diff --git a/1257-18B.sln b/1257-18B.sln new file mode 100644 index 0000000..33d022e --- /dev/null +++ b/1257-18B.sln @@ -0,0 +1,141 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33530.505 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.Helper", "JinYuan.Helper\JinYuan.Helper.csproj", "{258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.VirtualDataLibrary", "JinYuan.VirtualDataLibrary\JinYuan.VirtualDataLibrary.csproj", "{2AB7E380-7795-448A-933C-0F6A081B5E7E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.Models", "JinYuan.Models\JinYuan.Models.csproj", "{4C0BCB84-5CD7-4846-8363-C4C10D46E391}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.ControlCenters", "JinYuan.ControlCenter\JinYuan.ControlCenters.csproj", "{1D0FA5A4-07F0-4621-B6BB-683AEC91E658}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.DAL", "JinYuan.DAL\JinYuan.DAL.csproj", "{114AA012-29C9-418C-A2D6-3173C5341F51}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.MES", "JinYuan.MES\JinYuan.MES.csproj", "{530B6426-08E7-461C-91DC-787F876620FC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LargeSquareOne", "LargeSquareOne\LargeSquareOne.csproj", "{29E1F0D0-43DC-4077-A136-F25477E56881}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PLC", "PLC\PLC.csproj", "{486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JinYuan.ControlLib", "JinYuan.ControlLib\JinYuan.ControlLib.csproj", "{1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Language", "Language\Language.csproj", "{292A5C9C-7A82-4D25-A885-DDCEDC93F03C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOT.Services", "IOT.Services\IOT.Services.csproj", "{242400F4-9B01-4AEE-A6F7-05083757FCDD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{9FA3D6BD-1EC1-3BA5-80CB-CE02773A58D5}" + ProjectSection(SolutionItems) = preProject + 数据库\gluingmachineoftabflatteningandwelding_a.sql = 数据库\gluingmachineoftabflatteningandwelding_a.sql + 数据库\hbg_cupdataturnover.sql = 数据库\hbg_cupdataturnover.sql + TextFile1.txt = TextFile1.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Debug|Any CPU.Build.0 = Debug|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Debug|x64.ActiveCfg = Debug|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Debug|x64.Build.0 = Debug|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Release|Any CPU.ActiveCfg = Release|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Release|Any CPU.Build.0 = Release|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Release|x64.ActiveCfg = Release|Any CPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360}.Release|x64.Build.0 = Release|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Debug|x64.ActiveCfg = Debug|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Debug|x64.Build.0 = Debug|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Release|Any CPU.Build.0 = Release|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Release|x64.ActiveCfg = Release|Any CPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E}.Release|x64.Build.0 = Release|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Debug|x64.Build.0 = Debug|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Release|Any CPU.Build.0 = Release|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Release|x64.ActiveCfg = Release|Any CPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391}.Release|x64.Build.0 = Release|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Debug|x64.ActiveCfg = Debug|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Debug|x64.Build.0 = Debug|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Release|Any CPU.Build.0 = Release|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Release|x64.ActiveCfg = Release|Any CPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658}.Release|x64.Build.0 = Release|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Debug|x64.ActiveCfg = Debug|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Debug|x64.Build.0 = Debug|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Release|Any CPU.Build.0 = Release|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Release|x64.ActiveCfg = Release|Any CPU + {114AA012-29C9-418C-A2D6-3173C5341F51}.Release|x64.Build.0 = Release|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Debug|x64.Build.0 = Debug|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Release|Any CPU.Build.0 = Release|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Release|x64.ActiveCfg = Release|Any CPU + {530B6426-08E7-461C-91DC-787F876620FC}.Release|x64.Build.0 = Release|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Debug|x64.ActiveCfg = Debug|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Debug|x64.Build.0 = Debug|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Release|Any CPU.Build.0 = Release|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Release|x64.ActiveCfg = Release|Any CPU + {29E1F0D0-43DC-4077-A136-F25477E56881}.Release|x64.Build.0 = Release|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Debug|x64.ActiveCfg = Debug|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Debug|x64.Build.0 = Debug|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Release|Any CPU.Build.0 = Release|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Release|x64.ActiveCfg = Release|Any CPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7}.Release|x64.Build.0 = Release|Any CPU + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Debug|x64.ActiveCfg = Debug|x64 + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Debug|x64.Build.0 = Debug|x64 + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Release|Any CPU.Build.0 = Release|Any CPU + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Release|x64.ActiveCfg = Release|x64 + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2}.Release|x64.Build.0 = Release|x64 + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Debug|x64.ActiveCfg = Debug|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Debug|x64.Build.0 = Debug|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Release|Any CPU.Build.0 = Release|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Release|x64.ActiveCfg = Release|Any CPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C}.Release|x64.Build.0 = Release|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Debug|x64.ActiveCfg = Debug|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Debug|x64.Build.0 = Debug|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Release|Any CPU.Build.0 = Release|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Release|x64.ActiveCfg = Release|Any CPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD}.Release|x64.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E8421996-BAC4-4509-9C3E-BC424197F2D8} + RESX_NeutralResourcesLanguage = zh-Hans + RESX_SortFileContentOnSave = True + RESX_AutoCreateNewLanguageFiles = False + EndGlobalSection +EndGlobal diff --git a/BTW/新栈板V1.0.btw b/BTW/新栈板V1.0.btw new file mode 100644 index 0000000..3adb7ec Binary files /dev/null and b/BTW/新栈板V1.0.btw differ diff --git a/BTW/新箱唛V1.0.btw b/BTW/新箱唛V1.0.btw new file mode 100644 index 0000000..8c9ac56 Binary files /dev/null and b/BTW/新箱唛V1.0.btw differ diff --git a/IOT.Services/App.config b/IOT.Services/App.config new file mode 100644 index 0000000..62f6cc9 --- /dev/null +++ b/IOT.Services/App.config @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOT.Services/Config.xml b/IOT.Services/Config.xml new file mode 100644 index 0000000..a0fbd14 --- /dev/null +++ b/IOT.Services/Config.xml @@ -0,0 +1,3207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IOT.Services/IOT.Services.csproj b/IOT.Services/IOT.Services.csproj new file mode 100644 index 0000000..6da8971 --- /dev/null +++ b/IOT.Services/IOT.Services.csproj @@ -0,0 +1,127 @@ + + + + + Debug + AnyCPU + {242400F4-9B01-4AEE-A6F7-05083757FCDD} + WinExe + IOT.Services + IOT.Services + v4.8 + 512 + true + true + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + 10.0 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + Lib\DataConvertLib.dll + + + False + Lib\Newtonsoft.Json.dll + + + ..\packages\NLog.6.0.2\lib\net46\NLog.dll + + + False + Lib\PLCCommunication.dll + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + Service1.cs + + + + + + + + + + + + + + + + + Always + + + + + False + Microsoft .NET Framework 4.8 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/IOT.Services/Lib/Newtonsoft.Json.dll b/IOT.Services/Lib/Newtonsoft.Json.dll new file mode 100644 index 0000000..7af125a Binary files /dev/null and b/IOT.Services/Lib/Newtonsoft.Json.dll differ diff --git a/IOT.Services/Lib/PLCCommunication.dll b/IOT.Services/Lib/PLCCommunication.dll new file mode 100644 index 0000000..1993b11 Binary files /dev/null and b/IOT.Services/Lib/PLCCommunication.dll differ diff --git a/IOT.Services/Logger.cs b/IOT.Services/Logger.cs new file mode 100644 index 0000000..4d6a8d7 --- /dev/null +++ b/IOT.Services/Logger.cs @@ -0,0 +1,135 @@ +using NLog; +using System; +using System.IO; +using System.Timers; + + +public class Logger +{ + + + private static readonly NLog.Logger loginfo = LogManager.GetLogger("loginfo"); + private static readonly NLog.Logger logerror = LogManager.GetLogger("logerror"); + private static readonly NLog.Logger logmqtt = LogManager.GetLogger("logmqtt"); + + private static readonly NLog.Logger logsInfo = LogManager.GetLogger("logsInfo"); + private static readonly NLog.Logger logsMEStIME = LogManager.GetLogger("logsMEStIME"); + private static readonly NLog.Logger logsSql = LogManager.GetLogger("logsSql"); + private static readonly NLog.Logger logsSysErrorLog = LogManager.GetLogger("logsSysErrorLog"); + private static readonly NLog.Logger logsSysErrorLogcn = LogManager.GetLogger("logsSysErrorLogcn"); + private static readonly Timer cleanupTimer; + private const int MAX_DAYS = 7; + private const string LOG_BASE_PATH = "Log"; + + static Logger() + { + try + { + // 创建一个每天执行一次的定时器 + cleanupTimer = new Timer(24 * 60 * 60 * 1000); // 24小时 + cleanupTimer.Elapsed += CleanupOldLogs; + cleanupTimer.Start(); + + // 启动时执行一次清理 + CleanupOldLogs(null, null); + } + catch (Exception ex) + { + WriteError("Failed to initialize logger cleanup timer", ex); + } + } + + public static void WriteInfo(string info) + { + if (loginfo.IsInfoEnabled) + { + loginfo.Info(info); + } + } + + public static void WriteMqtt(string info) + { + if (logmqtt.IsInfoEnabled) + { + logmqtt.Info(info); + } + } + + public static void WriteError(string error) + { + if (logerror.IsErrorEnabled) + { + logerror.Error(error); + } + } + + public static void WriteError(string info, Exception ex) + { + if (logerror.IsErrorEnabled) + { + logerror.Error(info, ex); + } + } + + private static void CleanupOldLogs(object sender, ElapsedEventArgs e) + { + try + { + if (!Directory.Exists(LOG_BASE_PATH)) + return; + + string[] logTypes = { "LogError", "LogInfo", "LogMqtt" }; + DateTime cutoffDate = DateTime.Now.AddDays(-MAX_DAYS); + + foreach (string logType in logTypes) + { + string logTypeDir = Path.Combine(LOG_BASE_PATH, logType); + if (!Directory.Exists(logTypeDir)) + continue; + + // 获取所有日期文件夹 + string[] dateDirs = Directory.GetDirectories(logTypeDir); + foreach (string dateDir in dateDirs) + { + string dirName = Path.GetFileName(dateDir); + if (DateTime.TryParseExact(dirName, "yyyyMMdd", null, + System.Globalization.DateTimeStyles.None, out DateTime dirDate)) + { + if (dirDate < cutoffDate) + { + try + { + Directory.Delete(dateDir, true); + WriteInfo($"Deleted old log directory: {dateDir}"); + } + catch (Exception ex) + { + WriteError($"Failed to delete log directory: {dateDir}", ex); + } + } + } + } + } + } + catch (Exception ex) + { + WriteError("Error during log cleanup", ex); + } + } + + // 提供手动清理方法 + public static void ForceCleanupOldLogs() + { + CleanupOldLogs(null, null); + } + + // 在应用程序退出时调用此方法 + public static void Shutdown() + { + if (cleanupTimer != null) + { + cleanupTimer.Stop(); + cleanupTimer.Dispose(); + } + } +} \ No newline at end of file diff --git a/IOT.Services/Models.cs b/IOT.Services/Models.cs new file mode 100644 index 0000000..97e069c --- /dev/null +++ b/IOT.Services/Models.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; + +namespace WindowsService1 +{ + #region 1、系统内部 + public enum AcquisitionType + { + PPM, + Axis, + Cylinder, + LRobot + } + + public enum PLCDataType + { + Short, + Float + } + + public class StationData + { + public string Name { get; set; } + public object MainValue { get; set; } + public DateTime Timestamp { get; set; } + } + + public class TypeConfig + { + public string Name { get; set; } + public string Address { get; set; } + public string DataType { get; set; } + } + + + + public class CollectionGroupConfig + { + public string Name { get; set; } + public string StartAddress { get; set; } + public int Length { get; set; } + public string DefaultDataType { get; set; } + public Dictionary Types { get; set; } + } + #endregion + + #region 2、PPM点位 + #endregion + + #region 3、预测性点位 + #endregion + + #region 4、机械臂 + //直角坐标机械臂 + public class LRobot + { + public string bu_id { get; set; } + public string district_id { get; set; } + public string factory_id { get; set; } + public string production_line_id { get; set; } + public string production_processes_id { get; set; } + public string work_center_id { get; set; } + public string station_id { get; set; } + public string device_name { get; set; } = "601PWM01"; + public string robot_name { get; set; } + public List taglist { get; set; } + } + public class Taglist + { + public string device_time { get; set; } + public Collection collections_items { get; set; } + + } + public class Collection + { + public string robot_status { get; set; } = "1"; + public string x_value { get; set; } + public string y_value { get; set; } + public string z_value { get; set; } + public string time_span { get; set; } = "2.5"; + public string hand_status { get; set; } = "1"; + + } + #endregion +} diff --git a/IOT.Services/MqttClientWrapper.cs b/IOT.Services/MqttClientWrapper.cs new file mode 100644 index 0000000..1e77e14 --- /dev/null +++ b/IOT.Services/MqttClientWrapper.cs @@ -0,0 +1,376 @@ +using Newtonsoft.Json.Linq; +using PLCCommunication; +using PLCCommunication.LogNet; +using PLCCommunication.MQTT; +using System; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace WindowsService1 +{ + public class MqttClientWrapper + { + private MqttClient mqttClient; + private bool mqttIsConnected; + private const int MaxReconnectAttempts = 5; + private const int ReconnectDelay = 5000; // 5 seconds + + private MqttConnectionOptions options; + public event Action OnMessageReceived; + public long ReceiveCount { get; private set; } + + public PLCCommunication.LogNet.ILogNet LogNet = new LogNetDateTime("D:\\APILog\\Logs\\MQTTLogs", GenerateMode.ByEveryDay, 20); + + public enum MessageFormat + { + Binary, + Text, + Xml, + Json + } + + + public MqttClientWrapper(string ipAddress, int port, string clientId, MqttCredential credentials) + { + InitializeMqttOptions(ipAddress, port, clientId, credentials); + } + + private void InitializeMqttOptions(string ipAddress, int port, string clientId, MqttCredential credentials) + { + options = new MqttConnectionOptions + { + IpAddress = ipAddress, + Port = port, + ClientId = clientId, + Credentials = credentials, + UseRSAProvider = false, + CleanSession = false, + UseSSL = false, + SSLSecure = false, + CertificateFile = "", + KeepAlivePeriod = TimeSpan.FromSeconds(30), + KeepAliveSendInterval = TimeSpan.FromSeconds(10), + ConnectTimeout = 5, + WillMessage = null + }; + } + + public async Task InitializeAndConnectAsync() + { + try + { + mqttClient = new MqttClient(options); + Logger.WriteMqtt("MQTT 初始化成功"); + + await ConnectMqttAsync(); + } + catch (Exception ex) + { + Logger.WriteError($"MQTT 初始化失败: {ex.Message}"); + } + } + + private async Task ConnectMqttAsync() + { + try + { + JYResult connect = await mqttClient.ConnectServerAsync(); + if (connect.IsSuccess) + { + mqttIsConnected = true; + Logger.WriteMqtt("MQTT 连接服务器成功"); + } + else + { + Logger.WriteError("MQTT 无法连接到服务器"); + } + } + catch (Exception ex) + { + Logger.WriteError($"MQTT 无法连接到服务器: {ex.Message}"); + } + } + + + public async Task SendMessageAsync(string source, string publishTopic, string type, JObject messageObj) + { + if (!mqttClient.IsConnected) + { + mqttIsConnected = false; + + Logger.WriteMqtt("客户端未连接到服务器。正在尝试重新连接..."); + + await ReconnectWithRetry(); + if (!mqttClient.IsConnected) + { + throw new InvalidOperationException("无法与 MQTT 代理建立连接."); + } + } + try + { + if (messageObj != null) + { + string json = messageObj.ToString(); + //string json = JsonConvert.SerializeObject(messageObj); + JYResult result = await mqttClient.PublishMessageAsync(new MqttApplicationMessage + { + Topic = publishTopic, + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, + Payload = Encoding.UTF8.GetBytes(json), + Retain = false, + }); + if (result.IsSuccess) + { + if (Service1.SwitchLog) + { + Logger.WriteMqtt($"线程 [{source}] 发送 [{type}] 消息到主题 [{publishTopic}]: {json}"); + } + } + else + { + Logger.WriteMqtt($"线程 [{source}] 发送 [{type}] 消息到主题 [{publishTopic}] 失败: {result.Message}"); + + } + } + } + catch (Exception ex) + { + Logger.WriteError($"发送消息错误: {ex.Message}"); + } + } + + + public async Task SendMessageAsync(string source, string publishTopic, string type, string messageObj) + { + if (!mqttClient.IsConnected) + { + mqttIsConnected = false; + + Logger.WriteMqtt("客户端未连接到服务器。正在尝试重新连接..."); + + + await ReconnectWithRetry(); + if (!mqttClient.IsConnected) + { + throw new InvalidOperationException("无法与 MQTT 代理建立连接."); + } + } + try + { + if (messageObj != null) + { + JYResult result = await mqttClient.PublishMessageAsync(new MqttApplicationMessage + { + Topic = publishTopic, + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, + Payload = Encoding.UTF8.GetBytes(messageObj), + Retain = false, + }); + + if (result.IsSuccess) + { + if (Service1.SwitchLog) + { + Logger.WriteMqtt($"线程 [{source}] 发送 [{type}] 消息到主题 [{publishTopic}]: {messageObj}"); + } + } + else + { + Logger.WriteMqtt($"线程 [{source}] 发送 [{type}] 消息到主题 [{publishTopic}] 失败: {result.Message}"); + + } + } + } + catch (Exception ex) + { + Logger.WriteError($"发送消息错误: {ex.Message}"); + } + } + + + + public void SubscribeMessage(string topic, MessageFormat format = MessageFormat.Text, bool truncateLongMessage = false) + { + if (!mqttIsConnected) + { + ConnectMqttAsync().Wait(); + } + + try + { + JYResult operateResult = mqttClient.SubscribeMessage(new string[] { topic }); + if (!operateResult.IsSuccess) + { + Logger.WriteMqtt($"订阅消息失败: {operateResult.Message}"); + return; + } + + SubscribeTopic subscribeTopic = mqttClient.GetSubscribeTopic(topic); + if (subscribeTopic != null) + { + subscribeTopic.OnMqttMessageReceived += (sender, args) => + { + HandleReceivedMessage(args.Topic, args.Payload, format, truncateLongMessage); + }; + Logger.WriteMqtt($"成功订阅主题: {topic}"); + } + else + { + Logger.WriteMqtt($"无法获取订阅主题 {topic}"); + } + } + catch (Exception ex) + { + Logger.WriteError($"订阅主题时出错 {topic}: {ex.Message}"); + } + } + + private void HandleReceivedMessage(string topic, byte[] payload, MessageFormat format, bool truncateLongMessage) + { + ReceiveCount++; + string text = string.Empty; + + try + { + switch (format) + { + case MessageFormat.Binary: + text = BitConverter.ToString(payload).Replace("-", " "); + break; + case MessageFormat.Text: + text = Encoding.UTF8.GetString(payload); + break; + case MessageFormat.Xml: + try + { + text = XElement.Parse(Encoding.UTF8.GetString(payload)).ToString(); + } + catch + { + text = Encoding.UTF8.GetString(payload); + } + break; + case MessageFormat.Json: + try + { + text = JObject.Parse(Encoding.UTF8.GetString(payload)).ToString(); + } + catch + { + text = Encoding.UTF8.GetString(payload); + } + break; + } + //if (Service1.SwitchLog) + //{ + // LogNet.WriteDebug($"收到主题 {topic}: {text}"); + //} + //if (truncateLongMessage && text.Length > 200) + //{ + // text = text.Substring(0, 200) + "..."; + //} + + string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + OnMessageReceived?.Invoke(timestamp, topic, text); + } + catch (Exception ex) + { + Logger.WriteError($"处理收到的消息时出错: {ex.Message}"); + } + } + + public void UnsubscribeMessage(string topic) + { + try + { + JYResult operateResult = mqttClient.UnSubscribeMessage(new string[] { topic }); + if (operateResult.IsSuccess) + { + Logger.WriteMqtt($"成功取消订阅主题: {topic}"); + } + else + { + Logger.WriteMqtt($"取消订阅主题失败 {topic}: {operateResult.Message}"); + } + } + catch (Exception ex) + { + Logger.WriteError($"取消订阅主题时出错 {topic}: {ex.Message}"); + } + } + + /// + /// 重连 + /// + /// + private async Task ReconnectWithRetry() + { + int attempts = 0; + while (!mqttClient.IsConnected && attempts < MaxReconnectAttempts) + { + try + { + await mqttClient.ConnectServerAsync(); + Logger.WriteMqtt("重新连接成功."); + + return; + } + catch (Exception ex) + { + attempts++; + Logger.WriteMqtt($"重新连接尝试 {attempts} 失败的: {ex.Message}"); + await Task.Delay(ReconnectDelay); + } + } + if (!mqttClient.IsConnected) + { + Logger.WriteMqtt("尝试次数达到上限后仍无法重新连接."); + } + } + + + private async Task ReconnectAsync() + { + Logger.WriteMqtt("正在尝试重新连接..."); + mqttIsConnected = false; + int retryCount = 0; + const int maxRetries = 5; + const int retryDelayMs = 5000; + + while (!mqttIsConnected && retryCount < maxRetries) + { + try + { + await ConnectMqttAsync(); + if (mqttIsConnected) + { + Logger.WriteMqtt("重新连接成功"); + return; + } + } + catch (Exception ex) + { + Logger.WriteMqtt($"重新连接尝试 {retryCount + 1} 失败的: {ex.Message}"); + } + + retryCount++; + await Task.Delay(retryDelayMs); + } + + if (!mqttIsConnected) + { + Logger.WriteMqtt("多次尝试后仍无法重新连接"); + } + } + + + + public async Task Disconnect() + { + await mqttClient.ConnectCloseAsync(); + mqttIsConnected = false; + Logger.WriteMqtt("与 MQTT服务端断开连接!!!"); + } + } +} diff --git a/IOT.Services/MqttDataService.cs b/IOT.Services/MqttDataService.cs new file mode 100644 index 0000000..e6efb3c --- /dev/null +++ b/IOT.Services/MqttDataService.cs @@ -0,0 +1,730 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace WindowsService1 +{ + public class MqttDataService + { + + public static string BU_id; + public static string District_id; + public static string Factory_id; + public static string Production_line_id; + public static string Device_name; + public static string Topic; + public static string Work_Center_id; + public class OperationData + { + public int Item_Value { get; set; } + public string Start_Time { get; set; } + public string End_Time { get; set; } + } + + + public class MqttMessage + { + public string bu_id { get; set; } + public string district_id { get; set; } + public string factory_id { get; set; } + public string production_line_id { get; set; } + public string production_processes_id { get; set; } + public string work_center_id { get; set; } + public string station_id { get; set; } + public string device_name { get; set; } + public List taglist { get; set; } + } + + public class TagList + { + public string device_time { get; set; } + public Dictionary collection_items { get; set; } + } + + + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static MqttMessage CreateMqttMessage(string source, AcquisitionType type, List processedValues, + Dictionary> _plcAddresses, + Dictionary _collectionGroups) + { + try + { + Logger.WriteInfo($"开始创建 MQTT 消息, 类型: {type}, 数据点数量: {processedValues?.Count ?? 0}"); + + if (processedValues == null || processedValues.Count == 0) + { + Logger.WriteInfo("没有需要处理的数据,返回 null"); + return null; + } + + var addresses = _plcAddresses[type]; + var config = _collectionGroups[type]; + var collectionItems = new Dictionary(); + + // 获取当前时间作为设备时间 + var currentTime = DateTime.Now; + var deviceTimeStr = currentTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); + + Logger.WriteInfo($"处理数据类型: {type}, 当前时间: {deviceTimeStr}"); + + switch (type) + { + case AcquisitionType.PPM: + ProcessPPMData(processedValues, addresses, config, collectionItems); + break; + + case AcquisitionType.Axis: + case AcquisitionType.Cylinder: + ProcessFloatData(processedValues, addresses, config, currentTime, collectionItems); + break; + + default: + Logger.WriteError($"未知的数据类型: {type}"); + return null; + } + + if (collectionItems.Count == 0) + { + Logger.WriteInfo("没有有效的采集项,返回 null"); + return null; + } + + var message = new MqttMessage + { + bu_id = BU_id, + district_id = District_id, + factory_id = Factory_id, + production_line_id = Production_line_id, + production_processes_id = string.Empty, + work_center_id = Work_Center_id, + station_id = "1", + device_name = Device_name, + taglist = new List + { + new TagList + { + device_time = deviceTimeStr, + collection_items = collectionItems + } + } + }; + + // 记录创建的消息内容 + Logger.WriteInfo($"MQTT 消息创建完成: {JsonConvert.SerializeObject(message, Formatting.None)}"); + + return message; + } + catch (Exception ex) + { + Logger.WriteError($"创建 MQTT 消息时发生错误: {ex.Message}"); + return null; + } + } + + /// + /// PPM点位数据 + /// + /// + /// + /// + /// + /// + // 添加静态字段来存储上次发送的数据 + private static Dictionary _lastSentData = new Dictionary(); + + public static void ProcessPPMData(List processedValues, Dictionary addresses, CollectionGroupConfig config, Dictionary collectionItems) + { + try + { + Logger.WriteInfo($"开始处理 PPM 数据,数据点数量: {processedValues.Count}"); + + // 创建临时字典存储当前所有数据点 + var tempItems = new Dictionary(); + + foreach (var value in processedValues) + { + var addressPair = addresses.FirstOrDefault(x => x.Key == value.Name); + if (!string.IsNullOrEmpty(addressPair.Key)) + { + int itemValue = Convert.ToInt32(ConvertToIntegerWithThreeDecimals(value.MainValue)); + + // 计算开始时间 (结束时间 - 时长) + var startTime = value.Timestamp.AddMilliseconds(-itemValue); + + var operationData = new OperationData + { + Item_Value = itemValue, + Start_Time = startTime.ToString("yyyy-MM-dd HH:mm:ss.fff"), + End_Time = value.Timestamp.ToString("yyyy-MM-dd HH:mm:ss.fff") + }; + + // 检查数据是否发生变化 + bool shouldAdd = true; + + // 检查是否与上次发送的数据重复 + if (_lastSentData.TryGetValue(addressPair.Key, out var lastData)) + { + var currentEndTime = operationData.End_Time.ToString(); + var lastEndTime = lastData.End_Time.ToString(); + + if (string.Equals(lastEndTime, currentEndTime, StringComparison.OrdinalIgnoreCase)) + { + shouldAdd = false; + Logger.WriteInfo($"跳过重复数据点: {addressPair.Key}"); + continue; + } + } + + if (shouldAdd) + { + tempItems[addressPair.Key] = operationData; + Logger.WriteInfo($"处理数据点: {addressPair.Key}, 值: {itemValue}, " + + $"开始时间: {startTime:yyyy-MM-dd HH:mm:ss.fff}, " + + $"结束时间: {operationData.End_Time}"); + } + //if (shouldAdd) + //{ + // // 检查是否与当前批次的其他数据有重复的结束时间 + // var duplicateEndTimeItem = tempItems.FirstOrDefault(x => + // string.Equals(x.Value.End_Time.ToString(), operationData.End_Time.ToString(), StringComparison.OrdinalIgnoreCase)); + + // if (duplicateEndTimeItem.Key != null) + // { + // Logger.WriteError($"检测到结束时间重复: {operationData.End_Time} 对应地址: {addressPair.Key}, " + + // $"与地址 {duplicateEndTimeItem.Key} 的数据重复"); + + // // 根据地址的字母顺序决定哪个需要调整时间,确保调整的一致性 + // if (string.Compare(addressPair.Key, duplicateEndTimeItem.Key) > 0) + // { + // operationData.End_Time = value.Timestamp.AddMilliseconds(1).ToString("yyyy-MM-dd HH:mm:ss.fff"); + // Logger.WriteInfo($"调整后的结束时间: {operationData.End_Time}"); + // } + // } + + // tempItems[addressPair.Key] = operationData; + // Logger.WriteInfo($"处理数据点: {addressPair.Key}, 值: {itemValue}, " + + // $"开始时间: {startTime:yyyy-MM-dd HH:mm:ss.fff}, " + + // $"结束时间: {operationData.End_Time}"); + //} + } + else + { + Logger.WriteError($"未找到数据点 {value.Name} 对应的地址配置"); + } + } + + // 将处理后的数据添加到最终结果并更新上次发送的数据 + foreach (var item in tempItems) + { + collectionItems[item.Key] = item.Value; + _lastSentData[item.Key] = item.Value; // 更新上次发送的数据 + } + + Logger.WriteInfo($"PPM 数据处理完成,处理后的数据点数量: {collectionItems.Count}"); + } + catch (Exception ex) + { + Logger.WriteError($"处理 PPM 数据时出错: {ex.Message}"); + throw; + } + } + + private static bool IsDataEqual(OperationData data1, OperationData data2, string addressKey) + { + if (data1 == null || data2 == null) + return false; + + bool isEqual = data1.Item_Value == data2.Item_Value && + data1.Start_Time == data2.Start_Time && + data1.End_Time == data2.End_Time; + + if (isEqual) + { + Logger.WriteInfo($"检测到重复数据 - 地址: {addressKey}, " + + $"值: {data1.Item_Value}, " + + $"开始时间: {data1.Start_Time}, " + + $"结束时间: {data1.End_Time}"); + } + + return isEqual; + } + + + + /// + /// 预测性点位 + /// + /// + /// + /// + /// + /// + public static void ProcessFloatData(List processedValues, Dictionary addresses, CollectionGroupConfig config, DateTime endTime, Dictionary collectionItems) + { + for (int i = 0; i < processedValues.Count && i < config.Length; i++) + { + string address = $"D{int.Parse(config.StartAddress.Substring(1)) + i * 2}"; + if (addresses.ContainsValue(address)) + { + var key = addresses.FirstOrDefault(x => x.Value == address).Key; + int itemValue = Convert.ToInt32(ConvertToIntegerWithThreeDecimals(processedValues[i].MainValue)); + + // 计算开始时间 (结束时间 - 时长) + //var startTime = endTime.AddMilliseconds(-itemValue); + + collectionItems[key] = new OperationData + { + Item_Value = (int)itemValue, + Start_Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + End_Time = endTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + }; + } + } + } + + /// + /// 机械臂数据 + /// + /// + /// + /// + /// + /// + /// + public static LRobot LRobotMessage(string source, AcquisitionType type, List processedValues, Dictionary> _plcAddresses, + Dictionary _collectionGroups) + { + if (processedValues == null || processedValues.Count == 0) + { + return null; + } + var addresses = _plcAddresses[type]; + var config = _collectionGroups[type]; + return new LRobot() + { + bu_id = BU_id, + district_id = District_id, + factory_id = Factory_id, + production_line_id = Production_line_id, + production_processes_id = "", + work_center_id = "", + station_id = "", + device_name = "601PWM01", + robot_name = "LUR01", + taglist = new List + { + new Taglist//上料动子1 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[0].MainValue.ToString(), + y_value="0", + z_value=processedValues[1].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子2 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[2].MainValue.ToString(), + y_value="0", + z_value=processedValues[3].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子3 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[4].MainValue.ToString(), + y_value="0", + z_value=processedValues[5].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子4 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[6].MainValue.ToString(), + y_value="0", + z_value=processedValues[7].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子5 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[8].MainValue.ToString(), + y_value="0", + z_value=processedValues[9].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子6 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[10].MainValue.ToString(), + y_value="0", + z_value=processedValues[11].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子7 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[13].MainValue.ToString(), + y_value="0", + z_value=processedValues[14].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子8 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[16].MainValue.ToString(), + y_value="0", + z_value=processedValues[17].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//上料动子9 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[18].MainValue.ToString(), + y_value="0", + z_value=processedValues[19].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机1 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[20].MainValue.ToString(), + y_value=processedValues[21].MainValue.ToString(), + z_value=processedValues[22].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机2 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[23].MainValue.ToString(), + y_value=processedValues[24].MainValue.ToString(), + z_value=processedValues[25].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机3 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[26].MainValue.ToString(), + y_value=processedValues[27].MainValue.ToString(), + z_value=processedValues[28].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机4 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[29].MainValue.ToString(), + y_value=processedValues[30].MainValue.ToString(), + z_value=processedValues[31].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机5 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[32].MainValue.ToString(), + y_value=processedValues[33].MainValue.ToString(), + z_value=processedValues[34].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机6 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[35].MainValue.ToString(), + y_value=processedValues[36].MainValue.ToString(), + z_value=processedValues[37].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机7 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[38].MainValue.ToString(), + y_value=processedValues[39].MainValue.ToString(), + z_value=processedValues[40].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机8 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[41].MainValue.ToString(), + y_value=processedValues[42].MainValue.ToString(), + z_value=processedValues[43].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机9 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[44].MainValue.ToString(), + y_value=processedValues[45].MainValue.ToString(), + z_value=processedValues[46].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机10 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[47].MainValue.ToString(), + y_value=processedValues[48].MainValue.ToString(), + z_value=processedValues[49].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机11 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[50].MainValue.ToString(), + y_value=processedValues[51].MainValue.ToString(), + z_value=processedValues[52].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//焊机12 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[53].MainValue.ToString(), + y_value=processedValues[54].MainValue.ToString(), + z_value=processedValues[55].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//下料动子1 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[56].MainValue.ToString(), + y_value="0", + z_value=processedValues[57].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//下料动子2 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[58].MainValue.ToString(), + y_value="0", + z_value=processedValues[59].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//下料动子3 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[61].MainValue.ToString(), + y_value="0", + z_value=processedValues[62].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//下料动子4 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[63].MainValue.ToString(), + y_value="0", + z_value=processedValues[64].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//下料动子5 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[65].MainValue.ToString(), + y_value="0", + z_value=processedValues[66].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + }, + new Taglist//下料动子6 + { + device_time=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), + collections_items=new Collection() + { + robot_status = "1", + x_value=processedValues[67].MainValue.ToString(), + y_value="0", + z_value=processedValues[68].MainValue.ToString(), + time_span="2.5", + hand_status="1", + } + } + + } + + }; + } + + + + + // 辅助方法 + private static List ConvertToShortList(object[] data) + { + return data.Select(x => Convert.ToInt16(x)).ToList(); + } + + private static List ConvertToFloatList(object[] data) + { + return data.Select(x => Convert.ToSingle(x)).ToList(); + } + + + private static object ConvertToIntegerWithThreeDecimals(object value) + { + try + { + if (value == null) return 0; + + if (value is float floatValue) + { + return (int)Math.Round(floatValue * 1000); + } + else if (value is double doubleValue) + { + return (int)Math.Round(doubleValue * 1000); + } + else if (value is decimal decimalValue) + { + return (int)Math.Round(decimalValue * 1000); + } + else + { + // 尝试转换其他类型 + float converted = Convert.ToSingle(value); + return (int)Math.Round(converted * 1000); + } + } + catch (Exception ex) + { + Logger.WriteError($"转换值到整数时出错: {ex.Message}, 值: {value}"); + return 0; + } + } + } +} diff --git a/IOT.Services/NLog.config b/IOT.Services/NLog.config new file mode 100644 index 0000000..4ca60d8 --- /dev/null +++ b/IOT.Services/NLog.config @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOT.Services/PLCDataReader.cs b/IOT.Services/PLCDataReader.cs new file mode 100644 index 0000000..4bd584b --- /dev/null +++ b/IOT.Services/PLCDataReader.cs @@ -0,0 +1,155 @@ +using JinYuan.DataConvertLib; +using PLCCommunication.PLCType.Omron; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace WindowsService1 +{ + + + /// + /// 定义每个数据读取请求的参数。 + /// + public class PLCDataReadRequest + { + /// + /// PLC起始地址 + /// + public string StartAddress { get; set; } + /// + /// 读取长度 + /// + public ushort Length { get; set; } + /// + /// 读取区域名称 + /// + public string StorageName { get; set; } + /// + /// 读取数据类型 + /// + public PLCDataType DataType { get; set; } + } + + /// + /// 存储每次读取操作的结果。 + /// + public class PLCDataResult + { + /// + /// 读取区域名称 + /// + public string StorageName { get; set; } + /// + /// 读取数据类型 + /// + public PLCDataType DataType { get; set; } + /// + /// 数据 + /// + public byte[] Data { get; set; } + /// + /// 是否读取成功 + /// + public bool IsSuccess { get; set; } + /// + /// 读取失败的错误信息 + /// + public string ErrorMessage { get; set; } + } + + public class PLCDataReader + { + private readonly OmronFinsNet _plc; + + + public PLCDataReader(OmronFinsNet plc) + { + _plc = plc ?? throw new ArgumentNullException(nameof(plc)); + } + + public async Task ReadDataAsync(PLCDataReadRequest request) + { + try + { + var data = await _plc.ReadAsync(request.StartAddress, request.Length); + if (data.IsSuccess && data.Content.Length > 0) + { + Logger.WriteInfo($"成功读取PLC数据,起始地址:{request.StartAddress},长度:{request.Length},类型:{request.DataType}"); + return new PLCDataResult + { + StorageName = request.StorageName, + DataType = request.DataType, + Data = data.Content, + IsSuccess = true + }; + } + else + { + Logger.WriteInfo($"读取PLC数据失败,起始地址:{request.StartAddress},长度:{request.Length},类型:{request.DataType}"); + return new PLCDataResult + { + StorageName = request.StorageName, + DataType = request.DataType, + IsSuccess = false, + ErrorMessage = "读取PLC数据失败" + }; + } + } + catch (Exception ex) + { + Logger.WriteError($"读取PLC数据时发生错误:{ex.Message}"); + return new PLCDataResult + { + StorageName = request.StorageName, + DataType = request.DataType, + IsSuccess = false, + ErrorMessage = ex.Message + }; + } + } + + private object[] ParseData(byte[] content, PLCDataType dataType) + { + switch (dataType) + { + case PLCDataType.Short: + return ParseShortData(content); + case PLCDataType.Float: + return ParseFloatData(content); + default: + throw new ArgumentException($"不支持的数据类型:{dataType}"); + } + } + + private object[] ParseShortData(byte[] content) + { + int count = content.Length / 2; + return Enumerable.Range(0, count) + .Select(i => (object)ShortLib.GetShortFromByteArray(content, i * 2)) + .ToArray(); + } + + private object[] ParseFloatData(byte[] content) + { + int count = content.Length / 4; + return Enumerable.Range(0, count) + .Select(i => (object)FloatLib.GetFloatFromByteArray(content, i * 4)) + .ToArray(); + } + } + + public static class ConvertHelper + { + /// + /// 字节数组高低位转换 + /// + /// + /// + public static byte[] ByteReverse(this byte[] Arrbyte) + { + byte[] ArrByte = Arrbyte.Select((x, i) => new { x, i }).GroupBy(x => x.i / 2).SelectMany(x => new byte[] { x.Last().x, x.First().x }).ToArray(); + return ArrByte; + } + } +} diff --git a/IOT.Services/PLCWrapper.cs b/IOT.Services/PLCWrapper.cs new file mode 100644 index 0000000..f0d3889 --- /dev/null +++ b/IOT.Services/PLCWrapper.cs @@ -0,0 +1,104 @@ +using PLCCommunication.PLCType.Omron; +using System; +using System.Threading.Tasks; + +namespace WindowsService1 +{ + public class PLCWrapper + { + private OmronFinsNet _plc; + public bool _plcIsConnected; + private readonly string _ipAddress; + private readonly int _port; + private readonly int _maxReconnectAttempts; + private readonly int _reconnectDelay; + public PLCDataReader _dataReader; + public PLCWrapper(string ipAddress, int port, int maxReconnectAttempts = 3, int reconnectDelay = 5000) + { + _ipAddress = ipAddress; + _port = port; + _maxReconnectAttempts = maxReconnectAttempts; + _reconnectDelay = reconnectDelay; + } + + public async Task ConnectAsync() + { + try + { + _plc = new OmronFinsNet + { + IpAddress = _ipAddress, + Port = _port + }; + var connectResult = await Task.Run(() => _plc.ConnectServer()); + _plcIsConnected = connectResult.IsSuccess; + if (_plcIsConnected) + { + _dataReader = new PLCDataReader(GetPLCClient()); + Logger.WriteInfo("PLC连接成功"); + } + else + { + Logger.WriteInfo("PLC连接失败"); + } + return _plcIsConnected; + } + catch (Exception ex) + { + Logger.WriteError($"PLC连接失败: {ex.Message}"); + return false; + } + } + + public void Disconnect() + { + if (_plcIsConnected) + { + _plc.ConnectClose(); + _plcIsConnected = false; + Logger.WriteInfo("与PLC断开连接"); + } + } + + public OmronFinsNet GetPLCClient() + { + if (!_plcIsConnected || _plc == null) + { + throw new InvalidOperationException("PLC 未连接或未初始化。请先调用 ConnectAsync()。"); + } + return _plc; + } + + public async Task ReconnectAsync() + { + if (_plcIsConnected) + { + Logger.WriteInfo("PLC已连接,无需重连"); + return true; + } + + for (int attempt = 1; attempt <= _maxReconnectAttempts; attempt++) + { + Logger.WriteInfo($"尝试重新连接PLC,第 {attempt} 次尝试"); + if (await ConnectAsync()) + { + Logger.WriteInfo("PLC重新连接成功"); + return true; + } + + if (attempt < _maxReconnectAttempts) + { + await Task.Delay(_reconnectDelay); + } + } + + Logger.WriteError($"PLC重新连接失败,已尝试 {_maxReconnectAttempts} 次"); + return false; + } + + public bool IsConnected() + { + return _plcIsConnected; + } + } +} \ No newline at end of file diff --git a/IOT.Services/Program.cs b/IOT.Services/Program.cs new file mode 100644 index 0000000..aeeb614 --- /dev/null +++ b/IOT.Services/Program.cs @@ -0,0 +1,20 @@ +using System.ServiceProcess; + +namespace WindowsService1 +{ + internal static class Program + { + /// + /// 应用程序的主入口点。 + /// + static void Main() + { + ServiceBase[] ServicesToRun; + ServicesToRun = new ServiceBase[] + { + new Service1() + }; + ServiceBase.Run(ServicesToRun); + } + } +} diff --git a/IOT.Services/Properties/AssemblyInfo.cs b/IOT.Services/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..004aa2d --- /dev/null +++ b/IOT.Services/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("WindowsService1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WindowsService1")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("242400f4-9b01-4aee-a6f7-05083757fcdd")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/IOT.Services/Service1.Designer.cs b/IOT.Services/Service1.Designer.cs new file mode 100644 index 0000000..b7b9f85 --- /dev/null +++ b/IOT.Services/Service1.Designer.cs @@ -0,0 +1,38 @@ +namespace WindowsService1 +{ + partial class Service1 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + Logger.Shutdown(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.ServiceName = "Service1"; + } + + #endregion + } +} diff --git a/IOT.Services/Service1.cs b/IOT.Services/Service1.cs new file mode 100644 index 0000000..e347afc --- /dev/null +++ b/IOT.Services/Service1.cs @@ -0,0 +1,1179 @@ +using JinYuan.DataConvertLib; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using PLCCommunication.MQTT; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.ServiceProcess; +using System.Threading; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace WindowsService1 +{ + public partial class Service1 : ServiceBase + { + private readonly List _tasks = new List(); + private readonly CancellationTokenSource _cts = new CancellationTokenSource(); + + private PLCWrapper _plcWrapper; + private MqttClientWrapper mqttClient = null; + private System.Threading.Timer _periodicTimer; + + private Dictionary _collectionGroups; + private Dictionary> _plcAddresses; + + private AcquisitionType[] AcqTypes = null; + + private const int ReconnectionInterval = 5000; // 5 seconds + private const int MaxReconnectAttempts = 3; + + public string PlcIpAddress = "127.0.0.1"; + public int PlcPort = 9600; + + + public string MQTTServerAddress = "127.0.0.1"; + public int MQTTServerPort = 1883; + public string ClientId = "601UPW01"; + //PPM主题 + public string Topic = "EVE/60J/EQP/NEW_PPM/601UPW01"; + //PPM其他数据 + public string Topic1 = "eve/60J/EQP/601UPW01"; + //直角坐标机械臂 + public string LRobotTopic = "EVE/60J/LRobot/601PWM01_LUR01"; + //关节机械臂 + public string JRobotTopic = "EVE/60J/JRobot/601PWM01_STR01"; + + public MqttCredential credentials = null; + + public string BU_id = "EVE2BU"; + public string District_id = "QJ"; + public string Factory_id = "60J"; + public string Production_line_id = "MW-601"; + public string Device_name = "601UPW01"; + + public int ThreadInterval = 50; + public static bool SwitchLog = false; + + public Service1() + { + InitializeComponent(); + ServiceName = "TestMqttService"; + CanStop = true; // 服务可以被停止 + CanPauseAndContinue = false; + AutoLog = true; + + + } + + protected override void OnStart(string[] args) + { + Logger.WriteInfo($"OnStart:服务启动-{DateTime.Now}"); + InitializeConfig(); + _plcWrapper = new PLCWrapper(PlcIpAddress, PlcPort); + InitializeTask(); + InitializePLC(); + InitializeMQTT(); + + Task.Run(() => RunChangeDetectionTaskAsync(_cts.Token));// 启动变化检测任务 + + + Logger.WriteInfo($"OnStart:服务启动完毕-{DateTime.Now}"); + } + + protected override async void OnStop() + { + _cts.Cancel(); + _periodicTimer?.Dispose(); + // 停止 PLC 读取 + if (_plcWrapper != null) + { + _plcWrapper.Disconnect(); + Logger.WriteInfo("PLC 通讯停止."); + } + if (mqttClient != null) + { + await mqttClient.Disconnect(); + Logger.WriteInfo("MQTT 连接已关闭."); + } + Logger.WriteInfo("OnStop"); + } + + /// + /// 系统配置文件读取 + /// + private void InitializeConfig() + { + ReadConfigFromXml(); + PlcIpAddress = ConfigurationManager.AppSettings["PlcIpAddress"] ?? "127.0.0.1"; + PlcPort = int.Parse(ConfigurationManager.AppSettings["PlcPort"] ?? "9600"); + + MQTTServerAddress = ConfigurationManager.AppSettings["MQTTServerAddress"] ?? "127.0.0.1"; + MQTTServerPort = int.Parse(ConfigurationManager.AppSettings["MQTTServerPort"] ?? "1883"); + ClientId = ConfigurationManager.AppSettings["ClientId"] ?? "601UPW01"; + + Topic = ConfigurationManager.AppSettings["Topic"] ?? "EVE/60J/EQP/NEW_PPM/601UPW01"; + Topic1 = ConfigurationManager.AppSettings["Topic1"] ?? "eve/60J/EQP/601UPW01"; + LRobotTopic = ConfigurationManager.AppSettings["LRobotTopic"] ?? "EVE/60J/LRobot/601PWM01_LUR01"; + JRobotTopic = ConfigurationManager.AppSettings["JRobotTopic"] ?? "EVE/60J/JRobot/601PWM01_STR01"; + + BU_id = ConfigurationManager.AppSettings["BU_id"] ?? "601UPW01"; + District_id = ConfigurationManager.AppSettings["District_id"] ?? "QJ"; + Factory_id = ConfigurationManager.AppSettings["Factory_id"] ?? "60J"; + Production_line_id = ConfigurationManager.AppSettings["Production_line_id"] ?? "MW-601"; + Device_name = ConfigurationManager.AppSettings["Device_name"] ?? "601UPW01"; + ThreadInterval = int.Parse(ConfigurationManager.AppSettings["ThreadInterval"] ?? "50"); + SwitchLog = bool.Parse(ConfigurationManager.AppSettings["SwitchLog"] ?? "True"); + MqttDataService.BU_id = BU_id; + MqttDataService.District_id = District_id; + MqttDataService.Factory_id = Factory_id; + MqttDataService.Production_line_id = Production_line_id; + MqttDataService.Device_name = Device_name; + MqttDataService.Work_Center_id = "601FGE02"; + + Logger.WriteInfo("读取系统配置文件成功!"); + + + } + + private void ReadConfigFromXml() + { + try + { + var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config.xml"); + var doc = XDocument.Load(configPath); + string deviceName = ""; + _plcAddresses = new Dictionary>(); + _collectionGroups = new Dictionary(); + + foreach (var deviceElement in doc.Descendants("Device")) + { + var isEnabled = bool.Parse(deviceElement.Attribute("isEnable")?.Value ?? "false"); + + if (isEnabled) + { + deviceName = deviceElement.Attribute("name")?.Value; + + foreach (var groupElement in deviceElement.Elements("CollectionGroup")) + { + var groupName = groupElement.Attribute("name").Value; + Logger.WriteInfo($"添加寄存器组类型: {groupName}"); + + var acquisitionType = (AcquisitionType)Enum.Parse(typeof(AcquisitionType), groupName); + var groupConfig = new CollectionGroupConfig + { + Name = groupName, + StartAddress = groupElement.Attribute("StartAddress").Value, + Length = int.Parse(groupElement.Attribute("length").Value), + DefaultDataType = groupElement.Attribute("DataType")?.Value ?? "Short", + Types = new Dictionary() + }; + + var groupAddresses = new Dictionary(); + + foreach (var typeElement in groupElement.Elements("Type")) + { + var typeName = typeElement.Attribute("name").Value; + var typeAddress = typeElement.Attribute("address")?.Value ?? typeElement.Value; + var dataType = typeElement.Attribute("DataType")?.Value ?? groupConfig.DefaultDataType; + + // 创建TypeConfig对象 + var typeConfig = new TypeConfig + { + Name = typeName, + Address = typeAddress, + DataType = dataType + }; + + groupConfig.Types[typeName] = typeConfig; + groupAddresses[typeName] = typeAddress; + + Logger.WriteInfo($"添加类型: {typeName}, 地址: {typeAddress}, 数据类型: {dataType}"); + } + + _collectionGroups[acquisitionType] = groupConfig; + _plcAddresses[acquisitionType] = groupAddresses; + } + break; // 只处理第一个启用的Device + } + } + + Logger.WriteInfo($"读取 【{deviceName}】地址文件成功!!!"); + } + catch (Exception ex) + { + Logger.WriteError($"读取配置文件错误: {ex.Message}"); + } + } + + + + + private static PLCDataType DetermineDataType(string groupName, string dataTypeAttribute) + { + if (!string.IsNullOrEmpty(dataTypeAttribute)) + { + return (PLCDataType)Enum.Parse(typeof(PLCDataType), dataTypeAttribute); + } + if (!string.IsNullOrEmpty(groupName)) + { + AcquisitionType type = (AcquisitionType)Enum.Parse(typeof(AcquisitionType), groupName); + // 如果 DataType 属性为空,根据组名推断类型 + switch (type) + { + case AcquisitionType.PPM: + return PLCDataType.Short; + case AcquisitionType.Axis: + case AcquisitionType.Cylinder: + return PLCDataType.Float; + default: + throw new ArgumentException($"未知的组名: {groupName}"); + } + + } + else + { + throw new ArgumentException($"未知的组名: {groupName}"); + } + } + + + #region 初始化Task线程,PLC,MQTT + private void InitializeTask() + { + if (_collectionGroups != null && _collectionGroups.Count > 0) + { + List typesList = new List(); + foreach (var kvp in _collectionGroups) + { + switch (kvp.Key) + { + case AcquisitionType.Axis: + case AcquisitionType.Cylinder: + StartPeriodicTask(); // 启动定时读取任务 + break; + case AcquisitionType.PPM: + typesList.Add(kvp.Key); + break; + default: + break; + } + } + + // 将 List 转换为数组 + AcqTypes = typesList.ToArray(); + + // 如果需要,你可以在这里使用 types 数组 + if (AcqTypes.Length > 0) + { + Logger.WriteInfo("添加类型: " + string.Join(", ", AcqTypes)); + // 这里可以添加其他使用 types 数组的逻辑 + } + } + } + + + + + private async void InitializePLC() + { + try + { + bool connected = await _plcWrapper.ConnectAsync(); + if (connected) + { + Logger.WriteInfo("PLC初始化并连接成功."); + } + else + { + Logger.WriteInfo("无法连接 PLC."); + throw new Exception("PLC 连接失败"); + } + } + catch (Exception ex) + { + Logger.WriteError($"初始化 PLC 错误: {ex.Message}"); + } + } + + private async void InitializeMQTT() + { + try + { + mqttClient = new MqttClientWrapper(MQTTServerAddress, MQTTServerPort, ClientId, credentials); //初始化 + await mqttClient.InitializeAndConnectAsync();//连接MQTT + SubscribeTopic(Topic);//订阅主题 + SubscribeTopic(Topic1);//订阅主题1 + SubscribeTopic(LRobotTopic);//订阅直角坐标机械臂 + SubscribeTopic(JRobotTopic);//订阅关机机械臂 + } + catch (Exception ex) + { + Logger.WriteError($"连接 MQTT 代理时出错: {ex.Message}"); + } + } + + /// + /// 订阅主题 + /// + /// + private void SubscribeTopic(string topicToSubscribe) + { + mqttClient.OnMessageReceived += (timestamp, topic, message) => + { + //Console.WriteLine($"{timestamp} Topic[{topic}]: {message}"); + //Logger.WriteMqtt($"{timestamp} Topic[{topic}]"); + // 在这里更新你的 UI + }; + mqttClient.SubscribeMessage(topicToSubscribe, MqttClientWrapper.MessageFormat.Json, true); + } + + + /// + /// 类发布消息 + /// + /// + /// + /// + private async Task SendMqttAsync(string source, string publishTopic, string type, JObject messageObj) + { + try + { + if (publishTopic != null) + { + + await mqttClient.SendMessageAsync(source, publishTopic, type, messageObj); + } + } + catch (Exception ex) + { + + Console.WriteLine($"发布信息: {ex.Message}"); + } + + } + + + /// + /// 字符串发布消息 + /// + /// + /// + /// + /// + /// + private async Task SendMqttAsync(string source, string publishTopic, string type, string messageObj) + { + try + { + if (publishTopic != null) + { + + + await mqttClient.SendMessageAsync(source, publishTopic, type, messageObj); + } + } + catch (Exception ex) + { + + Console.WriteLine($"发布信息: {ex.Message}"); + } + + } + #endregion + + + #region 创建定时线程 + /// + /// 轴扭矩定时器采集线程 + /// + private void StartPeriodicTask() + { + Logger.WriteInfo("启动定期数据收集任务"); + _periodicTimer = new System.Threading.Timer(async _ => + { + try + { + Logger.WriteInfo($"定期触发任务: {DateTime.Now}"); + await CollectAndPublishData("AxisTask", new[] { AcquisitionType.Axis }); + await CollectAndPublishData("AxisTask", new[] { AcquisitionType.Cylinder }); + await CollectAndPublishData("LRobotTask", new[] { AcquisitionType.LRobot }); + Logger.WriteInfo($"定期任务完成: {DateTime.Now}"); + } + catch (Exception ex) + { + Logger.WriteError($"周期性任务执行错误: {ex.Message}"); + } + }, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); // 每秒执行一次 + } + + /// + /// 有变化数据采集线程 + /// + /// + /// + /// + + private async Task RunChangeDetectionTaskAsync(CancellationToken ct) + { + while (!ct.IsCancellationRequested) + { + if (_plcWrapper._plcIsConnected) + { + try + { + await CollectAndPublishData("ChangeTask", AcqTypes); + await Task.Delay(500, ct); + } + catch (OperationCanceledException) + { + // 正常取消,无需额外处理 + } + catch (Exception ex) + { + Logger.WriteError($"变更检测任务错误: {ex.Message}"); + await Task.Delay(1000, ct); + } + } + } + } + #endregion + + /// + /// 读取数据 + /// + /// + /// + /// + private async Task CollectAndPublishData(string source, AcquisitionType[] types) + { + const int maxRetries = 3; + for (int retry = 0; retry < maxRetries; retry++) + { + try + { + var requests = new List(); + foreach (var type in types) + { + var config = _collectionGroups[type]; + requests.Add(new PLCDataReadRequest + { + StartAddress = config.StartAddress, + Length = (ushort)config.Length, + StorageName = config.Name + }); + } + + foreach (var request in requests) + { + var result = await _plcWrapper._dataReader.ReadDataAsync(request); + if (result.IsSuccess) + { + await ProcessPLCData(source, request.StorageName, result.Data); + } + else + { + Logger.WriteInfo($"错误读取 {result.StorageName}: {result.ErrorMessage}"); + throw new Exception($"读取 PLC 数据失败: {result.ErrorMessage}"); + } + } + break; // 如果成功,退出重试循环 + } + catch (Exception ex) + { + Logger.WriteError($"Error {source}: {ex.Message}"); + if (retry < maxRetries - 1) + { + Logger.WriteInfo($"尝试重新连接到 PLC,尝试 {retry + 1}"); + bool reconnected = await AttemptReconnection(_cts.Token); + if (!reconnected) + { + Logger.WriteError("无法重新连接 PLC,放弃进一步尝试"); + break; + } + } + else + { + Logger.WriteError($"最大重试次数 ({maxRetries}) 已到达,放弃操作"); + } + } + } + } + + /// + /// 重连PLC + /// + /// + /// + private async Task AttemptReconnection(CancellationToken ct) + { + const int MaxReconnectAttempts = 3; + const int ReconnectionInterval = 5000; // 5 seconds + + for (int attempt = 1; attempt <= MaxReconnectAttempts; attempt++) + { + if (ct.IsCancellationRequested) + { + return false; + } + + Logger.WriteInfo($"尝试重新连接PLC,第 {attempt} 次尝试"); + bool reconnected = await _plcWrapper.ReconnectAsync(); + if (reconnected) + { + Logger.WriteInfo("PLC重新连接成功"); + return true; + } + + if (attempt < MaxReconnectAttempts) + { + await Task.Delay(ReconnectionInterval, ct); + } + } + Logger.WriteError($"PLC重新连接失败,已尝试 {MaxReconnectAttempts} 次"); + return false; + } + + + /// + /// 读取PLC数据 + /// + /// + /// + /// + /// + private async Task ProcessPLCData(string source, string acquisitionTypeName, byte[] data) + { + try + { + AcquisitionType type = (AcquisitionType)Enum.Parse(typeof(AcquisitionType), acquisitionTypeName); + var typeConfigs = GetTypeConfigs(type).ToList(); + bool hasChanges = false; + List processedValues = null; + + switch (type) + { + case AcquisitionType.PPM: + var ppmResult = ProcessShortData(type, data, typeConfigs); + hasChanges = ppmResult.hasChanges; + processedValues = ppmResult.values; + break; + + case AcquisitionType.Axis: + case AcquisitionType.Cylinder: + case AcquisitionType.LRobot: + var floatResult = ProcessFloatData(type, data, typeConfigs); + hasChanges = floatResult.hasChanges; + processedValues = floatResult.values; + break; + + default: + Logger.WriteError($"未知的采集类型: {type}"); + return; + } + + if (hasChanges && processedValues != null) + { + + // 上传到MQTT服务器 + await UpMQTTServerDataNew(source, type, processedValues); + } + else + { + Logger.WriteInfo($"{type} 数据未改变,未上传"); + } + } + catch (Exception ex) + { + Logger.WriteError($"处理 PLC 数据时出错(源: {source}, 类型: {acquisitionTypeName}): {ex.Message}"); + } + } + + // 相应地,ProcessFloatData方法也需要修改返回类型 + + private List _lastFloatStationData = new List(); + private (bool hasChanges, List values) ProcessFloatData(AcquisitionType type, byte[] rawData, List typeConfigs) + { + bool hasChanges = false; + var currentValues = new DataValue[typeConfigs.Count]; + + // 记录实际需要处理的数据点数量 + Logger.WriteInfo($"开始处理数据: typeConfigs.Count={typeConfigs.Count}, rawData.Length={rawData.Length}"); + var sw = new Stopwatch(); + sw.Restart(); + // 初始化数组为完整的大小 + currentValues = new DataValue[typeConfigs.Count]; + var stationDataList = new List(); + + try + { + // 第一步:处理所有Float类型数据(主数据) + var floatConfigs = typeConfigs.Where(t => t.DataType.Equals("Float", StringComparison.OrdinalIgnoreCase)).ToList(); + foreach (var config in floatConfigs) + { + // 从地址中提取偏移量 + if (int.TryParse(config.Address.Substring(1), out int address)) + { + int startAddress = int.Parse(typeConfigs[0].Address.Substring(1)); + int offset = (address - startAddress) * 2; + + if (offset >= 0 && offset + 4 <= rawData.Length) + { + byte[] valueBytes = new byte[4]; + for (int j = 0; j < 4; j++) + { + valueBytes[j] = (byte)(Convert.ToInt32(rawData[offset + j]) & 0xFF); + } + + object convertedValue = ConvertFromBytes(valueBytes, "Float"); + int index = typeConfigs.IndexOf(config); + currentValues[index] = new DataValue + { + Name = config.Name, + Value = convertedValue, + DataType = config.DataType + }; + } + } + } + + // 第二步:处理所有Short类型数据 + var shortConfigs = typeConfigs.Where(t => t.DataType.Equals("Short", StringComparison.OrdinalIgnoreCase)).ToList(); + foreach (var config in shortConfigs) + { + if (int.TryParse(config.Address.Substring(1), out int address)) + { + int startAddress = int.Parse(typeConfigs[0].Address.Substring(1)); + int offset = (address - startAddress) * 2; + + if (offset >= 0 && offset + 2 <= rawData.Length) + { + byte[] valueBytes = new byte[2]; + for (int j = 0; j < 2; j++) + { + valueBytes[j] = (byte)(Convert.ToInt32(rawData[offset + j]) & 0xFF); + } + + object convertedValue = ConvertFromBytes(valueBytes, "Short"); + int index = typeConfigs.IndexOf(config); + currentValues[index] = new DataValue + { + Name = config.Name, + Value = convertedValue, + DataType = config.DataType + }; + } + } + } + + // 第三步:组织StationData列表 + + foreach (var floatConfig in floatConfigs) + { + string baseName = floatConfig.Name; // 例如 "S_MagLev" + var mainValue = currentValues[typeConfigs.IndexOf(floatConfig)]?.Value; + // 先获取MainValue,如果为0则跳过这个工位,暂时不过滤 + //if (mainValue == null || Convert.ToDouble(mainValue) == 0) + //{ + // Logger.WriteInfo($"跳过工位 {baseName}: MainValue为0或null"); + // continue; + //} + + // 只检查MainValue是否与上一次的值相同,暂时不检查 + //var lastData = _lastStationData.FirstOrDefault(x => x.Name == baseName); + //if (lastData != null) + //{ + // bool valueEqual = Convert.ToDouble(lastData.MainValue) == Convert.ToDouble(mainValue); + + // if (valueEqual) + // { + // Logger.WriteInfo($"跳过工位 {baseName}: 值未变化 当前值:{mainValue}"); + // continue; + // } + + // Logger.WriteInfo($"工位 {baseName} 数值发生变化: {lastData.MainValue} -> {mainValue}"); + //} + + // 创建StationData对象 + var stationData = new StationData + { + Name = baseName, + MainValue = mainValue, + Timestamp = DateTime.Now, + }; + + stationDataList.Add(stationData); + Logger.WriteInfo($"添加工位数据: {stationData.Name}, 值: {stationData.MainValue}, 时间戳: {stationData.Timestamp:HH:mm:ss.fff}"); + } + + // 检查是否有新数据需要更新 + if (stationDataList.Any()) + { + hasChanges = true; // 如果有数据通过过滤,就表示有变化 + + // 创建深拷贝以避免引用问题 + _lastFloatStationData = stationDataList.Select(s => new StationData + { + Name = s.Name, + MainValue = s.MainValue, + Timestamp = s.Timestamp + }).ToList(); + + _lastFloatStationData = stationDataList;//把当前的新数据赋值到旧的集合中 + + + //// 记录变化信息 + //foreach (var newData in stationDataList) + //{ + // Logger.WriteInfo($"工位 {newData.Name} 更新: 时间戳: {newData.Timestamp:HH:mm:ss.fff}, 值: {newData.MainValue}"); + //} + } + else + { + Logger.WriteInfo("没有发现时间戳变化的数据"); + hasChanges = false; + } + + + sw.Stop(); + Logger.WriteInfo($"处理结束耗时:{sw.ElapsedMilliseconds}ms"); + return (hasChanges, stationDataList); + } + catch (Exception ex) + { + Logger.WriteError($"处理数据时出错: {ex.Message}"); + return (false, stationDataList); + } + + } + + + + + /// + /// 检测PPM数据是否有变化 + /// + /// + /// + private List _lastStationData = new List(); + + private readonly StationDataComparer2 _comparer = new StationDataComparer2(); + + private (bool hasChanges, List values) ProcessShortData(AcquisitionType type, byte[] rawData, List typeConfigs) + { + var sw = new Stopwatch(); + sw.Start(); + Logger.WriteInfo($"开始新一轮数据处理"); + + try + { + var currentStationData = new Dictionary(); + bool hasNewData = false; + + // 1. 获取所有主值配置(Float类型) + var mainValueConfigs = typeConfigs + .Where(t => string.Equals(t.DataType, "Float", StringComparison.OrdinalIgnoreCase)) + .OrderBy(t => int.Parse(t.Address.Substring(1))) + .ToList(); + + Logger.WriteInfo($"找到 {mainValueConfigs.Count} 个Float类型配置"); + foreach (var config in mainValueConfigs) + { + Logger.WriteInfo($"Float配置: {config.Name}, 地址: {config.Address}"); + } + + // 2. 获取所有时间配置(Short类型) + var timeConfigs = typeConfigs + .Where(t => string.Equals(t.DataType, "Short", StringComparison.OrdinalIgnoreCase)) + .ToList(); + + // 3. 首先读取所有工位的当前值和时间戳 + foreach (var mainConfig in mainValueConfigs) + { + string stationName = mainConfig.Name; + + // 读取主值 + double? mainValue = ReadFloatValue(mainConfig, rawData, typeConfigs[0].Address); + if (mainValue == null || mainValue <= 0) + { + Logger.WriteInfo($"工位 {stationName} 主值无效: {mainValue}"); + continue; + } + + // 读取时间组件 + DateTime timestamp = ReadTimestamp(stationName, timeConfigs, rawData, typeConfigs[0].Address); + + // 添加到当前数据集合 + currentStationData[stationName] = new StationData + { + Name = stationName, + MainValue = mainValue, + Timestamp = timestamp + }; + + Logger.WriteInfo($"读取工位数据: {stationName}, 值: {mainValue}, 时间: {timestamp:HH:mm:ss.fff}"); + } + + // 4. 比较新旧数据,确定是否有变化 + if (currentStationData.Any()) + { + if (_lastStationData == null || !_lastStationData.Any()) + { + hasNewData = true; + Logger.WriteInfo("首次数据采集,记录所有数据"); + } + else + { + // 检查每个工位的数据是否有变化 + foreach (var current in currentStationData.Values) + { + var lastData = _lastStationData.FirstOrDefault(x => x.Name == current.Name); + if (lastData == null) + { + hasNewData = true; + Logger.WriteInfo($"发现新工位数据: {current.Name}"); + break; + } + + // 检查值和时间戳是否都有变化 + bool valueChanged = Math.Abs(Convert.ToDouble(lastData.MainValue) - Convert.ToDouble(current.MainValue)) > 0.001; + bool timeChanged = Math.Abs((current.Timestamp - lastData.Timestamp).TotalMilliseconds) >= 500; + + if (valueChanged || timeChanged) + { + hasNewData = true; + Logger.WriteInfo($"工位 {current.Name} 数据发生变化 - 值变化: {valueChanged}, 时间变化: {timeChanged}"); + break; + } + } + } + } + + // 5. 如果有新数据,更新最后处理的数据 + var resultList = currentStationData.Values.ToList(); + if (hasNewData) + { + _lastStationData = new List(resultList); + Logger.WriteInfo($"更新状态数据,数量: {resultList.Count}"); + } + + sw.Stop(); + Logger.WriteInfo($"处理完成,耗时: {sw.ElapsedMilliseconds}ms, 数据点数量: {resultList.Count}, 有变化: {hasNewData}"); + + return (hasNewData, resultList); + } + catch (Exception ex) + { + Logger.WriteError($"数据处理错误: {ex.Message}\n{ex.StackTrace}"); + return (false, new List()); + } + } + + private double? ReadFloatValue(TypeConfig config, byte[] rawData, string baseAddress) + { + try + { + if (!int.TryParse(config.Address.Substring(1), out int address) || + !int.TryParse(baseAddress.Substring(1), out int startAddress)) + { + return null; + } + + int offset = (address - startAddress) * 2; + if (offset < 0 || offset + 4 > rawData.Length) + { + return null; + } + + byte[] valueBytes = new byte[4]; + Array.Copy(rawData, offset, valueBytes, 0, 4); + var value = ConvertFromBytes(valueBytes, "Float"); + return value != null ? Convert.ToDouble(value) : null; + } + catch + { + return null; + } + } + + private DateTime ReadTimestamp(string stationName, List timeConfigs, byte[] rawData, string baseAddress) + { + // 获取时间组件配置 + var hourConfig = timeConfigs.FirstOrDefault(t => t.Name == $"{stationName}_Hour"); + var minConfig = timeConfigs.FirstOrDefault(t => t.Name == $"{stationName}_Min"); + var secConfig = timeConfigs.FirstOrDefault(t => t.Name == $"{stationName}_Sec"); + var msecConfig = timeConfigs.FirstOrDefault(t => t.Name == $"{stationName}_MSec"); + + // 读取时间值 + int hour = ReadShortValue(hourConfig, rawData, baseAddress); + int minute = ReadShortValue(minConfig, rawData, baseAddress); + int second = ReadShortValue(secConfig, rawData, baseAddress); + int millisecond = ReadShortValue(msecConfig, rawData, baseAddress); + + // 验证时间值 + hour = Math.Min(Math.Max(hour, 0), 23); + minute = Math.Min(Math.Max(minute, 0), 59); + second = Math.Min(Math.Max(second, 0), 59); + millisecond = Math.Min(Math.Max(millisecond, 0), 999); + + // 获取当前时间 + var now = DateTime.Now; + + // 构建读取的时间 + var readTime = new DateTime( + now.Year, + now.Month, + now.Day, + hour, + minute, + second, + millisecond + ); + + // 如果读取的时间比当前时间大,说明应该是前一天的数据 + if (readTime > now) + { + readTime = readTime.AddDays(-1); + Logger.WriteInfo($"检测到跨天数据,调整日期为前一天: {readTime:yyyy-MM-dd HH:mm:ss.fff}"); + } + + return readTime; + } + + private int ReadShortValue(TypeConfig config, byte[] rawData, string baseAddress) + { + try + { + if (config == null || !int.TryParse(config.Address.Substring(1), out int address) || + !int.TryParse(baseAddress.Substring(1), out int startAddress)) + { + return 0; + } + + int offset = (address - startAddress) * 2; + if (offset < 0 || offset + 2 > rawData.Length) + { + return 0; + } + + byte[] valueBytes = new byte[2]; + Array.Copy(rawData, offset, valueBytes, 0, 2); + var value = ConvertFromBytes(valueBytes, "Short"); + return Convert.ToInt32(value); + } + catch + { + return 0; + } + } + + + + private object ConvertFromBytes(byte[] bytes, string dataType) + { + try + { + if (bytes == null || bytes.Length == 0) + return null; + + switch (dataType.ToLower()) + { + case "bool": + return BitConverter.ToInt16(bytes, 0) != 0; + case "short": + return ShortLib.GetShortFromByteArray(bytes, 0, DataFormat.CDAB); + case "int": + return IntLib.GetIntFromByteArray(bytes, 0, DataFormat.CDAB); + case "float": + return FloatLib.GetFloatFromByteArray(bytes, 0, DataFormat.CDAB); + default: + return ShortLib.GetShortFromByteArray(bytes, 0, DataFormat.CDAB); + } + } + catch (Exception ex) + { + Logger.WriteError($"转换数据类型失败: {BitConverter.ToString(bytes)} to {dataType}, {ex.Message}"); + return null; + } + } + + + + /// + /// 上传MQTT + /// + /// + /// + /// + /// + public async Task UpMQTTServerDataNew(string source, AcquisitionType type, List processedValues) + { + try + { + if (processedValues == null || processedValues.Count == 0) + { + return; + } + + //var addresses = _plcAddresses[type]; + //var config = _collectionGroups[type]; + + var message = MqttDataService.CreateMqttMessage(source, type, processedValues, _plcAddresses, _collectionGroups); + + if (message != null) + { + var messageJson = JsonConvert.SerializeObject(message, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.None + }); + if (type.ToString() == "PPM") + { + await SendMqttAsync(source, Topic, type.ToString(), messageJson); + } + else if (type.ToString() == "Axis" || type.ToString() == "Cylinder") + { + await SendMqttAsync(source, Topic1, type.ToString(), messageJson); + } + } + if (type.ToString() == "LRobot") + { + var message1 = MqttDataService.LRobotMessage(source, type, processedValues, _plcAddresses, _collectionGroups); + if (message1 != null) + { + var messageJson1 = JsonConvert.SerializeObject(message1, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.None + }); + if (type.ToString() == "LRobot") + { + await SendMqttAsync(source, LRobotTopic, type.ToString(), messageJson1); + } + } + } + + } + catch (Exception ex) + { + Logger.WriteError($"方法:上传MQTTServer数据,上传失败: {ex.Message}", ex); + } + } + + + + + private List ConvertToShortList(object[] data) + { + return data.Select(d => Convert.ToInt16(d)).ToList(); + } + + private List ConvertToFloatList(object[] data) + { + return data.Select(d => Convert.ToSingle(d)).ToList(); + } + + // 获取特定类型的数据类型 + public string GetDataType(AcquisitionType acquisitionType, string typeName) + { + if (_collectionGroups.TryGetValue(acquisitionType, out var groupConfig)) + { + if (groupConfig.Types.TryGetValue(typeName, out var typeConfig)) + { + return typeConfig.DataType; + } + } + return "Short"; // 默认返回Short类型 + } + + // 获取数据类型的字节大小 + public int GetTypeSize(string dataType) + { + switch (dataType.ToLower()) + { + case "bool": + return 2; // 在PLC中通常用2字节表示 + case "short": + return 2; // 2字节 + case "int": + return 4; // 4字节 + case "float": + return 4; // 4字节 + default: + return 2; // 默认2字节 + } + } + + // 获取组内所有类型配置 + public IEnumerable GetTypeConfigs(AcquisitionType acquisitionType) + { + if (_collectionGroups.TryGetValue(acquisitionType, out var groupConfig)) + { + return groupConfig.Types.Values; + } + return Enumerable.Empty(); + } + + + } + + + /// + /// 时间转化 + /// + + public static class DateTimeExtensions + { + public static long ToUnixTimeMilliseconds(this DateTime dateTime) + { + return (long)(dateTime.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; + } + + public static long GetUnixTimestamp() + { + return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; + } + } + + // 辅助类 + public class DataValue + { + public string Name { get; set; } + public object Value { get; set; } + public string DataType { get; set; } + + public override bool Equals(object obj) + { + if (obj is DataValue other) + { + if (Value == null && other.Value == null) return true; + if (Value == null || other.Value == null) return false; + + switch (DataType.ToLower()) + { + case "float": + if (Value is float f1 && other.Value is float f2) + return Math.Abs(f1 - f2) < 0.000001f; + break; + case "bool": + if (Value is bool b1 && other.Value is bool b2) + return b1 == b2; + break; + } + + return Value.Equals(other.Value); + } + return false; + } + + public override int GetHashCode() + { + return Value?.GetHashCode() ?? 0; + } + } +} diff --git a/IOT.Services/StationDataComparer.cs b/IOT.Services/StationDataComparer.cs new file mode 100644 index 0000000..0963233 --- /dev/null +++ b/IOT.Services/StationDataComparer.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; + +namespace WindowsService1 +{ + /// + /// 判断工位耗时变化 + /// + public class StationDataComparer : IEqualityComparer + { + private const float FloatEpsilon = 0.000001f; // 可以调整精度 + + public bool Equals(StationData x, StationData y) + { + if (ReferenceEquals(x, y)) return true; + if (x is null || y is null) return false; + + // 比较名称 + if (x.Name != y.Name) return false; + + // 比较主值 + if (x.MainValue is float xFloat && y.MainValue is float yFloat) + { + if (Math.Abs(xFloat - yFloat) > FloatEpsilon) return false; + } + else if (x.MainValue is double xDouble && y.MainValue is double yDouble) + { + if (Math.Abs(xDouble - yDouble) > FloatEpsilon) return false; + } + else if (!Equals(x.MainValue, y.MainValue)) + { + return false; + } + + // 比较时间戳(可以选择是否忽略毫秒) + return Math.Abs((x.Timestamp - y.Timestamp).TotalMilliseconds) < 1; + } + + public int GetHashCode(StationData obj) + { + if (obj is null) return 0; + + unchecked + { + int hash = 17; + hash = hash * 23 + (obj.Name?.GetHashCode() ?? 0); + + // 对于浮点数,可以先转换为整数再计算哈希 + if (obj.MainValue is float f) + { + hash = hash * 23 + ((int)(f * 1000000)).GetHashCode(); + } + else + { + hash = hash * 23 + (obj.MainValue?.GetHashCode() ?? 0); + } + + hash = hash * 23 + obj.Timestamp.GetHashCode(); + return hash; + } + } + } + + /// + /// 判断时间戳变化 + /// + public class StationDataComparer2 : IEqualityComparer + { + public bool Equals(StationData x, StationData y) + { + if (ReferenceEquals(x, y)) return true; + if (x is null || y is null) return false; + + // 只比较名称和时间戳 + if (x.Name != y.Name) return false; + + // 比较时间戳,检查是否完全相同 + return x.Timestamp == y.Timestamp; + } + + public int GetHashCode(StationData obj) + { + if (obj is null) return 0; + + unchecked + { + int hash = 17; + hash = hash * 23 + (obj.Name?.GetHashCode() ?? 0); + hash = hash * 23 + obj.Timestamp.GetHashCode(); + return hash; + } + } + } +} diff --git a/IOT.Services/XmlConfigReader.cs b/IOT.Services/XmlConfigReader.cs new file mode 100644 index 0000000..4a95ee2 --- /dev/null +++ b/IOT.Services/XmlConfigReader.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Xml.Linq; + +namespace WindowsService1 +{ + public class XmlConfigReader + { + private Dictionary>> deviceData; + + public XmlConfigReader(string xmlContent) + { + XDocument doc = XDocument.Parse(xmlContent); + deviceData = ReadXmlToNestedDictionary(doc); + } + + public XmlConfigReader(XDocument doc) + { + deviceData = ReadXmlToNestedDictionary(doc); + } + + private Dictionary>> ReadXmlToNestedDictionary(XDocument doc) + { + var result = new Dictionary>>(); + var mainDevice = doc.Root.Element("Device"); + string mainDeviceName = mainDevice.Attribute("name").Value; + result[mainDeviceName] = new Dictionary>(); + + foreach (var subDevice in mainDevice.Elements("Device")) + { + string subDeviceName = subDevice.Attribute("name").Value; + result[mainDeviceName][subDeviceName] = new Dictionary(); + + foreach (var type in subDevice.Elements("Type")) + { + string typeName = type.Attribute("name").Value; + string typeValue = type.Value; + result[mainDeviceName][subDeviceName][typeName] = typeValue; + } + } + + return result; + } + + public void PrintStructure() + { + foreach (var mainDevice in deviceData) + { + Console.WriteLine($"Main Device: {mainDevice.Key}"); + foreach (var subDevice in mainDevice.Value) + { + Console.WriteLine($" Sub Device: {subDevice.Key}"); + foreach (var type in subDevice.Value) + { + Console.WriteLine($" Type: {type.Key}, Value: {type.Value}"); + } + } + } + } + + public bool TryGetValue(string mainDeviceName, string subDeviceName, string typeName, out string value) + { + value = null; + return deviceData.TryGetValue(mainDeviceName, out var mainDevice) && + mainDevice.TryGetValue(subDeviceName, out var subDevice) && + subDevice.TryGetValue(typeName, out value); + } + + public Dictionary>> GetAllData() + { + return deviceData; + } + } +} diff --git a/IOT.Services/log4net.config b/IOT.Services/log4net.config new file mode 100644 index 0000000..b177cf0 --- /dev/null +++ b/IOT.Services/log4net.config @@ -0,0 +1,62 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOT.Services/packages.config b/IOT.Services/packages.config new file mode 100644 index 0000000..92e2b4b --- /dev/null +++ b/IOT.Services/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/JinYuan.ControlCenter/ControlCenter.cs b/JinYuan.ControlCenter/ControlCenter.cs new file mode 100644 index 0000000..a1db5c1 --- /dev/null +++ b/JinYuan.ControlCenter/ControlCenter.cs @@ -0,0 +1,2039 @@ +using JinYuan.Helper; +using JinYuan.MES.Models; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using MiniExcelLibs; +using PLC; +using PLC.PLCAlarm; +using PLCCommunication; +using PLCCommunication.Common; +using PLCCommunication.Common.DataConvert; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Runtime.CompilerServices.RuntimeHelpers; +using AlarmData = JinYuan.Models.AlarmData; +using DataType = PLC.DataType; + + +namespace JinYuan.ControlCenters +{ + public partial class ControlCenter : IDisposable + { + #region 1、变量定义 + private static readonly object uiLock = new object(); + private static ControlCenter _instance; + public static ControlCenter Instance + { + get + { + lock (uiLock) + { + return _instance ??= new ControlCenter(); + } + } + } + + private readonly Dictionary groups = new Dictionary(); + private Dictionary, PlcGroup, Task>> stationFunctions; + //private Dictionary, PlcGroup>> stationFunctions; + private readonly Dictionary> plcDeviceMapping = new Dictionary>(); + private readonly Dictionary groupTasks = new Dictionary(); + private readonly Dictionary plcAlarmReaders = new Dictionary(); + + public CancellationTokenSource _cts; + private Task _heartbeatTask; + private const int HeartbeatInterval = 1000; // 1 second + + private Dictionary group_status = new Dictionary(); + + /// + /// 定时器-定时刷新状态和数据 + /// + private System.Timers.Timer Timer_RefreshData; + + private readonly string configFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config"); + #endregion + + #region 2、初始化函数 + /// + /// 构造函数 + /// + private ControlCenter() + { + _cts = new CancellationTokenSource(); + + if (CommonMethods.plcDevices == null) + { + CommonMethods.plcDevices = new List(); + } + InitializeDevicesFromExcel(); + GetAlarmData(); + InitFunc(); + //initPrint();//打印机初始化 + Timer_RefreshData = new System.Timers.Timer(1000); + Timer_RefreshData.Elapsed += Timer_RefreshData_Elapsed; + Timer_RefreshData.Start(); + + // 轴位置监控 + //Task.Run(() => { ShowAxleEven_Run(); }); + + // 电机位置监控 + //Task.Run(() => { ShowMotorEven_Run(); }); + + //Mes心跳监控 + Task.Run(new Action(() => { UpdateMesHeartBeat(); })); + + //删除30天内日志 + //DeleteLog.Start(CommonMethods.strDeletepath);//会把整个ApiLog删除 + string[] clrPath = new string[] { CommonMethods.strAlarmLogspath, CommonMethods.strMesLogspath, CommonMethods.strWattrMeterpath, Application.StartupPath + "\\Logs\\" }; + short[] seltWay = new short[] { 0, 0, 0, 1 }; + DeleteLog.Start(clrPath, seltWay); + + if (!CommonMethods.IsRun) + { + CommonMethods.ResetEventRecv.Reset(); + } + } + + /// + /// 初始化 工位方法,添加到字典里面 + /// + private void InitFunc() + { + stationFunctions = new Dictionary, PlcGroup, Task>> + { + ["包装箱进站"] = FeedingStation, // 线头扫描,包装箱进站 + ["中部扫描"] = FeedingStationB, // 中部扫描 + ["尾部扫描"] = FeedingStationC, // 尾部扫描 + //["箱唛标签打印"] = PrintContainerStation, // 箱唛打印 + //["栈板标签打印"] = PrintPalletStation, // 栈板打印,O2不打印 + //["3S标签打印"] = Print3SStation, // 3S打印 在线网站拿数据的,贴标打印机自行打印 + //["6J标签打印"] = Print6JStation, // 6J打印 + //["绑定客户标签"] = BindingLabelStation, // 绑定客户标签 + ["包装箱出站"] = BlankingStation, // 包装箱出站 + ["中转数据"] = TransferStation, // 中转数据 + }; + } + + /// + /// 启动心跳及工位读取线程 + /// + /// + public async Task StartAsync() + { + CreatePLCThreads(); + _heartbeatTask = StartHeartbeatCheck(_cts.Token); + await Task.CompletedTask; + } + + /// + /// 加载配置文件 + /// + private void InitializeDevicesFromExcel() + { + CommonMethods.AddDataMonitorLog(1, "开始加载配置参数……".Translated()); + string deviceConfigPath = Path.Combine(configFolderPath, "Device.xlsx"); + string groupConfigPath = Path.Combine(configFolderPath, "Group.xlsx"); + string variableConfigPath = Path.Combine(configFolderPath, "Variable.xlsx"); + //string plcVariableConfigPath = Path.Combine(configFolderPath, "PLCVariable.xlsx"); + + if (!File.Exists(deviceConfigPath) || !File.Exists(groupConfigPath) || !File.Exists(variableConfigPath)) + { + LogHelper.Instance.WriteError("配置文件不存在"); + return; + } + + try + { + var deviceConfigs = MiniExcel.Query(deviceConfigPath).ToList(); + var groupConfigs = MiniExcel.Query(groupConfigPath).ToList(); + var variableConfigs = MiniExcel.Query(variableConfigPath).ToList(); + + foreach (var deviceConfig in deviceConfigs.Where(d => d.IsActive)) + { + IPEndPoint iep = new IPEndPoint(IPAddress.Parse(deviceConfig.IPAddress), deviceConfig.Port); + PlcReadWriteBase plc = PLCFactory.CreatePLC(GetPLCTypeEnum(deviceConfig.PLCType), deviceConfig.PlcNum, $"PLC_{deviceConfig.PlcNum}", iep); + + deviceConfig.Cts = new CancellationTokenSource(); + deviceConfig.GroupList = groupConfigs + .Where(g => g.IsActive && g.PlcNum == deviceConfig.PlcNum) + .ToList(); + + foreach (var group in deviceConfig.GroupList) + { + group.VarList = variableConfigs + .Where(v => v.GroupName == group.GroupName && v.PlcNum == deviceConfig.PlcNum) + .ToList(); + + group_status[group.GroupName] = 0; + } + + plcDeviceMapping[plc] = new List { deviceConfig }; + CommonMethods.plcDevices.Add(plc); + + // 初始化 PLCAlarm Reader报警读取 + var alarmReader = new PLCAlarmReader( + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AlarmConfig.csv"), + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AlarmRecords"), + RecordType.RecordWhenFinish, + false + ); + + //alarmReader.PLCAlarm_New += AlrmReader_PLCAlarm_New; + //alarmReader.PLCAlarm_Remove += AlrmReader_PLCAlarm_Remove; + plcAlarmReaders[plc] = alarmReader; + + CommonMethods.plcStatuses[plc] = new Dictionary + { + ["OldStatus"] = (short)0, + ["StatusCount"] = 0, + ["GuidAlarm"] = string.Empty, + ["Status"] = new List { false, false, false, false } + }; + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"加载配置失败:{ex.Message}"); + } + CommonMethods.AddDataMonitorLog(1, "配置文件加载完成".Translated()); + } + + #endregion + + #region 3、PLC读写 + + #region 创建PLC线程 几个工位就几个线程 + /// + /// 按工位读取线程 + /// + /// + private readonly Dictionary groupThreads = new Dictionary(); + private readonly object lockObject = new object(); + private void CreatePLCThreads() + { + for (int i = 0; i < CommonMethods.plcDevices.Count; i++) + { + var plc = CommonMethods.plcDevices[i]; + if (plcDeviceMapping.TryGetValue(plc, out var plcDevices)) + { + foreach (var plcDevice in plcDevices) + { + foreach (var plcGroup in plcDevice.GroupList.Where(g => g.IsActive)) + { + string threadKey = $"{plcDevice.PlcNum}-{plcGroup.GroupName}"; + + var parameter = (group: plcGroup, plcIndex: i); + + Thread thread = new Thread(new ParameterizedThreadStart(ReadPLCWorkModel)); + thread.IsBackground = true; + thread.Priority = ThreadPriority.Highest; + lock (lockObject) + { + groupThreads[threadKey] = thread; + } + thread.Start(parameter); + } + } + } + } + } + #endregion + + #region 循环读取PLC工位状态 + /// + /// 读取PLC循环工位 + /// + /// + /// + private void ReadPLCWorkModel(object parameter) + { + if (parameter is ValueTuple tuple) + { + var (group, plcIndex) = tuple; + + while (!_cts.Token.IsCancellationRequested) + { + if (CommonMethods.IsRun) + { + if (CommonMethods.plcDevices[plcIndex].IsConnected) + { + try + { + JYResult OpenValue = CommonMethods.plcDevices[plcIndex].ReadValue>(group.VarList[0].VarAddress, DataType.Short); + if (OpenValue.IsSuccess && OpenValue.Content == 1 && group_status[group.GroupName] == 0) + { + group_status[group.GroupName] = 1; + JYResult resByte = CommonMethods.plcDevices[plcIndex].ReadValue>($"{group.VarList[2].VarAddress}", + DataType.ArrByte, Convert.ToUInt16(group.VarList[2].OffsetOrLength)); + + if (resByte != null && stationFunctions.TryGetValue(group.GroupName, out var action)) + { + Task.Run(() => action(resByte, group)); + } + } + else if (OpenValue.IsSuccess && OpenValue.Content == 0) // 触发地址被PLC清0后的处理处理 + { + if(group_status[group.GroupName] != 0) + { + group_status[group.GroupName] = 0; + CommonMethods.AddDataMonitorLog(0, $"{group.GroupName} PLC设置为0,清空状态为0"); + } + JYResult checkValue = CommonMethods.plcDevices[plcIndex].ReadValue>(group.VarList[1].VarAddress, DataType.Short); + if (checkValue.IsSuccess && checkValue.Content != 0) + { + CommonMethods.plcDevices[plcIndex].WriteValue(group.VarList[1].VarAddress, 0, DataType.Short); + LogHelper.Instance.WriteLog($"记录: {group.VarList[1].VarAddress}清0"); + } + } + } + catch (Exception ex) + { + group_status[group.GroupName] = 0; + LogHelper.Instance.WriteError($"错误: {group.GroupName} - {ex.Message}"); + } + } + } + Thread.Sleep(50); + } + } + } + #endregion + + #region 开始停止联机事件 + /// + /// 开始联机 + /// + /// + + public async Task ConnectAllPlcsAsync() + { + bool allConnected = true; + if (CommonMethods.plcDevices.Count <= 0) + { + CommonMethods.AddDataMonitorLog(1, "无PLC配置信息".Translated() + "," + "请检查配置文件".Translated()); + return allConnected = false; + } + foreach (var plc in CommonMethods.plcDevices) + { + if (plcDeviceMapping.TryGetValue(plc, out var plcDevices)) + { + foreach (var deviceConfig in plcDevices) + { + string msg = ""; + try + { + // 使用 Task.Run 来在后台线程执行连接操作 + bool isConnected = await Task.Run(() => + { + // 设置一个连接超时 + using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10))) // 10秒超时 + { + try + { + return plc.Connect(ref msg); + } + catch (OperationCanceledException) + { + msg = "连接超时"; + return false; + } + } + }).ConfigureAwait(false); + + deviceConfig.IsConnected = isConnected; + + if (!deviceConfig.IsConnected) + { + allConnected = false; + LogHelper.Instance.WriteLog($"连接PLC失败: {deviceConfig.PlcNum}, 错误: {msg}"); + CommonMethods.AddDataMonitorLog(1, "连接PLC失败".Translated() + $": {deviceConfig.PlcNum}, " + "错误".Translated() + $": {msg}"); + } + else + { + await SendRightToPLCAsync(); + CommonMethods.AddDataMonitorLog(0, "成功连接PLC".Translated() + $": {deviceConfig.PlcNum}"); + } + } + catch (Exception ex) + { + allConnected = false; + LogHelper.Instance.WriteLog($"连接PLC时发生异常: {deviceConfig.PlcNum}, 错误: {ex.Message}"); + CommonMethods.AddDataMonitorLog(2, "连接PLC时发生异常".Translated() + $": {deviceConfig.PlcNum}" + "错误".Translated() + $": {ex.Message}"); + } + } + } + } + return allConnected; + } + + /// + /// 断开链接 + /// + public void DisconnectAllPlcs() + { + foreach (var plc in CommonMethods.plcDevices) + { + if (plcDeviceMapping.TryGetValue(plc, out var plcDevices)) + { + foreach (var deviceConfig in plcDevices) + { + plc.Disconnect(); + deviceConfig.IsConnected = false; + CommonMethods.AddDataMonitorLog(0, "已断开与PLC".Translated() + $"[{deviceConfig.PlcNum}]" + "的链接".Translated()); + } + } + } + } + #endregion + #endregion + + #region MES + /// + /// Mes心跳 + /// + private void UpdateMesHeartBeat() + { + Thread.Sleep(100); + while (true)//true + { + try + { + if (CommonMethods.mesConfig.IsLoginMesOK && CommonMethods.IsRun)//CommonMethods.mesConfig.isUpMes && + { + if (Ping() == true) + { + CommonMethods.mesConfig.isConnected = true; + } + else//Ping失败,提示检查线路。 + { + CommonMethods.mesConfig.isConnected = false; + if (DateTime.Now.Second % 10 == 0) + { + string errStr = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},Mes心跳Ping失败,IP:{CommonMethods.mesConfig.MESURLAddressIP},端口号:{CommonMethods.mesConfig.MESURLAddressPort}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{DateTime.Now.ToString("yyyyMMdd")}\Mes心跳报警\{DateTime.Now.ToString("HH")}.txt", errStr); + } + } + } + } + catch (Exception ex) + { + string errStr = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},Mes心跳Ping异常,IP:{CommonMethods.mesConfig.MESURLAddressIP},端口号:{CommonMethods.mesConfig.MESURLAddressPort},原因:{ex.ToString()}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{DateTime.Now.ToString("yyyyMMdd")}\Mes心跳报警\{DateTime.Now.ToString("HH")}.txt", errStr); + } + Thread.Sleep(1000); + } + } + + /// + /// Ping 检查网络线路问题 + /// + /// + public bool Ping() + { + try + { + string strIP = CommonMethods.mesConfig.MESURLAddressIP; + int port = Convert.ToInt32(CommonMethods.mesConfig.MESURLAddressPort); + IPAddress ip = IPAddress.Parse(strIP); + IPEndPoint _endPoint = new IPEndPoint(ip, port); + + if (_endPoint.Address == null) + { + return false; + } + + Ping _ping = new Ping(); + int timeout = 1000; + PingReply mPingRcv = _ping.Send(_endPoint.Address, timeout); + return (mPingRcv.Status == IPStatus.Success) ? true : false; + } + catch (Exception ex) + { + string errStr = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},Mes心跳Ping异常,IP:{CommonMethods.mesConfig.MESURLAddressIP},端口号:{CommonMethods.mesConfig.MESURLAddressPort},原因:{ex.ToString()}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{DateTime.Now.ToString("yyyyMMdd")}\Mes心跳报警\{DateTime.Now.ToString("HH")}.txt", errStr); + return false; + } + + } + #endregion + + #region 4、心跳和状态检查 + /// + /// 心跳检测 + /// + /// + /// + private async Task StartHeartbeatCheck(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + if (CommonMethods.IsRun) + { + foreach (var plc in CommonMethods.plcDevices) + { + if (plcDeviceMapping.TryGetValue(plc, out var plcDevices)) + { + foreach (var plcDevice in plcDevices) + { + if (plcDevice.IsActive && plcDevice.IsHeartBeat) + { + await CheckHeartbeatForDevice(plc, plcDevice); + //await ShowStateEven_RunAsync(); + } + } + } + } + } + await Task.Delay(HeartbeatInterval, cancellationToken); + } + } + + /// + /// + /// + /// + /// + /// + private async Task CheckHeartbeatForDevice(PlcReadWriteBase plc, PlcDevice plcDevice) + { + if (plcDevice.IsConnected) + { + JYResult result = await Task.Run(() => plc.ReadValue>(plcDevice.HeartBeat, DataType.Short)); + if (result.IsSuccess) + { + plcDevice.ErrorTimes = 0; + JYResult res = await Task.Run(() => plc.WriteValue(plcDevice.HeartBeat, (short)1, DataType.Short)); + if (!res.IsSuccess) + { + plcDevice.IsConnected = false; + LogHelper.Instance.WriteLog($"PLC编号:{plcDevice.PlcNum}=心跳写入异常:{res.Message}!!!"); + } + } + else + { + HandleHeartbeatFailure(plcDevice, result); + } + } + else + { + await ReconnectDevice(plc, plcDevice); + } + } + + private void HandleHeartbeatFailure(PlcDevice plcDevice, JYResult result) + { + plcDevice.ErrorTimes++; + plcDevice.IsConnected = false; + if (plcDevice.ErrorTimes >= plcDevice.AllowErrorTimes) + { + LogHelper.Instance.WriteLog($"编号:[{plcDevice.PlcNum}]的PLC链接断开:{result.Message}"); + } + } + + private async Task ReconnectDevice(PlcReadWriteBase plc, PlcDevice plcDevice) + { + if (!plcDevice.IsFirstConnect) + { + await Task.Delay(plcDevice.ReConnectTime); + plc.Disconnect(); + } + string msg = ""; + var connectResult = await Task.Run(() => plc.Connect(ref msg)); + plcDevice.IsConnected = connectResult; + LogHelper.Instance.WriteLog(connectResult + ? $"PLC编号:{plcDevice.PlcNum}{(plcDevice.IsFirstConnect ? "初次" : "重新")}连接成功{msg}!" + : $"[{plcDevice.PlcNum}]#PLC{(plcDevice.IsFirstConnect ? "初次" : "重新")}连接失败{msg}!"); + + plcDevice.IsFirstConnect = false; + } + + #endregion + + #region 5、报警处理 × + //private async Task CheckAlarmsAsync(PlcReadWriteBase plc, string guidAlarm) + //{ + // if (plc == null) + // { + // CommonMethods.AddDataMonitorLog(2, "PLC 对象为 null".Translated()); + // return; + // } + + // if (!plc.IsConnected) + // { + // CommonMethods.AddDataMonitorLog(2, "PLC 未连接".Translated()); + // return; + // } + + // if (plcAlarmReaders.TryGetValue(plc, out var alarmReader)) + // { + // try + // { + // JYResult result = null; + + // // 使用 Task.Run 和超时机制 + // var task = Task.Run(() => + // { + // try + // { + // return plc.ReadValue>("D10000", DataType.ArrUshort, 20); + // } + // catch (Exception ex) + // { + // CommonMethods.AddDataMonitorLog(2, "PLC 读取过程中发生异常".Translated() + $": {ex.Message}"); + // return null; + // } + // }); + + // // 设置5秒超时 + // if (await Task.WhenAny(task, Task.Delay(5000)) == task) + // { + // result = await task; + // } + // else + // { + // throw new TimeoutException("PLC 读取操作超时"); + // } + + // if (result == null) + // { + // throw new InvalidOperationException("PLC 读取操作返回空结果"); + // } + + // if (!result.IsSuccess) + // { + // throw new InvalidOperationException($"PLC 读取操作失败: {result.Message}"); + // } + + // if (result.Content == null) + // { + // throw new InvalidOperationException("PLC 读取操作返回空内容"); + // } + + // ushort[] alarmData = result.Content; + + // // 使用 alarmData 进行后续操作 + // bool isAlarming = alarmReader.IsPLCAlarm(10000, 20, alarmData); + + // if (isAlarming) + // { + // foreach (var alarm in alarmReader.RecordAlarms) + // { + // CommonMethods.AddDataMonitorLog(1, $"当前报警: 代码 {alarm.AlarmCode}, 内容 {alarm.AlarmInfo}, 开始时间 {alarm.StartTime}"); + // } + // } + // } + // catch (Exception ex) + // { + // CommonMethods.AddDataMonitorLog(2, $"检查报警时发生错误: {ex.Message}"); + // } + // } + // else + // { + // CommonMethods.AddDataMonitorLog(2, $"未找到 PLC 的报警读取器"); + // } + //} + + /// + /// 新增报警 + /// + /// + /// + //private void AlrmReader_PLCAlarm_New(object sender, RecordAlarmDataArgs e) + //{ + // Task.Run(() => + // { + // CommonMethods.alarmManager.AddAlarm(e); + // Debug.WriteLine($"新报警: 代码 {e.AlarmCode}, 内容 {e.AlarmInfo}, 日期 {e.AlarmDate}, 开始时间 {e.StartTime:HH:mm:ss}"); + // }); + //} + + /// + /// 报警结束移除报警 + /// + /// + /// + //private void AlrmReader_PLCAlarm_Remove(object sender, RecordAlarmDataArgs e) + //{ + // Task.Run(() => + // { + // CommonMethods.alarmManager.RemoveAlarm(e); + // Debug.WriteLine($"报警清除: 代码 {e.AlarmCode}, 内容 {e.AlarmInfo}, 日期 {e.AlarmDate}, 结束时间 {DateTime.Now:HH:mm:ss}"); + // }); + //} + + #endregion + + #region 6、设备状态检查 × + + /// + /// 设备状态 + /// + /// + //private async Task ShowStateEven_RunAsync() + //{ + // try + // { + // string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + // foreach (var plc in CommonMethods.plcDevices) + // { + // if (plcDeviceMapping.TryGetValue(plc, out var plcDevices)) + // { + // foreach (var plcDevice in plcDevices) + // { + // if (plcDevice.IsConnected) + // { + // var plcStatus = CommonMethods.plcStatuses[plc]; + // bool isUpload = false; + // string deviceStatus = string.Empty; + // string deviceStatusDesc = string.Empty; + // short newStatus = 100; + // newStatus = await Task.Run(() => plc.ReadValue>("D10", DataType.Short).Content); + + // if (newStatus != 100) + // { + // if (newStatus != (short)plcStatus["OldStatus"]) + // { + // // 从 Alert 切换到非 Alert 状态时,上传报警信息 + // if ((short)plcStatus["OldStatus"] == 3 && newStatus != 3) + // { + // await CheckAlarmsAsync(plc, (string)plcStatus["GuidAlarm"]); + // } + + // // 只要状态变更,就生成新的 GUID + // plcStatus["GuidAlarm"] = Guid.NewGuid().ToString(); + + // isUpload = true; + // plcStatus["StatusCount"] = 0; + // plcStatus["OldStatus"] = newStatus; + // } + // else + // { + // plcStatus["StatusCount"] = (int)plcStatus["StatusCount"] + 1; + // if ((int)plcStatus["StatusCount"] >= 5 * 60) + // { + // isUpload = true; + // plcStatus["StatusCount"] = 0; + // } + // } + + // (deviceStatus, deviceStatusDesc) = newStatus switch + // { + // 1 => ("Run", "正常运行"), + // 2 => ("Maintain", "停止运行"), + // 3 => ("Alert", "故障调试"), + // 4 => ("Idle", "闲置待机"), + // _ => (string.Empty, string.Empty) + // }; + + // plcStatus["Status"] = new List { newStatus == 1, newStatus == 2, newStatus == 3, newStatus == 4 }; + // CommonMethods.Statues = new List { newStatus == 1, newStatus == 2, newStatus == 3, newStatus == 4 }; + // if (newStatus == 3) //报警状态 + // { + // await CheckAlarmsAsync(plc, (string)plcStatus["GuidAlarm"]); + // } + // else if (newStatus == 4) //闲置状态 + // { + // await ShowStuesEven_Run(Date, (string)plcStatus["GuidAlarm"], plc); + // } + + // if (isUpload) + // { + // CommonMethods.AddDataMonitorLog(1, $"PLC[{plcDevice.PlcNum}]状态: {deviceStatusDesc}"); + // } + // if (CommonMethods.sysConfig.MesModeSwitching) + // { + // // 上传设备状态信息 + // if (CommonMethods.sysConfig.MesModeSwitching && isUpload && (newStatus == 1 || newStatus == 3 || newStatus == 4)) + // { + // var (success, message) = await CommonMethods.hbgMes.UploadEquStatusAsync( + // CommonMethods.mesConfig.DeviceStatus, + // CommonMethods.mesConfig.siteCode, + // CommonMethods.mesConfig.lineCode, + // CommonMethods.mesConfig.equipNum, + // CommonMethods.mesConfig.MaterialCode, + // CommonMethods.mesConfig.mesUserName, + // strGuidAlarm, // RUN 状态时传空 + // deviceStatus, + // null + // ); + + // if (success) + // { + // StatuesCount = 0; + // } + // } + // } + // } + // } + // } + // } + // } + // } + // catch (Exception ex) + // { + // await Task.Run(() => LogHelper.Instance.WriteEX(ex)); + // } + //} + + + /// + /// HMI手动触摸屏状态 + /// + /// + /// + /// + /// + //private async Task ShowStuesEven_Run(string Date, string strGuid, PlcReadWriteBase plc) + //{ + // if (plc.IsConnected) + // { + // string strCode = ""; + // string strText = ""; + // short HMIStatus = await Task.Run(() => plc.ReadValue>("D40", DataType.Short).Content); + + // if (HMIStatus != 0) + // { + // CommonMethods.AddDataMonitorLog(1, "触发了手动HMI弹窗功能!"); + // (strCode, strText) = HMIStatus switch + // { + // 1 => ("B1", "计划维保"), + // 2 => ("B2", "无生产计划"), + // 3 => ("B3", "样品、试产"), + // 4 => ("B4", "其他计划停机"), + // 5 => ("D1", "设备故障"), + // 6 => ("D2", "设备转型"), + // 7 => ("D3", "工程变更"), + // 8 => ("D4", "MES停机"), + // 9 => ("D5", "品质异常"), + // 10 => ("D6", "配件、物料更换"), + // 11 => ("D7", "来料不良"), + // 12 => ("D8", "待料"), + // 13 => ("D9", "品质检查"), + // 14 => ("D10", "清洁点检"), + // 15 => ("D11", "环境不满足"), + // 16 => ("D12", "其它非计划停机"), + // _ => (string.Empty, string.Empty) + // }; + + // if (!string.IsNullOrEmpty(strCode)) + // { + // CommonMethods.AddDataMonitorLog(1, $"{strCode} {strText}"); + // } + + + // if (CommonMethods.sysConfig.MesModeSwitching) + // { + // List alarmObj = new List(); + // AlarmData alarmData = new AlarmData(); + // alarmData.AlarmCode = strCode; + // alarmData.StartTime = ""; + // alarmData.EndTime = ""; + // alarmData.AlarmType = "非计划损失"; + // alarmData.AlarmContent = strText; + // alarmObj.Add(alarmData); + // //上传报警 + // var (success, message) = await CommonMethods.hbgMes.UploadEquAlarmAsync(CommonMethods.mesConfig.DeviceAlarm, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, + // CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.mesUserName, alarmObj, strGuid); + // if (success) + // CommonMethods.AddDataMonitorLog(0, $"HMI手动弹窗状态已上传成功,代码:{strCode}"); + // } + // bool IsSuccess = CommonMethods.plcDevices[0].WriteInt16("D40", 0); + // if (IsSuccess) + // CommonMethods.AddDataMonitorLog(0, $"D40已复位0"); + + // } + // } + //} + + #endregion + + #region 定时刷新数据 + + int TotalNum = 0; + int TotalNum1 = 0; + int Regular = 0; + int JetBeat = 0; + private void Timer_RefreshData_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + if (Regular >= 300) + { + Task.Run(() => + { + UploadEquEnergy();//能耗 + //ReUpProducResultParam();//定时补传 + }); + Regular = 0; + } + if (TotalNum > 4) + { + GetEnergyData(); + //GetEnergyDataFormPlc(); + Refresh12HourProdQty(); + GetDefectTypeQty(); + ReadPLCComm(); + + GetASqlAlarmData(DateTime.Today, CommonMethods.strClass); + TotalNum = 0; + } + else if (TotalNum == 2)//设备状态读取 + { + SetClass(); //变更班次 + } + + Task.Run(() => + { + ShowStateEven_Run(); + }); + + if (TotalNum1 >= 3600 * 24) + { + Task.Run(() => + { + DeleteFileOfLocal(); + }); + TotalNum1 = 0; + } + + //电能表心跳 + //if (jetBeat > 5) + //{ + // if (!CommonMethods.energyMeter.Connected) + // { + // CommonMethods.energyMeter.SetTCPParams(IPAddress.Parse("192.168.1.25"), 502); + // CommonMethods.energyMeter.Connect(); + // } + // jetBeat = 0; + //} + + //jetBeat++; + TotalNum++; + TotalNum1++; + Regular++; + } + #endregion + + #region 设备综合信息 + /// + /// 读取PLC通用信息 + /// + internal void ReadPLCComm() + { + if (CommonMethods.plcDevices.Count != 0 && CommonMethods.plcDevices[0].IsConnected) + { + Task.Run(() => + { + UpTotalCount(null); + }); + + CommonMethods.TotalQty = CommonMethods.plcDevices[0].ReadFloat("D15");//生产总数 + CommonMethods.ProOKQty = CommonMethods.plcDevices[0].ReadFloat("D17");//良品总数 + + CommonMethods.Ppm = CommonMethods.plcDevices[0].ReadFloat("D13"); + CommonMethods.JiaDL = Convert.ToDouble(CommonMethods.plcDevices[0].ReadFloat("D11").ToString("F2")); + + #region 开机时间/运行时间 + CommonMethods.PlcOpenAndRunTime = GetList(6, 0); + JYResult resByte = CommonMethods.plcDevices[0].ReadValue>($"D50", DataType.ArrByte, 12); + if (resByte.IsSuccess && resByte.Content.Length >= 24) + { + for (int i = 0; i < CommonMethods.PlcOpenAndRunTimeAdress.Count; i++) + { + CommonMethods.PlcOpenAndRunTime[i] = IntLib.GetIntFromByteArray(resByte.Content, i * 4, DataFormat.CDAB);//ShortLib.GetShortFromByteArray(resByte.Content, i * 4, DataFormat.CDAB); + } + } + #endregion + } + + } + #endregion + + #region 保存12小时产能数据 + public int totalNum = 0; // 总数 + public int okNum = 0; // 良品数 + + /// + /// 储存数据到数据库 + /// + /// + public void UpTotalCount(int[] DataCount) + { + + try + { + DateTime dateTime = DateTime.Now; + string strDate = dateTime.ToString("yyyy-MM-dd"); + + // 获取当前时间的小时和分钟 + int currentHour = dateTime.Hour; + int currentMinute = dateTime.Minute; + + // 根据当前分钟确定统计小时 + // 如果当前时间在 X:30 之前,则统计的是前一个小时的数据(从前一个小时的30分到这个小时的29分) + // 如果当前时间在 X:30 之后,则统计的是当前小时的数据(从当前小时的30分到下个小时的29分) + int statisticalHour; + if (currentMinute < 30) + { + statisticalHour = (currentHour + 23) % 24; // 前一个小时,处理跨天的情况 + // 如果是凌晨0点前的数据,需要使用前一天的日期 + if (currentHour == 0) + { + strDate = dateTime.AddDays(-1).ToString("yyyy-MM-dd"); + } + } + else + { + statisticalHour = currentHour; + } + + // 数据有效性验证 + if (statisticalHour < 0 || statisticalHour > 23) + { + throw new ArgumentException($"无效的小时值: {statisticalHour}"); + } + + //读取统计小时的PLC投入总数和产出数 + int ProdCurrAllQty = GetToDayHourQty(statisticalHour, true); + int ProdCurrOKQty = GetToDayHourQty(statisticalHour, false); + + // 确保数量为非负数 + if (ProdCurrAllQty < 0 || ProdCurrOKQty < 0) + { + LogHelper.Instance.WriteError($"产量不能为负数: 投入={ProdCurrAllQty}, 产出={ProdCurrOKQty}"); + //throw new ArgumentException($"产量不能为负数: 投入={ProdCurrAllQty}, 产出={ProdCurrOKQty}"); + } + + Hourprod mh = new Hourprod + { + FDate = strDate, + FHour = statisticalHour, + ProdIn = ProdCurrAllQty, + ProdOut = ProdCurrOKQty, + TestTime = dateTime, + Ppm = (int)CommonMethods.Ppm, + JiaDL = Convert.ToDecimal(CommonMethods.JiaDL) + }; + + // 尝试更新记录 + int res = CommonMethods.db.UpdateSingle( + mh, + it => new Hourprod + { + ProdIn = mh.ProdIn, + ProdOut = mh.ProdOut, + TestTime = mh.TestTime, + Ppm = mh.Ppm, + JiaDL = mh.JiaDL + }, + it => it.FDate == mh.FDate && it.FHour == mh.FHour + ); + + // 如果更新失败(记录不存在),则新增记录 + if (res <= 0) + { + bool addResult = CommonMethods.db.AddReturnBool(mh); + if (!addResult) + { + LogHelper.Instance.WriteError($"保存小时产能新增记录失败"); + } + } + + // 可以添加日志记录成功信息 + // Logger.Log($"成功更新/新增产能数据: 日期={strDate}, 小时={statisticalHour}, 时段={statisticalHour}:30~{(statisticalHour + 1) % 24}:29"); + } + catch (Exception ex) + { + // 这里应该添加错误日志记录 + LogHelper.Instance.WriteEX($"保存小时产能数据失败: ", ex); + } + } + + /// + /// 每小时产能读取处理 + /// + /// + /// + /// + private int GetToDayHourQty(int hour, bool flag) + { + try + { + string strAddr = ""; + + if (flag)//产出 + { + strAddr = "D" + (1040 + hour); + } + else//良品数 + { + strAddr = "D" + (1070 + hour); + } + int ProdNGQty = CommonMethods.plcDevices[0].ReadInt16(strAddr); + return ProdNGQty; + + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand); + } + return 0; + } + + #endregion + + #region 5、设备状态 + /// + /// 定时获取设备状态 + /// + /// + /// + int OldStatues = Convert.ToInt32(IniConfigHelper.ReadIniData("上一次设备状态", "DeviceStatus", "1", CommonMethods.strDeviceStatusPath));//退出程序前设备状态 + int StatuesCount = 0; + DateTime StatuesBeginTime = DateTime.Now.AddMinutes(-6); + string strGuidAlarm = IniConfigHelper.ReadIniData("上一次Guid", "DeviceGuid", Guid.NewGuid().ToString(), CommonMethods.strDeviceStatusPath);//退出程序前Guid + bool run_AlarmMark = false;//特殊情况1标志(运行状态) + bool run_IdleMark = false;//特殊情况2标志(闲置状态) + bool isUpIdleAlarm = false;//闲置状态报警信息上传标志 + List idleAlarmData = new List();//闲置状态的报警信息 + + private async void ShowStateEven_Run() + { + try + { + if (CommonMethods.plcDevices.Count > 0 && CommonMethods.plcDevices != null) + { + if (CommonMethods.plcDevices[0] != null && CommonMethods.plcDevices[0].IsConnected) + { + DateTime Date = DateTime.Now; + bool isUpload = false; + string deviceStatus = string.Empty; + string deviceStatusDesc = string.Empty; + short NewStatus = CommonMethods.plcDevices[0].ReadInt16("D10"); + + if (NewStatus != 100) + { + //特殊情况1:运行->报警->……->运行 + if (NewStatus == 3 && OldStatues == 1) { run_AlarmMark = true; }//第一次进入报警状态 + if (NewStatus == 1) { run_AlarmMark = false; }//下一次运行状态,置位 + if (run_AlarmMark) { NewStatus = 3; }//报警状态后下一次运行状态期间一直是报警状态 + //特殊情况2:运行->闲置->……->运行 + if (NewStatus == 4 && OldStatues == 1) { run_IdleMark = true; }//第一次进入闲置状态 + if (NewStatus == 1) { run_IdleMark = false; }//下一次闲置状态,置位 + if (run_IdleMark) { NewStatus = 4; }//闲置状态后下一次运行状态期间一直是闲置状态 + + //闲置状态结束报警信息上传 + if (OldStatues == 4 && NewStatus != 4 && isUpIdleAlarm) + { + _ = UpIdleDataAsync(idleAlarmData, strGuidAlarm); + } + + //设备状态信号灯变量 + CommonMethods.Statues = new List { NewStatus == 1, NewStatus == 2, NewStatus == 3, NewStatus == 4 }; + + // 状态切换时生成新的 GUID + if (NewStatus != OldStatues) + { + // 从 Alert 切换到非 Alert 状态时,上传报警信息 + if (OldStatues == 3 && NewStatus != 3) + { + ShowAlarmEven_Run(strGuidAlarm); + } + + // 只要状态变更,就生成新的 GUID + strGuidAlarm = Guid.NewGuid().ToString(); // 强制生成新的 GUID + + isUpload = true; + //StatuesCount = 0; + OldStatues = NewStatus; + StatuesBeginTime = Convert.ToDateTime(Date); + + //记录最新设备状态和Guid + //CommonMethods.UpdateConfig("MES_CONFIG", "DeviceStatus", NewStatus.ToString());// 保存设备状态到xml文件 + //CommonMethods.UpdateConfig("MES_CONFIG", "Guid", strGuidAlarm);// 保存设备状态到xml文件 + + //CommonMethods.Configxml["MES_CONFIG"]["DeviceStatus"] = NewStatus.ToString(); // 保存设备状态到xml文件 + //CommonMethods.Configxml["MES_CONFIG"]["Guid"] = strGuidAlarm; // 保存设备状态到xml文件 + //CommonMethods.WriteXmlFile(CommonMethods.Configxml, CommonMethods.xmlFilePath); + + IniConfigHelper.WriteIniData("上一次设备状态", "DeviceStatus", NewStatus.ToString(), CommonMethods.strDeviceStatusPath); + IniConfigHelper.WriteIniData("上一次Guid", "DeviceGuid", strGuidAlarm, CommonMethods.strDeviceStatusPath); + } + else + { + // 同种状态持续 5 分钟时上传状态信息 + //StatuesCount++; + //if (StatuesCount >= 5 * 60) + //{ + // isUpload = true; + // StatuesCount = 0; + //} + if (Date.Subtract(StatuesBeginTime).TotalSeconds >= 5 * 60) + { + isUpload = true; + StatuesBeginTime = DateTime.Now; + } + } + + // 根据状态设置设备状态和描述 + switch (NewStatus) + { + case 1: + deviceStatus = "Run"; + deviceStatusDesc = "正常运行"; + break; + case 2://取消 + deviceStatus = "Maintain"; + deviceStatusDesc = "停止运行"; + break; + case 3: + deviceStatus = "Alert"; + deviceStatusDesc = "故障调试"; + // Alert 状态时上传报警信息 + ShowAlarmEven_Run(strGuidAlarm); + break; + case 4: + deviceStatus = "Idle"; + deviceStatusDesc = "闲置待机"; + ShowStuesEven_Run(strGuidAlarm); + break; + } + + // 上传设备状态信息 + if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected && isUpload && (NewStatus == 1 || NewStatus == 3 || NewStatus == 4)) + { + var (success, message) = await CommonMethods.hbgMes.UploadEquStatusAsync( + CommonMethods.mesConfig.DeviceStatus, + CommonMethods.mesConfig.siteCode, + CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, + CommonMethods.mesConfig.MaterialCode, + CommonMethods.mesConfig.mesUserName, + strGuidAlarm, // RUN 状态时传空 + deviceStatus, + null + ); + + if (success) + { + StatuesCount = 0; + } + } + } + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + + #region 触摸屏弹窗 + private async void ShowStuesEven_Run(string strGuid) + { + if (CommonMethods.plcDevices[0].IsConnected) + { + string strCode = ""; + string alarmName = ""; + short HMIStatus = CommonMethods.plcDevices[0].ReadInt16("D40"); + if (HMIStatus != 0) + { + CommonMethods.AddDataMonitorLog(0, "触发了手动HMI弹窗功能".Translated()); + switch (HMIStatus) //注意:B1-D12都为闲置代码,上传代码是只需上传闲置代码 + { + //case 1://取消 + // strCode = "B1"; + // alarmName = "计划维保"; + // CommonMethods.AddDataMonitorLog(0, "B1 计划维保"); + + // break; + //case 2://取消 + // strCode = "B2"; + // alarmName = "无生产计划"; + // CommonMethods.AddDataMonitorLog(0, "B2 无生产计划"); + // break; + //case 3://取消 + // strCode = "B3"; + // alarmName = "样品、试产"; + // CommonMethods.AddDataMonitorLog(0, "B3 样品、试产"); + // break; + //case 4://取消 + // strCode = "B4"; + // alarmName = "其他计划停机"; + // CommonMethods.AddDataMonitorLog(0, "B4.其他计划停机"); + // break; + case 5: + strCode = "D1"; + alarmName = "设备故障".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 6: + strCode = "D2"; + alarmName = "设备转型".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 7: + strCode = "D3"; + alarmName = "工程变更".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 8: + strCode = "D4"; + alarmName = "MES停机".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 9: + strCode = "D5"; + alarmName = "品质异常".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 10: + strCode = "D6"; + alarmName = "配件,物料更换".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 11: + strCode = "D7"; + alarmName = "来料不良".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 12: + strCode = "D8"; + alarmName = "待料".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 13: + strCode = "D9"; + alarmName = "品质检查".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 14: + strCode = "D10"; + alarmName = "清洁点检".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 15: + strCode = "D11"; + alarmName = "环境不满足".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + case 16: + strCode = "D12"; + alarmName = "其它非计划停机".Translated(); + CommonMethods.AddDataMonitorLog(0, $"{strCode} {alarmName}"); + break; + default: + break; + } + + if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) + { + List alarmObj = new List(); + AlarmData alarmData = new AlarmData(); + alarmData.AlarmCode = strCode; + alarmData.StartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + alarmData.EndTime = ""; + alarmData.AlarmType = "非计划损失"; + alarmData.AlarmContent = alarmName; + alarmObj.Add(alarmData); + + //闲置报警上传标志 + isUpIdleAlarm = true; + idleAlarmData.Add(alarmData); + + //上传报警 + var (success, message) = await CommonMethods.hbgMes.UploadEquAlarmAsync(CommonMethods.mesConfig.DeviceAlarm, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.mesUserName, alarmObj, strGuid); + if (success) + CommonMethods.AddDataMonitorLog(0, "HMI手动弹窗状态已上传成功,代码".Translated() + $":{strCode}"); + } + bool IsSuccess = CommonMethods.plcDevices[0].WriteInt16("D40", 0); + if (IsSuccess) + CommonMethods.AddDataMonitorLog(0, $"D40已复位0".Translated()); + + } + } + } + + #endregion + + /// + /// HMI手动弹窗结束状态上传 + /// + /// + /// + /// + private async Task UpIdleDataAsync(List idleAlarmDate, string strGuidAlarm) + { + if (idleAlarmDate.Count == 0) { return; } + string strCode = ""; + foreach (var item in idleAlarmDate) + { + item.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + strCode = item.AlarmCode + ","; + } + if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) + { + //上传报警 + var (success, message) = await CommonMethods.hbgMes.UploadEquAlarmAsync(CommonMethods.mesConfig.DeviceAlarm, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.mesUserName, idleAlarmDate, strGuidAlarm); + if (success) + CommonMethods.AddDataMonitorLog(0, "HMI手动弹窗结束状态已上传成功,代码".Translated() + $":{strCode.TrimEnd(',')}"); + } + idleAlarmData.Clear(); + isUpIdleAlarm = false; + } + + #endregion + + #region 6、设备报警 + //报警表单数据 + List listAlarmForm = null; + public void GetAlarmData() + { + //加载PLC报警文件 + try + { + string strFileName = System.Environment.CurrentDirectory + "\\欧姆龙报警寄存器对应表.csv"; + listAlarmForm = CSVHelper.ReadCSV(strFileName); + } + catch (Exception ex) + { + MessageBox.Show("加载报警文件失败!"); + } + + } + + /// + /// 报警信息读取 + /// + /// + /// + List listOld = new List(); + List listNew = new List(); + List listAlarmStatus = null; + private async void ShowAlarmEven_Run(string strGuidAlarm) + { + if (!CommonMethods.IsRun || !CommonMethods.plcDevices[0].IsConnected) + { + return; + } + + try + { + // 1. 读取 PLC 报警信息 + var alarmStatusList = ReadAlarmStatusFromPLC(); + if (alarmStatusList == null || listAlarmForm == null)//true + { + return; + } + + // 2. 解析报警信息并生成新的报警列表 + var newAlarms = ParseAlarmStatus(alarmStatusList, strGuidAlarm); + if (newAlarms.Count > 0) + { + // 3. 检测新报警并添加到旧报警列表,上传第一次报警信息 + await DetectNewAlarmsAsync(newAlarms); + + // 4. 显示新报警信息 + DisplayAlarmInfo(newAlarms); + } + + // 5. 检测已取消的报警并处理 + var canceledAlarms = DetectCanceledAlarms(newAlarms); + if (canceledAlarms.Count > 0) + { + // 6. 记录已取消的报警信息(保存本地) + LogCanceledAlarms(canceledAlarms); + + // 7. 上传已取消的报警信息(报警结束上传一次) + await UploadCanceledAlarmsAsync(canceledAlarms, strGuidAlarm); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + /// + /// 从 PLC 读取报警状态 + /// + private List ReadAlarmStatusFromPLC() + { + //string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + //JYResult resByte = CommonMethods.plcDevices[0].ReadValue>("D10150", DataType.ArrByte, 5000); + + //if (resByte.IsSuccess && resByte != null) + //{ + // int startPlcAddr = 10150; // 读取起始地址 + // return PLCAlarmParseHelper.OmronFinsByte2Status(startPlcAddr, resByte.Content); + //} + string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + // 读取足够的字节覆盖所有可能的报警地址 + int startAddr = 10010; + int endAddr = 10519; // 根据实际最大地址调整 + int wordCount = endAddr - startAddr + 1; + int byteCount = wordCount * 2; // 每个字2字节 + + JYResult resByte = CommonMethods.plcDevices[0].ReadValue>( + $"D{startAddr}", DataType.ArrByte, (ushort)byteCount); + + if (resByte.IsSuccess && resByte.Content != null) + { + return PLCAlarmParseHelper.OmronFinsByte2Status(startAddr, resByte.Content); + } + + return null; + } + + /// + /// 解析报警状态并生成新的报警列表 + /// + private List ParseAlarmStatus(List alarmStatusList, string strGuidAlarm) + { + string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + switch (LanguageManager.LanguageCode) + { + case "en"://英语报警信息 + return alarmStatusList + .Where(s => s.Status) + .Join(listAlarmForm, s => s.PLCAdress, f => f.PLCAdress, (s, f) => new AlarmData() + { + AlarmGuid = strGuidAlarm, + PLCAdress = s.PLCAdress, + AlarmCode = f.AlarmCode, + AlarmContent = f.EnAlarmContent == "" ? s.PLCAdress : f.EnAlarmContent, + AlarmType = "停机报警", + AlarmDesc = f.EnAlarmContent == "" ? s.PLCAdress : f.EnAlarmContent, + AlarmState = "1", + StartTime = Date, + EndTime = "",//Date + Flag = 0 + }).ToList(); + case "hu"://匈牙利语报警信息 + return alarmStatusList + .Where(s => s.Status) + .Join(listAlarmForm, s => s.PLCAdress, f => f.PLCAdress, (s, f) => new AlarmData() + { + AlarmGuid = strGuidAlarm, + PLCAdress = s.PLCAdress, + AlarmCode = f.AlarmCode, + AlarmContent = f.HuAlarmContent == "" ? s.PLCAdress : f.HuAlarmContent, + AlarmType = "停机报警", + AlarmDesc = f.HuAlarmContent == "" ? s.PLCAdress : f.HuAlarmContent, + AlarmState = "1", + StartTime = Date, + EndTime = "",//Date + Flag = 0 + }).ToList(); + case "ms"://马来语报警信息 + return alarmStatusList + .Where(s => s.Status) + .Join(listAlarmForm, s => s.PLCAdress, f => f.PLCAdress, (s, f) => new AlarmData() + { + AlarmGuid = strGuidAlarm, + PLCAdress = s.PLCAdress, + AlarmCode = f.AlarmCode, + AlarmContent = f.MsAlarmContent == "" ? s.PLCAdress : f.MsAlarmContent, + AlarmType = "停机报警", + AlarmDesc = f.MsAlarmContent == "" ? s.PLCAdress : f.MsAlarmContent, + AlarmState = "1", + StartTime = Date, + EndTime = "",//Date + Flag = 0 + }).ToList(); + case "zh"://中语报警信息 + default: + return alarmStatusList + .Where(s => s.Status) + .Join(listAlarmForm, s => s.PLCAdress, f => f.PLCAdress, (s, f) => new AlarmData() + { + AlarmGuid = strGuidAlarm, + PLCAdress = s.PLCAdress, + AlarmCode = f.AlarmCode, + AlarmContent = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent, + AlarmType = "停机报警", + AlarmDesc = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent, + AlarmState = "1", + StartTime = Date, + EndTime = "",//Date + Flag = 0 + }).ToList(); + } + } + + /// + /// 检测新报警并添加到旧报警列表 + /// + private async Task DetectNewAlarmsAsync(List newAlarms) + { + foreach (var alarm in newAlarms) + { + if (!listOld.Any(o => o.PLCAdress == alarm.PLCAdress)) + { + listOld.Add(alarm); + + // 4.5 新增逻辑(报警开始上传一次) + await UploadCanceledAlarmsAsync(newAlarms, strGuidAlarm); + } + } + } + + /// + /// 显示报警信息 + /// + private void DisplayAlarmInfo(List newAlarms) + { + StringBuilder sb = new StringBuilder(); + newAlarms.ForEach(r => sb.Append($"{r.AlarmContent} ")); + + if (sb.Length > 0) + { + CommonMethods.SlideAlarmText = sb.ToString().Substring(0, sb.Length - 10); + } + } + + /// + /// 检测已取消的报警 + /// + private List DetectCanceledAlarms(List newAlarms) + { + var canceledAlarms = new List(); + var listOldAlarm = new List(listOld); + + foreach (var item in listOldAlarm) + { + if (!newAlarms.Any(n => n.PLCAdress == item.PLCAdress)) + { + item.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + canceledAlarms.Add(item); + listOld.Remove(item); + } + } + + return canceledAlarms; + } + + /// + /// 记录已取消的报警信息 + /// + private void LogCanceledAlarms(List canceledAlarms) + { + var nowDate = DateTime.Now; + string basePath = $@"{CommonMethods.strAlarmLogspath}\{nowDate.Year}\{nowDate.Month}"; + string fileName = $@"{nowDate.Day}.csv"; + string title = "GUID,报警地址,故障代码,报警内容,开始时间,结束时间,是否停机"; + string alarmContent = string.Join("\n", canceledAlarms.Select(m1 => + $"{m1.AlarmGuid},{m1.PLCAdress},{m1.AlarmCode},{m1.AlarmContent},{m1.StartTime},{m1.EndTime},{m1.AlarmType}")); + + CSVHelper.WriterCSV(basePath, fileName, title, alarmContent); + + foreach (var m1 in canceledAlarms) + { + var alarm = new SysLog + { + InsertTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + LogType = "报警日志", + Note = m1.AlarmContent == "" ? m1.PLCAdress : m1.AlarmContent, + AlarmType = "错误", + Operater = CommonMethods.currentAdmin.LoginName, + VarName = m1.PLCAdress, + AlarmSet = "", + AlarmValue = "1", + }; + // 显示报警信息 + CommonMethods.AddAlarmLog(alarm); + // 告警TOP10保存 + SaveAlarmCount(canceledAlarms); + } + } + + /// + /// 上传已取消的报警信息 + /// + private async Task UploadCanceledAlarmsAsync(List canceledAlarms, string strGuidAlarm) + { + if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) + { + await CommonMethods.hbgMes.UploadEquAlarmAsync( + CommonMethods.mesConfig.DeviceAlarm, + CommonMethods.mesConfig.siteCode, + CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, + CommonMethods.mesConfig.MaterialCode, + CommonMethods.mesConfig.mesUserName, + canceledAlarms, + strGuidAlarm + ); + } + } + + + /// + /// 告警TOP10保存 + /// + private void SaveAlarmCount(List alarmDatas) + { + bool ISAdd = false; + var recordToUpdate = new AlarmCountEntry(); + + DateTime today = DateTime.Today; + DateTime upTime = DateTime.Now; + var listAlarmStatistics = CommonMethods.db.QueryWhereList(it => Convert.ToDateTime(it.AlarmTime.ToString("yyyy-MM-dd")) == today); + List fd = new List(); + if (listAlarmStatistics != null) + { + alarmDatas.ForEach(r => + { + recordToUpdate = listAlarmStatistics.FirstOrDefault(x => x.PLCAdress.Trim() == r.PLCAdress); + if (recordToUpdate != null) + { + CommonMethods.db.Update(it => it.AlarmCount == it.AlarmCount + 1, it => it.PLCAdress == r.PLCAdress && Convert.ToDateTime(it.AlarmTime.ToString("yyyy-MM-dd")) == today); + } + else + { + ISAdd = true; + AlarmCountEntry alarm = new AlarmCountEntry(); + alarm.PLCAdress = r.PLCAdress; + alarm.AlarmContent = r.AlarmContent; + alarm.AlarmCount = 1; + alarm.Class = CommonMethods.strClass; + alarm.AlarmTime = upTime; + fd.Add(alarm); + } + }); + if (ISAdd) + { + bool res = CommonMethods.db.AddReturnBool(fd); + ISAdd = false; + } + } + else + { + foreach (var m in listNew) + { + AlarmCountEntry alarm = new AlarmCountEntry(); + alarm.PLCAdress = m.PLCAdress; + alarm.AlarmContent = m.AlarmContent; + alarm.AlarmCount = 1; + alarm.Class = CommonMethods.strClass; + alarm.AlarmTime = today; + fd.Add(alarm); + } + CommonMethods.db.AddReturnBool(fd); + } + GetASqlAlarmData(DateTime.Today, CommonMethods.strClass); + } + + + /// + /// 读取数据库报警信息 + /// + /// + /// + public void GetASqlAlarmData(DateTime today, string strClass) + { + try + { + List chartAlarms = new List(); + List AlarmDatas = null; + List List_X = new List(); + List List_Y = new List(); + + DateTime baiClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 8:30:00")); + DateTime baiClassEnd = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 20:29:59")); + + DateTime yeClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 20:30:00")); + DateTime yeClassEnd = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 8:29:59")); + + + if (strClass == "全天".Translated()) + { + AlarmDatas = CommonMethods.db.QueryList("AlarmCount", 10, it => Convert.ToDateTime(it.AlarmTime.ToString("yyyy-MM-dd")) == today); + } + else if (strClass == "白班".Translated()) + { + AlarmDatas = CommonMethods.db.QueryList("AlarmCount", 10, it => it.AlarmTime >= baiClassStart && it.AlarmTime <= baiClassEnd && it.Class == strClass); + } + else + { + AlarmDatas = CommonMethods.db.QueryList("AlarmCount", 10, it => it.AlarmTime >= yeClassStart && it.AlarmTime <= yeClassEnd && it.Class == strClass); + } + + if (AlarmDatas != null && AlarmDatas.Count > 0) + { + + for (int i = 0; i < AlarmDatas.Count; i++) + { + chartAlarms.Add(new ChartDataType() + { + DataType = AlarmDatas[i].AlarmContent, + DataCount = (int)AlarmDatas[i].AlarmCount + }); + } + CommonMethods.Lst_AlarmTop10_Qty = chartAlarms; + } + else + { + CommonMethods.Lst_AlarmTop10_Qty = null; + } + } + catch (Exception) + { + + } + } + + #endregion + + #region 下发权限给PLC + /// + /// 下发权限到PLC + /// + /// + private async Task SendRightToPLCAsync() + { + ushort quanxian = 1; + switch (CommonMethods.currentAdmin.LoginLevel) + { + case "操作员": + quanxian = 1; + break; + case "工程师": + quanxian = 2; + break; + case "管理员": + quanxian = 3; + break; + default: + break; + } + + + foreach (var plc in CommonMethods.plcDevices) + { + if (plcDeviceMapping.TryGetValue(plc, out var plcDevices)) + { + foreach (var plcDevice in plcDevices) + { + if (plcDevice.IsConnected) + { + JYResult result = await Task.Run(() => plc.WriteValue("D21", (short)quanxian, DataType.Short)); + if (result.IsSuccess) + { + CommonMethods.AddDataMonitorLog(1, $"Write_PLC_permission_Successful"); + } + else + { + CommonMethods.AddDataMonitorLog(2, $"Write_PLC_permission(D15)_Failed"); + } + } + } + } + } + } + + #endregion + + #region 获取白夜班次 + bool qiehuan = false; + private void SetClass() + { + try + { + var nowDate = DateTime.Now; + string strClass = ""; + DateTime time1 = Convert.ToDateTime($"{nowDate.ToShortDateString()} {CommonMethods.ChangeClassTime}"); + DateTime time2 = Convert.ToDateTime($"{nowDate.ToShortDateString()} {Convert.ToDateTime(CommonMethods.ChangeClassTime).AddHours(12).ToString("HH:mm:ss")}"); + if (nowDate <= time1 && nowDate >= time2) + { + if (CommonMethods.plcDevices[0].IsConnected) + { + if (!qiehuan) + { + if (!SetPlcTime()) + { + CommonMethods.AddLog(true, $"PC写入PLC时间失败".Translated()); + } + else + { + qiehuan = true; + CommonMethods.AddLog(false, "PC写入PLC时间成功".Translated()); + } + } + } + strClass = "白班".Translated(); + } + else + { + qiehuan = false; + strClass = "夜班".Translated(); + } + CommonMethods.strClass = strClass; + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "PC写入PLC时间异常".Translated() + ":" + ex.Message); + LogHelper.Instance.WriteEX(ex); + } + } + #endregion + + #region 写入PLC时间 + /// + /// 写当前时间给PLC + /// + private bool SetPlcTime() + { + var nowDate = DateTime.Now; + string yearStr = nowDate.Year.ToString(); + + + bool IsSuccess = false; + + // 为防止PLC时间出现偏差,每次自动运行的时候写PLC系统时间 + short[] writeArr = new short[] + { + Convert.ToInt16(nowDate.Year),//D70 + Convert.ToInt16(nowDate.Month),//D71 + Convert.ToInt16(nowDate.Day),//D72 + Convert.ToInt16(nowDate.Hour),//D73 + Convert.ToInt16(nowDate.Minute),//D74 + Convert.ToInt16(nowDate.Second),//D75 + (short)1 //D76 + }; + if (CommonMethods.plcDevices[0].IsConnected) + { + JYResult result = CommonMethods.plcDevices[0].WriteValue("D70", writeArr, DataType.ArrShort); + if (result.IsSuccess) + { + IsSuccess = true; + } + } + return IsSuccess; + + } + + #region 9、IDisposable 实现 + + + // 如果需要在StopAsync中也显示进度,可以添加一个进度回调 + + private Task processTask; + + public async Task StopAsync(IProgress progress = null) + { + _cts.Cancel(); + + if (_heartbeatTask != null) + { + progress?.Report("正在停止心跳任务..."); + try + { + await _heartbeatTask; + } + catch (OperationCanceledException) + { + // 忽略取消异常 + } + } + + if (processTask != null) + { + progress?.Report("正在停止处理任务..."); + try + { + await processTask; + } + catch (OperationCanceledException) + { + // 忽略取消异常 + } + } + + foreach (var pair in groupTasks) + { + progress?.Report($"正在停止组任务: {pair.Key}..."); + try + { + await pair.Value; + } + catch (OperationCanceledException) + { + // 忽略取消异常 + } + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _cts?.Cancel(); + _cts?.Dispose(); + + processTask?.Wait(); + + // 断开所有设备连接 + foreach (var plc in CommonMethods.plcDevices) + { + plc.Disconnect(); + //if (plcAlarmReaders.TryGetValue(plc, out var alarmReader)) + //{ + // alarmReader.PLCAlarm_New -= AlrmReader_PLCAlarm_New; + // alarmReader.PLCAlarm_Remove -= AlrmReader_PLCAlarm_Remove; + //} + } + + CommonMethods.plcDevices.Clear(); + plcDeviceMapping.Clear(); + plcAlarmReaders.Clear(); + CommonMethods.plcStatuses.Clear(); + + DisconnectAllPlcs(); + } + } + + + + #endregion + #endregion + + #region 7、辅助方法 + + private static PLCType GetPLCTypeEnum(string plcTypeString) + { + if (Enum.TryParse(plcTypeString, out PLCType plcType)) + { + return plcType; + } + throw new ArgumentException($"PLC 类型无效: {plcTypeString}"); + } + + + + #endregion + } +} diff --git a/JinYuan.ControlCenter/ControlCenter_Ext.cs b/JinYuan.ControlCenter/ControlCenter_Ext.cs new file mode 100644 index 0000000..bd636f1 --- /dev/null +++ b/JinYuan.ControlCenter/ControlCenter_Ext.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using PLCCommunication.Common; +using PLCCommunication.Common.DataConvert; + +namespace JinYuan.ControlCenters +{ + public partial class ControlCenter + { + public static string GetValueFromByteArray(byte[] bArray, string PLCGroupVariablekey, int offset = 0, Group pf = null) + { + return GetValueFromByteArray(bArray, getPLCVariable(PLCGroupVariablekey), offset, pf); + } + + public static PLCGroupVariable getPLCVariable(string key) + { + PLCGroupVariable pLCGroupVariable = new PLCGroupVariable(); + CommonMethods.PLCVariable.TryGetValue(key, out pLCGroupVariable); + return pLCGroupVariable; + } + + /// + /// 获取MES返回结果 + /// + /// + /// + /// + /// + /// + public static string GetValueFromByteArray(byte[] bArray, PLCGroupVariable var, int offset = 0, Group pf = null) + { + string value = "0"; + try + { + switch (var.DataType) + { + case "Float": + value = FloatLib.GetFloatFromByteArray(bArray, var.ArrayStart * 2 + offset, DataFormat.CDAB).ToString("0.###"); + break; + case "Short": + value = ShortLib.GetShortFromByteArray(bArray, var.ArrayStart * 2 + offset).ToString(); + break; + case "Int": + value = IntLib.GetIntFromByteArray(bArray, var.ArrayStart * 2 + offset).ToString(); + break; + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"数据解析异常, 原因: {ex}", "SysErrorLog"); + } + return value; + } + } +} diff --git a/JinYuan.ControlCenter/ControlCenter_Plc.cs b/JinYuan.ControlCenter/ControlCenter_Plc.cs new file mode 100644 index 0000000..83ef067 --- /dev/null +++ b/JinYuan.ControlCenter/ControlCenter_Plc.cs @@ -0,0 +1,2078 @@ + +using JinYuan.Helper; +using JinYuan.MES.Enums; +using JinYuan.MES.Models; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using JinYuan.VirtualDataLibrary.Utlis; +using Language; +using Microsoft.SqlServer.Server; +using PLC; +using PLCCommunication; +using PLCCommunication.BasicFramework; +using PLCCommunication.Common; +using PLCCommunication.Common.DataConvert; +using SqlSugar; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Eventing.Reader; +using System.IO; +using System.Net; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Xml.Linq; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace JinYuan.ControlCenters +{ + public partial class ControlCenter + { + public object FileLock = new object();//文件锁 + + + #region 保留2位小数 + private float SaveTwoNum(float TNum) + { + //1.2333 0.998 + int value = (int)(TNum * 1000) % 10; + value = value > 4 ? 10 - value : -value; + TNum += ((float)value / 1000); + //保留3位小数 + TNum = (float)(int)(TNum * 1000) / 1000; + return TNum; + } + #endregion + + + #region 包装上料工位(数据处理) + /// + /// 包装箱上料工位 + /// + private async Task FeedingStation(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + using (var timer = new TimedOperation("包装箱进站", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"包装箱进站共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + try + { + #region 数据初始化 + //解析数据 + List cartonTagInfos = new List(); + const int CODE_SIZE = 40; + #endregion + + #region 数据解析 + byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 + string containerCode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, CODE_SIZE -1, System.Text.Encoding.ASCII).// 从D3100开始 + Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + #endregion + + #region 获取箱唛信息MES + if (String.IsNullOrEmpty(containerCode) || containerCode.Trim() == "ERROR" || !IsAlphaNumeric(containerCode)) + { + CommonMethods.AddDataMonitorLog(0, "PLC中读取箱唛码NG:" + containerCode); + var entity = new AGearEntity + { + ContainerCode = "NG", + PalletCode = "NG", + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "包装箱进站", + Result = "NG" + }; + + var entityList = new List { entity }; + // 线程安全调用委托 + CommonMethods.ShowFeedingDelegate.Invoke(entityList); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + return; + } + + if (CommonMethods.sysConfig.MesModeSwitching) + { + try + { + await GetCartonTagInfosAsync(pf, containerCode); + } + catch (Exception ex) + { + CommonMethods.AddDataMonitorLog(0, "保存箱唛信息失败,箱唛码:" + containerCode + ",异常信息:" + ex.Message); + } + + + + #region 箱唛数据反馈&保存 + if (cartonTagInfos.Count > 0) + { + try + { + await SaveCartonTagInfosAsync(containerCode, cartonTagInfos); + } + catch (Exception ex) + { + CommonMethods.AddDataMonitorLog(0, "保存箱唛信息失败,箱唛码:" + containerCode + ",异常信息:" + ex.Message); + } + } + else + { + CommonMethods.AddDataMonitorLog(0, "未从mes中获取到箱唛信息,箱唛码:" + containerCode); + } + #endregion + + #region 获取栈板信息 + (var palletCode, var palletTagInfos) = await GetPalletTagInfosAsync(pf, containerCode); + #endregion + + #region 栈板数据反馈&保存 + if (palletTagInfos.Count > 0) + { + try + { + await SavePalletTagInfosAsync(containerCode, palletCode, palletTagInfos); + } + catch (Exception ex) + { + CommonMethods.AddDataMonitorLog(0, "保存栈板信息失败,栈板码:" + palletCode + ",异常信息:" + ex.Message); + } + } + else + { + CommonMethods.AddDataMonitorLog(0, "未从mes中获取到栈板信息,栈板码:" + palletCode); + } + await SaveFeedingStationAsync(containerCode, palletCode); + + #endregion + //if (palletTagInfos.Count > 0 && cartonTagInfos.Count > 0) + // await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[2].VarAddress, 1)); + //else + // await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[2].VarAddress, 2)); + + + + var taginfo = cartonTagInfos.FirstOrDefault(x => x.tagCode == "model"); + int model = CommonMethods.mesConfig.GetModel(taginfo.tagValue); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[3].VarAddress, (short)model)); + } + else if (CommonMethods.sysConfig.IsDebugMode) + { + string batModel = CommonMethods.mesConfig.ModelName; + TagInfo kVDetail = new TagInfo() + { + tagCode="model", + tagValue = batModel + }; + cartonTagInfos.Add(kVDetail); + await SaveCartonTagInfosAsync(containerCode, cartonTagInfos); + string palletCode = containerCode + "_01"; + await SaveFeedingStationAsync(containerCode, palletCode); + + + int model = CommonMethods.mesConfig.GetModel(batModel); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[3].VarAddress, (short)model)); + } + else + { + CommonMethods.AddDataMonitorLog(0, "MES 功能未开启,无法获取箱唛和栈板信息"); + //await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[2].VarAddress, 2)); + } + + #endregion + + + ////O2 客户还是普通客户 + //short customertype = CommonMethods.mesConfig.customerType == "O2" ? (short)1 : (short)2; + //await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[2].VarAddress, customertype)); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"获取箱唛和栈板信息线程处理异常:{ex}", "SysErrorLog"); + // 异常时反馈PLC错误 + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); + } + finally + { + // 重置PLC信号 + await Task.Run(() => + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1) + ); + } + } + } + } + + /// + /// 保存包装箱进站数据 + /// + /// + + private async Task SaveFeedingStationAsync(string containerCode, string palletCode) + { + var entity = new AGearEntity + { + ContainerCode = containerCode, + PalletCode = palletCode, + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "包装箱进站", + Result = "成功" + }; + + if (string.IsNullOrWhiteSpace(containerCode)) + { + LogHelper.Instance.WriteError("包装箱码为空,无法保存进站信息", "SysErrorLog"); + entity.ContainerCode = "NG"; + entity.Remark = "NG"; + } + if (string.IsNullOrWhiteSpace(palletCode)) + { + LogHelper.Instance.WriteLog($"包装箱[{containerCode}]对应的栈板码码为空"); + entity.PalletCode = "NG"; + entity.Remark = "NG"; + } + + try + { + if (entity.ContainerCode != "NG") + { + bool con_success = await CommonMethods.db.AddReturnBoolAsync(entity); + + string logMsg = con_success + ? $"包装箱[{containerCode}](栈板码码[{palletCode}])进站信息存储成功" + : $"包装箱[{containerCode}](栈板码码[{palletCode}])进站信息存储失败"; + CommonMethods.AddDataMonitorLog(0, logMsg); + } + + + var entityList = new List { entity }; + // 线程安全调用委托 + CommonMethods.ShowFeedingDelegate.Invoke(entityList); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(containerCode + $"包装箱进站信息保存处理异常:{ex}", "SysErrorLog"); + } + + } + #endregion + + + #region 获取箱唛信息 + private async Task> GetCartonTagInfosAsync(PlcGroup pf, string containerCode) + { + List cartonTagInfos = new List(); + const int maxRetry = 3; // 最大重试3次 + const int retryIntervalMs = 1000; // 重试间隔1秒 + int retryCount = 0; + //bool success = false; + while (retryCount < maxRetry) + { + if (!CommonMethods.mesConfig.isConnected) + { + CommonMethods.AddDataMonitorLog(1, "MES连接中断,停止上传"); // 1:错误级别 + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); // 反馈错误 + break; + } + + var (success, mesMessage, mesResType, cartonTags) = await CommonMethods.hbgMes.QueryCartonAsync( + CommonMethods.mesConfig.queryCartonUrl, + CommonMethods.mesConfig.siteCode, + CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, + containerCode + ); + + if (success && cartonTags.Count > 0) + { + cartonTagInfos = cartonTags; + await WritePlcResult(pf, "D80", 0, PLC.DataType.Short); // 反馈成功 + break; + } + + // 失败处理 + retryCount++; + CommonMethods.AddDataMonitorLog(1, $"MES请求失败({retryCount}/{maxRetry}):{mesMessage}"); + if (retryCount >= maxRetry) + { + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); // 超过重试次数,反馈错误 + break; + } + else + { + await Task.Delay(retryIntervalMs); // 等待重试 + } + } + + return cartonTagInfos; + + } + + #endregion + + + #region 保存箱唛信息数据 + /// + /// 保存箱唛信息数据 + /// + /// + + private async Task SaveCartonTagInfosAsync(string containerCode, List list) + { + if (list == null || list.Count == 0) + return; + + // 明确指定为异步 lambda + try + { + ContainerEntity containerEntity = new ContainerEntity + { + container_id = containerCode, + create_time = DateTime.Now + }; + + + List containerKVList = list + .Select(tag => new ContainerKVDetail + { + container_id = containerCode, + tag_code = tag.tagCode, + tag_value = tag.tagValue, + create_time = DateTime.Now + }) + .ToList(); + + // 数据库操作 + bool con_success = await CommonMethods.db.AddReturnBoolAsync(containerEntity); + bool kv_success = await CommonMethods.db.AddReturnBoolAsync(containerKVList); + if (kv_success) + { + CommonMethods.AddDataMonitorLog(0, containerCode + "箱唛信息存储成功"); + } + else + { + CommonMethods.AddDataMonitorLog(0, containerCode + "箱唛信息存储失败"); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(containerCode + $"箱唛信息保存处理异常:{ex}", "SysErrorLog"); + } + + } + + #endregion + + + #region 获取栈板信息 + private async Task<(string palletCode, List palletTagInfos)> GetPalletTagInfosAsync(PlcGroup pf, string containerCode) + { + string palletCode = string.Empty; + List palletTagInfos = new List(); + const int maxRetry = 3; // 最大重试3次 + const int retryIntervalMs = 1000; // 重试间隔1秒 + int retryCount = 0; + + if (!CommonMethods.mesConfig.isConnected) + { + CommonMethods.AddDataMonitorLog(1, "MES连接中断"); + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); // 反馈错误 + return (palletCode, palletTagInfos); + } + + // 调用MES接口 + var (success, mesMessage, mesResType, retPalletCode, retPalletTags) = await CommonMethods.hbgMes.QueryPalletAsync( + CommonMethods.mesConfig.queryPalletUrl, + CommonMethods.mesConfig.siteCode, + CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, + containerCode + ); + + if (!success || retPalletTags == null || retPalletTags.Count == 0) + { + CommonMethods.AddDataMonitorLog(1, "MES获取栈板信息失败"); + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); // 反馈错误 + return (palletCode, palletTagInfos); + } + + // 赋值有效数据 + palletCode = retPalletCode; + palletTagInfos = retPalletTags; + + return (palletCode, palletTagInfos); + } + #endregion + + + #region 保存栈板信息数据 + /// + /// 保存栈板信息数据 + /// + /// + + private async Task SavePalletTagInfosAsync(string containerCode, string pallet_id, List list) + { + if (list == null || list.Count == 0) + return; + + // 明确指定为异步 lambda + try + { + PalletEntity palletEntity = new PalletEntity + { + container_id = containerCode, + pallet_id = pallet_id, + create_time = DateTime.Now + }; + + List palletKVList = list + .Select(tag => new PalletKVDetail + { + pallet_id = pallet_id, + tag_code = tag.tagCode, + tag_value = tag.tagValue, + create_time = DateTime.Now + }) + .ToList(); + + // 数据库操作 + bool con_success = await CommonMethods.db.AddReturnBoolAsync(palletEntity); + bool kv_success = await CommonMethods.db.AddReturnBoolAsync(palletKVList); + + if (con_success && kv_success) + { + CommonMethods.AddDataMonitorLog(0, containerCode + "栈板信息存储成功"); + } + else + { + CommonMethods.AddDataMonitorLog(0, containerCode + "栈板信息存储失败"); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(containerCode+ "_" + $"栈板信息保存处理异常:{ex}", "SysErrorLog"); + } + + } + + #endregion + + + private async Task FeedingStationB(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + using (var timer = new TimedOperation("中部扫描", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"中部扫描共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + try + { + #region 数据初始化 + //解析数据 + List cartonTagInfos = new List(); + const int CODE_SIZE = 40; + #endregion + + #region 数据解析 + byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 + string containerCode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, CODE_SIZE - 1, System.Text.Encoding.ASCII).// 从D3100开始 + Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + #endregion + + //#region 获取箱唛信息 + if (String.IsNullOrEmpty(containerCode) || containerCode.Trim() == "ERROR" || IsAlphaNumeric(containerCode)) + { + CommonMethods.AddDataMonitorLog(0, "PLC中读取箱唛码NG:" + containerCode); + var entity = new AGearEntity + { + ContainerCode = "NG", + PalletCode = "NG", + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "中部扫描包装箱", + Result = "NG" + }; + + var entityList = new List { entity }; + // 线程安全调用委托 + //CommonMethods.ShowFeedingDelegate.Invoke(entityList); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + return; + } + + ContainerKVDetail modelDetail = CommonMethods.db.Query(it => it.container_id == containerCode && it.tag_code == "model"); + //string palletCode = cartonEntity.ContainerCode; + //if (cartonEntity == null || string.IsNullOrWhiteSpace(palletCode)) + //{ + // LogHelper.Instance.WriteLog($"包装箱[{containerCode}]对应的栈板码为空"); + // await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[4].VarAddress, 1)); + // return; + //} + string batModel = modelDetail.tag_code; + int model = CommonMethods.mesConfig.GetModel(batModel); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[3].VarAddress, (short)model)); + + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"中部扫描获取箱唛信息线程处理异常:{ex}", "SysErrorLog"); + + } + finally + { + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + } + } + } + } + + + private async Task FeedingStationC(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + using (var timer = new TimedOperation("尾部扫描", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"尾部扫描共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + try + { + #region 数据初始化 + //解析数据 + List cartonTagInfos = new List(); + const int CODE_SIZE = 40; + #endregion + + #region 数据解析 + byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 + string containerCode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, CODE_SIZE - 1, System.Text.Encoding.ASCII).// 从D3100开始 + Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + #endregion + + //#region 获取箱唛信息 + if (String.IsNullOrEmpty(containerCode) || containerCode.Trim() == "ERROR" || IsAlphaNumeric(containerCode)) + { + CommonMethods.AddDataMonitorLog(0, "PLC中读取箱唛码NG:" + containerCode); + var entity = new AGearEntity + { + ContainerCode = "NG", + PalletCode = "NG", + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "尾部扫描包装箱", + Result = "NG" + }; + + var entityList = new List { entity }; + // 线程安全调用委托 + //CommonMethods.ShowFeedingDelegate.Invoke(entityList); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + return; + } + ContainerKVDetail modelDetail = CommonMethods.db.Query(it => it.container_id == containerCode && it.tag_code == "model"); + string batModel = modelDetail.tag_code; + + int model = CommonMethods.mesConfig.GetModel(batModel); + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[3].VarAddress, (short)model)); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"尾部扫描获取箱唛信息线程处理异常:{ex}", "SysErrorLog"); + + } + finally + { + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + } + } + } + } + + + #region 箱唛打印 + /// + /// 箱唛打印 + /// + /// + /// + /// + private async Task PrintContainerStation(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + if (CommonMethods.mesConfig.customerType == "O2") + { + // 重置PLC信号 + await Task.Run(() => + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + ); + CommonMethods.AddDataMonitorLog(0, "上位机不打印O2客户箱唛标签."); + return; + } + + + + + using (var timer = new TimedOperation("箱唛标签打印", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"箱唛标签打印共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + List listRes = GetList(1, 2);//默认为2,判断箱唛码 + byte[] bytes = bArrays.Content.ByteReverse(); + string containercode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, System.Text.Encoding.ASCII).// D4610~4629 + Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + if (String.IsNullOrEmpty(containercode) || containercode.Contains("ERROR") || containercode.Contains("NG")) + { + var entity = new DGearEntity + { + ContainerCode = "NG", + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "箱唛标签打印", + Result = "NG" + }; + + var entityList = new List { entity }; + CommonMethods.ShowPrintContainergDelegate?.Invoke(entityList); + //CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + + CommonMethods.AddDataMonitorLog(0, "获取箱唛码为空,请检查".Translated()); + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//置位0 + return; + } + else + { + listRes = await PrintContainer(containercode, listRes); + await SavePrintContainerAsync(containercode); + //CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//复位 + } + } + } + } + + private static readonly Dictionary CartonFieldMappings = new Dictionary + { + { "customer", "57" }, + { "supplier", "EVE" }, + { "orderNumber", "19999" }, + { "materialCode", "1" }, + { "productModel", "123" }, + { "productDate", "2026-01-15" }, + { "batchQuantity", "240 " }, + { "packingQuantity", "10 " }, + { "level", "A" }, + { "voltage", "100" }, + { "resistance", "1000" }, + { "capacity", "99" }, + { "boxNumber", "test111" }, + { "groupNumber", "88" }, + { "remark", "测试" } + }; + + private async Task> PrintContainer(string containercode, List listRes) + { + if (CommonMethods.containerPrint == null) + { + if (!string.IsNullOrEmpty(CommonMethods.btwConfig.printerName)) + { + CommonMethods.containerPrint = new BartenderPrinter(CommonMethods.btwConfig.printerName); + } + else + { + listRes[0] = 3; + LogHelper.Instance.WriteLog($"打印机未设置和连接", "printLog"); + return listRes; + } + } + try + { + List container_kv_data = null; + // 初始化目标字典 + Dictionary vdaPrintValues = new Dictionary(); + + if (!CommonMethods.sysConfig.IsDebugMode) + { + container_kv_data = CommonMethods.db.QueryWhereList(it => it.container_id == containercode); + if (container_kv_data == null || !container_kv_data.Any()) + { + listRes[0] = 3; + CommonMethods.AddDataMonitorLog(0, $"container:{containercode}获取参数失败".Translated()); + LogHelper.Instance.WriteLog($"container:{containercode}获取参数失败", "printLog"); + return listRes; + } + + MapCartonKvDataToPrintDict(container_kv_data, vdaPrintValues); + } + else + { + FillDebugPrintCartonData(vdaPrintValues); + } + + //使用zebra打印机 + bool b = CommonMethods.containerPrint.write(CommonMethods.btwConfig.containerBTWPath, "carton label", vdaPrintValues); + if (b) + { + listRes[0] = 1; + CommonMethods.AddDataMonitorLog(0, $"箱唛码{containercode}:打印发送成功".Translated()); + } + else + { + listRes[0] = 2; + CommonMethods.AddDataMonitorLog(0, $"箱唛码{containercode}:打印发送失败".Translated()); + LogHelper.Instance.WriteLog($"{containercode}发送失败", "printLog"); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"箱唛打印线程异常:{ex}", "printLog"); + } + return listRes; + } + + /// + /// 将KV数据映射到打印字典(业务转换层) + /// + /// KV数据列表 + /// 打印字典 + private void MapCartonKvDataToPrintDict(List kvData, Dictionary printDict) + { + var kvDict = kvData.ToDictionary(kv => kv.tag_code, kv => kv.tag_value, StringComparer.OrdinalIgnoreCase); + foreach (var mapping in CartonFieldMappings) + { + if (kvDict.TryGetValue(mapping.Value, out var value)) + { + printDict[mapping.Key] = value ?? string.Empty; // 空值处理 + } + else + { + LogHelper.Instance.WriteLog($"托盘数据缺失字段:{mapping.Key}(对应TagCode:{mapping.Value})", "printLog"); + printDict[mapping.Key] = string.Empty; + } + } + } + + /// + /// 填充调试模式的测试数据(测试层) + /// + /// 打印字典 + private void FillDebugPrintCartonData(Dictionary printDict) + { + printDict["customer"] = "57"; + printDict["supplier"] = "EVE"; + printDict["orderNumber"] = "19999"; + printDict["materialCode"] = "1"; + //printDict["产品描述"] = "方形铁锂"; + printDict["productModel"] = "123"; + printDict["productDate"] = "2026-01-15"; + printDict["batchQuantity"] = "240 "; + printDict["packingQuantity"] = "10 "; + printDict["level"] = "A"; + printDict["voltage"] = "100"; + printDict["resistance"] = "1000"; + printDict["capacity"] = "99"; + printDict["boxNumber"] = "test111"; + printDict["groupNumber"] = "88"; + printDict["remark"] = "测试"; + } + + /// + /// 保存包装箱进站数据 + /// + /// + private async Task SavePrintContainerAsync(string containerCode) + { + var entity = new DGearEntity + { + ContainerCode = containerCode, + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "箱唛标签打印", + Result = "成功" + }; + + // 入参校验(避免空值写入数据库) + if (string.IsNullOrWhiteSpace(containerCode)) + { + LogHelper.Instance.WriteError("包装箱码为空,无法保存进站信息", "SysErrorLog"); + entity.ContainerCode = "NG"; + entity.Result = "NG"; + } + + // 明确指定为异步 lambda + try + { + + if (entity.ContainerCode != "NG") + { + // 数据库操作 + bool con_success = await CommonMethods.db.AddReturnBoolAsync(entity); + + string logMsg = con_success + ? $"包装箱[{containerCode}]箱唛打印信息存储成功" + : $"包装箱[{containerCode}]箱唛打印信息存储失败"; + CommonMethods.AddDataMonitorLog(0, logMsg); + } + + var entityList = new List { entity }; + CommonMethods.ShowPrintContainergDelegate?.Invoke(entityList); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(containerCode + $"包装箱进站信息保存处理异常:{ex}", "SysErrorLog"); + } + + } + #endregion + + #region 栈板打印 + /// + /// 栈板打印 + /// + /// + /// + /// + private async Task PrintPalletStation(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + if (CommonMethods.mesConfig.customerType == "O2") + { + // 重置PLC信号 + await Task.Run(() => + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + ); + CommonMethods.AddDataMonitorLog(0, "上位机不打印O2客户栈板标签."); + return; + } + + + using (var timer = new TimedOperation("栈板打印", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"栈板打印共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (!CommonMethods.sysConfig.IsDebugMode) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + List listRes = GetList(1, 2);//默认为2,判断栈板码 + byte[] bytes = bArrays.Content.ByteReverse(); + string palletcode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, System.Text.Encoding.ASCII).// D4610~4629 + Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + if (String.IsNullOrEmpty(palletcode) || palletcode.Contains("ERROR") || palletcode.Contains("NG")) + { + CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//置位0 + CommonMethods.AddDataMonitorLog(0, "获取栈板码为空,请检查".Translated()); + return; + } + else + { + listRes = await PrintPallet(palletcode, listRes); + await SavePrintPalletAsync(palletcode); + + CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//复位 + } + + } + } + else + { + List listRes = GetList(1, 2); + string palletcode = "222222"; + listRes = await PrintPallet(palletcode, listRes); + } + + } + } + + private static readonly Dictionary PalletFieldMappings = new Dictionary + { + { "customer", "customer" }, // 客户编码 + { "groupNumber", "groupNumber" }, // 组号 + { "orderNumber", "orderNumber" }, // 订单号 + { "packageQty", "packageQty" }, // 包装数量 + { "productCode", "productCode" }, // 产品编码 + { "palletQty", "palletQty" }, // 托盘数量 + { "palletNo", "palletNo" }, // 托盘编号 + { "remark", "remark" } // 备注 + }; + + private async Task> PrintPallet(string palletcode, List listRes) + { + if (CommonMethods.palletPrint == null) + { + if (!string.IsNullOrEmpty(CommonMethods.btwConfig.printerName)) + { + CommonMethods.palletPrint = new BartenderPrinter(CommonMethods.btwConfig.printerName); + } + else + { + listRes[0] = 3; + LogHelper.Instance.WriteLog($"打印机未设置和连接", "printLog"); + return listRes; + } + } + + try + { + List pallet_kv_data = null; + // 初始化目标字典 + Dictionary vdaPrintValues = new Dictionary(); + if (!CommonMethods.sysConfig.IsDebugMode) + { + pallet_kv_data = CommonMethods.db.QueryWhereList(it => it.pallet_id == palletcode); + if (pallet_kv_data == null || !pallet_kv_data.Any()) + { + listRes[0] = 3; + CommonMethods.AddDataMonitorLog(0, $"Pallet:{palletcode}获取参数失败".Translated()); + LogHelper.Instance.WriteLog($"Pallet:{palletcode}获取参数失败", "printLog"); + return listRes; + } + + MapPalletKvDataToPrintDict(pallet_kv_data, vdaPrintValues); + } + else + { + FillDebugPrintPalletData(vdaPrintValues); + } + + //使用zera打印机 + bool b = CommonMethods.palletPrint.write(CommonMethods.btwConfig.palletBTWPath, "pallet label", vdaPrintValues); + if (b) + { + listRes[0] = 1; + CommonMethods.AddDataMonitorLog(0, $"栈板码{palletcode}:打印VDA发送成功".Translated()); + } + else + { + listRes[0] = 2; + CommonMethods.AddDataMonitorLog(0, $"栈板码{palletcode}:打印VDA发送失败".Translated()); + LogHelper.Instance.WriteLog($"{palletcode}发送VDA失败", "printLog"); + } + + + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"栈板打印线程异常:{ex}", "printLog"); + } + return listRes; + } + + /// + /// 将KV数据映射到打印字典(业务转换层) + /// + /// KV数据列表 + /// 打印字典 + private void MapPalletKvDataToPrintDict(List kvData, Dictionary printDict) + { + var kvDict = kvData.ToDictionary(kv => kv.tag_code, kv => kv.tag_value, StringComparer.OrdinalIgnoreCase); + foreach (var mapping in PalletFieldMappings) + { + if (kvDict.TryGetValue(mapping.Value, out var value)) + { + printDict[mapping.Key] = value ?? string.Empty; // 空值处理 + } + else + { + LogHelper.Instance.WriteLog($"托盘数据缺失字段:{mapping.Key}(对应TagCode:{mapping.Value})", "printLog"); + printDict[mapping.Key] = string.Empty; + } + } + } + + /// + /// 填充调试模式的测试数据(测试层) + /// + /// 打印字典 + private void FillDebugPrintPalletData(Dictionary printDict) + { + printDict["customer"] = "57"; + printDict["groupNumber"] = "88"; + printDict["orderNumber"] = "19999"; + printDict["packageQty"] = "10"; + //printDict["产品描述"] = "方形铁锂"; + printDict["productCode"] = "123"; + printDict["palletQty"] = "2400"; + printDict["palletNo"] = "1000"; + printDict["remark"] = "测试"; + } + + /// + /// 保存栈板标签数据 + /// + /// + private async Task SavePrintPalletAsync(string palletCode) + { + // 入参校验(避免空值写入数据库) + if (string.IsNullOrWhiteSpace(palletCode)) + { + LogHelper.Instance.WriteLog($"包装箱[{palletCode}]对应的栈板码码为空"); + } + + // 明确指定为异步 lambda + try + { + var entity = new EGearEntity + { + PalletCode = palletCode, + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "栈板标签打印", + Result = "成功" + }; + + + // 数据库操作 + bool con_success = await CommonMethods.db.AddReturnBoolAsync(entity); + + string logMsg = con_success + ? $"栈板[{palletCode}]标签信息存储成功" + : $"栈板[{palletCode}]标签信息存储失败"; + CommonMethods.AddDataMonitorLog(0, logMsg); + + var entityList = new List { entity }; + + CommonMethods.ShowPrintPalletDelegate?.Invoke(entityList); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(palletCode + $"栈板标签信息保存处理异常:{ex}", "SysErrorLog"); + } + + } + #endregion + + //#region 3S 打印 + ///// + ///// 3S打印 + ///// + ///// + ///// + ///// + //private async Task Print3SStation(JYResult bArrays, object plcModel) + //{ + // PlcGroup pf = plcModel as PlcGroup; + // if (pf == null) + // { + // LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + // return; + // } + + // if (CommonMethods.mesConfig.customerType != "O2") + // { + // // 重置PLC信号 + // await Task.Run(() => + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + // ); + // CommonMethods.AddDataMonitorLog(0, "上位机不打印普通客户的3S标签."); + // return; + // } + + + // using (var timer = new TimedOperation("3S标签打印", (elapsedMs, operationName) => + // { + // CommonMethods.AddDataMonitorLog(0, $"3S标签打印共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + // })) + // { + // if (bArrays.IsSuccess && bArrays.Content != null) + // { + // List listRes = GetList(1, 2);//默认为2,判断栈板码 + // byte[] bytes = bArrays.Content.ByteReverse(); + // string palletcode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, System.Text.Encoding.ASCII).// D4610~4629 + // Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + // if (String.IsNullOrEmpty(palletcode) || palletcode.Contains("ERROR") || palletcode.Contains("NG")) + // { + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//置位0 + // CommonMethods.AddDataMonitorLog(0, "获取栈板码为空,请检查".Translated()); + // return; + // } + // else + // { + // listRes = await Print3SLabel(palletcode, listRes); + // await SavePrint3SAsync(palletcode); + + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//复位 + // } + + // } + // } + //} + + + //private async Task> Print3SLabel(string palletcode, List listRes) + //{ + + // //try + // //{ + // // List pallet_kv_data = null; + + // // pallet_kv_data = CommonMethods.db.QueryWhereList(it => it.pallet_id == palletcode); + // // if (pallet_kv_data == null || pallet_kv_data.Count == 0) + // // { + // // listRes[0] = 3; + // // CommonMethods.AddDataMonitorLog(0, $"Pallet:{palletcode}获取参数失败".Translated()); + // // LogHelper.Instance.WriteLog($"Pallet:{palletcode}获取参数失败", "printLog"); + // // return listRes; + // // } + + // // // 定义需要写入的多组数据(变量名和值的键值对) + // // var palletLabelData = new Dictionary + // // { + // // //{ "vda1", VDAdata.receiver }, + // // //{ "vda2", VDAdata.unloading }, + // // //{ "vda4", VDAdata.supplier }, + // // //{ "vda5", VDAdata.netWeight }, + // // //{ "vda6", VDAdata.groWeight }, + // // //{ "vda7", VDAdata.noBoxes }, + // // //{ "vda8", VDAdata.partNo },//8数字+条形码(格式为39码) + // // //{ "vda8-1", VDAdata.bmwDmcJYA },//8-1 二维码 + // // //{ "vda9", VDAdata.quantity },//9数字+条形码(格式为39码) + // // //{ "vda10", VDAdata.skuDescr }, + // // //{ "vda11.1", VDAdata.sku }, + + // // // 可继续添加更多数据... + // // }; + + // // 初始化目标字典 + // Dictionary vdaPrintValues = new Dictionary(); + // // //循环处理每组数据 + // // foreach (var entry in palletLabelData) + // // { + // // // 获取PLC变量信息 + // // var plcVariable = getPLCVariable(entry.Key); + // // // 将BTName与值存入字典 + // // vdaPrintValues[plcVariable.BTName] = entry.Value; // 使用索引器避免重复键异常(会覆盖旧值) + // // // 或者用 Add 方法(如果确保键不重复): + // // // vdaPrintValues.Add(plcVariable.BTName, entry.Value); + // // } + // //使用VDA打印机 + // bool b = CommonMethods._3SPrint.write(CommonMethods.btwConfig.palletBTWPath, vdaPrintValues); + // if (b) + // { + // listRes[0] = 1; + // CommonMethods.AddDataMonitorLog(0, $"栈板码{palletcode}:打印VDA发送成功".Translated()); + // } + // else + // { + // listRes[0] = 2; + // CommonMethods.AddDataMonitorLog(0, $"栈板码{palletcode}:打印VDA发送失败".Translated()); + // LogHelper.Instance.WriteLog($"{palletcode}发送VDA失败", "printLog"); + // } + + + // //} + // //catch (Exception ex) + // //{ + // // LogHelper.Instance.WriteError($"栈板打印线程异常:{ex}", "printLog"); + // //} + // return listRes; + //} + + ///// + ///// 保存3S标签数据 + ///// + ///// + //private async Task SavePrint3SAsync(string palletCode) + //{ + // // 入参校验(避免空值写入数据库) + // if (string.IsNullOrWhiteSpace(palletCode)) + // { + // LogHelper.Instance.WriteLog($"包装箱[{palletCode}]对应的栈板码码为空"); + // } + + // // 明确指定为异步 lambda + // try + // { + // var entity = new EGearEntity + // { + // PalletCode = palletCode, + // TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + // Remark = "3S标签打印", + // Result = "成功" + // }; + + + // // 数据库操作 + // bool con_success = await CommonMethods.db.AddReturnBoolAsync(entity); + + // string logMsg = con_success + // ? $"3S[{palletCode}]标签信息存储成功" + // : $"3S[{palletCode}]标签信息存储失败"; + // CommonMethods.AddDataMonitorLog(0, logMsg); + + // var entityList = new List { entity }; + + // CommonMethods.ShowPrintPalletDelegate?.Invoke(entityList); + // } + // catch (Exception ex) + // { + // LogHelper.Instance.WriteError(palletCode + $"3S标签信息保存处理异常:{ex}", "SysErrorLog"); + // } + + //} + //#endregion + + //#region 6J 打印 + ///// + ///// 6J打印 + ///// + ///// + ///// + ///// + //private async Task Print6JStation(JYResult bArrays, object plcModel) + //{ + // PlcGroup pf = plcModel as PlcGroup; + // if (pf == null) + // { + // LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + // return; + // } + + // if (CommonMethods.mesConfig.customerType != "O2") + // { + // // 重置PLC信号 + // await Task.Run(() => + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + // ); + // CommonMethods.AddDataMonitorLog(0, "上位机不打印普通客户的6J标签."); + // return; + // } + + + // using (var timer = new TimedOperation("6J标签打印", (elapsedMs, operationName) => + // { + // CommonMethods.AddDataMonitorLog(0, $"6J标签打印共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + // })) + // { + // if (bArrays.IsSuccess && bArrays.Content != null) + // { + // List listRes = GetList(1, 2);//默认为2,判断栈板码 + // byte[] bytes = bArrays.Content.ByteReverse(); + // string palletcode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, System.Text.Encoding.ASCII).// D4610~4629 + // Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + // if (String.IsNullOrEmpty(palletcode) || palletcode.Contains("ERROR") || palletcode.Contains("NG")) + // { + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//置位0 + // CommonMethods.AddDataMonitorLog(0, "获取栈板码为空,请检查".Translated()); + // return; + // } + // else + // { + // listRes = await Print6JLabel(palletcode, listRes); + // await SavePrint6JAsync(palletcode); + + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0);//复位 + // } + + // } + // } + //} + + + //private async Task> Print6JLabel(string palletcode, List listRes) + //{ + + // //try + // //{ + // // List pallet_kv_data = null; + + // // pallet_kv_data = CommonMethods.db.QueryWhereList(it => it.pallet_id == palletcode); + // // if (pallet_kv_data == null || pallet_kv_data.Count == 0) + // // { + // // listRes[0] = 3; + // // CommonMethods.AddDataMonitorLog(0, $"Pallet:{palletcode}获取参数失败".Translated()); + // // LogHelper.Instance.WriteLog($"Pallet:{palletcode}获取参数失败", "printLog"); + // // return listRes; + // // } + + // // // 定义需要写入的多组数据(变量名和值的键值对) + // // var palletLabelData = new Dictionary + // // { + // // //{ "vda1", VDAdata.receiver }, + // // //{ "vda2", VDAdata.unloading }, + // // //{ "vda4", VDAdata.supplier }, + // // //{ "vda5", VDAdata.netWeight }, + // // //{ "vda6", VDAdata.groWeight }, + // // //{ "vda7", VDAdata.noBoxes }, + // // //{ "vda8", VDAdata.partNo },//8数字+条形码(格式为39码) + // // //{ "vda8-1", VDAdata.bmwDmcJYA },//8-1 二维码 + // // //{ "vda9", VDAdata.quantity },//9数字+条形码(格式为39码) + // // //{ "vda10", VDAdata.skuDescr }, + // // //{ "vda11.1", VDAdata.sku }, + + // // // 可继续添加更多数据... + // // }; + + // // 初始化目标字典 + // Dictionary vdaPrintValues = new Dictionary(); + // // //循环处理每组数据 + // // foreach (var entry in palletLabelData) + // // { + // // // 获取PLC变量信息 + // // var plcVariable = getPLCVariable(entry.Key); + // // // 将BTName与值存入字典 + // // vdaPrintValues[plcVariable.BTName] = entry.Value; // 使用索引器避免重复键异常(会覆盖旧值) + // // // 或者用 Add 方法(如果确保键不重复): + // // // vdaPrintValues.Add(plcVariable.BTName, entry.Value); + // // } + // //使用VDA打印机 + // bool b = CommonMethods._6JPrint.write(CommonMethods.btwConfig.palletBTWPath, vdaPrintValues); + // if (b) + // { + // listRes[0] = 1; + // CommonMethods.AddDataMonitorLog(0, $"栈板码{palletcode}:打印VDA发送成功".Translated()); + // } + // else + // { + // listRes[0] = 2; + // CommonMethods.AddDataMonitorLog(0, $"栈板码{palletcode}:打印VDA发送失败".Translated()); + // LogHelper.Instance.WriteLog($"{palletcode}发送VDA失败", "printLog"); + // } + + + // //} + // //catch (Exception ex) + // //{ + // // LogHelper.Instance.WriteError($"栈板打印线程异常:{ex}", "printLog"); + // //} + // return listRes; + //} + + ///// + ///// 保存6J标签数据 + ///// + ///// + //private async Task SavePrint6JAsync(string palletCode) + //{ + // // 入参校验(避免空值写入数据库) + // if (string.IsNullOrWhiteSpace(palletCode)) + // { + // LogHelper.Instance.WriteLog($"包装箱[{palletCode}]对应的栈板码码为空"); + // } + + // // 明确指定为异步 lambda + // try + // { + // var entity = new EGearEntity + // { + // PalletCode = palletCode, + // TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + // Remark = "3S标签打印", + // Result = "成功" + // }; + + + // // 数据库操作 + // bool con_success = await CommonMethods.db.AddReturnBoolAsync(entity); + + // string logMsg = con_success + // ? $"3S[{palletCode}]标签信息存储成功" + // : $"3S[{palletCode}]标签信息存储失败"; + // CommonMethods.AddDataMonitorLog(0, logMsg); + + // var entityList = new List { entity }; + + // CommonMethods.ShowPrintPalletDelegate?.Invoke(entityList); + // } + // catch (Exception ex) + // { + // LogHelper.Instance.WriteError(palletCode + $"3S标签信息保存处理异常:{ex}", "SysErrorLog"); + // } + + //} + + //#endregion + + ///// + ///// 绑定客户标签 + ///// + ///// + ///// + ///// + //private async Task BindingLabelStation(JYResult bArrays, object plcModel) + //{ + // PlcGroup pf = plcModel as PlcGroup; + // if (pf == null) + // { + // LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + // return; + // } + // if (CommonMethods.mesConfig.customerType != "O2") + // { + // // 重置PLC信号 + // await Task.Run(() => + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + // ); + // CommonMethods.AddDataMonitorLog(0, "普通客户不用上传MES绑定标签"); + // return; + // } + + // using (var timer = new TimedOperation("标签绑定", (elapsedMs, operationName) => + // { + // CommonMethods.AddDataMonitorLog(0, $"标签绑定共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + // })) + // { + // if (bArrays.IsSuccess && bArrays.Content != null) + // { + // await BindingLabelAsync(bArrays, plcModel); + // } + + // // 重置PLC信号 + // await Task.Run(() => + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + // ); + // } + //} + + //private async Task BindingLabelAsync(JYResult bArrays, object plcModel) + //{ + // PlcGroup pf = plcModel as PlcGroup; + // if (pf == null) + // { + // LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + // return; + // } + + // using (var timer = new TimedOperation("标签绑定", (elapsedMs, operationName) => + // { + // CommonMethods.AddDataMonitorLog(0, $"标签绑定共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + // })) + // { + // if (bArrays.IsSuccess && bArrays.Content != null) + // { + // try + // { + // #region 数据初始化 + // //解析数据 + // const int maxChannel = 8; // 固定8通道,改为常量便于维护 + // var listMark = Enumerable.Repeat(false, maxChannel).ToList(); // 有料标志 + + // #endregion + + // // 从D2021开始 + // #region 数据解析 + // byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 + // // TODO 从PLC读取出所有的电芯条码和条码位置! + // string containerCode = ""; + // string palletCode = ""; + // string custcartonCode = ""; + // string custpalletCode = ""; + // List custcarton = new List(); + // List custpallet = new List(); + // ////有料标志 + + // #endregion + + // #region 上传MES + // //上传MES + // if (custcarton.Count > 0 && custpallet.Count > 0) + // { + // const int maxRetry = 3; // 最大重试3次 + // const int retryIntervalMs = 1000; // 重试间隔1秒 + // int retryCount = 0; + // //bool isSuccess = false; + + // while (retryCount < maxRetry) + // { + // if (!CommonMethods.mesConfig.isConnected) + // { + // CommonMethods.AddDataMonitorLog(1, "MES连接中断,停止上传"); // 1:错误级别 + // await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); // 反馈错误 + // break; + // } + + // //Task<(bool success, string mesMessage, MesResType mesResType)> + // // BindingAsync( string containerCode, string palletCode, string custcartonCode, string custpalletCode, List custcarton, List custpallet) + // // 调用MES接口 + // var (success, mesMessage, mesResType) = await CommonMethods.hbgMes.BindingAsync( + // CommonMethods.mesConfig.bindingUrl, + // CommonMethods.mesConfig.siteCode, + // CommonMethods.mesConfig.lineCode, + // CommonMethods.mesConfig.equipNum, + // containerCode, palletCode, custcartonCode, custpalletCode, custcarton, custpallet + // ); + + // if (success) + // { + // await WritePlcResult(pf, "D80", 0, PLC.DataType.Short); // 反馈成功 + // break; + // } + + // // 失败处理 + // retryCount++; + // CommonMethods.AddDataMonitorLog(1, $"MES请求失败({retryCount}/{maxRetry}):{mesMessage}"); + // if (retryCount >= maxRetry) + // { + // await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); // 超过重试次数,反馈错误 + // break; + // } + // await Task.Delay(retryIntervalMs); // 等待重试 + // } + // } + + // #endregion + + // #region 数据反馈&保存 + + + // // //读取结果显示 + // // // TODO 界面上将本次mes获得档位的电芯码状态置为红色!存储各个档位的数据,监控每个档位的电芯是不是满了,满了就调用另一个上传mes接口处理,需要另外写一个监控线程来监控吗? + + // try + // { + // //await SaveBindingDataAsync(custcarton); //是否需要存库? + // } + // catch (Exception ex) + // { + // //MessageBox.Show($"保存失败:{ex.Message}"); //TODO 是否需要弹窗提示? + // } + + + // // 重置PLC信号 + // await Task.Run(() => + // CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0) + // ); + + // #endregion + + // } + // catch (Exception ex) + // { + // LogHelper.Instance.WriteError($"标签绑定线程处理异常:{ex}", "SysErrorLog"); + // // 异常时反馈PLC错误 + // await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); + // } + // } + // } + //} + + #region 保存箱唛信息数据 + /// + /// 保存绑定信息数据 + /// + /// + + private async Task SaveBindingDataAsync(string containerCode, List list) + { + if (list == null || list.Count == 0) + return; + + // 明确指定为异步 lambda + await Task.Run(async () => + { + try + { + // 数据库操作 + bool success = await CommonMethods.db.AddReturnBoolAsync(list); + + if (success) + { + //// TODO 界面需要展示吗? + //await SafeInvokeOnUIThread(() => + //{ + // CommonMethods.ShowBatteryNGRsnDelegate?.Invoke(list); + //}); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"箱唛信息保存处理异常:{ex}", "SysErrorLog"); + } + }); + } + + #endregion + + + #region 包装出站 + private async Task BlankingStation(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + using (var timer = new TimedOperation("包装箱出站", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"包装箱出站共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + try + { + #region 数据解析 + byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 + // 从PLC读取出卡板码 + int containerLen = 40; + + string containerCode = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, containerLen, System.Text.Encoding.ASCII).// 从D3100开始 + Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); + #endregion + + if (!String.IsNullOrEmpty(containerCode)) //(String.IsNullOrEmpty(x) || x.Trim() == "ERROR" || !IsAlphaNumeric(x)) + { + CommonMethods.AddDataMonitorLog(0, "包装箱出站,箱唛码:" + containerCode); + // 出站界面显示 + await SaveBlankingAsync(containerCode); + } + else + { + var entity = new BGearEntity + { + ContainerCode = "NG", + PalletCode = "NG", + //Weight = weight.ToString(), + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "包装箱出站", + Result = "NG" + }; + var entityList = new List { entity }; + CommonMethods.ShowBlankingDelegate?.Invoke(entityList); + CommonMethods.AddDataMonitorLog(0, "未从plc中获取到栈板码"); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"包装箱出站线程处理异常:{ex}", "SysErrorLog"); + // 异常时反馈PLC错误 + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); + } + finally + { + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + } + } + } + } + + private async Task PreparePrintDataAsync(List cartonInfo, List palletInfo, string weight) + { + try + { + if (CommonMethods.tcpClient == null) + { + CommonMethods.tcpClient = new PrintSocket.TCPClient(); + } + if (!CommonMethods.tcpClient.IsConnected()) + { + CommonMethods.tcpClient.InitClient("127.0.0.1", 8000); + } + + Dictionary printData = new Dictionary(StringComparer.OrdinalIgnoreCase); + + printData.Add("siteCode", CommonMethods.mesConfig.siteCode); + printData.Add("lineCode", CommonMethods.mesConfig.lineCode); + printData.Add("equipName", CommonMethods.mesConfig.equipNum); + + if (cartonInfo != null && cartonInfo.Count > 0) + { + printData.Add("ContainerCode", cartonInfo[0].container_id); + foreach (var containerItem in cartonInfo) + { + // 过滤空Key/空Value,避免无效数据 + if (string.IsNullOrWhiteSpace(containerItem.tag_code) || string.IsNullOrWhiteSpace(containerItem.tag_value)) + { + LogHelper.Instance.WriteLog($"ContainerKVDetail无效数据:tag_code={containerItem.tag_code}, tag_value={containerItem.tag_value}"); + continue; + } + + // 重复Key则覆盖(后添加的覆盖先添加的) + if (printData.ContainsKey(containerItem.tag_code)) + { + printData[containerItem.tag_code] = containerItem.tag_value; + } + else + { + printData.Add(containerItem.tag_code, containerItem.tag_value); + } + } + } + + if (palletInfo != null && palletInfo.Count > 0) + { + foreach (var palletItem in palletInfo) + { + // 过滤空Key/空Value + if (string.IsNullOrWhiteSpace(palletItem.tag_code) || string.IsNullOrWhiteSpace(palletItem.tag_value)) + { + LogHelper.Instance.WriteLog($"PalletKVDetail无效数据:tag_code={palletItem.tag_code}, tag_value={palletItem.tag_value}"); + continue; + } + + // 重复Key则覆盖(Pallet覆盖Container) + if (!printData.ContainsKey(palletItem.tag_code)) + { + printData.Add(palletItem.tag_code, palletItem.tag_value); + } + } + } + + if (!string.IsNullOrWhiteSpace(weight)) + { + if (printData.ContainsKey("weight")) + { + printData["weight"] = weight; + } + else + { + printData.Add("weight", weight); + } + } + + // 如果PrintData中的containerTypeCode未从KV中获取到,设置默认空值 + var printDataFields = new List + { + "ContainerCode", "containerTypeCode", "virtualContainerCode", "groupNum", + "supplierCode", "customerCode", "customerName", "packQty", "batchQty", + "soNum", "customerOrder", "soLineNum", "materialCode", "materialName", + "model", "grade", "voltage", "inresistance", "capacity", "productDate", + "rohs", "locatorCode", "locatorName", "enableFlag", "actualLoadQty", + "palletCode", "containerCode", "poNum", "autoFlag" + }; + foreach (var field in printDataFields) + { + if (!printData.ContainsKey(field)) + { + printData.Add(field, string.Empty); // 缺失字段赋值为空字符串 + } + } + + // 发送打印任务 + CommonMethods.tcpClient.Send(printData); + } + + catch (Exception ex) + { + LogHelper.Instance.WriteLog($"发送打印数据失败{ex.Message}"); + } + } + + /// + /// 保存包装线出站数据 + /// + /// + private async Task SaveBlankingAsync(string cartonCode) + { + var entity = new BGearEntity + { + ContainerCode = cartonCode, + TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Remark = "包装箱出站", + Weight = "", + }; + + try + { + List containerEntity = CommonMethods.db.QueryWhereList(it => it.ContainerCode == cartonCode); + if (containerEntity == null || !containerEntity.Any()) + { + LogHelper.Instance.WriteLog($"数据库中无包装箱[{cartonCode}]进站信息"); + entity.PalletCode = "NG"; + entity.Result = "NG"; + entity.Remark += ",对应的栈板码为空"; + } + else + { + entity.PalletCode = containerEntity[0].PalletCode; + entity.Result = "OK"; + } + + // 数据库操作 + bool con_success = await CommonMethods.db.AddReturnBoolAsync(entity); + + string logMsg = con_success ? $"包装箱[{cartonCode}]出站信息存储成功": $"包装箱[{cartonCode}]出站信息存储失败"; + CommonMethods.AddDataMonitorLog(0, logMsg); + var entityList = new List { entity }; + CommonMethods.ShowBlankingDelegate?.Invoke(entityList); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(cartonCode + $"包装箱出站信息保存处理异常:{ex}", "SysErrorLog"); + } + + } + #endregion + + + #region 中转数据给博杰 + private async Task TransferStation(JYResult bArrays, object plcModel) + { + PlcGroup pf = plcModel as PlcGroup; + if (pf == null) + { + LogHelper.Instance.WriteError("PLC模型转换失败", "SysErrorLog"); + return; + } + + using (var timer = new TimedOperation("中转数据", (elapsedMs, operationName) => + { + CommonMethods.AddDataMonitorLog(0, $"【结束】中转数据共耗时:{operationName} 执行耗时:{elapsedMs}ms"); + })) + { + if (bArrays.IsSuccess && bArrays.Content != null) + { + try + { + #region 数据解析 + + byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 + // 从PLC读取出卡板码 + int containerLen = 40; + short model = CommonMethods.plcDevices[0].ReadInt16(pf.VarList[2].VarAddress); //ShortLib.GetShortFromByteArray(bArrays.Content, 0); // 产品型号 + string containerCode = StringLib.GetStringFromByteArrayByEncoding(bytes, 6, containerLen, System.Text.Encoding.ASCII).// 从D3100开始 + Replace('\r', ' ').Replace(" ", "").Trim(); + #endregion + + if (String.IsNullOrEmpty(containerCode) || String.IsNullOrEmpty(containerCode) || containerCode.ToUpper().Trim() == "ERROR" || containerCode.Length < 5) + { + CommonMethods.AddDataMonitorLog(0, "中转数据,箱唛码无效" + containerCode); + return; + } + + CommonMethods.AddDataMonitorLog(0, $"【开始】中转数据,产品型号:{model}, 箱唛码:{containerCode}\n"); + + PlcReadWriteBase plc = PLCFactory.CreatePLC(PLCType.Siemens, 1, "S7_1200", new IPEndPoint(IPAddress.Parse("192.168.2.50"), 102)); + string msg = ""; + plc.Connect(ref msg); + if (plc.IsConnected) + { + plc.WriteValue("DB44.8", new short[(ushort)(containerLen + 2)], PLC.DataType.ArrShort); + //short[] value4 = plc.ReadValue("DB44.8", PLC.DataType.ArrShort, (ushort)(containerLen + 2)); + //string value5 = ShortArrayToString(value4); + //CommonMethods.AddDataMonitorLog(0, $"清空后再读取【DB44.8】:{value4}=>{value5}"); + + // 写入数据 偏移量产品类型地址是,DB44.6 条码地址是DB44.8 + plc.WriteValue("DB44.6", (short)model, PLC.DataType.Short); + plc.WriteValue("DB44.8", containerCode, PLC.DataType.String); + CommonMethods.AddDataMonitorLog(0, $"【DB44.6】写入型号:{model},【DB44.8】写入箱唛码:{containerCode}\n"); + + //object value = plc.ReadValue("DB44.6", PLC.DataType.Short); + //short[] value2 = plc.ReadValue("DB44.8", PLC.DataType.ArrShort, (ushort)(containerLen+2)); + //string value3 = ShortArrayToString(value2); + //CommonMethods.AddDataMonitorLog(0, $"读取【DB44.6】:{value}, 读取【DB44.8】:{value3}"); + } + else + { + CommonMethods.AddDataMonitorLog(0, "连接失败,请检查网络和PLC设置。"); + } + + // 关闭连接 + plc.Disconnect(); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"中转数据处理异常:{ex}", "SysErrorLog"); + // 异常时反馈PLC错误 + await WritePlcResult(pf, "D80", 1, PLC.DataType.Short); + } + finally + { + await Task.Run(() => CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[1].VarAddress, 1)); + } + } + } + } + + private string ShortArrayToString(short[] shortArray) + { + if (shortArray == null || shortArray.Length < 1) + return ""; + + // short[] 转 byte[] + byte[] byteArray = new byte[shortArray.Length * 2]; + Buffer.BlockCopy(shortArray, 0, byteArray, 0, byteArray.Length); + + // 长度 + int currentLength = byteArray[0]; + if (currentLength <= 0 || (2 + currentLength) > byteArray.Length) + return ""; + + // 从第2个字节开始,转字符串 + string result = Encoding.ASCII.GetString(byteArray.ByteReverse(), 2, currentLength); + return result; + } + + #endregion + + #region 斑马/VDA打印机 + public static void initPrint() + { + //安装驱动后初始化 + //CommonMethods.containerPrint = new BartenderPrinter(CommonMethods.containerPrintName); + //CommonMethods.palletPrint = new BartenderPrinter(CommonMethods.palletPrintName); + } + + #endregion + + #region 创建空的数组List + public List GetList(int num, T data) + { + List list = new List(); + for (int i = 0; i < num; i++) + { + list.Add(data); + } + return list; + + } + + public List GetMesType(int Num) + { + List mesResTypes = new List(); + for (int i = 0; i < Num; i++) + { + mesResTypes.Add(MesResType.UnKnow); + } + return mesResTypes; + } + + /// + /// PLC内批量写\0 + /// + /// + /// + public string GetString_0(int Num) + { + string ff = ""; + for (int i = 0; i < Num; i++) + { + ff = ff.Insert(ff.Length, "\0"); + } + return ff; + } + + public string GetBarCodeNum(int Num) + { + string CodeNo = ""; + int CodeLenth = Num.ToString().Length; + + switch (CodeLenth) + { + case 1: + return CodeNo = $"00000{Num}"; + case 2: + return CodeNo = $"0000{Num}"; + case 3: + return CodeNo = $"000{Num}"; + case 4: + return CodeNo = $"00{Num}"; + case 5: + return CodeNo = $"0{Num}"; + default: + return CodeNo = $"{Num}"; + } + } + #endregion + + + #region 辅助方法 + /// + /// 检测数据是否只包含字母加数字 + /// + /// + /// + public bool IsAlphaNumeric(string input) + { + // 使用正则表达式检查是否只包含字母和数字 + return Regex.IsMatch(input, "^[a-zA-Z0-9]+$"); + } + + ///// + ///// 解析条码(通用方法,减少冗余) + ///// + //private string ParseBarcode(byte[] bytes, int offset, int length) + //{ + // return StringLib.GetStringFromByteArrayByEncoding(bytes, offset, length * 2, System.Text.Encoding.ASCII) + // .Replace('\0', ' ') + // .Replace('\r', ' ') + // .Trim(); + //} + + /// + /// 写入PLC结果(封装重复逻辑) + /// + private async Task WritePlcResult(PlcGroup pf, string plcAddress, short result, PLC.DataType datatype) + { + await Task.Run(() => + CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(plcAddress, result, datatype) + //CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", result, PLC.DataType.Short) + ); + } + + + ///// + ///// 电池结果辅助方法 + ///// + ///// + //private string GetNGReasons(int value, string reasonCode) + //{ + // // 只有当值为2时才返回原因代码,否则返回空字符串 + // return value == 2 ? reasonCode : string.Empty; + //} + + //// 组合多个NG原因字段 + //private string CombineNGReasons(params string[] reasons) + //{ + // // 过滤空值并连接 + // var validReasons = reasons + // .Where(r => !string.IsNullOrEmpty(r)) + // .Distinct(); // 去重 + + // return string.Join(",", validReasons); + //} + + #endregion + + } +} \ No newline at end of file diff --git a/JinYuan.ControlCenter/ControlCenter_Total.cs b/JinYuan.ControlCenter/ControlCenter_Total.cs new file mode 100644 index 0000000..e4adf15 --- /dev/null +++ b/JinYuan.ControlCenter/ControlCenter_Total.cs @@ -0,0 +1,677 @@ + +using JinYuan.Helper; +using JinYuan.MES.Models; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using PLCCommunication; +using PLCCommunication.Common; +using PLCCommunication.Modbus; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using static System.Windows.Forms.LinkLabel; + +namespace JinYuan.ControlCenters +{ + public partial class ControlCenter + { + #region 刷新12小时产能 + + public int GetHour() + { + DateTime now = DateTime.Now; + int nowHour = Convert.ToInt32($"{now.Hour}30"); + int hour = 0; + if (CommonMethods.LastHour != nowHour) + { + hour = Convert.ToInt32($"{now.Hour - 1}30"); + if (now.Hour == 0) + { + hour = 2330; + } + } + else + { + hour = Convert.ToInt32($"{now.Hour}30"); + } + return hour; + } + + + public void Refresh12HourProdQty() + { + List chart12Hours = new List(); + DateTime dtTime = DateTime.Now; + string strDate = dtTime.ToString("yyyy-MM-dd"); + string nextDate = dtTime.AddDays(1).ToString("yyyy-MM-dd"); + int Hour = GetHour(); + + var listTotal = CommonMethods.db.QueryWhereList(t => + t.FDate == strDate || t.FDate == nextDate);// 查询两天的数据 + + if (listTotal != null && listTotal.Count > 0) + { + for (int i = 0; i < 24; i++) // 改为24小时 + { + int currentHour = (i + 8) % 24; // 从8点开始 + int nextHour = (currentHour + 1) % 24; + string currentDate = currentHour >= 8 ? strDate : nextDate; + + var hour1 = listTotal.Where(p => + p.FDate == currentDate && + p.FHour == currentHour).FirstOrDefault(); + + int ProdALLQty = 0; + int ProdOKQty = 0; + int ProdNGQty = 0; + string strOkRatio = "0.00"; + if (hour1 != null) + { + ProdALLQty = hour1.ProdIn; + ProdOKQty = hour1.ProdOut; + } + ProdNGQty = ProdALLQty - ProdOKQty; + if (ProdOKQty >= 0 && ProdALLQty > 0) + { + strOkRatio = (Math.Round(decimal.Parse(ProdOKQty.ToString()) / decimal.Parse(ProdALLQty.ToString()), 4)).ToString(); + } + string displayTime = $"{currentHour:D2}:30~{nextHour:D2}:29"; + + chart12Hours.Add(new Chart12HourData() + { + DisplayTime = displayTime, + ProdIn = ProdALLQty, + ProdOut = ProdOKQty, + ProdNg = ProdNGQty, + OKRatio = strOkRatio + }); + } + } + else + { + for (int i = 0; i < 24; i++) + { + int currentHour = (i + 8) % 24; + int nextHour = (currentHour + 1) % 24; + + Random rand = new Random(); + int ranOK = rand.Next(1000, 3000); + int ranNG = rand.Next(400, 1200); + int total = ranOK + ranNG; + string displayTime = $"{currentHour:D2}:30~{nextHour:D2}:29"; + string strOkRatio = (Math.Round(decimal.Parse(ranOK.ToString()) / decimal.Parse(total.ToString()), 4)).ToString(); + chart12Hours.Add(new Chart12HourData() + { + DisplayTime = displayTime, + ProdIn = ranOK + ranNG, + ProdOut = ranOK, + ProdNg = ranNG, + OKRatio = strOkRatio // 保留2位小数,添加% + }); + } + } + if (chart12Hours != null) + { + CommonMethods.Lst_Prod12HourData = chart12Hours; + } + } + #endregion + + #region 检测项不良 + /// + /// 读取检测项不良 + /// + private void GetDefectTypeQty() + { + + try + { + if (CommonMethods.Lst_DefectTypeQty.Count <= 0) + { + + //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "极性检测不良".Translated(), DataCount = 0 }); + //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "称重不良".Translated(), DataCount = 0 }); + //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "铜极耳剪切不良".Translated(), DataCount = 0 }); + //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "铝极耳剪切不良".Translated(), DataCount = 0 }); + //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "厚度不良", DataCount = 0 }); + //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "焊前CCD正极耳顶面不良", DataCount = 0 }); + CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "扫码不良".Translated(), DataCount = 0 }); + CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "MES不良".Translated(), DataCount = 0 }); + CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "其他不良".Translated(), DataCount = 0 }); + } + else //读取PLC数据 + { + if (CommonMethods.plcDevices[0] != null && CommonMethods.plcDevices[0].IsConnected) + { + Task.Run(() => + { + try + { + int ProdDRFIDNgQty = CommonMethods.plcDevices[0].ReadInt16("D1000");//扫码不良 + int ProdDXNgQty = CommonMethods.plcDevices[0].ReadInt16("D1001");//MES不良 + int ProdGRFIDNgQty = CommonMethods.plcDevices[0].ReadInt16("D1002");//其他不良 + //int ProdDRFIDNgQty = CommonMethods.plcDevices[0].ReadInt16("D1000");//极性检测不良 + //int ProdDXNgQty = CommonMethods.plcDevices[0].ReadInt16("D1002");//称重不良 + //int ProdGRFIDNgQty = CommonMethods.plcDevices[0].ReadInt16("D1006");//铜极耳剪切不良 + //int ProdYLZNgQty = CommonMethods.plcDevices[0].ReadInt16("D1004");//铝极耳剪切不良 + + //從PLC讀取數據賦值給到NGList + CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "扫码不良".Translated()).FirstOrDefault().DataCount = ProdDRFIDNgQty; + CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "MES不良".Translated()).FirstOrDefault().DataCount = ProdDXNgQty; + CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "其他不良".Translated()).FirstOrDefault().DataCount = ProdGRFIDNgQty; + //CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "铝极耳剪切不良".Translated()).FirstOrDefault().DataCount = ProdYLZNgQty; + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + }); + + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + #endregion + + #region 智能电表 ---默认D1100开始 + public void GetEnergyData() + { + ModbusRtu busRtuClient = new ModbusRtu(); + if (CommonMethods.plcDevices.Count > 0 && CommonMethods.plcDevices[0] != null && CommonMethods.plcDevices[0].IsConnected) + { + List listM = new List(); + List ListF = new List(); + List listAddre = new List() + { + "D1100","D1102","D1104","D1106","D1108","D1110","D1112","D1114","D1116","D1118","D1120","D1122","D1124","D1126" + }; + try + { + + ElectricEnergy m = new ElectricEnergy(); + //for (int i = 0; i < listAddre.Count; i++) + //{ + // ListF.Add(CommonMethods.plcDevices[0].ReadFloat(listAddre[i])); + //} + + //m.AccumulatedElectricity = (Decimal)ListF[0]; //有功电能(累计电能)D1100 + //m.PhaseVoltageA = (Decimal)ListF[1]; ; //A相电压 D1102 + //m.PhaseVoltageB = (Decimal)ListF[2]; ;//B相电压 D1104 + //m.PhaseVoltageC = (Decimal)ListF[3]; ;//C相电压 D1106 + //m.PhaseCurrentA = (Decimal)ListF[4]; ; //电流IA D1108 + //m.PhaseCurrentB = (Decimal)ListF[5]; ;//电流IB D1110 + //m.PhaseCurrentC = (Decimal)ListF[6]; ;//电流IC D1112 + //m.PhasePowerA = (Decimal)ListF[7]; ; //A相有功功率 D1114 + //m.PhasePowerB = (Decimal)ListF[8]; ; //B相有功功率 D1116 + //m.PhasePowerC = (Decimal)ListF[9]; ;//C相有功功率 D1118 + //m.ActivePower = (Decimal)ListF[10]; ; //总有功功率 D1120 + //m.PowerFactor = (Decimal)ListF[11]; ; //总功率因数 D1122 + //m.pt = (Decimal)ListF[12]; ; //电压变比 D1124 + //m.ct = (Decimal)ListF[13]; ; //电流变比 D1126 + + //listM.Add(m); + //CommonMethods.listElectricEnergy = listM; + //return; + + busRtuClient.SerialPortInni(sp => + { + sp.PortName = "COM3"; + sp.BaudRate = 9600; + sp.DataBits = 8; + sp.StopBits = System.IO.Ports.StopBits.One; + sp.Parity = System.IO.Ports.Parity.None; + }); + busRtuClient.DataFormat = (PLCCommunication.Common.DataFormat)DataFormat.CDAB; + busRtuClient.Open(); // 打开 + if (busRtuClient.IsOpen()) + { + // 读取数据 + JYResult readResult = busRtuClient.Read("35", 30); + JYResult readResult1 = busRtuClient.Read("3", 2); + if (readResult.IsSuccess && readResult1.IsSuccess) + { + //DPT + Byte DptH = busRtuClient.ByteTransform.TransByte(readResult.Content, 0);//高8位 + Byte DptL = busRtuClient.ByteTransform.TransByte(readResult.Content, 1);//低8位 + //DPQ + Byte DpqH = busRtuClient.ByteTransform.TransByte(readResult.Content, 2);//高8位 + Byte DpqL = busRtuClient.ByteTransform.TransByte(readResult.Content, 3);//低8位 + + //m = new ElectricEnergy(); + Decimal q = busRtuClient.ByteTransform.TransUInt16(readResult.Content, 56); + Decimal w = busRtuClient.ByteTransform.TransUInt16(readResult.Content, 58); + + m.pt = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult1.Content, 0)); //电压变比 D1124 + m.ct = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult1.Content, 2)); //电流变比 D1126 + Decimal Power = (q * 65536 + w) / 1000; + m.AccumulatedElectricity = Convert.ToDecimal(Power * m.pt * m.ct); //有功电能(累计电能)D1100 + ListF.Add((float)m.AccumulatedElectricity.Value); + //电压 + m.PhaseVoltageA = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 4) * Math.Pow(10, DptH - 4)); //A相电压 D1102 + m.PhaseVoltageB = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 6) * Math.Pow(10, DptH - 4));//B相电压 D1104 + m.PhaseVoltageC = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 8) * Math.Pow(10, DptH - 4));//C相电压 D1106 + ListF.Add((float)m.PhaseVoltageA.Value); + ListF.Add((float)m.PhaseVoltageB.Value); + ListF.Add((float)m.PhaseVoltageC.Value); + + //电流 + m.PhaseCurrentA = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 16) * Math.Pow(10, DptL - 4)); //电流IA D1108 + m.PhaseCurrentB = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 18) * Math.Pow(10, DptL - 4));//电流IB D1110 + m.PhaseCurrentC = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 20) * Math.Pow(10, DptL - 4));//电流IC D1112 + ListF.Add((float)m.PhaseCurrentA.Value); + ListF.Add((float)m.PhaseCurrentB.Value); + ListF.Add((float)m.PhaseCurrentC.Value); + + //有功功率 + m.PhasePowerA = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 22) * Math.Pow(10, DpqH - 4)); //A相有功功率 D1114 + m.PhasePowerB = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 24) * Math.Pow(10, DpqH - 4)); //B相有功功率 D1116 + m.PhasePowerC = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 26) * Math.Pow(10, DpqH - 4));//C相有功功率 D1118 + m.ActivePower = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 28) * Math.Pow(10, DpqH - 4)); //总有功功率 D1120 + ListF.Add((float)m.PhasePowerA.Value); + ListF.Add((float)m.PhasePowerB.Value); + ListF.Add((float)m.PhasePowerC.Value); + ListF.Add((float)m.ActivePower.Value); + m.PowerFactor = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 44)) / 1000; //总功率因数 D1122 + ListF.Add((float)m.PowerFactor.Value); + ListF.Add((float)m.pt.Value); + ListF.Add((float)m.ct.Value); + + for (int i = 0; i < ListF.Count; i++) + { + CommonMethods.plcDevices[0].WriteFloat(listAddre[i], ListF[i]); + } + listM.Add(m); + CommonMethods.listElectricEnergy = listM; + + } + else + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "智能电表:读取数据失败"); + } + } + else + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "智能电表:串口打开失败"); + } + } + catch (Exception ex) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"智能电表:{ex}"); + } + finally + { + if (busRtuClient.IsOpen()) + { + busRtuClient.Close(); + } + } + + } + } + + public void GetEnergyDataFormPlc() + { + //if (CommonMethods.plcDevices.Count <= 0) { return; } + if (CommonMethods.plcDevices[0] != null && CommonMethods.plcDevices[0].IsConnected && CommonMethods.energyMeter.IsConnected) + { + + List listM = new List(); + List ListF = new List(); + List listAddre = new List() + { + //"D1100","D1102","D1104","D1106","D1108","D1110","D1112","D1114","D1116","D1118","D1120","D1122","D1124","D1126" + "D1300","D1302","D1304","D1306","D1308","D1310","D1312","D1314","D1316","D1318","D1320","D1322","D1324","D1326" + }; + //00 00 00 00 00 06 报文头 + //01 04 00 00 00 3E 不需要校验位 + byte[] bytes = new byte[12]; + bytes[0] = Convert.ToByte(01 >> 8); // Slave id high byte//事务元标识符,高字节在前,低字节在后 + bytes[1] = Convert.ToByte(01);// Slave id low byte + bytes[2] = 0x00;//协议标识符,高字节在前,低字节在后 (TCP 00) + bytes[3] = 0x00; + bytes[4] = 0x00;//后续字节长度,高字节在前,低字节在后 + bytes[5] = 0x06; // Message size + bytes[6] = 0x01; // Slave address + bytes[7] = 0x04;//功能码04H // Function code + bytes[8] = Convert.ToByte((00 >> 8) & 0xFF); // Start address//寄存器起始地址高字节m_unBeginWord + bytes[9] = Convert.ToByte(00 & 0xFF); // Start address//寄存器起始地址低字节m_unBeginWord + bytes[10] = Convert.ToByte((88 >> 8) & 0xFF); // Number of data to read//寄存器数量高字节m_unWordsCount + bytes[11] = Convert.ToByte(88 & 0xFF); // Number of data to read//寄存器数量低字节m_unWordsCount 0x58 + + try + { + CommonMethods.energyMeter.SendAndGetRes(bytes, ref listM); + #region 读取× + //for (int i = 0; i < listAddre.Count; i++) + //{ + // float val = CommonMethods.plcDevices[0].ReadFloat(listAddre[i]); + // ListF.Add(val); + //} + + //ElectricEnergy m = new ElectricEnergy(); + //m.AccumulatedElectricity = Convert.ToDecimal(ListF[0]); + //m.PhaseVoltageA = Convert.ToDecimal(ListF[1]); + //m.PhaseVoltageB = Convert.ToDecimal(ListF[2]); + //m.PhaseVoltageC = Convert.ToDecimal(ListF[3]); + //m.PhaseCurrentA = Convert.ToDecimal(ListF[4]); + //m.PhaseCurrentB = Convert.ToDecimal(ListF[5]); + //m.PhaseCurrentC = Convert.ToDecimal(ListF[6]); + //m.PhasePowerA = Convert.ToDecimal(ListF[7]); + //m.PhasePowerB = Convert.ToDecimal(ListF[8]); + //m.PhasePowerC = Convert.ToDecimal(ListF[9]); + //m.ActivePower = Convert.ToDecimal(ListF[10]); + //m.PowerFactor = Convert.ToDecimal(ListF[11]); + //m.pt = Convert.ToDecimal(ListF[12]); + //m.ct = Convert.ToDecimal(ListF[13]); + + //listM.Add(m); + #endregion + foreach (ElectricEnergy energy in listM) + { + CommonMethods.plcDevices[0].WriteFloat(listAddre[0], (float)energy.AccumulatedElectricity); + CommonMethods.plcDevices[0].WriteFloat(listAddre[1], (float)energy.PhaseVoltageA); + CommonMethods.plcDevices[0].WriteFloat(listAddre[2], (float)energy.PhaseVoltageB); + CommonMethods.plcDevices[0].WriteFloat(listAddre[3], (float)energy.PhaseVoltageC); + CommonMethods.plcDevices[0].WriteFloat(listAddre[4], (float)energy.PhaseCurrentA); + CommonMethods.plcDevices[0].WriteFloat(listAddre[5], (float)energy.PhaseCurrentB); + CommonMethods.plcDevices[0].WriteFloat(listAddre[6], (float)energy.PhaseCurrentC); + CommonMethods.plcDevices[0].WriteFloat(listAddre[7], (float)energy.PhasePowerA); + CommonMethods.plcDevices[0].WriteFloat(listAddre[8], (float)energy.PhasePowerB); + CommonMethods.plcDevices[0].WriteFloat(listAddre[9], (float)energy.PhasePowerC); + + CommonMethods.plcDevices[0].WriteFloat(listAddre[10], (float)energy.ActivePower); + CommonMethods.plcDevices[0].WriteFloat(listAddre[11], (float)energy.PowerFactor); + CommonMethods.plcDevices[0].WriteFloat(listAddre[12], (float)energy.pt); + CommonMethods.plcDevices[0].WriteFloat(listAddre[13], (float)energy.ct); + } + CommonMethods.listElectricEnergy = listM; + } + catch (Exception ex) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"智能电表:{ex}"); + } + } + } + + /// + /// 能耗上传MES + /// + public async void UploadEquEnergy() + { + if (CommonMethods.listElectricEnergy.Count > 0) + { + if (CommonMethods.mesConfig.isUpMes) + { + string msg = string.Empty; + DateTime nowDate = DateTime.Now; + string filePath = string.Empty; + string fileName = string.Empty; + string fileTitle = string.Empty; + string fileContent = string.Empty; + List listP = new List(); + int i = 0; + foreach (ElectricEnergy m in CommonMethods.listElectricEnergy) + { + WattrMeter param = new WattrMeter(); + param.siteCode = CommonMethods.mesConfig.siteCode; + param.lineCode = CommonMethods.mesConfig.lineCode; + param.equipNum = CommonMethods.mesConfig.equipNum; + param.userName = CommonMethods.mesConfig.mesUserName; + param.electricMeterNum = CommonMethods.mesConfig.electricMeterNum[i]; + param.recordDate = nowDate.ToString("yyyy-MM-dd HH:mm:ss"); + param.accumulatedElectricity = (decimal)m.AccumulatedElectricity; + param.phaseVoltageA = (decimal)m.PhaseVoltageA; + param.phaseVoltageB = (decimal)m.PhaseVoltageB; + param.phaseVoltageC = (decimal)m.PhaseVoltageC; + param.phaseCurrentA = (decimal)m.PhaseCurrentA; + param.phaseCurrentB = (decimal)m.PhaseCurrentB; + param.phaseCurrentC = (decimal)m.PhaseCurrentC; + param.phasePowerA = (decimal)m.PhasePowerA; + param.phasePowerB = (decimal)m.PhasePowerB; + param.phasePowerC = (decimal)m.PhasePowerC; + param.activePower = (decimal)m.ActivePower; + param.powerFactor = (decimal)m.PowerFactor; + param.pt = (decimal)m.pt; + param.ct = (decimal)m.ct; + + listP.Add(param); + i++; + + // 写csv文件 + string productName = string.Empty; + + filePath = $@"{CommonMethods.strWattrMeterpath}\{nowDate.Year}\{nowDate.Month}"; + fileName = $@"{nowDate.Day}.csv"; + fileTitle = "工序名称,生产机台编号,拉线,型号,物料编号,操作人员,班次,电表编号,采集时间,有功电能(累计电能)KwH,A相电压 V,B相电压 V,C相电压 V,A相电流 A,B相电流 A,C相电流 A,A相功率 Kw,B相功率 Kw,C相功率 Kw,总有功功率 Kw,总功率因数 %,电压变比,电流变比"; + fileContent = $"包装工序,{CommonMethods.mesConfig.equipNum},{CommonMethods.mesConfig.lineCode},{productName},{CommonMethods.mesConfig.MaterialCode},{CommonMethods.mesConfig.mesUserName},{CommonMethods.strClass},{param.electricMeterNum},{nowDate.ToString("yyyy-MM-dd HH:mm:ss")}," + + $"{param.accumulatedElectricity},{param.phaseVoltageA},{param.phaseVoltageB},{param.phaseVoltageC},{param.phaseCurrentA},{param.phaseCurrentB},{param.phaseCurrentC}," + + $"{param.phasePowerA},{param.phasePowerB},{param.phasePowerC},{param.activePower},{param.powerFactor},{param.pt},{param.ct}"; + CSVHelper.WriterCSV(filePath, fileName, fileTitle, fileContent); + } + //上传MES + var (success, mesg) = await CommonMethods.hbgMes.UploadEquEnergyAsync(CommonMethods.mesConfig.EnergyConsumption, CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.mesUserName, CommonMethods.mesConfig.electricMeterNum, listP); + } + } + } + + public static byte[] CalculateCRCTemp(ref byte[] messageArray, int dataLength) + { + byte usCRCHi = 0xFF; + byte usCRCLo = 0xFF; + byte[] returnResult = { 0x00, 0x00 }; + int index = 0; + int messageIndex = 0; + while (dataLength > 0) + { + index = usCRCLo ^ messageArray[messageIndex]; + usCRCLo = Convert.ToByte(usCRCHi ^ crcHi[index]); + usCRCHi = crcLo[index]; + messageIndex++; + dataLength--; + } + //0th item is crcLo + returnResult[0] = usCRCLo; + //1st item is crcHi + returnResult[1] = usCRCHi; + //2nd item is the total CRC16. + //returnResult[2] = Convert.ToByte((usCRCHi << 8 | usCRCLo)); + return returnResult; + } + + static byte[] crcHi = + { + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, + 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, + 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, + 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, + 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, + 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40 + }; + + static byte[] crcLo = + { + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, + 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, + 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, + 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, + 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, + 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, + 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, + 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, + 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, + 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, + 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, + 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, + 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, + 0x40 + }; + #endregion + + #region 定期清理本地保存下料数据 + /// + /// 定期清理本地保存下料数据 + /// + public void DeleteFileOfLocal() + { + try + { + //string filePath = string.Format(@"{0}\Data\{1}", Application.StartupPath, DateTime.Now.AddDays(-365).Year); + string filePath = string.Format(@"{0}\{1}", @"D:\LocalData", DateTime.Now.AddYears(-1).Year); + if (Directory.Exists(filePath)) + { + //判断是否有子文件夹,循环删除 + for (int i = 1; i <= DateTime.Now.Month; i++) + { + string tempPath = string.Format(@"{0}\{1}", filePath, i); + if (Directory.Exists(tempPath)) + { + LogCLear_DirOrFile("下料本地文件", DateTime.Now, tempPath, 365); + } + } + //没有子文件夹,删除目录 + DirectoryInfo[] DirList = GetSubcatalog(filePath);//获取文件路径 + if (DirList != null)//目录存在 + { + if (DirList.Length == 0) + { + Directory.Delete(filePath, true); + Thread.Sleep(10); + } + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteLog($"定期清理本地保存下料数据异常:{ex.ToString()}", "Info"); + } + + } + + /// 清理指定目录下的文件夹或文件 + /// 清理文件注释 + /// 当前时间 + /// 文件目录 + /// 保留天数 + public void LogCLear_DirOrFile(string strName, DateTime CurrentTime, string FilePath, uint RtnDayNums) + { + long time = 0; + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + bool b_OK = true; + LogHelper.Instance.WriteLog($"清理{strName}开始", "Info"); + try + { + DirectoryInfo[] DirList = GetSubcatalog(FilePath);//获取文件路径 + if (DirList != null)//目录不存在 + { + if (DirList.Length != 0)//目录是否有子文件夹:如 文件夹“2021-10-31” + { + #region 删文件夹 + foreach (var dirInfo in DirList)//循环删除文件夹 + { + DateTime itemDateTime = dirInfo.CreationTime;//获取文件夹创建日期 + if (CurrentTime.AddDays(-RtnDayNums) > itemDateTime) + { + if (dirInfo.Exists) + { + dirInfo.Delete(true); + Thread.Sleep(10); + } + } + } + #endregion + } + else//目录下无子文件夹存在时,判断是否有文件 + { + string[] fileList = null; + if (Directory.Exists(FilePath)) + { + //获取文件列表 + fileList = Directory.GetFiles(FilePath); + if (fileList != null)//目录不存在 + { + if (fileList.Length != 0)//目录下是否存在文件 + { + #region 删除文件 + foreach (var filePath in fileList)//循环删除文件 + { + DateTime itemDateTime = new FileInfo(filePath).LastWriteTime;//获取文件修改日期 + if (CurrentTime.AddDays(-RtnDayNums) > itemDateTime) + { + if (File.Exists(filePath)) + { + File.Delete(filePath); + Thread.Sleep(2); + } + } + } + #endregion + } + else + { + #region 删除文件夹 + Directory.Delete(FilePath, true); + #endregion + } + } + } + } + } + b_OK = true; + } + catch (Exception) + { + b_OK = false; + } + stopWatch.Stop(); + time = stopWatch.ElapsedMilliseconds; + LogHelper.Instance.WriteLog($"{FilePath},清理结束,结果;{b_OK},耗时:{time}", "Info"); + } + + /// + /// 获取指定目录中所有文件列表 + /// + /// 指定目录的绝对路径 + public DirectoryInfo[] GetSubcatalog(string directoryPath) + { + DirectoryInfo dir = new DirectoryInfo(directoryPath); + //如果目录存在 + if (dir.Exists) + { + //获取文件列表 + DirectoryInfo[] dirs = dir.GetDirectories(); + return dirs; + } + else + return null; + } + + #endregion + } +} diff --git a/JinYuan.ControlCenter/JinYuan.ControlCenters.csproj b/JinYuan.ControlCenter/JinYuan.ControlCenters.csproj new file mode 100644 index 0000000..fee6687 --- /dev/null +++ b/JinYuan.ControlCenter/JinYuan.ControlCenters.csproj @@ -0,0 +1,114 @@ + + + + + Debug + AnyCPU + {1D0FA5A4-07F0-4621-B6BB-683AEC91E658} + Library + Properties + JinYuan.ControlCenters + JinYuan.ControlCenters + v4.8 + 512 + true + 8.0 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\MiniExcel.1.36.1\lib\net45\MiniExcel.dll + + + False + ..\LargeSquareOne\Lib\PLCCommunication.dll + + + ..\Libs\SqlSugar.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + + + + + + + + + + + + + + + + + {114aa012-29c9-418c-a2d6-3173c5341f51} + JinYuan.DAL + + + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360} + JinYuan.Helper + + + {530B6426-08E7-461C-91DC-787F876620FC} + JinYuan.MES + + + {4c0bcb84-5cd7-4846-8363-c4c10d46e391} + JinYuan.Models + + + {2ab7e380-7795-448a-933c-0f6a081b5e7e} + JinYuan.VirtualDataLibrary + + + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C} + Language + + + {486aecd0-c2bf-43c5-b7d7-88e565ade4b7} + PLC + + + + + + + + \ No newline at end of file diff --git a/JinYuan.ControlCenter/Properties/AssemblyInfo.cs b/JinYuan.ControlCenter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a45bd93 --- /dev/null +++ b/JinYuan.ControlCenter/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.ControlCenters")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.ControlCenters")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("1d0fa5a4-07f0-4621-b6bb-683aec91e658")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.ControlCenter/app.config b/JinYuan.ControlCenter/app.config new file mode 100644 index 0000000..875387a --- /dev/null +++ b/JinYuan.ControlCenter/app.config @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.ControlCenter/iniConfigHelper/CreateIniFile.cs b/JinYuan.ControlCenter/iniConfigHelper/CreateIniFile.cs new file mode 100644 index 0000000..5440afa --- /dev/null +++ b/JinYuan.ControlCenter/iniConfigHelper/CreateIniFile.cs @@ -0,0 +1,6 @@ +namespace iniConfigHelper +{ + internal class CreateIniFile + { + } +} \ No newline at end of file diff --git a/JinYuan.ControlCenter/packages.config b/JinYuan.ControlCenter/packages.config new file mode 100644 index 0000000..2c915a5 --- /dev/null +++ b/JinYuan.ControlCenter/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/AlertManager.cs b/JinYuan.ControlLib/AlertManager.cs new file mode 100644 index 0000000..d5e0aaa --- /dev/null +++ b/JinYuan.ControlLib/AlertManager.cs @@ -0,0 +1,63 @@ +using AntdUI; +using System; +using System.Collections.Generic; + +namespace Controls +{ + public class AlertManager + { + private readonly Alert alert; + private readonly Queue<(string message, TType type)> messageQueue = new Queue<(string, TType)>(); + private readonly System.Windows.Forms.Timer throttleTimer; + private const int ThrottleInterval = 100; // 毫秒 + + public AlertManager(Alert alertControl) + { + alert = alertControl ?? throw new ArgumentNullException(nameof(alertControl)); + + throttleTimer = new System.Windows.Forms.Timer(); + throttleTimer.Interval = ThrottleInterval; + throttleTimer.Tick += ThrottleTimer_Tick; + } + + public void ShowAlert(string message, TType type = TType.Info) + { + messageQueue.Enqueue((message, type)); + if (!throttleTimer.Enabled) + { + throttleTimer.Start(); + } + } + + private void ThrottleTimer_Tick(object sender, EventArgs e) + { + if (messageQueue.Count > 0) + { + var (message, type) = messageQueue.Dequeue(); + UpdateAlertUI(message, type); + } + else + { + throttleTimer.Stop(); + } + } + + private void UpdateAlertUI(string message, TType type) + { + if (alert.InvokeRequired) + { + alert.BeginInvoke(new Action(() => UpdateAlertUI(message, type))); + return; + } + + alert.Text = message; + alert.Icon = type; + alert.Invalidate(); + } + + public void Dispose() + { + throttleTimer?.Dispose(); + } + } +} diff --git a/JinYuan.ControlLib/ArrTotalQty.Designer.cs b/JinYuan.ControlLib/ArrTotalQty.Designer.cs new file mode 100644 index 0000000..e77ad7b --- /dev/null +++ b/JinYuan.ControlLib/ArrTotalQty.Designer.cs @@ -0,0 +1,173 @@ +namespace JinYuan.ControlLib +{ + partial class ArrTotalQty + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ArrTotalQty)); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.lbl_Title6 = new JinYuan.ControlLib.TotalQty(); + this.lbl_Title5 = new JinYuan.ControlLib.TotalQty(); + this.lbl_Title4 = new JinYuan.ControlLib.TotalQty(); + this.lbl_Title3 = new JinYuan.ControlLib.TotalQty(); + this.lbl_Title2 = new JinYuan.ControlLib.TotalQty(); + this.lbl_Title1 = new JinYuan.ControlLib.TotalQty(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 6; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title6, 5, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title5, 4, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title4, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title3, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title1, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(300, 79); + this.tableLayoutPanel1.TabIndex = 1; + // + // lbl_Title6 + // + this.lbl_Title6.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title6.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("lbl_Title6.BackgroundImage"))); + this.lbl_Title6.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbl_Title6.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title6.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title6.Location = new System.Drawing.Point(254, 5); + this.lbl_Title6.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title6.Name = "lbl_Title6"; + this.lbl_Title6.Size = new System.Drawing.Size(42, 69); + this.lbl_Title6.TabIndex = 5; + this.lbl_Title6.TitleName = "0"; + // + // lbl_Title5 + // + this.lbl_Title5.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title5.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("lbl_Title5.BackgroundImage"))); + this.lbl_Title5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbl_Title5.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title5.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title5.Location = new System.Drawing.Point(204, 5); + this.lbl_Title5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title5.Name = "lbl_Title5"; + this.lbl_Title5.Size = new System.Drawing.Size(42, 69); + this.lbl_Title5.TabIndex = 4; + this.lbl_Title5.TitleName = "0"; + // + // lbl_Title4 + // + this.lbl_Title4.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title4.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("lbl_Title4.BackgroundImage"))); + this.lbl_Title4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbl_Title4.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title4.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title4.Location = new System.Drawing.Point(154, 5); + this.lbl_Title4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title4.Name = "lbl_Title4"; + this.lbl_Title4.Size = new System.Drawing.Size(42, 69); + this.lbl_Title4.TabIndex = 3; + this.lbl_Title4.TitleName = "0"; + // + // lbl_Title3 + // + this.lbl_Title3.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title3.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("lbl_Title3.BackgroundImage"))); + this.lbl_Title3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbl_Title3.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title3.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title3.Location = new System.Drawing.Point(104, 5); + this.lbl_Title3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title3.Name = "lbl_Title3"; + this.lbl_Title3.Size = new System.Drawing.Size(42, 69); + this.lbl_Title3.TabIndex = 2; + this.lbl_Title3.TitleName = "0"; + // + // lbl_Title2 + // + this.lbl_Title2.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title2.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("lbl_Title2.BackgroundImage"))); + this.lbl_Title2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbl_Title2.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title2.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title2.Location = new System.Drawing.Point(54, 5); + this.lbl_Title2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title2.Name = "lbl_Title2"; + this.lbl_Title2.Size = new System.Drawing.Size(42, 69); + this.lbl_Title2.TabIndex = 1; + this.lbl_Title2.TitleName = "0"; + // + // lbl_Title1 + // + this.lbl_Title1.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("lbl_Title1.BackgroundImage"))); + this.lbl_Title1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbl_Title1.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title1.ForeColor = System.Drawing.Color.White; + this.lbl_Title1.Location = new System.Drawing.Point(4, 5); + this.lbl_Title1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title1.Name = "lbl_Title1"; + this.lbl_Title1.Size = new System.Drawing.Size(42, 69); + this.lbl_Title1.TabIndex = 0; + this.lbl_Title1.TitleName = "0"; + // + // ArrTotalQty + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "ArrTotalQty"; + this.Size = new System.Drawing.Size(300, 79); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private TotalQty lbl_Title1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private TotalQty lbl_Title6; + private TotalQty lbl_Title5; + private TotalQty lbl_Title4; + private TotalQty lbl_Title3; + private TotalQty lbl_Title2; + } +} diff --git a/JinYuan.ControlLib/ArrTotalQty.cs b/JinYuan.ControlLib/ArrTotalQty.cs new file mode 100644 index 0000000..c8ff3fc --- /dev/null +++ b/JinYuan.ControlLib/ArrTotalQty.cs @@ -0,0 +1,136 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class ArrTotalQty : UserControl + { + public ArrTotalQty() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // UpData(); + } + + + //#region 减少闪烁 + //protected override CreateParams CreateParams + //{ + // get + // { + // CreateParams cp = base.CreateParams; + // cp.ExStyle |= 0x02000000; + // return cp; + // } + //} + //#endregion + + private int _MaxValue = 999999; + + + private int totalValue = 0; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示数字值:(最大值999999)")] + + + public int TotalValue + { + get { return totalValue; } + set + { + if (value > _MaxValue) return; + totalValue = value; + SetElectricEnergy(totalValue); + } + } + + + private void SetElectricEnergy(int value) + { + if (totalValue.ToString().Length < 7) + { + bool isNumeric = Regex.IsMatch(totalValue.ToString(), @"^\d+$"); + if (isNumeric) + { + List numbers = new List(); + + foreach (char c in totalValue.ToString()) + { + if (char.IsDigit(c)) + { + int number = int.Parse(c.ToString()); + numbers.Add(number); + } + } + + for (int i = 1; i < numbers.Count + 1; i++) + { + switch (numbers.Count) + { + case 1: + this.lbl_Title1.TitleName = 0.ToString(); + this.lbl_Title2.TitleName = 0.ToString(); + this.lbl_Title3.TitleName = 0.ToString(); + this.lbl_Title4.TitleName = 0.ToString(); + this.lbl_Title5.TitleName = 0.ToString(); + this.lbl_Title6.TitleName = numbers[0].ToString(); + break; + case 2: + this.lbl_Title1.TitleName = 0.ToString(); + this.lbl_Title2.TitleName = 0.ToString(); + this.lbl_Title3.TitleName = 0.ToString(); + this.lbl_Title4.TitleName = 0.ToString(); + this.lbl_Title5.TitleName = numbers[0].ToString(); + this.lbl_Title6.TitleName = numbers[1].ToString(); + break; + case 3: + this.lbl_Title1.TitleName = 0.ToString(); + this.lbl_Title2.TitleName = 0.ToString(); + this.lbl_Title3.TitleName = 0.ToString(); + this.lbl_Title4.TitleName = numbers[0].ToString(); + this.lbl_Title5.TitleName = numbers[1].ToString(); + this.lbl_Title6.TitleName = numbers[2].ToString(); + break; + case 4: + this.lbl_Title1.TitleName = 0.ToString(); + this.lbl_Title2.TitleName = 0.ToString(); + this.lbl_Title3.TitleName = numbers[0].ToString(); + this.lbl_Title4.TitleName = numbers[1].ToString(); + this.lbl_Title5.TitleName = numbers[2].ToString(); + this.lbl_Title6.TitleName = numbers[3].ToString(); + break; + case 5: + this.lbl_Title1.TitleName = 0.ToString(); + this.lbl_Title2.TitleName = numbers[0].ToString(); + this.lbl_Title3.TitleName = numbers[1].ToString(); + this.lbl_Title4.TitleName = numbers[2].ToString(); + this.lbl_Title5.TitleName = numbers[3].ToString(); + this.lbl_Title6.TitleName = numbers[4].ToString(); + break; + case 6: + this.lbl_Title1.TitleName = numbers[0].ToString(); + this.lbl_Title2.TitleName = numbers[1].ToString(); + this.lbl_Title3.TitleName = numbers[2].ToString(); + this.lbl_Title4.TitleName = numbers[3].ToString(); + this.lbl_Title5.TitleName = numbers[4].ToString(); + this.lbl_Title6.TitleName = numbers[5].ToString(); + break; + default: + break; + } + } + } + } + } + } +} diff --git a/JinYuan.ControlLib/ArrTotalQty.resx b/JinYuan.ControlLib/ArrTotalQty.resx new file mode 100644 index 0000000..d4d689f --- /dev/null +++ b/JinYuan.ControlLib/ArrTotalQty.resx @@ -0,0 +1,877 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + BD5r4T4h7uvLAAAAAElFTkSuQmCC + + + + + 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 + BD5r4T4h7uvLAAAAAElFTkSuQmCC + + + + + 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 + BD5r4T4h7uvLAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADEAAABFCAYAAADjLw7LAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAA + SMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEo + qGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAG + eIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK + 7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gz + SZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25q + bc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9Cvjc + M4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4 + oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjK + uLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqx + OPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIW + iAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFV + SAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAy + rA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYg + hUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2 + aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7r + h2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/ + Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SE + dJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3J + aSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQt + lHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJ + y5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV + 9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1 + JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7 + m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hop + b2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsy + u21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj + 9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCc + cNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527P + YS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT + 4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOw + EaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6s + faznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP + 8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy + +rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVs + S1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7 + SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9Uxlfe + qXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/w + jowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9V + t1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO + 6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503r + m10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9 + qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h + ++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7 + Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsMAAALDAE/QCLIAAARpklEQVRoQ9WaeVwT19rHh50k + bAmEBEjC5lp7l89t6y4ighu07rsgLiwuJIQAIYEEENms4tbba93aWtu6L9W64FK1ouLWuoIrgrWiVq2t + du/M/T2TRKPX9733837e2+AfXyfJzHme5ztzZs45g4ys8MIrYAwYCAZZwef6gTJz/Rtyc93rjgQ1vI5a + 3viX+oouDA801cdKDec9SKIPMIJpFuqnys3n0+WmcylBpjOTwUTHcnYSSJGbzqdBaIq1zumQyIZEIiQE + TGDRpShZ4UXakSQ314+Vm86MDC44PTSk4ItBIfnH31DkH3vdkYTknxhItQQXnBoCqRE4waMhkygrupgq + NV8YGmCsFzDS4ss9ITFdZq4bG1RwZkRwwReDFcZjryuNtQOUxkP9Qg01fUMNB/s4ChVqUBqPDFAYjyaE + 5J+EzOmh6CWjUXOKtPDSsICCCwImoPhKL3ShabhkI2A8WJF/NF5lQPF5n8eG5u2LCdfv7RWu3xPtGPZG + h+n39Q7NOxCLmvoq8mvjcWUG4WQPlxfWT4LE8AATSZRAwlw3lQzpCpBAmP5AbHjunugIfXVUq9zt3R3H + ju6ROdVREbm7e4bp9/cONR7sozQehcgXg4LM55MDii4N9zddhMTMht50I2PHQOpCuAJxJBCZs6NH6+yt + XdvoNndpo9vU2TFs7tI6e0uXVjnbu5NIaN7+3krj4f4K3KtB5rOJkBjhb74kZPwhga6USjvoHghDF4rI + rY7iBbI2dW6bta5ju6y1DqOtbkMniHSlk0pdm+5R9JiEIPOZxIDiSyPEhZeFjKS0MVZuPptCNw4O6BOB + ftgqZ0f3NrpPurSDQHvtqlfba1c7iFWvkghdlVbZ27pFoIeo0FOoSwWbTo/1n3FlpF/xVUiUNcZBIpWX + yDsIiT2Q2A6JTZ0R4DUK9FLmR684inba1a+1zaKrsbVbeO7uaOru9LQKNp0aA4lRfsUNXoy4vKkvJNIg + Ef9iSXw5RlJydYzvjEZvRlxxvb/cfC79xZM4NVZS0jDWd0aTN+NXeWPACylhPjVWPLMhyWdGkw9JJLyo + V0I881qSTwkkfN+8iZnquSkvmER/SIzzK2tK9i694cP4zG4eKC88N/WFkjBAwgyJ8qZJXmU3fBmfObeG + QGIaJDBa20tsxjixlh8nnhf8j4KX0G20SWDUtkmcHudb8VWKV/lNP8Z77u1h8sLz05WGZ69Ey5SwDHa1 + A4LMpxMhkcpLeFV9MwISGZAYQFNfy4jdEiQ+fIVyt8ta81ob3UaM2J9CAiO2wSphIokb6V4VzZCYd2ck + JNQKwzFMwWv6hus/64VpRw+rhEPvCZp60InkJXIggV6iQm/BtAOP2DNJPpVfTxVVNIsZ0by7YyCRqTAe + T8AMEdPwz3pF5uyExCddaPLnWAnb3OmJBLp8HN2/8sKzyd6zvs4QVtySMKL598fJCuu0kIinaW6ofn9M + RIuT2GyZjlsk+tCTlJd4s1kjnHVHwggXfDs5sLBOpzCeiFdZJHpHYCHSWrela1vd+k4tSYKm4tTlMRWP + x3pivPfsW7mQ8GcE8+4PkZQ1FCqNJ7CuPtKfloIRubt64mnAS7TLWv1a+0zHiJAE9QbqFdTFqatTlyeJ + wOJ6tWju3SxRxS13RlR620dU9Y1eXnQ2Gc9frK1JYndP9MGubbM2YsBb4xCJ9pkf8esJOpHUK6h3UC/B + wq1/SMHJIT6zbxYLK+/81avoJsMIFtxlPOd9G+1f3pCv0h+KDTUciLNIbOuG57MDJagr0RjBj9ZdqXdg + eRqryjvURzbj/GSvkjtqz8X3GOfzvzAMc4V71WPRgxH+xQ05Kv3hOIwVkNgDie3dHS+xxjblsEocgMTh + PuhKU4Rv3h3puu/ndsx9rj3DXOM2ub/zfZVkxrV0Vd6RPrhx+tANZB3wLPOnzI8dJ2F9vFpeFPASfQML + 6tI9lz2IZr7m5jBXuTcZ/LPU/Z3vKiQl1zJIghbi1gEPV6KlSND6GhLo6ioDJEwXpnou/q4v08CZQD51 + p6Vui7+fJS65lqnKq40NMx37W0R+TYc2hj1t2us/De+Qs1H5sm6N4s+61cF/JC/r1io65KxXvqTfEtbW + sDOytfFAuwjz0b+oCk50DjTVZXgu+a7/E4mr3BL3dx7OlpRez1DqjyRIpm7cK05bV+OfvubzgLRVBwLS + Pt4vTf1wn0NI+2gf5fdPX33AP33dQb/UNTXS6Z+ukBVdTvJY+n3CUxJuix/NkVQ0T1Fm7R8iaBXLuSk7 + c+7h0ZxbeAznFtGbc42IcwCxPHwNqMU9vCfnGtCB8+2YfE9ecWsYJN54SsJ1yQ9V4rIbmaqcmgHSweXL + A+NN78sTCpbL4w1LgwfkLgnpr1sM3vljyV4cPCBncXC8finVIksofFfaz7BCPurtysCSxskeSx8OflZi + vl9Jo15lOBobWlr3l8iSU23bFB0Jb2/er+hgqg76k3Gr7M/GLYF/JH8ybpO9bNoh72DeG9K2qCa0dfHJ + yIiyupfCis+9KjXVa92XPRoCAbOdxI8L/GY26fF0iqW5CYb3GHpt+HgS2JKeThgnpOaLavelj4Y9kbjC + LXZZ+tNCv7LrBkj0bnmP2A2dLOOEbbA7FBdQeFHjtuyHEfYSmyCxDBK4EodjWtxg98yIHQoJuhJu7/04 + hLnJzUNPms0wzdx41+U/5/uVXJ+BaQckDvahZaBFwvrGw2ESNHfCBNBu7hSqP9g7oPiixn3hw8lOJ3/r + j2lHAuO26hHj+o+fBvlU3lgYqq+JfjIB3O7gCeDHllnsU1Px/TGheTWx0pl1ae5zHy11n/uAcVv3kGE8 + Sr91c/37D/P9Sy/rcKlwuR5PxR0qQTwrQfcqdXel4dgA77m3Frks+NHoWXjPhXF9+6dkr6rb7ysMtDyl + vxTZLYqyaFHkWAl0Z0hswsoOTyjr8lRpONovOP/UUOGCe1udF/8Sx7gs/bVKOuNiKdbYff/n5enHz03y + 38ZOwu6VDdbY+UcTlPrj0eLypuXMCm48SVTIiuqKbRJh+n0YI6qjHo8RvMTzk/y3sUjwY4X15Rnd3Px7 + p3hl3vFefhXX32Pe48aSxCxZUX2J0nisb0t7ZUPYvYvFE6o6KgzdnSRU+qPR4oqm9yGRyDgv+202Vkol + yryjWBAdwkBHY0TLeHlGWCRsj1lI8OvsI/1V+tqe4kpIvM8lMc7Lf5tjkajFguOgVaJFvYtFl1rXsXX2 + J10jc+kxu4//MzAkoiCxAvdEMq7E73MhMVNpqI1roS+UrRJbeAk8ZjEgH+oHiR6Q+ABXYgJJzLdIHMEY + 8SJJHOkOiQ8hMQndiV0IiVIlTf6ekmg5f2Sxdqcukbn0B3ka8GwS1z9Cd0phnJazb0Gi7AWU6OZXeX0V + JFJJ4u3/H4kP/w88L87T/BuJ1TaJRZAo/88knpeYZriYrGWuopmnDXxf/RyeOuZx26fjPS34byTWQCKN + JBZDouL5Epg3QQIzSiQFGhSrwY2mWfNaO826jm3V68GGTm3VGzu1UW/q3Dpjs5VPuljY0vUJ9N2yv43a + gqXteqJjO81axEQ+jV0+AvnpAdM6e/PzJNZCYgpJLHkswf8HFZvEZozYGzq2y0Sxmes7tdFg6Nds7tJa + jaeE+tNukRnbu0dm7OgRkVEdZWFXz/Dpu+3YE/00T/ZFZBDVRBTFQCyieyv11m4Uv40GkshHedtpkT+L + ph2WcQISMfS/0SDRFRLrIDGVcXqXWwaJWZgZxvJzp7x9mADu7hmp29GjVSYCa7Z1j9Rs7xGh3hUVod4d + HZaxt1dYxmcxoRn7eodm7AdYbWXsj8OWwOfP40KnA9raY/mtj+U7HUtteKg94uyLCc/YG0PxI9R7elK+ + SM021LCteyvtju6Rup1RNAHE3AnTjiMD+Csx6/oGZiU3jXFayS2XFl2crTCcoL/AJKj0h/qGZh+MC81C + osz9vcPUSKLG2lZ9ME6VUdPXwqF+yozD4Eh/OwZYwOSMUD+D7Xce27H27Q/3o7h8fHVN31A1ZNUH4sI0 + yK890Bv1xFJdSj3/9wnMYo9F+VV+tYlZx01nnBax70pLL80NNnwZH5x3cnBIzolBCt2JgQrt8QRF5tF4 + heZogkJzDNtj2B5/3cKJN0I0JwaGaE5iexLbLwaBwRa+HByceWpIyDPwv2GfBf5YagP4GHw8imuJT7l4 + LPkz8VmL31FXSO6Jgah1iEJ/Msa36sYW5i1IOJey70tmX3lLrj83RK4/Pzoo5+xIue7syCDt6WFgaFDm + l3wBwZrT2J4eZmV4kPbsCIDjzo0K0qKd9vwYC3Vj5Vn1jwnKevx9HO0DluMy0YbQnkMMinNmOMW1xh8a + rCFxS25LLWeGy7NxXM7ZUfK8ujHBuWf6eb91c4dTNpfBOFewKySV1xYF6i+OluZeniDNvpQcqKtPlPHJ + 60bLUKAcyeRILEMRMm09kSjTXiCSZFkXxwfqLiXLdJcmyLKvTJRlX50sy25Ikeoa03y1jWlCTWOaBNtA + 3bU0/J4q012dJNNdnkjHB2YhF9pb4lC8unGW+JSLh8+PWsaAcYHZF5ICcy5NkOovT5Tn1A30nt+8y8nA + aRincm6lpLRpEYInynSNU6TaxvQAzbVUWWZDilxzNUWqaUgJwGf8lu6f2TjVP7Npur/2ukasvZ4lzvoq + R5L9dZ44p7lAom+eITHerpAWfjM/qOz+YtWCBx+9+u7DLTErH+7ssOT7jcFV364ILLv3j4Cib6ok+bfL + JcbmIrHhZr4k54ZeovsqG/G0Em2TWpzZNM1fc20qSPfXNKSCFH/U4Z95LRWk+Wc1TvHPvjZFpr002Lvq + djVj4LIYpzncLp95zYclhTf+LjY3f+BruvWBX/7tD3zzb62krbfxzseinLsbvPLvrhUZ724UGO9t9jR9 + u83T/KBaaP5ur6Dw4UHBjEfHBaU/nhOU/Xzdq+rX++Klv/+q/JTlhp/hOFMDx0Uf57jA9Sznu+j3H0VV + v9wRVP50VVj6wxnhzEe1gqLvDyDOHqHpwQ5hwf0tovx7m5BrvSj/mzVe+XdWeeXf/tCb6iAKbq30Nt1a + 6VPYvEJiapolfOfuDaaAMzEu+Vyu81x2i3P57584lbFbcY9sA9sfM5Pd6TyDq3YpZXcSHqXsLlEZR+x2 + L+P2uJVze90quM/cKrkDHpXcQY83uRrPOdxh4Tyu1nchVyteyB3xXsDVCudytZ6zucO0H8d+jjb70fYz + 1zJurwvigN0uFWy1SyW7C1s+F9jhMhOgDpcyvh6qbZsz1Vn++2bUvdUlg41l3EexjPsIjnEbyeEztqM4 + J7fRnCtwA+4eYzgPj0QwjhN4JLJCryRW5Dee9fabwPqIJrJ+whRWIkpl/UXprNRrGiv3nsYG+6hZhbea + VXllcCqhmlN5qVklviu9prMKHBMsmsLKRGmslNoJJ7FiAeJ4JrM+nojrkcR6IZ+QzzeO83RHfnfUAdyA + M9XI10n1DgdjOIZxT2SdgAsKRLGsCPgikARIPZK4QCDzGM/JCc/xXDC2IW7JrMJ9IqvwnMQqBSmsCoQK + UtkwYRpIZ8NBBAGxCBQcSVvrb5Z9dGwq2lC7yWg/mVUilgIiITzj2SCP8Syf01oDYAOwFaM+HzqZwB11 + O1P9DL7YIBE34IkGIkAyYkBCAZ6Q8kQwiBByJJN7TmDlgglcEM5ksGASZ08ICgsRTuaAZUvf+d9tx0wk + 0G4CYiEOHy+Zk1nis4GUj/Ja81Md3qiNTjKdbFfgDOgiMPYSjCesgDNwAx5AgGAi4AN8gRhIgD8IQDJC + yicFguTHyAQo6F+h3y3H2kHt6SQRFJugPJSP8or4OnDmgSvgi7fxPAkbNhkX4IZAHsCTD4g+C2xShB+w + ydlDos9iv5/aENTeFotiE3TyKB8VTieU6qCa+Prsa/7fJOyxCTkjqCsgKXdrEkJoxSZoj7cdz+6j46md + rWBL0RTfUrQlp13xNuxr/k8lnkKAoHY4Axc7XAVJnBX6zLrhM6Ct3T467kkbikE8jvu8vPbY1+yeyDL/ + BD5r4T4h7uvLAAAAAElFTkSuQmCC + + + + + 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 + BD5r4T4h7uvLAAAAAElFTkSuQmCC + + + + + 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 + BD5r4T4h7uvLAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/CPK.Designer.cs b/JinYuan.ControlLib/CPK.Designer.cs new file mode 100644 index 0000000..3509c37 --- /dev/null +++ b/JinYuan.ControlLib/CPK.Designer.cs @@ -0,0 +1,263 @@ +namespace JinYuan.ControlLib +{ + partial class CPK + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.listView1 = new System.Windows.Forms.ListView(); + this.项目1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.数值1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.项目2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.数值2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.项目3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.数值3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.lbl_Ca = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.listView2 = new System.Windows.Forms.ListView(); + this.tableLayoutPanel1.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.SuspendLayout(); + // + // listView1 + // + this.listView1.Activation = System.Windows.Forms.ItemActivation.OneClick; + this.listView1.AutoArrange = false; + this.listView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.项目1, + this.数值1, + this.项目2, + this.数值2, + this.项目3, + this.数值3}); + this.listView1.ForeColor = System.Drawing.Color.White; + this.listView1.GridLines = true; + this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.listView1.HideSelection = false; + this.listView1.LabelWrap = false; + this.listView1.Location = new System.Drawing.Point(4, 5); + this.listView1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.listView1.Name = "listView1"; + this.listView1.ShowItemToolTips = true; + this.listView1.Size = new System.Drawing.Size(518, 99); + this.listView1.TabIndex = 3; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // 项目1 + // + this.项目1.Text = "项目1"; + this.项目1.Width = 90; + // + // 数值1 + // + this.数值1.Text = "数值"; + this.数值1.Width = 80; + // + // 项目2 + // + this.项目2.Text = "项目2"; + this.项目2.Width = 90; + // + // 数值2 + // + this.数值2.Text = "数值"; + this.数值2.Width = 75; + // + // 项目3 + // + this.项目3.Text = "项目3"; + this.项目3.Width = 100; + // + // 数值3 + // + this.数值3.Text = "数值3"; + this.数值3.Width = 80; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.listView1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.listView2, 0, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 109F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 229F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 364F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(526, 415); + this.tableLayoutPanel1.TabIndex = 5; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel2.ColumnCount = 3; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 53.63881F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 46.36119F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 195F)); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel5, 2, 0); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel3, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel4, 1, 0); + this.tableLayoutPanel2.Location = new System.Drawing.Point(4, 343); + this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(518, 67); + this.tableLayoutPanel2.TabIndex = 5; + // + // tableLayoutPanel5 + // + this.tableLayoutPanel5.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel5.ColumnCount = 2; + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel5.Location = new System.Drawing.Point(325, 6); + this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel5.Name = "tableLayoutPanel5"; + this.tableLayoutPanel5.RowCount = 1; + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel5.Size = new System.Drawing.Size(185, 22); + this.tableLayoutPanel5.TabIndex = 2; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Controls.Add(this.lbl_Ca, 1, 0); + this.tableLayoutPanel3.Controls.Add(this.label2, 0, 0); + this.tableLayoutPanel3.Location = new System.Drawing.Point(5, 6); + this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 1; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(163, 22); + this.tableLayoutPanel3.TabIndex = 0; + // + // lbl_Ca + // + this.lbl_Ca.AutoSize = true; + this.lbl_Ca.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Ca.ForeColor = System.Drawing.Color.White; + this.lbl_Ca.Location = new System.Drawing.Point(86, 1); + this.lbl_Ca.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl_Ca.Name = "lbl_Ca"; + this.lbl_Ca.Size = new System.Drawing.Size(72, 20); + this.lbl_Ca.TabIndex = 0; + this.lbl_Ca.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Dock = System.Windows.Forms.DockStyle.Fill; + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(4, 1); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 20); + this.label2.TabIndex = 1; + this.label2.Text = "CA"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel4.ColumnCount = 2; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.Location = new System.Drawing.Point(177, 6); + this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 1; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.Size = new System.Drawing.Size(139, 22); + this.tableLayoutPanel4.TabIndex = 1; + // + // listView2 + // + this.listView2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.listView2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.listView2.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView2.ForeColor = System.Drawing.Color.White; + this.listView2.GridLines = true; + this.listView2.HideSelection = false; + this.listView2.Location = new System.Drawing.Point(3, 112); + this.listView2.Name = "listView2"; + this.listView2.Size = new System.Drawing.Size(520, 223); + this.listView2.TabIndex = 6; + this.listView2.UseCompatibleStateImageBehavior = false; + this.listView2.View = System.Windows.Forms.View.Details; + // + // trw + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "trw"; + this.Size = new System.Drawing.Size(526, 415); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.tableLayoutPanel3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader 项目1; + private System.Windows.Forms.ColumnHeader 数值1; + private System.Windows.Forms.ColumnHeader 项目2; + private System.Windows.Forms.ColumnHeader 数值2; + private System.Windows.Forms.ColumnHeader 项目3; + private System.Windows.Forms.ColumnHeader 数值3; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.Label lbl_Ca; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ListView listView2; + } +} diff --git a/JinYuan.ControlLib/CPK.cs b/JinYuan.ControlLib/CPK.cs new file mode 100644 index 0000000..86c8037 --- /dev/null +++ b/JinYuan.ControlLib/CPK.cs @@ -0,0 +1,285 @@ +using JinYuan.ControlLib.Models; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class CPK : UserControl + { + public CPK() + { + InitializeComponent(); + IntValue(); + } + + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + + private int subgroupSize = 5; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取子组大小值")] + public int SubgroupSize + { + get { return subgroupSize; } + set + { + subgroupSize = value; + listView1.Items[0].SubItems[3].Text = value.ToString(); + this.Invalidate(); + } + } + + private double _uSLs = 0; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取上规格值")] + public double USLs + { + get { return _uSLs; } + set + { + _uSLs = value; + listView1.Items[2].SubItems[1].Text = value.ToString(); + this.Invalidate(); + } + } + + private double _lSLs = 0; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取下规格值")] + public double LSLs + { + get { return _lSLs; } + set + { + _lSLs = value; + listView1.Items[2].SubItems[5].Text = value.ToString(); + this.Invalidate(); + } + } + + private double _cpkPpkAcceptanceValue = 0; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取目标值")] + public double CpkPpkAcceptanceValue + { + get { return _cpkPpkAcceptanceValue; } + set + { + _cpkPpkAcceptanceValue = value; + listView1.Items[2].SubItems[3].Text = value.ToString(); + this.Invalidate(); + } + } + + + private CPKModel _cPKData = new CPKModel(); + [Browsable(true)] + [Category("自定义属性")] + [Description("获取目标值")] + public CPKModel CPKData + { + get { return _cPKData; } + set + { + if (value != null) + { + _cPKData = value; + //总样本数 + listView1.Items[0].SubItems[1].Text = _cPKData.TotalNumber.ToString(); + //平均值 + listView1.Items[1].SubItems[1].Text = _cPKData.MeanVlaue.ToString(); + //最大值 + listView1.Items[1].SubItems[3].Text = _cPKData.MaxValue.ToString(); + //最小值 + listView1.Items[1].SubItems[5].Text = _cPKData.MinValue.ToString(); + // 正的3倍标准差线 + listView1.Items[3].SubItems[1].Text = _cPKData.Pos3Sigma.ToString(); + // 负的3倍标准差线 + listView1.Items[3].SubItems[3].Text = _cPKData.Neg3Sigma.ToString(); + + // 组内标准差值 + listView2.Items[0].SubItems[1].Text = _cPKData.GroupSTDEV.ToString(); + // 整体标准差值 + listView2.Items[0].SubItems[2].Text = _cPKData.WholeSTDEV.ToString(); + + // 组内CPK值 + listView2.Items[1].SubItems[1].Text = _cPKData.GroupCPK.ToString(); + // 整体CPK值 + listView2.Items[1].SubItems[2].Text = _cPKData.WholeCPK.ToString(); + // 组内CP值 + listView2.Items[2].SubItems[1].Text = _cPKData.GroupCP.ToString(); + // 整体CP值 + listView2.Items[2].SubItems[2].Text = _cPKData.WholeCP.ToString(); + + // 组内CPL值 + listView2.Items[3].SubItems[1].Text = _cPKData.GroupCPL.ToString(); + // 整体CPL值 + listView2.Items[3].SubItems[2].Text = _cPKData.WholeCPL.ToString(); + // 组内CPU值 + listView2.Items[4].SubItems[1].Text = _cPKData.GroupCPU.ToString(); + // 整体CPU值 + listView2.Items[4].SubItems[2].Text = _cPKData.WholeCPU.ToString(); + + // 组内PPMUSL值 + listView2.Items[6].SubItems[1].Text = _cPKData.GroupPPM_USL.ToString(); + // 整体PPM>USL值 + listView2.Items[6].SubItems[2].Text = _cPKData.WholePPM_USL.ToString(); + + // 组内PPM Total值 + listView2.Items[7].SubItems[1].Text = _cPKData.GroupPPM_Total.ToString(); + // 整体PPMN Total值 + listView2.Items[7].SubItems[2].Text = _cPKData.WholePPM_Total.ToString(); + + lbl_Ca.Text = _cPKData.CA.ToString(); + this.Invalidate(); + } + + } + } + + + + #region 初始化 + private void IntValue() + { + + //listView2.OwnerDraw = true; + //listView2.DrawColumnHeader += ListView2_DrawColumnHeader; + + listView1.Columns.Clear(); + listView2.Columns.Clear(); + + // 假设ListView控件的名称为listView1 + // 添加列头 + listView1.Columns.Add("项目1", 80); + listView1.Columns.Add("数值1", 90); + listView1.Columns.Add("项目2", 80); + listView1.Columns.Add("数值2", 90); + listView1.Columns.Add("项目3", 80); + listView1.Columns.Add("数值3", 95); + + // 创建一个ListViewItem对象,并将数据添加到指定单元格 0 + ListViewItem item1_1 = new ListViewItem("总样本数"); + item1_1.SubItems.Add("0"); + item1_1.SubItems.Add("子组大小"); + item1_1.SubItems.Add("0"); + item1_1.SubItems.Add("图标类型"); + item1_1.SubItems.Add("XR"); + listView1.Items.Add(item1_1); // 添加完整的ListViewItem对象到ListView控件中的指定行索引 + + + // 如果需要添加多行数据,可以类似地重复上述步骤 + ListViewItem item1_2 = new ListViewItem("平均值"); //1 + item1_2.SubItems.Add("0"); + item1_2.SubItems.Add("最大值"); + item1_2.SubItems.Add("0"); + item1_2.SubItems.Add("最小值"); + item1_2.SubItems.Add("0"); + listView1.Items.Add(item1_2); + + ListViewItem item1_3 = new ListViewItem("上规格"); //2 + item1_3.SubItems.Add("0"); + item1_3.SubItems.Add("目标值"); + item1_3.SubItems.Add("0"); + item1_3.SubItems.Add("下规格"); + item1_3.SubItems.Add("0"); + listView1.Items.Add(item1_3); + + ListViewItem item1_4 = new ListViewItem("+3Sigma"); //3 + item1_4.SubItems.Add("0"); + item1_4.SubItems.Add("-3Sigma"); + item1_4.SubItems.Add("0"); + listView1.Items.Add(item1_4); + + + + + // 假设ListView控件的名称为listView1 + // 添加列头 + listView2.Columns.Add("", 150); + listView2.Columns.Add("组内", 120); + listView2.Columns.Add("整体", 120); + listView2.Columns.Add("实测", 128); + + // 创建一个ListViewItem对象,并将数据添加到指定单元格 + ListViewItem item2_1 = new ListViewItem("STDEV"); //0 + item2_1.SubItems.Add("0"); + item2_1.SubItems.Add("0"); + item2_1.SubItems.Add(""); + listView2.Items.Add(item2_1); // 添加完整的ListViewItem对象到ListView控件中的指定行索引 + + ListViewItem item2_2 = new ListViewItem("CPK"); //1 + item2_2.SubItems.Add("0"); + item2_2.SubItems.Add("0"); + item2_2.SubItems.Add(""); + listView2.Items.Add(item2_2); + ListViewItem item2_3 = new ListViewItem("CP");//2 + item2_3.SubItems.Add("0"); + item2_3.SubItems.Add("0"); + item2_3.SubItems.Add(""); + listView2.Items.Add(item2_3); + ListViewItem item2_4 = new ListViewItem("CPL");//3 + item2_4.SubItems.Add("0"); + item2_4.SubItems.Add("0"); + item2_4.SubItems.Add(""); + listView2.Items.Add(item2_4); + ListViewItem item2_5 = new ListViewItem("CPU");//4 + item2_5.SubItems.Add("0"); + item2_5.SubItems.Add("0"); + item2_5.SubItems.Add(""); + listView2.Items.Add(item2_5); + ListViewItem item2_6 = new ListViewItem("PPMUSL");//6 + item2_7.SubItems.Add("0"); + item2_7.SubItems.Add("0"); + item2_7.SubItems.Add("0"); + listView2.Items.Add(item2_7); + ListViewItem item2_8 = new ListViewItem("PPM Total");//7 + item2_8.SubItems.Add("0"); + item2_8.SubItems.Add("0"); + item2_8.SubItems.Add("0"); + listView2.Items.Add(item2_8); + + lbl_Ca.Text = "0"; + } + + #endregion + + public void ListView2_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + e.DrawBackground(); + + // 设置自定义的列标题栏背景颜色 + e.Graphics.FillRectangle(Brushes.AliceBlue, e.Bounds); + + // 绘制列标题栏的文本 + e.DrawText(); + } + } + +} diff --git a/JinYuan.ControlLib/CPK.resx b/JinYuan.ControlLib/CPK.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/CPK.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/CheckBoxExt.Designer.cs b/JinYuan.ControlLib/CheckBoxExt.Designer.cs new file mode 100644 index 0000000..875b6d4 --- /dev/null +++ b/JinYuan.ControlLib/CheckBoxExt.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class CheckBoxExt + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/CheckBoxExt.cs b/JinYuan.ControlLib/CheckBoxExt.cs new file mode 100644 index 0000000..84f6fae --- /dev/null +++ b/JinYuan.ControlLib/CheckBoxExt.cs @@ -0,0 +1,132 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class CheckBoxExt : CheckBox + { + public CheckBoxExt() + { + InitializeComponent(); + + _format.LineAlignment = StringAlignment.Center; + _format.Alignment = StringAlignment.Center; + + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private StringFormat _format = new StringFormat(); + + + + private int defultCheckButtonWidth = 20; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示标题名称")] + public int DefultCheckButtonWidth + { + get { return defultCheckButtonWidth; } + set { defultCheckButtonWidth = value; } + } + + private Color checkColor = Color.FromArgb(3, 25, 66); + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示选中颜色")] + public Color CheckColor + { + get { return checkColor; } + set + { + checkColor = value; + this.Invalidate(); + } + } + + private Color checkBackColor = Color.White; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示选中框背景颜色")] + public Color CheckBackColor + { + get { return checkBackColor; } + set + { + checkBackColor = value; + this.Invalidate(); + } + } + + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + base.OnPaintBackground(e); + + Graphics g = e.Graphics; + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + + Rectangle checkRec; + Rectangle textRec; + + CalculatorRec(out checkRec, out textRec); + + SolidBrush solidBrush = new SolidBrush(CheckBackColor); + g.FillRectangle(solidBrush, checkRec); + + Pen pen = new Pen(Color.LightGray); + g.DrawRectangle(pen, checkRec); + + if (this.CheckState == CheckState.Checked) + { + //画勾选 + DrawCheckFlag(g, checkRec, checkColor); + } + + //绘制文本 + g.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), textRec, this._format); + } + + + /// + /// 计算矩形 + /// + /// + /// + private void CalculatorRec(out Rectangle checkRec, out Rectangle textRec) + { + checkRec = new Rectangle(3, (this.Height - defultCheckButtonWidth) / 2, defultCheckButtonWidth, + defultCheckButtonWidth); + + textRec = new Rectangle(checkRec.Right + 3, 0, Width - checkRec.Right - 6, this.Height); + } + + + /// + /// 画勾选 + /// + /// + /// + /// + private void DrawCheckFlag(Graphics g, Rectangle rectangle, Color color) + { + PointF[] pointFs = new PointF[3]; + + pointFs[0] = new PointF(rectangle.X + rectangle.Width / 4.5f, rectangle.Y + rectangle.Height / 2.5f); + pointFs[1] = new PointF(rectangle.X + rectangle.Width / 2.5F, rectangle.Bottom - rectangle.Height / 3.0f); + pointFs[2] = new PointF(rectangle.Right - rectangle.Width / 4.0f, rectangle.Y + rectangle.Height / 4.5f); + + Pen pen = new Pen(color, 2.0f); + g.DrawLines(pen, pointFs); + + } + } +} diff --git a/JinYuan.ControlLib/CircleProgramBar.Designer.cs b/JinYuan.ControlLib/CircleProgramBar.Designer.cs new file mode 100644 index 0000000..f86b951 --- /dev/null +++ b/JinYuan.ControlLib/CircleProgramBar.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class CircleProgramBar + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/CircleProgramBar.cs b/JinYuan.ControlLib/CircleProgramBar.cs new file mode 100644 index 0000000..2944890 --- /dev/null +++ b/JinYuan.ControlLib/CircleProgramBar.cs @@ -0,0 +1,220 @@ +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class CircleProgramBar : Control + { + public CircleProgramBar() + { + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + InitControl(); + this.SizeChanged += delegate + { + this.Invalidate(); //重绘控件 + }; + + + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + /// + /// 初始化控件参数 + /// + private void InitControl() + { + this.Width = 200; + this.Height = 200; + } + + private Color bgColor = Color.FromArgb(224, 224, 224); + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示背景边框颜色")] + public Color BgColor + { + get { return this.bgColor; } + set + { + this.bgColor = value; + this.Invalidate(); + } + } + + private Color sectorColor = Color.FromArgb(109, 179, 63); + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示扇形颜色")] + public Color SectorColor + { + get { return this.sectorColor; } + set + { + this.sectorColor = value; + this.Invalidate(); + } + } + + private int borderWidth = 5; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示边框宽度")] + public int BorderWidth + { + get { return this.borderWidth; } + set + { + this.borderWidth = value; + this.Invalidate(); + } + } + + private int maxValue = 100; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示进度最大值")] + public int MaxValue + { + get { return this.maxValue; } + set + { + this.maxValue = value; + this.Invalidate(); + } + } + + + private bool isShowDataType = false; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置显示数值是小数还是整数")] + public bool IsShowDataType + { + get { return this.isShowDataType; } + set + { + this.isShowDataType = value; + this.Invalidate(); + } + } + + + private int intValue = 0; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示整数进度值")] + public int IntValue + { + get { return this.intValue; } + set + { + if (value > this.maxValue) + { + return; + } + this.intValue = value; + this.Invalidate(); + } + } + + private int floatValue = 0; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示小数进度值")] + public int FloatValue + { + get { return this.floatValue; } + set + { + if (value > this.maxValue) + { + return; + } + this.floatValue = value; + this.Invalidate(); + } + } + + + private bool setShowsign = false; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示百分号,显示百分号需要设置MaxValue值为100")] + public bool SetShowsign + { + get { return this.setShowsign; } + set + { + if (this.maxValue > 100) + { + this.maxValue = 100; + } + this.setShowsign = value; + this.Invalidate(); + } + } + + //对Control进行绘制 + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (this.Width < borderWidth * 4 || this.Height < borderWidth * 4) + { + return; + } + var g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿,也就是抗锯齿什么鬼东西 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + + + RectangleF bg_rectangle = new RectangleF(0 + borderWidth, 0 + borderWidth, Width - borderWidth * 2, Height - borderWidth * 2); //控件整体坐标 + + g.DrawEllipse(new Pen(bgColor, borderWidth), bg_rectangle); //画背景圆 + + + + Rectangle rl = new Rectangle(0 + borderWidth * 2, 0 + borderWidth * 2, this.Width - borderWidth * 4, this.Height - borderWidth * 4); + + decimal topAngle = (isShowDataType ? this.floatValue : this.intValue * 1.0M / this.maxValue) * 360M;//计算进度条划过的度数 + g.FillPie(new SolidBrush(sectorColor), rl, 0, (float)topAngle); //填充扇形 + + if (this.setShowsign) + { + SizeF proValSize = g.MeasureString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString() + "%", this.Font);//计算文字的范围 + + g.DrawString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString() + "%", this.Font, new SolidBrush(this.ForeColor), + + bg_rectangle.X + bg_rectangle.Width / 2 - proValSize.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - proValSize.Height / 2); + } + else + { + SizeF proValSize = g.MeasureString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString(), this.Font);//计算文字的范围 + + g.DrawString(isShowDataType ? this.floatValue.ToString() : this.intValue.ToString(), this.Font, new SolidBrush(this.ForeColor), + bg_rectangle.X + bg_rectangle.Width / 2 - proValSize.Width / 2, bg_rectangle.Y + bg_rectangle.Height / 2 - proValSize.Height / 2); + } + } + } +} diff --git a/JinYuan.ControlLib/ControlBase.Designer.cs b/JinYuan.ControlLib/ControlBase.Designer.cs new file mode 100644 index 0000000..aac3ed3 --- /dev/null +++ b/JinYuan.ControlLib/ControlBase.Designer.cs @@ -0,0 +1,37 @@ +namespace JinYuan.ControlLib +{ + partial class ControlBase + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/ControlBase.cs b/JinYuan.ControlLib/ControlBase.cs new file mode 100644 index 0000000..4a80ee4 --- /dev/null +++ b/JinYuan.ControlLib/ControlBase.cs @@ -0,0 +1,258 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class ControlBase : UserControl + { + /// + /// The is radius + /// + private bool _isRadius = false; + + /// + /// The corner radius + /// + private int _cornerRadius = 24; + + + /// + /// The is show rect + /// + private bool _isShowRect = false; + + /// + /// The rect color + /// + private Color _rectColor = Color.FromArgb(220, 220, 220); + + /// + /// The rect width + /// + private int _rectWidth = 1; + + /// + /// The fill color + /// + private Color _fillColor = Color.Transparent; + /// + /// 是否圆角 + /// + /// true if this instance is radius; otherwise, false. + [Description("是否圆角"), Category("自定义")] + public virtual bool IsRadius + { + get + { + return this._isRadius; + } + set + { + this._isRadius = value; + Refresh(); + } + } + /// + /// 圆角角度 + /// + /// The coner radius. + [Description("圆角角度"), Category("自定义")] + public virtual int ConerRadius + { + get + { + return this._cornerRadius; + } + set + { + this._cornerRadius = Math.Max(value, 1); + Refresh(); + } + } + + /// + /// 是否显示边框 + /// + /// true if this instance is show rect; otherwise, false. + [Description("是否显示边框"), Category("自定义")] + public virtual bool IsShowRect + { + get + { + return this._isShowRect; + } + set + { + this._isShowRect = value; + Refresh(); + } + } + /// + /// 边框颜色 + /// + /// The color of the rect. + [Description("边框颜色"), Category("自定义")] + public virtual Color RectColor + { + get + { + return this._rectColor; + } + set + { + this._rectColor = value; + this.Refresh(); + } + } + + /// + /// 边框宽度 + /// + /// The width of the rect. + [Description("边框宽度"), Category("自定义")] + public virtual int RectWidth + { + get + { + return this._rectWidth; + } + set + { + this._rectWidth = value; + Refresh(); + } + } + /// + /// 当使用边框时填充颜色,当值为背景色或透明色或空值则不填充 + /// + /// The color of the fill. + [Description("当使用边框时填充颜色,当值为背景色或透明色或空值则不填充"), Category("自定义")] + public virtual Color FillColor + { + get + { + return this._fillColor; + } + set + { + this._fillColor = value; + Refresh(); + } + } + + /// + /// Initializes a new instance of the class. + /// + public ControlBase() + { + this.InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + } + + /// + /// 引发 事件。 + /// + /// 包含事件数据的 。 + protected override void OnPaint(PaintEventArgs e) + { + if (this.Visible) + { + if (this._isRadius) + { + this.SetWindowRegion(); + } + else + { + //关闭圆角后显示为原矩形 + GraphicsPath g = new GraphicsPath(); + g.AddRectangle(base.ClientRectangle); + g.CloseFigure(); + base.Region = new Region(g); + } + + GraphicsPath graphicsPath = new GraphicsPath(); + if (this._isShowRect || (_fillColor != Color.Empty && _fillColor != Color.Transparent && _fillColor != this.BackColor)) + { + Rectangle clientRectangle = base.ClientRectangle; + if (_isRadius) + { + graphicsPath.AddArc(0, 0, _cornerRadius, _cornerRadius, 180f, 90f); + graphicsPath.AddArc(clientRectangle.Width - _cornerRadius - 1, 0, _cornerRadius, _cornerRadius, 270f, 90f); + graphicsPath.AddArc(clientRectangle.Width - _cornerRadius - 1, clientRectangle.Height - _cornerRadius - 1, _cornerRadius, _cornerRadius, 0f, 90f); + graphicsPath.AddArc(0, clientRectangle.Height - _cornerRadius - 1, _cornerRadius, _cornerRadius, 90f, 90f); + graphicsPath.CloseFigure(); + } + else + { + graphicsPath.AddRectangle(clientRectangle); + } + } + e.Graphics.SetGDIHigh(); + if (_fillColor != Color.Empty && _fillColor != Color.Transparent && _fillColor != this.BackColor) + e.Graphics.FillPath(new SolidBrush(this._fillColor), graphicsPath); + if (this._isShowRect) + { + Color rectColor = this._rectColor; + Pen pen = new Pen(rectColor, (float)this._rectWidth); + e.Graphics.DrawPath(pen, graphicsPath); + } + } + base.OnPaint(e); + } + + /// + /// Sets the window region. + /// + private void SetWindowRegion() + { + GraphicsPath path = new GraphicsPath(); + Rectangle rect = new Rectangle(-1, -1, base.Width + 1, base.Height); + path = this.GetRoundedRectPath(rect, this._cornerRadius); + base.Region = new Region(path); + } + + /// + /// Gets the rounded rect path. + /// + /// The rect. + /// The radius. + /// GraphicsPath. + private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius) + { + Rectangle rect2 = new Rectangle(rect.Location, new Size(radius, radius)); + GraphicsPath graphicsPath = new GraphicsPath(); + graphicsPath.AddArc(rect2, 180f, 90f);//左上角 + rect2.X = rect.Right - radius; + graphicsPath.AddArc(rect2, 270f, 90f);//右上角 + rect2.Y = rect.Bottom - radius; + rect2.Width += 1; + rect2.Height += 1; + graphicsPath.AddArc(rect2, 360f, 90f);//右下角 + rect2.X = rect.Left; + graphicsPath.AddArc(rect2, 90f, 90f);//左下角 + graphicsPath.CloseFigure(); + return graphicsPath; + } + + /// + /// WNDs the proc. + /// + /// 要处理的 Windows 。 + protected override void WndProc(ref Message m) + { + if (m.Msg != 20) + { + base.WndProc(ref m); + } + } + } +} diff --git a/JinYuan.ControlLib/CustomComboBox.Designer.cs b/JinYuan.ControlLib/CustomComboBox.Designer.cs new file mode 100644 index 0000000..de3f81a --- /dev/null +++ b/JinYuan.ControlLib/CustomComboBox.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class CustomComboBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/CustomComboBox.cs b/JinYuan.ControlLib/CustomComboBox.cs new file mode 100644 index 0000000..6a0d21c --- /dev/null +++ b/JinYuan.ControlLib/CustomComboBox.cs @@ -0,0 +1,280 @@ +using AntdUI; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class CustomComboBox : ComboBox + { + private Color darkBackColor = Color.FromArgb(30, 30, 30); + private Color lightBackColor = Color.White; + private Color darkForeColor = Color.White; + private Color lightForeColor = Color.Black; + private Color darkBorderColor = Color.FromArgb(64, 64, 64); + private Color lightBorderColor = Color.FromArgb(217, 217, 217); + private Color darkArrowColor = Color.White; + private Color lightArrowColor = Color.Black; + private Color darkWatermarkColor = Color.Gray; + private Color lightWatermarkColor = Color.LightGray; + + private string watermarkText = string.Empty; + [Category("行为")] + public string WatermarkText + { + get { return watermarkText; } + set + { + watermarkText = value; + Invalidate(); + } + } + + private int cornerRadius = 5; // 新增:控制圆角半径的字段 + + [Category("外观")] + [DefaultValue(5)] + public int CornerRadius + { + get { return cornerRadius; } + set + { + if (cornerRadius != value) + { + cornerRadius = value; + Invalidate(); + } + } + } + + public CustomComboBox() + { + SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); + DrawMode = DrawMode.OwnerDrawFixed; + DropDownStyle = ComboBoxStyle.DropDownList; + UpdateTheme(Config.IsDark); + + } + + + + + public void UpdateTheme(bool isDark) + { + BackColor = isDark ? darkBackColor : lightBackColor; + ForeColor = isDark ? darkForeColor : lightForeColor; + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs e) + { + using (var path = CreateRoundedRectangle(new Rectangle(0, 0, Width - 1, Height - 1), cornerRadius)) + { + var g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; + + var rect = new Rectangle(0, 0, Width - 1, Height - 1); + var borderColor = Config.IsDark ? darkBorderColor : lightBorderColor; + var arrowColor = Config.IsDark ? darkArrowColor : lightArrowColor; + + // Draw background + using (var brush = new SolidBrush(BackColor)) + { + g.FillPath(brush, path); + } + + // Draw border + using (var pen = new Pen(borderColor)) + { + g.DrawPath(pen, path); + } + + // Draw text or watermark + var textRect = new Rectangle(cornerRadius, 2, Width - 20 - cornerRadius, Height - 4); + var flags = TextFormatFlags.VerticalCenter | TextFormatFlags.Left; + if (SelectedItem != null) + { + string displayText = GetCustomItemText(SelectedItem); + using (var brush = new SolidBrush(ForeColor)) + { + TextRenderer.DrawText(g, displayText, Font, textRect, ForeColor, flags); + } + } + else if (!string.IsNullOrEmpty(watermarkText)) + { + var watermarkColor = Config.IsDark ? darkWatermarkColor : lightWatermarkColor; + TextRenderer.DrawText(g, watermarkText, Font, textRect, watermarkColor, flags); + } + + // Draw arrow + var arrowSize = 8; + var arrowRect = new Rectangle(Width - arrowSize - 8 - cornerRadius, (Height - arrowSize) / 2, arrowSize, arrowSize); + using (var brush = new SolidBrush(arrowColor)) + { + Point[] arrow = { + new Point(arrowRect.Left, arrowRect.Top), + new Point(arrowRect.Right, arrowRect.Top), + new Point(arrowRect.Left + arrowRect.Width / 2, arrowRect.Bottom) + }; + g.FillPolygon(brush, arrow); + } + } + } + + protected override void OnDrawItem(DrawItemEventArgs e) + { + if (e.Index < 0) return; + + // 设置下拉项的背景色 + Color backColor; + Color textColor; + + if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) + { + // 选中项的颜色 + backColor = Config.IsDark ? Color.FromArgb(45, 45, 45) : Color.FromArgb(230, 230, 230); + textColor = Config.IsDark ? darkForeColor : lightForeColor; + } + else + { + // 未选中项的颜色 + backColor = Config.IsDark ? darkBackColor : lightBackColor; + textColor = Config.IsDark ? darkForeColor : lightForeColor; + } + + // 使用新的背景色绘制背景 + using (var backBrush = new SolidBrush(backColor)) + { + e.Graphics.FillRectangle(backBrush, e.Bounds); + } + + // 绘制文本 + if (e.Index >= 0) + { + string itemText = GetCustomItemText(Items[e.Index]); + + // 设置文本边距 + Rectangle textBounds = new Rectangle( + e.Bounds.X + 5, // 左边距 + e.Bounds.Y, + e.Bounds.Width - 10, // 右边距 + e.Bounds.Height + ); + + // 使用TextRenderer绘制文本以获得更好的文本渲染效果 + TextRenderer.DrawText( + e.Graphics, + itemText, + Font, + textBounds, + textColor, + TextFormatFlags.VerticalCenter | TextFormatFlags.Left + ); + } + + // 如果有焦点,绘制焦点矩形 + if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) + { + using (Pen focusPen = new Pen(Config.IsDark ? Color.FromArgb(70, 70, 70) : Color.FromArgb(180, 180, 180))) + { + e.Graphics.DrawRectangle(focusPen, new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1)); + } + } + } + + // 添加这个方法来处理下拉列表的外观 + protected override void WndProc(ref System.Windows.Forms.Message m) + { + if (m.Msg == 0x204E) // WM_CTLCOLORLISTBOX + { + // 获取下拉列表的句柄 + var hDC = m.WParam; + var hListBox = m.LParam; + + using (Graphics g = Graphics.FromHdc(hDC)) + { + // 设置下拉列表的背景色 + using (SolidBrush backBrush = new SolidBrush(Config.IsDark ? darkBackColor : lightBackColor)) + { + g.FillRectangle(backBrush, this.DropDownRectangle); + } + } + } + base.WndProc(ref m); + } + + // 获取下拉列表的矩形区域 + private Rectangle DropDownRectangle + { + get + { + return new Rectangle(0, 0, DropDownWidth, ItemHeight * Math.Max(Items.Count, 1)); + } + } + + private string GetCustomItemText(object item) + { + if (item == null) + return string.Empty; + + if (string.IsNullOrEmpty(DisplayMember)) + return item.ToString(); + + PropertyDescriptor descriptor = TypeDescriptor.GetProperties(item).Find(DisplayMember, true); + if (descriptor != null) + return descriptor.GetValue(item)?.ToString() ?? string.Empty; + + return item.ToString(); + } + + public object GetSelectedValue() + { + if (SelectedItem == null) + return null; + + if (string.IsNullOrEmpty(ValueMember)) + return SelectedItem; + + PropertyDescriptor descriptor = TypeDescriptor.GetProperties(SelectedItem).Find(ValueMember, true); + if (descriptor != null) + return descriptor.GetValue(SelectedItem); + + return null; + } + + + private GraphicsPath CreateRoundedRectangle(Rectangle bounds, int radius) + { + int diameter = radius * 2; + Size size = new Size(diameter, diameter); + Rectangle arc = new Rectangle(bounds.Location, size); + GraphicsPath path = new GraphicsPath(); + + if (radius == 0) + { + path.AddRectangle(bounds); + return path; + } + + // 左上角 + path.AddArc(arc, 180, 90); + + // 右上角 + arc.X = bounds.Right - diameter; + path.AddArc(arc, 270, 90); + + // 右下角 + arc.Y = bounds.Bottom - diameter; + path.AddArc(arc, 0, 90); + + // 左下角 + arc.X = bounds.Left; + path.AddArc(arc, 90, 90); + + path.CloseFigure(); + return path; + } + } +} diff --git a/JinYuan.ControlLib/CustomDataGridView.cs b/JinYuan.ControlLib/CustomDataGridView.cs new file mode 100644 index 0000000..3e9d8f6 --- /dev/null +++ b/JinYuan.ControlLib/CustomDataGridView.cs @@ -0,0 +1,233 @@ +using AntdUI; +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public class CustomDataGridView : DataGridView + { + private Color darkBackgroundColor = Color.FromArgb(18, 18, 18); + private Color lightBackgroundColor = Color.White; + private Color darkForeColor = Color.White; + private Color lightForeColor = Color.Black; + private Color darkHeaderBackColor = Color.FromArgb(30, 30, 30); + private Color lightHeaderBackColor = Color.FromArgb(240, 240, 240); + private Color darkSelectedCellColor = Color.FromArgb(64, 64, 64); + private Color lightSelectedCellColor = Color.FromArgb(200, 200, 200); + private Color darkSelectedColumnColor = Color.FromArgb(45, 45, 45); + private Color lightSelectedColumnColor = Color.FromArgb(220, 220, 220); + private Color darkButtonColor = Color.FromArgb(64, 64, 64); + private Color lightButtonColor = Color.FromArgb(240, 240, 240); + private Color darkComboBoxColor = Color.FromArgb(45, 45, 45); + private Color lightComboBoxColor = Color.FromArgb(250, 250, 250); + + public CustomDataGridView() + { + InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + UpdateTheme(Config.IsDark); + } + + private void InitializeComponent() + { + this.RowHeadersVisible = true; + this.AllowUserToAddRows = false; + this.AllowUserToDeleteRows = false; + this.AllowUserToResizeRows = false; + this.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + this.MultiSelect = false; + this.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal; + this.BorderStyle = BorderStyle.None; + this.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; + this.EnableHeadersVisualStyles = false; + + this.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + this.ColumnHeadersDefaultCellStyle.Font = new Font(this.Font.FontFamily, this.Font.Size, FontStyle.Bold); + this.ColumnHeadersHeight = 30; + + this.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + this.RowHeadersWidth = 50; + + // 设置默认的行高 + this.RowTemplate.Height = 28; + } + + public void UpdateTheme(bool isDark) + { + // 基础颜色 + this.BackgroundColor = isDark ? darkBackgroundColor : lightBackgroundColor; + this.ForeColor = isDark ? darkForeColor : lightForeColor; + this.GridColor = isDark ? Color.DimGray : Color.LightGray; + + // 列头样式 + this.ColumnHeadersDefaultCellStyle.BackColor = isDark ? darkHeaderBackColor : lightHeaderBackColor; + this.ColumnHeadersDefaultCellStyle.ForeColor = isDark ? darkForeColor : lightForeColor; + this.ColumnHeadersDefaultCellStyle.SelectionBackColor = isDark ? darkSelectedColumnColor : lightSelectedColumnColor; + this.ColumnHeadersDefaultCellStyle.SelectionForeColor = isDark ? darkForeColor : lightForeColor; + + // 行头样式 + this.RowHeadersDefaultCellStyle.BackColor = isDark ? darkHeaderBackColor : lightHeaderBackColor; + this.RowHeadersDefaultCellStyle.ForeColor = isDark ? darkForeColor : lightForeColor; + this.RowHeadersDefaultCellStyle.SelectionBackColor = isDark ? darkSelectedCellColor : lightSelectedCellColor; + this.RowHeadersDefaultCellStyle.SelectionForeColor = isDark ? darkForeColor : lightForeColor; + + // 默认单元格样式 + this.DefaultCellStyle.BackColor = this.BackgroundColor; + this.DefaultCellStyle.ForeColor = this.ForeColor; + this.DefaultCellStyle.SelectionBackColor = isDark ? darkSelectedCellColor : lightSelectedCellColor; + this.DefaultCellStyle.SelectionForeColor = isDark ? darkForeColor : lightForeColor; + + // 更新所有列的样式 + foreach (DataGridViewColumn column in this.Columns) + { + if (column is DataGridViewComboBoxColumn comboBoxColumn) + { + // ComboBox列样式 + comboBoxColumn.DefaultCellStyle.BackColor = isDark ? darkComboBoxColor : lightComboBoxColor; + comboBoxColumn.DefaultCellStyle.ForeColor = isDark ? darkForeColor : lightForeColor; + comboBoxColumn.DefaultCellStyle.SelectionBackColor = isDark ? darkSelectedCellColor : lightSelectedCellColor; + comboBoxColumn.DefaultCellStyle.SelectionForeColor = isDark ? darkForeColor : lightForeColor; + comboBoxColumn.FlatStyle = FlatStyle.Flat; + } + else if (column is DataGridViewButtonColumn buttonColumn) + { + // Button列样式 + DataGridViewCellStyle buttonStyle = new DataGridViewCellStyle(); + buttonStyle.BackColor = isDark ? darkButtonColor : lightButtonColor; + buttonStyle.ForeColor = isDark ? darkForeColor : lightForeColor; + buttonStyle.SelectionBackColor = isDark ? darkSelectedCellColor : lightSelectedCellColor; + buttonStyle.SelectionForeColor = isDark ? darkForeColor : lightForeColor; + buttonStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + buttonColumn.DefaultCellStyle = buttonStyle; + buttonColumn.FlatStyle = FlatStyle.Flat; + } + } + + this.Invalidate(); + } + + protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) + { + if (e.RowIndex == -1 && e.ColumnIndex >= 0) + { + // 绘制列头 + e.PaintBackground(e.CellBounds, true); + Rectangle newRect = new Rectangle(e.CellBounds.X + 2, e.CellBounds.Y + 2, + e.CellBounds.Width - 4, e.CellBounds.Height - 4); + + using (var brush = new SolidBrush(e.CellStyle.ForeColor)) + { + e.Graphics.DrawString(e.Value?.ToString(), this.ColumnHeadersDefaultCellStyle.Font, + brush, newRect, new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }); + } + e.Handled = true; + } + else if (e.RowIndex >= 0 && e.ColumnIndex == -1) + { + // 绘制行头(行号) + e.PaintBackground(e.CellBounds, true); + Rectangle newRect = new Rectangle(e.CellBounds.X + 2, e.CellBounds.Y + 2, + e.CellBounds.Width - 4, e.CellBounds.Height - 4); + + string rowNumber = (e.RowIndex + 1).ToString(); + + // 判断当前行是否被选中 + bool isSelected = this.Rows[e.RowIndex].Selected; + Color textColor; + + if (isSelected) + { + // 如果行被选中,使用选中状态的前景色 + textColor = this.RowHeadersDefaultCellStyle.SelectionForeColor; + } + else + { + // 如果行未被选中,使用普通状态的前景色 + textColor = Config.IsDark ? darkForeColor : lightForeColor; + } + + using (var brush = new SolidBrush(textColor)) + { + e.Graphics.DrawString(rowNumber, this.RowHeadersDefaultCellStyle.Font, + brush, newRect, new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }); + } + e.Handled = true; + } + else if (e.ColumnIndex >= 0 && e.RowIndex >= 0) + { + // 处理按钮列的绘制 + if (this.Columns[e.ColumnIndex] is DataGridViewButtonColumn) + { + e.PaintBackground(e.CellBounds, true); + Rectangle buttonBounds = new Rectangle(e.CellBounds.X + 2, e.CellBounds.Y + 2, + e.CellBounds.Width - 4, e.CellBounds.Height - 4); + + using (var buttonBrush = new SolidBrush(e.CellStyle.BackColor)) + using (var textBrush = new SolidBrush(e.CellStyle.ForeColor)) + { + // 绘制按钮背景 + e.Graphics.FillRectangle(buttonBrush, buttonBounds); + + // 绘制按钮文本 + string buttonText = e.Value?.ToString() ?? string.Empty; + e.Graphics.DrawString(buttonText, this.Font, textBrush, + buttonBounds, new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }); + } + e.Handled = true; + } + else + { + base.OnCellPainting(e); + } + } + else + { + base.OnCellPainting(e); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // 绘制列头底部边框 + using (var pen = new Pen(Config.IsDark ? Color.DimGray : Color.LightGray)) + { + e.Graphics.DrawLine(pen, 0, this.ColumnHeadersHeight, this.Width, this.ColumnHeadersHeight); + } + } + + protected override void OnColumnHeadersHeightChanged(EventArgs e) + { + base.OnColumnHeadersHeightChanged(e); + this.ColumnHeadersHeight = 30; + } + + protected override void OnDataBindingComplete(DataGridViewBindingCompleteEventArgs e) + { + base.OnDataBindingComplete(e); + + // 重新应用主题样式 + UpdateTheme(Config.IsDark); + } + } +} diff --git a/JinYuan.ControlLib/CustomGroupBox.Designer.cs b/JinYuan.ControlLib/CustomGroupBox.Designer.cs new file mode 100644 index 0000000..fce89ce --- /dev/null +++ b/JinYuan.ControlLib/CustomGroupBox.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class CustomGroupBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/CustomGroupBox.cs b/JinYuan.ControlLib/CustomGroupBox.cs new file mode 100644 index 0000000..91efe94 --- /dev/null +++ b/JinYuan.ControlLib/CustomGroupBox.cs @@ -0,0 +1,137 @@ +using AntdUI; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class CustomGroupBox : GroupBox + { + private Color darkBorderColor = Color.FromArgb(64, 64, 64); + private Color lightBorderColor = Color.FromArgb(217, 217, 217); + private Color darkForeColor = Color.White; + private Color lightForeColor = Color.Black; + private const int TextPadding = 4; + + public Color BorderColor { get; set; } = Color.Gray; + + + private float _borderWidth = 1f; + private float _cornerRadius = 5f; + + [Category("Appearance")] + [DefaultValue(1f)] + public float BorderWidth + { + get => _borderWidth; + set + { + _borderWidth = value; + Invalidate(); + } + } + + [Category("Appearance")] + [DefaultValue(5f)] + public float CornerRadius + { + get => _cornerRadius; + set + { + _cornerRadius = value; + Invalidate(); + } + } + + public CustomGroupBox() + { + SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); + UpdateTheme(Config.IsDark); + + } + + + + public void UpdateTheme(bool isDark) + { + ForeColor = isDark ? darkForeColor : lightForeColor; + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs e) + { + var g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; + + var borderColor = Config.IsDark ? darkBorderColor : lightBorderColor; + var textSize = g.MeasureString(Text, Font); + var textWidth = (int)Math.Ceiling(textSize.Width) + TextPadding * 2; + var textHeight = (int)Math.Ceiling(textSize.Height); + + var textRect = new Rectangle(TextPadding, 0, textWidth, textHeight); + var borderRect = new Rectangle((int)(_borderWidth / 2), textHeight / 2, + Width - 1 - (int)_borderWidth, Height - textHeight / 2 - 1 - (int)_borderWidth); + + //绘制边框颜色 + using (var pen = new Pen(BorderColor, BorderWidth)) + { + e.Graphics.DrawRectangle(pen, 0, 0, Width - BorderWidth, Height - BorderWidth); + } + + // 绘制背景 + using (var brush = new SolidBrush(BackColor)) + { + g.FillRectangle(brush, ClientRectangle); + } + + // 创建圆角矩形路径 + using (var path = GetRoundedRectanglePath(borderRect, _cornerRadius)) + { + // 绘制边框 + using (var pen = new Pen(borderColor, _borderWidth)) + { + g.DrawPath(pen, path); + } + } + + // 绘制标题文本背景 + using (var brush = new SolidBrush(BackColor)) + { + g.FillRectangle(brush, textRect); + } + + // 绘制标题文本 + using (var brush = new SolidBrush(ForeColor)) + { + g.DrawString(Text, Font, brush, textRect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); + } + } + + private GraphicsPath GetRoundedRectanglePath(Rectangle rect, float radius) + { + GraphicsPath path = new GraphicsPath(); + float diameter = radius * 2; + RectangleF arcRect = new RectangleF(rect.Location, new SizeF(diameter, diameter)); + + // 左上角 + path.AddArc(arcRect, 180, 90); + + // 顶边 + arcRect.X = rect.Right - diameter; + path.AddArc(arcRect, 270, 90); + + // 右边 + arcRect.Y = rect.Bottom - diameter; + path.AddArc(arcRect, 0, 90); + + // 底边 + arcRect.X = rect.Left; + path.AddArc(arcRect, 90, 90); + + path.CloseFigure(); + return path; + } + } +} diff --git a/JinYuan.ControlLib/CustomRichTextBox.Designer.cs b/JinYuan.ControlLib/CustomRichTextBox.Designer.cs new file mode 100644 index 0000000..aa3874d --- /dev/null +++ b/JinYuan.ControlLib/CustomRichTextBox.Designer.cs @@ -0,0 +1,37 @@ +namespace JinYuan.ControlLib +{ + partial class CustomRichTextBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + HandleCreated -= CustomRichTextBox_HandleCreated; + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/CustomRichTextBox.cs b/JinYuan.ControlLib/CustomRichTextBox.cs new file mode 100644 index 0000000..abc8b46 --- /dev/null +++ b/JinYuan.ControlLib/CustomRichTextBox.cs @@ -0,0 +1,442 @@ +using AntdUI; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + + public partial class CustomRichTextBox : RichTextBox + { + private Color darkBackColor = Color.Black; + private Color lightBackColor = Color.White; + private Color darkForeColor = Color.White; + private Color lightForeColor = Color.Black; + private Color darkBorderColor = Color.FromArgb(64, 64, 64); + private Color lightBorderColor = Color.FromArgb(217, 217, 217); + private bool isDarkTheme; + private const int BatchSize = 5000; + private bool isUpdatingTheme = false; + private bool isInitialized = false; + + public CustomRichTextBox() + { + BorderStyle = BorderStyle.None; + SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); + + // 在句柄创建后初始化主题 + HandleCreated += CustomRichTextBox_HandleCreated; + } + + private void CustomRichTextBox_HandleCreated(object sender, EventArgs e) + { + if (!isInitialized) + { + isInitialized = true; + InitializeThemeAsync(); + } + } + + private async void InitializeThemeAsync() + { + try + { + await UpdateThemeAsync(Config.IsDark); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Theme initialization failed: {ex.Message}"); + } + } + + public async Task UpdateThemeAsync(bool isDark) + { + if (isDarkTheme == isDark || isUpdatingTheme || !IsHandleCreated) return; + + isUpdatingTheme = true; + isDarkTheme = isDark; + + try + { + if (InvokeRequired) + { + await Task.Run(() => + { + Invoke((MethodInvoker)(() => UpdateThemeInternal())); + }); + } + else + { + UpdateThemeInternal(); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Theme update failed: {ex.Message}"); + } + finally + { + isUpdatingTheme = false; + } + } + + private void UpdateThemeInternal() + { + if (!IsHandleCreated) return; + + BackColor = isDarkTheme ? darkBackColor : lightBackColor; + ForeColor = isDarkTheme ? darkForeColor : lightForeColor; + + SuspendLayout(); + try + { + int visibleStart = GetCharIndexFromPosition(new Point(0, 0)); + int visibleEnd = GetCharIndexFromPosition(new Point(ClientSize.Width, ClientSize.Height)); + + // Update visible text first + UpdateTextColors(visibleStart, visibleEnd - visibleStart); + + // Then update the rest in batches + for (int i = 0; i < TextLength; i += BatchSize) + { + if (i >= visibleStart && i < visibleEnd) continue; + int length = Math.Min(BatchSize, TextLength - i); + UpdateTextColors(i, length); + if (i % (BatchSize * 10) == 0) Application.DoEvents(); + } + } + finally + { + ResumeLayout(); + } + + Invalidate(); + } + + private void UpdateTextColors(int start, int length) + { + if (start < 0 || length <= 0 || start + length > TextLength) return; + + Select(start, length); + SelectionColor = ForeColor; + SelectionBackColor = BackColor; + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + using (var pen = new Pen(isDarkTheme ? darkBorderColor : lightBorderColor)) + { + e.Graphics.DrawRectangle(pen, 0, 0, Width - 1, Height - 1); + } + } + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + + if (!isUpdatingTheme && TextLength > 0 && IsHandleCreated) + { + int start = TextLength - 1; + int length = 1; + if (start < 0) start = 0; + if (start + length > TextLength) length = TextLength - start; + + UpdateTextColors(start, length); + SelectionLength = 0; + SelectionStart = TextLength; + } + } + + [Browsable(true)] + [Category("Appearance")] + [DefaultValue(typeof(Color), "30, 30, 30")] + public Color DarkBackColor + { + get => darkBackColor; + set + { + if (darkBackColor != value) + { + darkBackColor = value; + if (isDarkTheme && IsHandleCreated) SafeRefreshTheme(); + } + } + } + + [Browsable(true)] + [Category("Appearance")] + [DefaultValue(typeof(Color), "White")] + public Color LightBackColor + { + get => lightBackColor; + set + { + if (lightBackColor != value) + { + lightBackColor = value; + if (!isDarkTheme && IsHandleCreated) SafeRefreshTheme(); + } + } + } + + [Browsable(true)] + [Category("Appearance")] + [DefaultValue(typeof(Color), "White")] + public Color DarkForeColor + { + get => darkForeColor; + set + { + if (darkForeColor != value) + { + darkForeColor = value; + if (isDarkTheme && IsHandleCreated) SafeRefreshTheme(); + } + } + } + + [Browsable(true)] + [Category("Appearance")] + [DefaultValue(typeof(Color), "Black")] + public Color LightForeColor + { + get => lightForeColor; + set + { + if (lightForeColor != value) + { + lightForeColor = value; + if (!isDarkTheme && IsHandleCreated) SafeRefreshTheme(); + } + } + } + + [Browsable(true)] + [Category("Appearance")] + [DefaultValue(typeof(Color), "64, 64, 64")] + public Color DarkBorderColor + { + get => darkBorderColor; + set + { + if (darkBorderColor != value) + { + darkBorderColor = value; + if (isDarkTheme && IsHandleCreated) Invalidate(); + } + } + } + + [Browsable(true)] + [Category("Appearance")] + [DefaultValue(typeof(Color), "217, 217, 217")] + public Color LightBorderColor + { + get => lightBorderColor; + set + { + if (lightBorderColor != value) + { + lightBorderColor = value; + if (!isDarkTheme && IsHandleCreated) Invalidate(); + } + } + } + + private async void SafeRefreshTheme() + { + try + { + await RefreshThemeAsync(); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Theme refresh failed: {ex.Message}"); + } + } + + public async Task RefreshThemeAsync() + { + if (!IsHandleCreated) return; + await UpdateThemeAsync(isDarkTheme); + } + + + } +} +//public partial class CustomRichTextBox : RichTextBox +//{ +// private Color darkBackColor = Color.Black; +// private Color lightBackColor = Color.White; +// private Color darkForeColor = Color.White; +// private Color lightForeColor = Color.Black; +// private Color darkBorderColor = Color.FromArgb(64, 64, 64); +// private Color lightBorderColor = Color.FromArgb(217, 217, 217); +// private bool isDarkTheme; + +// private const int BatchSize = 5000; // 每批处理的字符数 +// private bool isUpdatingTheme = false; + +// public CustomRichTextBox() +// { +// BorderStyle = BorderStyle.None; +// SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); + +// InitializeThemeAsync(); +// } + + +// private async void InitializeThemeAsync() +// { +// await UpdateThemeAsync(Config.IsDark); +// } + +// public async Task UpdateThemeAsync(bool isDark) +// { +// if (isDarkTheme == isDark || isUpdatingTheme) return; + +// isUpdatingTheme = true; +// isDarkTheme = isDark; + +// try +// { +// await Task.Run(async () => +// { +// await InvokeAsync(() => +// { +// BackColor = isDark ? darkBackColor : lightBackColor; +// ForeColor = isDark ? darkForeColor : lightForeColor; + +// SuspendLayout(); +// try +// { +// int visibleStart = GetCharIndexFromPosition(new Point(0, 0)); +// int visibleEnd = GetCharIndexFromPosition(new Point(ClientSize.Width, ClientSize.Height)); + +// // Update visible text first +// UpdateTextColors(visibleStart, visibleEnd - visibleStart); + +// // Then update the rest in batches +// for (int i = 0; i < TextLength; i += BatchSize) +// { +// if (i >= visibleStart && i < visibleEnd) continue; // Skip already updated visible part +// int length = Math.Min(BatchSize, TextLength - i); +// UpdateTextColors(i, length); +// if (i % (BatchSize * 10) == 0) Application.DoEvents(); +// } +// } +// finally +// { +// ResumeLayout(); +// } + +// Invalidate(); +// }); +// }); +// } +// finally +// { +// isUpdatingTheme = false; +// } +// } + +// private void UpdateTextColors(int start, int length) +// { +// Select(start, length); +// SelectionColor = ForeColor; +// SelectionBackColor = BackColor; +// } + +// protected override void OnPaint(PaintEventArgs e) +// { +// base.OnPaint(e); +// using (var pen = new Pen(isDarkTheme ? darkBorderColor : lightBorderColor)) +// { +// e.Graphics.DrawRectangle(pen, 0, 0, Width - 1, Height - 1); +// } +// } + +// protected override void OnTextChanged(EventArgs e) +// { +// base.OnTextChanged(e); + +// if (!isUpdatingTheme && TextLength > 0) +// { +// int start = TextLength - 1; +// int length = 1; +// if (start < 0) start = 0; +// if (start + length > TextLength) length = TextLength - start; + +// UpdateTextColors(start, length); +// SelectionLength = 0; +// SelectionStart = TextLength; +// } +// } + +// [Browsable(true)] +// [Category("Appearance")] +// [DefaultValue(typeof(Color), "30, 30, 30")] +// public Color DarkBackColor +// { +// get => darkBackColor; +// set { darkBackColor = value; if (isDarkTheme) RefreshThemeAsync(); } +// } + +// [Browsable(true)] +// [Category("Appearance")] +// [DefaultValue(typeof(Color), "White")] +// public Color LightBackColor +// { +// get => lightBackColor; +// set { lightBackColor = value; if (!isDarkTheme) RefreshThemeAsync(); } +// } + +// [Browsable(true)] +// [Category("Appearance")] +// [DefaultValue(typeof(Color), "White")] +// public Color DarkForeColor +// { +// get => darkForeColor; +// set { darkForeColor = value; if (isDarkTheme) RefreshThemeAsync(); } +// } + +// [Browsable(true)] +// [Category("Appearance")] +// [DefaultValue(typeof(Color), "Black")] +// public Color LightForeColor +// { +// get => lightForeColor; +// set { lightForeColor = value; if (!isDarkTheme) RefreshThemeAsync(); } +// } + +// [Browsable(true)] +// [Category("Appearance")] +// [DefaultValue(typeof(Color), "64, 64, 64")] +// public Color DarkBorderColor +// { +// get => darkBorderColor; +// set { darkBorderColor = value; if (isDarkTheme) Invalidate(); } +// } + +// [Browsable(true)] +// [Category("Appearance")] +// [DefaultValue(typeof(Color), "217, 217, 217")] +// public Color LightBorderColor +// { +// get => lightBorderColor; +// set { lightBorderColor = value; if (!isDarkTheme) Invalidate(); } +// } + +// public async Task RefreshThemeAsync() +// { +// await UpdateThemeAsync(isDarkTheme); +// } + +// private Task InvokeAsync(Action action) +// { +// return Task.Factory.FromAsync(BeginInvoke(action), EndInvoke); +// } +//} diff --git a/JinYuan.ControlLib/DataGridView/DataGridViewCellEntity.cs b/JinYuan.ControlLib/DataGridView/DataGridViewCellEntity.cs new file mode 100644 index 0000000..3640850 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/DataGridViewCellEntity.cs @@ -0,0 +1,40 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class DataGridViewCellEntity. + /// + public class DataGridViewCellEntity + { + /// + /// Gets or sets the title. + /// + /// The title. + public string Title { get; set; } + /// + /// Gets or sets the width. + /// + /// The width. + public int Width { get; set; } + /// + /// Gets or sets the type of the width. + /// + /// The type of the width. + public System.Windows.Forms.SizeType WidthType { get; set; } + + } +} diff --git a/JinYuan.ControlLib/DataGridView/DataGridViewCellEventArgs.cs b/JinYuan.ControlLib/DataGridView/DataGridViewCellEventArgs.cs new file mode 100644 index 0000000..5ae6b39 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/DataGridViewCellEventArgs.cs @@ -0,0 +1,45 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class DataGridViewEventArgs. + /// Implements the + /// + /// + public class DataGridViewEventArgs : EventArgs + { + /// + /// Gets or sets the cell control. + /// + /// The cell control. + public Control CellControl { get; set; } + /// + /// Gets or sets the index of the cell. + /// + /// The index of the cell. + public int CellIndex { get; set; } + /// + /// Gets or sets the index of the row. + /// + /// The index of the row. + public int RowIndex { get; set; } + + } +} diff --git a/JinYuan.ControlLib/DataGridView/DataGridViewCellEventHandler.cs b/JinYuan.ControlLib/DataGridView/DataGridViewCellEventHandler.cs new file mode 100644 index 0000000..d18702e --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/DataGridViewCellEventHandler.cs @@ -0,0 +1,38 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; +using System.Runtime.InteropServices; + +namespace JinYuan.ControlLib +{ + /// + /// Delegate DataGridViewEventHandler + /// + /// The sender. + /// The instance containing the event data. + [Serializable] + [ComVisible(true)] + public delegate void DataGridViewEventHandler(object sender, DataGridViewEventArgs e); + + /// + /// Delegate DataGridViewRowCustomEventHandler + /// + /// The sender. + /// The instance containing the event data. + [Serializable] + [ComVisible(true)] + public delegate void DataGridViewRowCustomEventHandler(object sender, DataGridViewRowCustomEventArgs e); +} diff --git a/JinYuan.ControlLib/DataGridView/DataGridViewColumnEntity.cs b/JinYuan.ControlLib/DataGridView/DataGridViewColumnEntity.cs new file mode 100644 index 0000000..2b200a4 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/DataGridViewColumnEntity.cs @@ -0,0 +1,79 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; +using System.Drawing; + +namespace JinYuan.ControlLib +{ + /// + /// Class DataGridViewColumnEntity. + /// + public class DataGridViewColumnEntity + { + /// + /// Gets or sets the head text. + /// + /// The head text. + public string HeadText { get; set; } + /// + /// Gets or sets the width. + /// + /// The width. + public int Width { get; set; } + /// + /// Gets or sets the type of the width. + /// + /// The type of the width. + public System.Windows.Forms.SizeType WidthType { get; set; } + /// + /// Gets or sets the data field. + /// + /// The data field. + public string DataField { get; set; } + /// + /// Gets or sets the format. + /// + /// The format. + public Func Format { get; set; } + /// + /// The text align + /// + private ContentAlignment _TextAlign = ContentAlignment.MiddleCenter; + /// + /// Gets or sets the text align. + /// + /// The text align. + public ContentAlignment TextAlign { get { return _TextAlign; } set { _TextAlign = value; } } + /// + /// 自定义的单元格控件,一个实现IDataGridViewCustomCell的Control + /// + /// The custom cell. + private Type customCellType = null; + public Type CustomCellType + { + get + { + return customCellType; + } + set + { + if (!typeof(IDataGridViewCustomCell).IsAssignableFrom(value) || !value.IsSubclassOf(typeof(System.Windows.Forms.Control))) + throw new Exception("行控件没有实现IDataGridViewCustomCell接口"); + customCellType = value; + } + } + } +} diff --git a/JinYuan.ControlLib/DataGridView/DataGridViewRowCustomEventArgs.cs b/JinYuan.ControlLib/DataGridView/DataGridViewRowCustomEventArgs.cs new file mode 100644 index 0000000..59fab8a --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/DataGridViewRowCustomEventArgs.cs @@ -0,0 +1,36 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-27-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; + +namespace JinYuan.ControlLib +{ + /// + /// Class DataGridViewRowCustomEventArgs. + /// Implements the + /// + /// + public class DataGridViewRowCustomEventArgs : EventArgs + { + /// + /// Gets or sets the name of the event. + /// + /// The name of the event. + public string EventName { get; set; } + + public object Data { get; set; } + + } +} diff --git a/JinYuan.ControlLib/DataGridView/IDataGridViewCustomCell.cs b/JinYuan.ControlLib/DataGridView/IDataGridViewCustomCell.cs new file mode 100644 index 0000000..5b63737 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/IDataGridViewCustomCell.cs @@ -0,0 +1,19 @@ +namespace JinYuan.ControlLib +{ + public interface IDataGridViewCustomCell + { + /// + /// 绑定行关联的数据 + /// + /// The object. + void SetBindSource(object obj); + /// + /// 自定义事件传递,用于单元格向行中传递此事件 + /// + event DataGridViewRowCustomEventHandler RowCustomEvent; + /// + /// 关联数据源 + /// + object DataSource { get; } + } +} diff --git a/JinYuan.ControlLib/DataGridView/IDataGridViewRow.cs b/JinYuan.ControlLib/DataGridView/IDataGridViewRow.cs new file mode 100644 index 0000000..d3ea3fc --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/IDataGridViewRow.cs @@ -0,0 +1,87 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System.Collections.Generic; + +namespace JinYuan.ControlLib +{ + /// + /// Interface IDataGridViewRow + /// + public interface IDataGridViewRow + { + /// + /// Occurs when [row custom event]. + /// + event DataGridViewRowCustomEventHandler RowCustomEvent; + /// + /// CheckBox选中事件 + /// + event DataGridViewEventHandler CheckBoxChangeEvent; + /// + /// 点击单元格事件 + /// + event DataGridViewEventHandler CellClick; + /// + /// 数据源改变事件 + /// + event DataGridViewEventHandler SourceChanged; + /// + /// 列参数,用于创建列数和宽度 + /// + /// The columns. + List Columns { get; set; } + /// + /// Gets or sets a value indicating whether this instance is show CheckBox. + /// + /// true if this instance is show CheckBox; otherwise, false. + bool IsShowCheckBox { get; set; } + /// + /// 是否选中 + /// + /// true if this instance is checked; otherwise, false. + bool IsChecked { get; set; } + + /// + /// 数据源 + /// + /// The data source. + object DataSource { get; set; } + /// + /// 添加单元格元素,仅做添加控件操作,不做数据绑定,数据绑定使用BindingCells + /// + void ReloadCells(); + /// + /// 绑定数据到Cell + /// + /// 返回true则表示已处理过,否则将进行默认绑定(通常只针对有Text值的控件) + void BindingCellData(); + /// + /// 设置选中状态,通常为设置颜色即可 + /// + /// 是否选中 + void SetSelect(bool blnSelected); + /// + /// 行高 + /// + /// The height of the row. + int RowHeight { get; set; } + /// + /// 行号 + /// + /// The Index of the row. + int RowIndex { get; set; } + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridView.Designer.cs b/JinYuan.ControlLib/DataGridView/UCDataGridView.Designer.cs new file mode 100644 index 0000000..1c4a93c --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridView.Designer.cs @@ -0,0 +1,147 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class UCDataGridView. + /// Implements the + /// + /// + partial class UCDataGridView + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panHead = new System.Windows.Forms.Panel(); + this.panColumns = new System.Windows.Forms.TableLayoutPanel(); + this.panHeadLeft = new System.Windows.Forms.Panel(); + this.panRow = new System.Windows.Forms.FlowLayoutPanel(); + this.ucSplitLine_H1 = new JinYuan.ControlLib.UCSplitLine_H(); + this.panHead.SuspendLayout(); + this.SuspendLayout(); + // + // panHead + // + this.panHead.Controls.Add(this.panColumns); + this.panHead.Controls.Add(this.panHeadLeft); + this.panHead.Controls.Add(this.ucSplitLine_H1); + this.panHead.Location = new System.Drawing.Point(0, 0); + this.panHead.Name = "panHead"; + this.panHead.Size = new System.Drawing.Size(1061, 40); + this.panHead.TabIndex = 0; + // + // panColumns + // + this.panColumns.ColumnCount = 1; + this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.panColumns.Dock = System.Windows.Forms.DockStyle.Fill; + this.panColumns.Location = new System.Drawing.Point(0, 0); + this.panColumns.Name = "panColumns"; + this.panColumns.RowCount = 1; + this.panColumns.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.panColumns.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.panColumns.Size = new System.Drawing.Size(1061, 39); + this.panColumns.TabIndex = 1; + // + // panHeadLeft + // + this.panHeadLeft.Dock = System.Windows.Forms.DockStyle.Left; + this.panHeadLeft.Location = new System.Drawing.Point(0, 0); + this.panHeadLeft.Name = "panHeadLeft"; + this.panHeadLeft.Size = new System.Drawing.Size(0, 39); + this.panHeadLeft.TabIndex = 2; + // + // panRow + // + this.panRow.AutoScroll = true; + this.panRow.Dock = System.Windows.Forms.DockStyle.Fill; + this.panRow.Location = new System.Drawing.Point(0, 40); + this.panRow.Name = "panRow"; + this.panRow.Size = new System.Drawing.Size(317, 225); + this.panRow.TabIndex = 1; + this.panRow.Scroll += new System.Windows.Forms.ScrollEventHandler(this.panRow_Scroll); + // + // ucSplitLine_H1 + // + this.ucSplitLine_H1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); + this.ucSplitLine_H1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ucSplitLine_H1.Location = new System.Drawing.Point(0, 39); + this.ucSplitLine_H1.Name = "ucSplitLine_H1"; + this.ucSplitLine_H1.Size = new System.Drawing.Size(1061, 1); + this.ucSplitLine_H1.TabIndex = 0; + this.ucSplitLine_H1.TabStop = false; + // + // UCDataGridView + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.panRow); + this.Controls.Add(this.panHead); + this.Name = "UCDataGridView"; + this.Padding = new System.Windows.Forms.Padding(0, 40, 0, 0); + this.Size = new System.Drawing.Size(317, 265); + this.Scroll += new System.Windows.Forms.ScrollEventHandler(this.UCDataGridView_Scroll); + this.SizeChanged += new System.EventHandler(this.UCDataGridView_SizeChanged); + this.panHead.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + /// + /// The pan head + /// + private System.Windows.Forms.Panel panHead; + /// + /// The pan columns + /// + private System.Windows.Forms.TableLayoutPanel panColumns; + /// + /// The uc split line h1 + /// + private UCSplitLine_H ucSplitLine_H1; + /// + /// The pan head left + /// + private System.Windows.Forms.Panel panHeadLeft; + private System.Windows.Forms.FlowLayoutPanel panRow; + + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridView.cs b/JinYuan.ControlLib/DataGridView/UCDataGridView.cs new file mode 100644 index 0000000..aad6a50 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridView.cs @@ -0,0 +1,815 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using JinYuan.ControlLib.UCHelper; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCDataGridView. + /// Implements the + /// + /// + public partial class UCDataGridView : UserControl + { + #region 属性 + /// + /// The m head pading left + /// + private int m_headPadingLeft = 0; + + /// + /// Gets or sets the head pading left. + /// + /// The head pading left. + [Description("标题左侧间距"), Category("自定义")] + public int HeadPadingLeft + { + get { return m_headPadingLeft; } + set + { + m_headPadingLeft = value; + this.panHeadLeft.Width = m_headPadingLeft; + } + } + + /// + /// The m head font + /// + private Font m_headFont = new Font("微软雅黑", 12F); + /// + /// 标题字体 + /// + /// The head font. + [Description("标题字体"), Category("自定义")] + public Font HeadFont + { + get { return m_headFont; } + set { m_headFont = value; } + } + /// + /// The m head text color + /// + private Color m_headTextColor = Color.Black; + /// + /// 标题字体颜色 + /// + /// The color of the head text. + [Description("标题文字颜色"), Category("自定义")] + public Color HeadTextColor + { + get { return m_headTextColor; } + set { m_headTextColor = value; } + } + + /// + /// The m is show head + /// + private bool m_isShowHead = true; + /// + /// 是否显示标题 + /// + /// true if this instance is show head; otherwise, false. + [Description("是否显示标题"), Category("自定义")] + public bool IsShowHead + { + get { return m_isShowHead; } + set + { + if (m_isShowHead != value) + { + m_isShowHead = value; + panHead.Visible = value; + if (value) + { + this.panRow.Location = new Point(0, panHead.Height); + this.panRow.Height = this.panRow.Height - panHead.Height; + } + else + { + this.panRow.Location = new Point(0, 0); + this.panRow.Height = this.panRow.Height + panHead.Height; + } + } + } + } + /// + /// The m head height + /// + private int m_headHeight = 40; + /// + /// 标题高度 + /// + /// The height of the head. + [Description("标题高度"), Category("自定义")] + public int HeadHeight + { + get { return m_headHeight; } + set + { + m_headHeight = value; + panHead.Height = value; + this.Padding = new Padding(0, value, 0, 0); + } + } + + /// + /// The m is show CheckBox + /// + private bool m_isShowCheckBox = false; + /// + /// 是否显示复选框 + /// + /// true if this instance is show CheckBox; otherwise, false. + [Description("是否显示选择框"), Category("自定义")] + public bool IsShowCheckBox + { + get { return m_isShowCheckBox; } + set + { + if (value != m_isShowCheckBox) + { + m_isShowCheckBox = value; + LoadColumns(); + } + } + } + + /// + /// The m row height + /// + private int m_rowHeight = 40; + /// + /// 行高 + /// + /// The height of the row. + [Description("数据行高"), Category("自定义")] + public int RowHeight + { + get { return m_rowHeight; } + set { m_rowHeight = value; } + } + + + /// + /// Gets the show count. + /// + /// The show count. + [Description("当前高度可显示行个数"), Category("自定义")] + public int ShowCount + { + get + { + return this.panRow.Height / (m_rowHeight); + } + } + + /// + /// The m columns + /// + private List m_columns = null; + /// + /// 列 + /// + /// The columns. + [Description("列"), Category("自定义")] + public List Columns + { + get { return m_columns; } + set + { + m_columns = value; + LoadColumns(); + } + } + + /// + /// The m data source + /// + private object m_dataSource = null; + /// + /// 数据源,支持列表或table,如果使用翻页控件,请使用翻页控件的DataSource + /// + /// The data source. + /// 数据源不是有效的数据类型,请使用Datatable或列表 + /// 数据源不是有效的数据类型,请使用Datatable或列表 + [Description("数据源,支持列表或table,如果使用翻页控件,请使用翻页控件的DataSource"), Category("自定义")] + public object DataSource + { + get { return m_dataSource; } + set + { + if (value != null) + { + if (!(value is DataTable) && (!typeof(IList).IsAssignableFrom(value.GetType()))) + { + throw new Exception("数据源不是有效的数据类型,请使用Datatable或列表"); + } + } + m_dataSource = value; + if (m_columns != null && m_columns.Count > 0) + { + ReloadSource(); + } + if (BindingSourceEvent != null) + { + BindingSourceEvent(this, null); + } + } + } + + /// + /// Gets the rows. + /// + /// The rows. + public List Rows { get; private set; } + + /// + /// The m row type + /// + private Type m_rowType = typeof(UCDataGridViewRow); + /// + /// 行元素类型,默认UCDataGridViewItem + /// + /// The type of the row. + /// 行控件没有实现IDataGridViewRow接口 + /// 行控件没有实现IDataGridViewRow接口 + [Description("行控件类型,默认UCDataGridViewRow,如果不满足请自定义行控件实现接口IDataGridViewRow"), Category("自定义")] + public Type RowType + { + get { return m_rowType; } + set + { + if (value == null) + return; + if (!typeof(IDataGridViewRow).IsAssignableFrom(value) || !value.IsSubclassOf(typeof(Control))) + throw new Exception("行控件没有实现IDataGridViewRow接口"); + m_rowType = value; + if (m_columns != null && m_columns.Count > 0) + ReloadSource(); + } + } + + /// + /// The m select row + /// + IDataGridViewRow m_selectRow = null; + /// + /// 选中的节点 + /// + /// The select row. + [Description("选中行"), Category("自定义")] + public IDataGridViewRow SelectRow + { + get { return m_selectRow; } + private set { m_selectRow = value; } + } + + + /// + /// 选中的行,如果显示CheckBox,则以CheckBox选中为准 + /// + /// The select rows. + [Description("选中的行,如果显示CheckBox,则以CheckBox选中为准"), Category("自定义")] + public List SelectRows + { + get + { + return GetSelectRows(); + } + } + + /// + /// Gets the select rows. + /// + /// List<IDataGridViewRow>. + private List GetSelectRows() + { + List lst = new List(); + if (m_isShowCheckBox) + { + if (Rows != null && Rows.Count > 0) + lst.AddRange(Rows.FindAll(p => p.IsChecked)); + } + else + { + if (m_selectRow != null) + lst.AddRange(new List() { m_selectRow }); + } + if (Rows != null && Rows.Count > 0 && m_rowType == typeof(UCDataGridViewTreeRow)) + { + foreach (UCDataGridViewTreeRow row in Rows) + { + lst.AddRange(FindTreeRowSelected(row)); + } + } + return lst; + } + + private List FindTreeRowSelected(UCDataGridViewTreeRow row) + { + List lst = new List(); + var _lst = row.ChildrenRows.FindAll(p => p.IsChecked); + lst.AddRange(_lst); + foreach (UCDataGridViewTreeRow _row in row.ChildrenRows) + { + lst.AddRange(FindTreeRowSelected(_row)); + } + return lst; + } + + /// + /// Finds the child grid. + /// + /// The c. + /// UCDataGridView. + private UCDataGridView FindChildGrid(Control c) + { + foreach (Control item in c.Controls) + { + if (item is UCDataGridView) + return item as UCDataGridView; + else if (item.Controls.Count > 0) + { + var grid = FindChildGrid(item); + if (grid != null) + return grid; + } + } + return null; + } + [Bindable(false)] + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoScroll + { + get + { + return base.AutoScroll; + } + set + { + base.AutoScroll = value; + } + } + #region 事件 + /// + /// The head CheckBox change event + /// + [Description("选中标题选择框事件"), Category("自定义")] + public EventHandler HeadCheckBoxChangeEvent; + /// + /// The head column click event + /// + [Description("标题点击事件"), Category("自定义")] + public EventHandler HeadColumnClickEvent; + /// + /// Occurs when [item click]. + /// + [Description("项点击事件"), Category("自定义")] + public event DataGridViewEventHandler ItemClick; + /// + /// Occurs when [source changed]. + /// + [Description("行数据源改变事件"), Category("自定义")] + public event DataGridViewEventHandler RowSourceChangedEvent; + /// + /// Occurs when [row custom event]. + /// + [Description("预留的自定义的事件,比如你需要在行上放置删改等按钮时,可以通过此事件传递出来"), Category("自定义")] + public event DataGridViewRowCustomEventHandler RowCustomEvent; + [Description("绑定数据源后事件"), Category("自定义")] + public event EventHandler BindingSourceEvent; + #endregion + #endregion + + + /// + /// Initializes a new instance of the class. + /// + public UCDataGridView() + { + InitializeComponent(); + } + + #region 私有方法 + #region 加载column + /// + /// 功能描述:加载column + /// 作  者:HZH + /// 创建日期:2019-08-08 17:51:50 + /// 任务编号:POS + /// + private void LoadColumns() + { + try + { + if (DesignMode) + { return; } + + ControlHelper.FreezeControl(this.panHead, true); + + this.panRow.Controls.Clear(); + this.panColumns.Controls.Clear(); + this.panColumns.ColumnStyles.Clear(); + + + if (m_columns != null && m_columns.Count() > 0) + { + int _width = 0; + m_columns.ForEach(p => + { + if (p.WidthType == SizeType.Absolute) + { + _width += p.Width; + } + else if (p.WidthType == SizeType.Percent) + { + _width += (int)((p.Width / 100f) * this.Width); + } + }); + if (m_isShowCheckBox) + _width += 30; + if (_width > this.Width) + { + //this.panRow.Width = _width; + this.panHead.Width = _width; + } + else + { + if (m_columns.Any(p => p.WidthType == SizeType.AutoSize)) + { + //this.panRow.Width = this.Width; + this.panHead.Width = this.Width; + } + else + { + //this.panRow.Width = _width; + this.panHead.Width = _width; + } + } + m_columns.FindAll(p => p.WidthType == SizeType.Absolute); + m_columns.FindAll(p => p.WidthType == SizeType.Percent); + int intColumnsCount = m_columns.Count(); + if (m_isShowCheckBox) + { + intColumnsCount++; + } + this.panColumns.ColumnCount = intColumnsCount; + for (int i = 0; i < intColumnsCount; i++) + { + Control c = null; + if (i == 0 && m_isShowCheckBox) + { + this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F)); + + UCCheckBox box = new UCCheckBox(); + box.TextValue = ""; + box.Size = new Size(30, 30); + box.CheckedChangeEvent += (a, b) => + { + Rows.ForEach(p => p.IsChecked = box.Checked); + if (HeadCheckBoxChangeEvent != null) + { + HeadCheckBoxChangeEvent(a, b); + } + }; + c = box; + } + else + { + var item = m_columns[i - (m_isShowCheckBox ? 1 : 0)]; + this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width)); + Label lbl = new Label(); + lbl.Name = "dgvColumns_" + i; + lbl.Text = item.HeadText; + lbl.Font = m_headFont; + lbl.ForeColor = m_headTextColor; + lbl.TextAlign = ContentAlignment.MiddleCenter; + lbl.AutoSize = false; + lbl.Dock = DockStyle.Fill; + lbl.MouseDown += (a, b) => + { + if (HeadColumnClickEvent != null) + { + HeadColumnClickEvent(a, b); + } + }; + c = lbl; + } + this.panColumns.Controls.Add(c, i, 0); + } + + } + } + finally + { + ControlHelper.FreezeControl(this.panHead, false); + } + } + #endregion + + #endregion + + + + #region 公共函数 + /// + /// 刷新数据 + /// + public void ReloadSource() + { + if (DesignMode) + { return; } + try + { + ControlHelper.FreezeControl(this, true); + panHead.Location = new Point(0, 0); + Rows = new List(); + if (m_columns == null || m_columns.Count <= 0) + return; + if (m_dataSource != null) + { + int intIndex = 0; + + int intSourceCount = 0; + if (m_dataSource is DataTable) + { + intSourceCount = (m_dataSource as DataTable).Rows.Count; + } + else if (typeof(IList).IsAssignableFrom(m_dataSource.GetType())) + { + intSourceCount = (m_dataSource as IList).Count; + } + + foreach (Control item in this.panRow.Controls) + { + if (intIndex >= intSourceCount) + { + item.Visible = false; + } + else + { + var row = (item as IDataGridViewRow); + row.IsShowCheckBox = m_isShowCheckBox; + if (m_dataSource is DataTable) + { + row.DataSource = (m_dataSource as DataTable).Rows[intIndex]; + } + else + { + row.DataSource = (m_dataSource as IList)[intIndex]; + } + row.BindingCellData(); + if (row.RowHeight != m_rowHeight) + row.RowHeight = m_rowHeight; + item.Visible = true; + item.Width = panHead.Width; + + Rows.Add(row); + row.RowIndex = Rows.IndexOf(row); + } + intIndex++; + } + + if (intIndex < intSourceCount) + { + for (int i = intIndex; i < intSourceCount; i++) + { + IDataGridViewRow row = (IDataGridViewRow)Activator.CreateInstance(m_rowType); + if (m_dataSource is DataTable) + { + row.DataSource = (m_dataSource as DataTable).Rows[i]; + } + else + { + row.DataSource = (m_dataSource as IList)[i]; + } + row.Columns = m_columns; + List lstCells = new List(); + row.IsShowCheckBox = m_isShowCheckBox; + row.ReloadCells(); + row.BindingCellData(); + + Control rowControl = (row as Control); + rowControl.Width = panHead.Width; + row.RowHeight = m_rowHeight; + row.CellClick += (a, b) => { this.FindForm().ActiveControl = this; rowControl.Focus(); SetSelectRow(rowControl, b); }; + row.CheckBoxChangeEvent += (a, b) => { SetSelectRow(rowControl, b); }; + row.RowCustomEvent += (a, b) => { if (RowCustomEvent != null) { RowCustomEvent(a, b); } }; + row.SourceChanged += RowSourceChanged; + Rows.Add(row); + row.RowIndex = Rows.IndexOf(row); + this.panRow.Controls.Add(rowControl); + + } + } + + //this.panRow.Height = intSourceCount * RowHeight; + } + else + { + foreach (Control item in this.panRow.Controls) + { + item.Visible = false; + } + } + } + finally + { + ControlHelper.FreezeControl(this, false); + } + } + + /// + /// 快捷键 + /// + /// 通过引用传递的 ,它表示要处理的窗口消息。 + /// 值之一,它表示要处理的键。 + /// 如果字符已由控件处理,则为 true;否则为 false。 + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + if (keyData == Keys.Up) + { + Previous(); + } + else if (keyData == Keys.Down) + { + Next(); + } + else if (keyData == Keys.Home) + { + First(); + } + else if (keyData == Keys.End) + { + End(); + } + return base.ProcessCmdKey(ref msg, keyData); + } + /// + /// 选中第一个 + /// + public void First() + { + if (Rows == null || Rows.Count <= 0) + return; + Control c = null; + c = (Rows[0] as Control); + SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = 0 }); + } + /// + /// 选中上一个 + /// + public void Previous() + { + if (Rows == null || Rows.Count <= 0) + return; + Control c = null; + + int index = Rows.IndexOf(m_selectRow); + if (index - 1 >= 0) + { + c = (Rows[index - 1] as Control); + SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = index - 1 }); + } + } + /// + /// 选中下一个 + /// + public void Next() + { + if (Rows == null || Rows.Count <= 0) + return; + Control c = null; + + int index = Rows.IndexOf(m_selectRow); + if (index + 1 < Rows.Count) + { + c = (Rows[index + 1] as Control); + SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = index + 1 }); + } + } + /// + /// 选中最后一个 + /// + public void End() + { + if (Rows == null || Rows.Count <= 0) + return; + Control c = null; + c = (Rows[Rows.Count - 1] as Control); + SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = Rows.Count - 1 }); + } + + #endregion + + #region 事件 + /// + /// Rows the source changed. + /// + /// The sender. + /// The instance containing the event data. + void RowSourceChanged(object sender, DataGridViewEventArgs e) + { + if (RowSourceChangedEvent != null) + RowSourceChangedEvent(sender, e); + } + /// + /// Sets the select row. + /// + /// The item. + /// The instance containing the event data. + private void SetSelectRow(Control item, DataGridViewEventArgs e) + { + try + { + ControlHelper.FreezeControl(this, true); + if (item == null) + return; + if (item.Visible == false) + return; + this.FindForm().ActiveControl = this; + this.FindForm().ActiveControl = item; + if (m_selectRow != item) + { + if (m_selectRow != null) + { + m_selectRow.SetSelect(false); + } + m_selectRow = item as IDataGridViewRow; + m_selectRow.SetSelect(true); + + if (this.panRow.Controls.Count > 0) + { + if (item.Location.Y < 0) + { + this.panRow.AutoScrollPosition = new Point(0, Math.Abs(this.panRow.Controls[this.panRow.Controls.Count - 1].Location.Y) + item.Location.Y); + } + else if (item.Location.Y + m_rowHeight > this.panRow.Height) + { + this.panRow.AutoScrollPosition = new Point(0, Math.Abs(this.panRow.AutoScrollPosition.Y) + item.Location.Y - this.panRow.Height + m_rowHeight); + } + } + } + + + if (ItemClick != null) + { + ItemClick(item, e); + } + } + finally + { + ControlHelper.FreezeControl(this, false); + } + } + + #endregion + + private void UCDataGridView_SizeChanged(object sender, EventArgs e) + { + //LoadColumns(); + //ReloadSource(); + } + + private void UCDataGridView_Scroll(object sender, ScrollEventArgs e) + { + //if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) + //{ + // panHead.Location = new Point(0, this.VerticalScroll.Value + this.panRow.Location.Y - panHead.Height - 2); + //} + } + + private void panRow_Scroll(object sender, ScrollEventArgs e) + { + if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll && this.panRow.Controls.Count > 0) + { + Console.WriteLine(this.panRow.HorizontalScroll.Value); + Console.WriteLine(this.panRow.Controls[0].Location.X); + panHead.Location = new Point(this.panRow.HorizontalScroll.Value * -1, 0); + } + } + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridView.resx b/JinYuan.ControlLib/DataGridView/UCDataGridView.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.Designer.cs b/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.Designer.cs new file mode 100644 index 0000000..12646a7 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.Designer.cs @@ -0,0 +1,102 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class UCDataGridViewRow. + /// Implements the + /// + /// + partial class UCDataGridViewRow + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.ucSplitLine_H1 = new JinYuan.ControlLib.UCSplitLine_H(); + this.panCells = new System.Windows.Forms.TableLayoutPanel(); + this.SuspendLayout(); + // + // ucSplitLine_H1 + // + this.ucSplitLine_H1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); + this.ucSplitLine_H1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ucSplitLine_H1.Location = new System.Drawing.Point(0, 55); + this.ucSplitLine_H1.Name = "ucSplitLine_H1"; + this.ucSplitLine_H1.Size = new System.Drawing.Size(661, 1); + this.ucSplitLine_H1.TabIndex = 0; + this.ucSplitLine_H1.TabStop = false; + // + // panCells + // + this.panCells.ColumnCount = 1; + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.panCells.Dock = System.Windows.Forms.DockStyle.Fill; + this.panCells.Location = new System.Drawing.Point(0, 0); + this.panCells.Name = "panCells"; + this.panCells.RowCount = 1; + this.panCells.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.panCells.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.panCells.Size = new System.Drawing.Size(661, 55); + this.panCells.TabIndex = 1; + // + // UCDataGridViewItem + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.panCells); + this.Controls.Add(this.ucSplitLine_H1); + this.Name = "UCDataGridViewItem"; + this.Size = new System.Drawing.Size(661, 56); + this.ResumeLayout(false); + + } + + #endregion + + /// + /// The uc split line h1 + /// + private UCSplitLine_H ucSplitLine_H1; + /// + /// The pan cells + /// + private System.Windows.Forms.TableLayoutPanel panCells; + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.cs b/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.cs new file mode 100644 index 0000000..a03fea8 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.cs @@ -0,0 +1,332 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-09-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using JinYuan.ControlLib.UCHelper; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCDataGridViewRow. + /// Implements the + /// Implements the + /// + /// + /// + [ToolboxItem(false)] + public partial class UCDataGridViewRow : UserControl, IDataGridViewRow + { + + #region 属性 + /// + /// CheckBox选中事件 + /// + public event DataGridViewEventHandler CheckBoxChangeEvent; + /// + /// Occurs when [row custom event]. + /// + public event DataGridViewRowCustomEventHandler RowCustomEvent; + /// + /// 点击单元格事件 + /// + public event DataGridViewEventHandler CellClick; + + /// + /// 数据源改变事件 + /// + public event DataGridViewEventHandler SourceChanged; + + /// + /// 列参数,用于创建列数和宽度 + /// + /// The columns. + public List Columns + { + get; + set; + } + + /// + /// 数据源 + /// + /// The data source. + public object DataSource + { + get; + set; + } + + /// + /// 行号 + /// + /// The Index of the row. + public int RowIndex { get; set; } + + /// + /// Gets or sets a value indicating whether this instance is show CheckBox. + /// + /// true if this instance is show CheckBox; otherwise, false. + public bool IsShowCheckBox + { + get; + set; + } + /// + /// The m is checked + /// + private bool m_isChecked; + /// + /// 是否选中 + /// + /// true if this instance is checked; otherwise, false. + public bool IsChecked + { + get + { + return m_isChecked; + } + + set + { + if (m_isChecked != value) + { + m_isChecked = value; + (this.panCells.Controls.Find("check", false)[0] as UCCheckBox).Checked = value; + } + } + } + /// + /// The m row height + /// + int m_rowHeight = 40; + /// + /// 行高 + /// + /// The height of the row. + public int RowHeight + { + get + { + return m_rowHeight; + } + set + { + m_rowHeight = value; + this.Height = value; + } + } + + #endregion + + /// + /// Initializes a new instance of the class. + /// + public UCDataGridViewRow() + { + InitializeComponent(); + } + + /// + /// 绑定数据到Cell + /// + /// 返回true则表示已处理过,否则将进行默认绑定(通常只针对有Text值的控件) + public void BindingCellData() + { + if (DataSource != null) + { + for (int i = 0; i < Columns.Count; i++) + { + DataGridViewColumnEntity com = Columns[i]; + var cs = this.panCells.Controls.Find("lbl_" + com.DataField, false); + if (cs != null && cs.Length > 0) + { + if (DataSource is DataRow) + { + DataRow row = DataSource as DataRow; + if (com.Format != null) + { + cs[0].Text = com.Format(row[com.DataField]); + } + else + { + cs[0].Text = row[com.DataField].ToStringExt(); + } + } + else + { + var pro = DataSource.GetType().GetProperty(com.DataField); + + if (pro != null) + { + var value = pro.GetValue(DataSource, null); + if (com.Format != null) + { + cs[0].Text = com.Format(value); + } + else + { + cs[0].Text = value.ToStringExt(); + } + } + } + } + } + } + foreach (Control item in this.panCells.Controls) + { + if (item is IDataGridViewCustomCell) + { + IDataGridViewCustomCell cell = item as IDataGridViewCustomCell; + cell.RowCustomEvent += cell_RowCustomEvent; + cell.SetBindSource(DataSource); + } + } + } + + void cell_RowCustomEvent(object sender, DataGridViewRowCustomEventArgs e) + { + if (RowCustomEvent != null) + { + RowCustomEvent(sender, e); + } + } + + /// + /// Handles the MouseDown event of the Item control. + /// + /// The source of the event. + /// The instance containing the event data. + void Item_MouseDown(object sender, MouseEventArgs e) + { + if (CellClick != null) + { + CellClick(this, new DataGridViewEventArgs() + { + CellControl = this, + CellIndex = (sender as Control).Tag.ToInt(), + RowIndex = this.RowIndex + }); + } + } + + /// + /// 设置选中状态,通常为设置颜色即可 + /// + /// 是否选中 + public void SetSelect(bool blnSelected) + { + if (blnSelected) + { + this.BackColor = Color.FromArgb(255, 247, 245); + } + else + { + this.BackColor = Color.Transparent; + } + } + + /// + /// Reloads the cells. + /// + public void ReloadCells() + { + try + { + ControlHelper.FreezeControl(this, true); + this.panCells.Controls.Clear(); + this.panCells.ColumnStyles.Clear(); + + int intColumnsCount = Columns.Count(); + if (Columns != null && intColumnsCount > 0) + { + if (IsShowCheckBox) + { + intColumnsCount++; + } + this.panCells.ColumnCount = intColumnsCount; + for (int i = 0; i < intColumnsCount; i++) + { + Control c = null; + if (i == 0 && IsShowCheckBox) + { + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F)); + + UCCheckBox box = new UCCheckBox(); + box.Name = "check"; + box.TextValue = ""; + box.Size = new Size(30, 30); + box.Dock = DockStyle.Fill; + box.CheckedChangeEvent += (a, b) => + { + IsChecked = box.Checked; + if (CheckBoxChangeEvent != null) + { + CheckBoxChangeEvent(a, new DataGridViewEventArgs() + { + RowIndex = this.RowIndex, + CellControl = box, + CellIndex = 0 + }); + } + }; + c = box; + } + else + { + var item = Columns[i - (IsShowCheckBox ? 1 : 0)]; + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width)); + + if (item.CustomCellType == null) + { + Label lbl = new Label(); + lbl.Tag = i - (IsShowCheckBox ? 1 : 0); + lbl.Name = "lbl_" + item.DataField; + lbl.Font = new Font("微软雅黑", 12); + lbl.ForeColor = Color.Black; + lbl.AutoSize = false; + lbl.Dock = DockStyle.Fill; + lbl.TextAlign = item.TextAlign; + lbl.MouseDown += (a, b) => + { + Item_MouseDown(a, b); + }; + c = lbl; + } + else + { + Control cc = (Control)Activator.CreateInstance(item.CustomCellType); + cc.Dock = DockStyle.Fill; + c = cc; + } + } + this.panCells.Controls.Add(c, i, 0); + } + + } + } + finally + { + ControlHelper.FreezeControl(this, false); + } + } + + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.resx b/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridViewRow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.Designer.cs b/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.Designer.cs new file mode 100644 index 0000000..68b4c86 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.Designer.cs @@ -0,0 +1,149 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-23-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class UCDataGridViewTreeRow. + /// Implements the + /// + /// + partial class UCDataGridViewTreeRow + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panCells = new System.Windows.Forms.TableLayoutPanel(); + this.panLeft = new System.Windows.Forms.Panel(); + this.panMain = new System.Windows.Forms.Panel(); + this.ucSplitLine_H1 = new JinYuan.ControlLib.UCSplitLine_H(); + this.ucSplitLine_V1 = new JinYuan.ControlLib.UCSplitLine_V(); + this.panMain.SuspendLayout(); + this.SuspendLayout(); + // + // panCells + // + this.panCells.ColumnCount = 1; + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.panCells.Dock = System.Windows.Forms.DockStyle.Fill; + this.panCells.Location = new System.Drawing.Point(24, 0); + this.panCells.Name = "panCells"; + this.panCells.RowCount = 1; + this.panCells.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.panCells.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 55F)); + this.panCells.Size = new System.Drawing.Size(636, 64); + this.panCells.TabIndex = 2; + // + // panLeft + // + this.panLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.panLeft.Dock = System.Windows.Forms.DockStyle.Left; + this.panLeft.Location = new System.Drawing.Point(0, 0); + this.panLeft.Name = "panLeft"; + this.panLeft.Size = new System.Drawing.Size(24, 64); + this.panLeft.TabIndex = 0; + this.panLeft.Tag = "0"; + this.panLeft.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panLeft_MouseDown); + // + // panMain + // + this.panMain.Controls.Add(this.panCells); + this.panMain.Controls.Add(this.panLeft); + this.panMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.panMain.Location = new System.Drawing.Point(1, 0); + this.panMain.Name = "panMain"; + this.panMain.Size = new System.Drawing.Size(660, 64); + this.panMain.TabIndex = 0; + // + // ucSplitLine_H1 + // + this.ucSplitLine_H1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); + this.ucSplitLine_H1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ucSplitLine_H1.Location = new System.Drawing.Point(1, 64); + this.ucSplitLine_H1.Name = "ucSplitLine_H1"; + this.ucSplitLine_H1.Size = new System.Drawing.Size(660, 1); + this.ucSplitLine_H1.TabIndex = 1; + this.ucSplitLine_H1.TabStop = false; + // + // ucSplitLine_V1 + // + this.ucSplitLine_V1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); + this.ucSplitLine_V1.Dock = System.Windows.Forms.DockStyle.Left; + this.ucSplitLine_V1.Location = new System.Drawing.Point(0, 0); + this.ucSplitLine_V1.Name = "ucSplitLine_V1"; + this.ucSplitLine_V1.Size = new System.Drawing.Size(1, 65); + this.ucSplitLine_V1.TabIndex = 0; + this.ucSplitLine_V1.TabStop = false; + this.ucSplitLine_V1.Visible = false; + // + // UCDataGridViewTreeRow + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.panMain); + this.Controls.Add(this.ucSplitLine_H1); + this.Controls.Add(this.ucSplitLine_V1); + this.Name = "UCDataGridViewTreeRow"; + this.Size = new System.Drawing.Size(661, 65); + this.panMain.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + /// + /// The pan cells + /// + private System.Windows.Forms.TableLayoutPanel panCells; + /// + /// The uc split line h1 + /// + private UCSplitLine_H ucSplitLine_H1; + /// + /// The pan left + /// + private System.Windows.Forms.Panel panLeft; + /// + /// The pan main + /// + private System.Windows.Forms.Panel panMain; + private UCSplitLine_V ucSplitLine_V1; + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.cs b/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.cs new file mode 100644 index 0000000..8b77ef1 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.cs @@ -0,0 +1,475 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-23-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using JinYuan.ControlLib.UCHelper; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCDataGridViewTreeRow. + /// Implements the + /// Implements the + /// + /// + /// + [ToolboxItem(false)] + public partial class UCDataGridViewTreeRow : UserControl, IDataGridViewRow + { + #region 属性 + /// + /// CheckBox选中事件 + /// + public event DataGridViewEventHandler CheckBoxChangeEvent; + + /// + /// 点击单元格事件 + /// + public event DataGridViewEventHandler CellClick; + + /// + /// 数据源改变事件 + /// + public event DataGridViewEventHandler SourceChanged; + /// + /// Occurs when [row custom event]. + /// + public event DataGridViewRowCustomEventHandler RowCustomEvent; + /// + /// 列参数,用于创建列数和宽度 + /// + /// The columns. + public List Columns + { + get; + set; + } + + /// + /// 数据源 + /// + /// The data source. + public object DataSource + { + get; + set; + } + + private int rowLevel = 0; + /// + /// 折叠的第几层,用于缩进 + /// + public int RowLevel + { + get { return rowLevel; } + set + { + rowLevel = value; + this.Padding = new Padding(this.panLeft.Width / 2 * value, this.Padding.Top, this.panLeft.Right, this.Padding.Bottom); + this.ucSplitLine_V1.Visible = value > 0; + } + } + + /// + /// 行号,树状图目前没有给予行号 + /// + /// The Index of the row. + public int RowIndex { get; set; } + + /// + /// Gets or sets a value indicating whether this instance is show CheckBox. + /// + /// true if this instance is show CheckBox; otherwise, false. + public bool IsShowCheckBox + { + get; + set; + } + /// + /// The m is checked + /// + private bool m_isChecked; + /// + /// 是否选中 + /// + /// true if this instance is checked; otherwise, false. + public bool IsChecked + { + get + { + return m_isChecked; + } + + set + { + if (m_isChecked != value) + { + m_isChecked = value; + (this.panCells.Controls.Find("check", false)[0] as UCCheckBox).Checked = value; + } + } + } + + /// + /// The m row height + /// + int m_rowHeight = 40; + /// + /// 行高 + /// + /// The height of the row. + public int RowHeight + { + get + { + return m_rowHeight; + } + set + { + m_rowHeight = value; + this.Height = value; + } + } + private List childrenRows = new List(); + + public List ChildrenRows + { + get { return childrenRows; } + set { childrenRows = value; } + } + private bool? isOpened = false; + /// + /// 是否打开状态 + /// + public bool? IsOpened + { + get { return isOpened; } + set + { + isOpened = value; + if (value.HasValue) + { + panLeft.Enabled = true; + if (value.Value) + { + panLeft.BackgroundImage = Properties.Resources.caret_down; + } + else + { + panLeft.BackgroundImage = Properties.Resources.caret_right; + } + } + else + { + panLeft.BackgroundImage = null; + panLeft.Enabled = false; + } + } + } + #endregion + + /// + /// Initializes a new instance of the class. + /// + public UCDataGridViewTreeRow() + { + InitializeComponent(); + } + + /// + /// 绑定数据到Cell + /// + public void BindingCellData() + { + for (int i = 0; i < Columns.Count; i++) + { + DataGridViewColumnEntity com = Columns[i]; + var cs = this.panCells.Controls.Find("lbl_" + com.DataField, false); + if (cs != null && cs.Length > 0) + { + var pro = DataSource.GetType().GetProperty(com.DataField); + if (pro != null) + { + var value = pro.GetValue(DataSource, null); + if (com.Format != null) + { + cs[0].Text = com.Format(value); + } + else + { + cs[0].Text = value.ToStringExt(); + } + } + } + } + foreach (Control item in this.panCells.Controls) + { + if (item is IDataGridViewCustomCell) + { + IDataGridViewCustomCell cell = item as IDataGridViewCustomCell; + cell.RowCustomEvent += cell_RowCustomEvent; + cell.SetBindSource(DataSource); + } + } + IsOpened = false; + var proChildrens = DataSource.GetType().GetProperty("Childrens"); + if (proChildrens != null) + { + var value = proChildrens.GetValue(DataSource, null); + if (value != null) + { + } + else + { + IsOpened = null; + } + } + else + { + IsOpened = null; + } + } + + void cell_RowCustomEvent(object sender, DataGridViewRowCustomEventArgs e) + { + if (RowCustomEvent != null) + RowCustomEvent(sender, e); + } + + /// + /// Handles the MouseDown event of the Item control. + /// + /// The source of the event. + /// The instance containing the event data. + void Item_MouseDown(object sender, MouseEventArgs e) + { + if (CellClick != null) + { + CellClick(this, new DataGridViewEventArgs() + { + CellControl = this, + CellIndex = (sender as Control).Tag.ToInt() + }); + } + } + + /// + /// 设置选中状态,通常为设置颜色即可 + /// + /// 是否选中 + public void SetSelect(bool blnSelected) + { + if (blnSelected) + { + this.panMain.BackColor = Color.FromArgb(255, 247, 245); + } + else + { + this.panMain.BackColor = Color.Transparent; + } + } + + /// + /// 添加单元格元素,仅做添加控件操作,不做数据绑定,数据绑定使用BindingCells + /// + public void ReloadCells() + { + try + { + ControlHelper.FreezeControl(this, true); + this.panCells.Controls.Clear(); + this.panCells.ColumnStyles.Clear(); + + int intColumnsCount = Columns.Count(); + if (Columns != null && intColumnsCount > 0) + { + if (IsShowCheckBox) + { + intColumnsCount++; + } + this.panCells.ColumnCount = intColumnsCount; + bool blnFirst = true; + for (int i = 0; i < intColumnsCount; i++) + { + Control c = null; + if (i == 0 && IsShowCheckBox) + { + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F)); + + UCCheckBox box = new UCCheckBox(); + box.Name = "check"; + box.TextValue = ""; + box.Size = new Size(30, 30); + box.Dock = DockStyle.Fill; + box.CheckedChangeEvent += box_CheckedChangeEvent; + c = box; + } + else + { + var item = Columns[i - (IsShowCheckBox ? 1 : 0)]; + var w = item.Width - (blnFirst ? (this.panLeft.Width / 2 * rowLevel) : 0); + if (w < 5) + w = 5; + this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, w)); + blnFirst = false; + if (item.CustomCellType == null) + { + Label lbl = new Label(); + lbl.Tag = i - (IsShowCheckBox ? 1 : 0); + lbl.Name = "lbl_" + item.DataField; + lbl.Font = new Font("微软雅黑", 12); + lbl.ForeColor = Color.Black; + lbl.AutoSize = false; + lbl.Dock = DockStyle.Fill; + lbl.TextAlign = item.TextAlign; + lbl.MouseDown += (a, b) => + { + Item_MouseDown(a, b); + }; + c = lbl; + } + else + { + Control cc = (Control)Activator.CreateInstance(item.CustomCellType); + cc.Dock = DockStyle.Fill; + c = cc; + } + } + this.panCells.Controls.Add(c, i, 0); + } + + } + } + finally + { + ControlHelper.FreezeControl(this, false); + } + } + + void box_CheckedChangeEvent(object sender, EventArgs e) + { + IsChecked = ((UCCheckBox)sender).Checked; + } + + + + /// + /// Handles the MouseDown event of the panLeft control. + /// + /// The source of the event. + /// The instance containing the event data. + private void panLeft_MouseDown(object sender, MouseEventArgs e) + { + try + { + if (!IsOpened.HasValue) + return; + ControlHelper.FreezeControl(this.FindForm(), true); + if (!IsOpened.Value) + { + + IsOpened = !IsOpened; + if (childrenRows.Count > 0) + { + childrenRows.ForEach(p => + { + p.IsChecked = IsChecked; + p.Visible = true; + }); + } + else + { + var proChildrens = DataSource.GetType().GetProperty("Childrens"); + if (proChildrens != null) + { + var value = proChildrens.GetValue(DataSource, null); + int intSourceCount = 0; + if (value is DataTable) + { + intSourceCount = (value as DataTable).Rows.Count; + } + else if (typeof(IList).IsAssignableFrom(value.GetType())) + { + intSourceCount = (value as IList).Count; + } + for (int i = intSourceCount - 1; i >= 0; i--) + { + UCDataGridViewTreeRow row = new UCDataGridViewTreeRow(); + if (value is DataTable) + { + row.DataSource = (value as DataTable).Rows[i]; + } + else + { + row.DataSource = (value as IList)[i]; + } + row.RowLevel = RowLevel + 1; + row.Columns = Columns; + row.IsShowCheckBox = IsShowCheckBox; + row.ReloadCells(); + row.BindingCellData(); + + Control rowControl = (row as Control); + row.RowHeight = m_rowHeight; + rowControl.Width = this.Width; + //rowControl.Dock = DockStyle.Top; + row.CellClick += (a, b) => { CellClick(rowControl, b); }; + row.CheckBoxChangeEvent += (a, b) => { CheckBoxChangeEvent(rowControl, b); }; + row.RowCustomEvent += (a, b) => { if (RowCustomEvent != null) { RowCustomEvent(a, b); } }; + row.SourceChanged += SourceChanged; + ChildrenRows.Add(row); + row.RowIndex = ChildrenRows.IndexOf(row); + + this.Parent.Controls.Add(rowControl); + var index = this.Parent.Controls.GetChildIndex(this); + this.Parent.Controls.SetChildIndex(row, index + 1); + + } + } + } + } + else + { + HideChildrenRows(this); + this.Height = m_rowHeight; + } + } + finally + { + ControlHelper.FreezeControl(this.FindForm(), false); + } + } + + private void HideChildrenRows(UCDataGridViewTreeRow row) + { + if (row.ChildrenRows.Count > 0) + { + foreach (var item in row.ChildrenRows) + { + HideChildrenRows(item); + item.Hide(); + } + row.IsOpened = false; + } + } + } +} diff --git a/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.resx b/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/DataGridView/UCDataGridViewTreeRow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/DialPlate.Designer.cs b/JinYuan.ControlLib/DialPlate.Designer.cs new file mode 100644 index 0000000..7ba3d27 --- /dev/null +++ b/JinYuan.ControlLib/DialPlate.Designer.cs @@ -0,0 +1,48 @@ +namespace JinYuan.ControlLib +{ + partial class DialPlate + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // DialPlate + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(28)))), ((int)(((byte)(68))))); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "DialPlate"; + this.Size = new System.Drawing.Size(329, 202); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/DialPlate.cs b/JinYuan.ControlLib/DialPlate.cs new file mode 100644 index 0000000..21bff0c --- /dev/null +++ b/JinYuan.ControlLib/DialPlate.cs @@ -0,0 +1,341 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class DialPlate : UserControl + { + public DialPlate() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + stringFormat.Alignment = StringAlignment.Center; + stringFormat.LineAlignment = StringAlignment.Center; + } + + private StringFormat stringFormat = new StringFormat(); + + #region 外环设计 + private Color alarmColor = Color.FromArgb(36, 184, 196); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取报警颜色")] + public Color AlarmColor + { + get { return alarmColor; } + set + { + alarmColor = value; + this.Invalidate(); + } + } + + private Color rightColor = Color.FromArgb(187, 187, 187); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取圆环整体颜色")] + public Color RightColor + { + get { return rightColor; } + set + { + rightColor = value; + this.Invalidate(); + } + } + + + private float alarmAngle = 120.0f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取报警角度")] + public float AlarmAngle + { + get { return alarmAngle; } + set + { + alarmAngle = value; + this.Invalidate(); + } + } + + private int outThickness = 8; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取外环宽度")] + public int OutThickness + { + get { return outThickness; } + set + { + outThickness = value; + this.Invalidate(); + } + } + #endregion + + #region 内环设计 + private float tempScale = 0.8f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取温度环比列,默认小于1.0f")] + public float TempScale + { + get { return tempScale; } + set + { + if (value > 1.0f) return; + tempScale = value; + this.Invalidate(); + } + } + + private Color tempColor = Color.FromArgb(36, 184, 196); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取温度环颜色")] + public Color TempColor + { + get { return tempColor; } + set + { + tempColor = value; + this.Invalidate(); + } + } + + + private float humidityScale = 0.4f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取湿度环比列,默认小于1.0f")] + public float HumidityScale + { + get { return humidityScale; } + set + { + if (value > 1.0f) return; + humidityScale = value; + this.Invalidate(); + } + } + + private Color humidityColor = Color.FromArgb(36, 184, 196); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取湿度环颜色")] + public Color HumidityColor + { + get { return humidityColor; } + set + { + humidityColor = value; + this.Invalidate(); + } + } + + private int inThickness = 16; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取内环宽度")] + public int InThickness + { + get { return inThickness; } + set + { + inThickness = value; + this.Invalidate(); + } + } + #endregion + + #region 刻度环设计 + private float textScale = 0.6f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取刻度环比列,默认小于1.0f")] + public float MyProperty + { + get { return textScale; } + set + { + if (value > 1.0f) return; + textScale = value; + this.Invalidate(); + } + } + + private float rangeMin = 0.0f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取刻度量程低限")] + public float RangeMin + { + get { return rangeMin; } + set + { + if (value > rangeMax) return; + rangeMin = value; + this.Invalidate(); + } + } + + private float rangeMax = 90.0f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取刻度量程高限")] + public float RangeMax + { + get { return rangeMax; } + set + { + if (value < rangeMin) return; + rangeMax = value; + this.Invalidate(); + } + } + + #endregion + + #region 实时显示 + private float temp = 10.0f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取温度实时值")] + public float Temp + { + get { return temp; } + set + { + if (value < rangeMin) + value = rangeMin; + if (value > rangeMax) + value = rangeMax; + temp = value; + this.Invalidate(); + } + } + + private float humidity = 10.0f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取湿度实时值")] + public float Humidity + { + get { return humidity; } + set + { + if (value < rangeMin) + value = rangeMin; + if (value > rangeMax) + value = rangeMax; + humidity = value; + this.Invalidate(); + } + } + #endregion + + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + //获取画布并设置 + Graphics g = e.Graphics; + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + + //异常情况处理 + if (this.Width <= 20 || this.Height <= 20) return; + + if (this.Height < this.Width / 2) return; + + //画外环 + Pen pen = new Pen(alarmColor, OutThickness); + + g.DrawArc(pen, new RectangleF(10, 10, this.Width - 20, this.Width - 20), 180, alarmAngle); + + pen = new Pen(rightColor, OutThickness); + + g.DrawArc(pen, new RectangleF(10, 10, this.Width - 20, this.Width - 20), 180 + alarmAngle, 180 - alarmAngle); + + //转移坐标系 + g.TranslateTransform(this.Width * 0.5f, this.Width * 0.5f); + + //旋转坐标系 + g.RotateTransform(-90); + + SolidBrush solidBrush; + for (int i = 0; i < 7; i++) + { + if (30 * i <= alarmAngle) + { + solidBrush = new SolidBrush(alarmColor); + } + else + { + solidBrush = new SolidBrush(rightColor); + } + float x = -0.3f; + float width = 6.0f; + float height = outThickness + 4; + float y = (this.Width * 0.5f - 10 + height * 0.5f) * (-1.0f); + g.FillRectangle(solidBrush, new RectangleF(x, y, width, height)); + + g.RotateTransform(30); + } + + //坐标系旋转回去 + g.RotateTransform(-210); + g.RotateTransform(90); + + ////绘制刻度 + float rangeAvg = ((rangeMax - rangeMin) % 6 == 0) ? Convert.ToSingle((rangeMax - rangeMin) / 6) : Convert.ToSingle(((rangeMax - rangeMin) / 6).ToString("f1")); + + for (int i = 0; i < 7; i++) + { + float angle = -180.0f + i * 30.0f; + + float pointX = Convert.ToSingle(this.Width * textScale * 0.5f * Math.Cos(angle * Math.PI / 180.0f)); + float pointY = Convert.ToSingle(this.Width * textScale * 0.5f * Math.Sin(angle * Math.PI / 180.0f)); + + string text = (rangeMin + rangeAvg * i).ToString(); + + SizeF size = g.MeasureString(text, this.Font); + + RectangleF rectangle = new RectangleF(pointX - size.Width * 0.5f, pointY, size.Width, size.Height); + + g.DrawString(text, this.Font, new SolidBrush(this.ForeColor), rectangle, stringFormat); + } + + ////绘制实际温度湿度环 + //pen = new Pen(tempColor, inThickness); + + //float sweepAngle = (temp - rangeMin) / (rangeMax - rangeMin) * 180.0f; + + //float xx = this.Width * tempScale * 0.5f * (-1.0f); + //float yy = this.Width * tempScale * 0.5f * (-1.0f); + + //g.DrawArc(pen, new RectangleF(xx, yy, this.Width * tempScale, this.Width * tempScale), 180.0f, sweepAngle); + + + //pen = new Pen(humidityColor, inThickness); + + //sweepAngle = (humidity - rangeMin) / (rangeMax - rangeMin) * 180.0f; + + //xx = this.Width * humidityScale * 0.5f * (-1.0f); + //yy = this.Width * humidityScale * 0.5f * (-1.0f); + + //g.DrawArc(pen, new RectangleF(xx, yy, this.Width * humidityScale, this.Width * humidityScale), 180.0f, sweepAngle); + } + } +} diff --git a/JinYuan.ControlLib/DialPlate.resx b/JinYuan.ControlLib/DialPlate.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/DialPlate.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/FanShapedSchedule.Designer.cs b/JinYuan.ControlLib/FanShapedSchedule.Designer.cs new file mode 100644 index 0000000..bbbee55 --- /dev/null +++ b/JinYuan.ControlLib/FanShapedSchedule.Designer.cs @@ -0,0 +1,37 @@ +namespace JinYuan.ControlLib +{ + partial class FanShapedSchedule + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/FanShapedSchedule.cs b/JinYuan.ControlLib/FanShapedSchedule.cs new file mode 100644 index 0000000..842e737 --- /dev/null +++ b/JinYuan.ControlLib/FanShapedSchedule.cs @@ -0,0 +1,88 @@ +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class FanShapedSchedule : UserControl + { + public FanShapedSchedule() + { + InitializeComponent(); + } + + + //最大值 + private float maxValue = 100; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置最大值")] + public float MaxValue + { + get { return maxValue; } + set + { + maxValue = value; + this.Invalidate(); + } + } + + //实际值 + private float actureValue = 60; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置实际值")] + public float ActureValue + { + get { return actureValue; } + set + { + actureValue = value; + this.Invalidate(); + } + } + + //文字显示值 + private float PercentVal = 0; + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // 获取画布 + Graphics graphics = e.Graphics; + + //消除锯齿 + graphics.SmoothingMode = SmoothingMode.AntiAlias; + //文字显示效果 + graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + //插补模式 + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + //图片呈现质量 + graphics.CompositingQuality = CompositingQuality.HighQuality; + + + // 绘制底圆 + SolidBrush brush1 = new SolidBrush(Color.FromArgb(93, 107, 153)); + Rectangle rectangle1 = new Rectangle(1, 1, this.Width - 2, this.Height - 2); + graphics.FillEllipse(brush1, rectangle1); + + //绘制扇形 + Rectangle rectangle2 = new Rectangle(1, 1, this.Width - 2, this.Height - 2); + LinearGradientBrush brush2 = new LinearGradientBrush(rectangle2, Color.Blue, Color.Red, 150.0f, true); + this.PercentVal = (ActureValue / MaxValue) * 100; + graphics.FillPie(brush2, rectangle2, -90, (ActureValue / MaxValue) * 360f); + + //绘制上圆 + SolidBrush solidBrushElipse = new SolidBrush(this.BackColor); + Rectangle rectangle3 = new Rectangle(15, 15, this.Width - 30, this.Height - 30); + graphics.FillEllipse(solidBrushElipse, rectangle3); + + //绘制文字 + Font font = new Font("微软雅黑", 15); + PointF point = new PointF(((float)this.Width) / 2.0f - 27, ((float)this.Height) / 2.0f - 10); + graphics.DrawString(this.PercentVal.ToString("0.0") + "%", font, Brushes.Coral, point); + } + } +} diff --git a/JinYuan.ControlLib/FlatComboBox.Designer.cs b/JinYuan.ControlLib/FlatComboBox.Designer.cs new file mode 100644 index 0000000..8fad653 --- /dev/null +++ b/JinYuan.ControlLib/FlatComboBox.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class FlatComboBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/FlatComboBox.cs b/JinYuan.ControlLib/FlatComboBox.cs new file mode 100644 index 0000000..7611b1d --- /dev/null +++ b/JinYuan.ControlLib/FlatComboBox.cs @@ -0,0 +1,171 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class FlatComboBox : ComboBox + { + private Color borderColor = Color.Gray; + [DefaultValue(typeof(Color), "Gray")] + public Color BorderColor + { + get { return borderColor; } + set + { + if (borderColor != value) + { + borderColor = value; + Invalidate(); + } + } + } + private Color buttonColor = Color.LightGray; + [DefaultValue(typeof(Color), "LightGray")] + public Color ButtonColor + { + get { return buttonColor; } + set + { + if (buttonColor != value) + { + buttonColor = value; + Invalidate(); + } + } + } + protected override void WndProc(ref Message m) + { + if (m.Msg == WM_PAINT && DropDownStyle != ComboBoxStyle.Simple) + { + var clientRect = ClientRectangle; + var dropDownButtonWidth = SystemInformation.HorizontalScrollBarArrowWidth; + var outerBorder = new Rectangle(clientRect.Location, + new Size(clientRect.Width - 1, clientRect.Height - 1)); + var innerBorder = new Rectangle(outerBorder.X + 1, outerBorder.Y + 1, + outerBorder.Width - dropDownButtonWidth - 2, outerBorder.Height - 2); + var innerInnerBorder = new Rectangle(innerBorder.X + 1, innerBorder.Y + 1, + innerBorder.Width - 2, innerBorder.Height - 2); + var dropDownRect = new Rectangle(innerBorder.Right + 1, innerBorder.Y, + dropDownButtonWidth, innerBorder.Height + 1); + if (RightToLeft == RightToLeft.Yes) + { + innerBorder.X = clientRect.Width - innerBorder.Right; + innerInnerBorder.X = clientRect.Width - innerInnerBorder.Right; + dropDownRect.X = clientRect.Width - dropDownRect.Right; + dropDownRect.Width += 1; + } + var innerBorderColor = Enabled ? BackColor : SystemColors.Control; + var outerBorderColor = Enabled ? BorderColor : SystemColors.ControlDark; + var buttonColor = Enabled ? ButtonColor : SystemColors.Control; + var middle = new Point(dropDownRect.Left + dropDownRect.Width / 2, + dropDownRect.Top + dropDownRect.Height / 2); + var arrow = new Point[] + { + new Point(middle.X - 3, middle.Y - 2), + new Point(middle.X + 4, middle.Y - 2), + new Point(middle.X, middle.Y + 2) + }; + var ps = new PAINTSTRUCT(); + bool shoulEndPaint = false; + IntPtr dc; + if (m.WParam == IntPtr.Zero) + { + dc = BeginPaint(Handle, ref ps); + m.WParam = dc; + shoulEndPaint = true; + } + else + { + dc = m.WParam; + } + var rgn = CreateRectRgn(innerInnerBorder.Left, innerInnerBorder.Top, + innerInnerBorder.Right, innerInnerBorder.Bottom); + SelectClipRgn(dc, rgn); + DefWndProc(ref m); + DeleteObject(rgn); + rgn = CreateRectRgn(clientRect.Left, clientRect.Top, + clientRect.Right, clientRect.Bottom); + SelectClipRgn(dc, rgn); + using (var g = Graphics.FromHdc(dc)) + { + using (var b = new SolidBrush(buttonColor)) + { + g.FillRectangle(b, dropDownRect); + } + using (var b = new SolidBrush(outerBorderColor)) + { + g.FillPolygon(b, arrow); + } + using (var p = new Pen(innerBorderColor)) + { + g.DrawRectangle(p, innerBorder); + g.DrawRectangle(p, innerInnerBorder); + } + using (var p = new Pen(outerBorderColor)) + { + g.DrawRectangle(p, outerBorder); + } + } + if (shoulEndPaint) + EndPaint(Handle, ref ps); + DeleteObject(rgn); + } + else + base.WndProc(ref m); + } + + private const int WM_PAINT = 0xF; + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int L, T, R, B; + } + [StructLayout(LayoutKind.Sequential)] + public struct PAINTSTRUCT + { + public IntPtr hdc; + public bool fErase; + public int rcPaint_left; + public int rcPaint_top; + public int rcPaint_right; + public int rcPaint_bottom; + public bool fRestore; + public bool fIncUpdate; + public int reserved1; + public int reserved2; + public int reserved3; + public int reserved4; + public int reserved5; + public int reserved6; + public int reserved7; + public int reserved8; + } + [DllImport("user32.dll")] + private static extern IntPtr BeginPaint(IntPtr hWnd, + [In, Out] ref PAINTSTRUCT lpPaint); + + [DllImport("user32.dll")] + private static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint); + + [DllImport("gdi32.dll")] + public static extern int SelectClipRgn(IntPtr hDC, IntPtr hRgn); + + [DllImport("user32.dll")] + public static extern int GetUpdateRgn(IntPtr hwnd, IntPtr hrgn, bool fErase); + public enum RegionFlags + { + ERROR = 0, + NULLREGION = 1, + SIMPLEREGION = 2, + COMPLEXREGION = 3, + } + [DllImport("gdi32.dll")] + internal static extern bool DeleteObject(IntPtr hObject); + + [DllImport("gdi32.dll")] + private static extern IntPtr CreateRectRgn(int x1, int y1, int x2, int y2); + } +} diff --git a/JinYuan.ControlLib/Forms/FrmBase.Designer.cs b/JinYuan.ControlLib/Forms/FrmBase.Designer.cs new file mode 100644 index 0000000..dca7834 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmBase.Designer.cs @@ -0,0 +1,74 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib.Forms +{ + /// + /// Class FrmBase. + /// Implements the + /// + /// + partial class FrmBase + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmBase)); + this.SuspendLayout(); + // + // FrmBase + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(247)))), ((int)(((byte)(247))))); + this.ClientSize = new System.Drawing.Size(331, 371); + this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(66)))), ((int)(((byte)(66)))), ((int)(((byte)(66))))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.Name = "FrmBase"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmBase"; + this.Load += new System.EventHandler(this.FrmBase_Load); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/JinYuan.ControlLib/Forms/FrmBase.cs b/JinYuan.ControlLib/Forms/FrmBase.cs new file mode 100644 index 0000000..5a23190 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmBase.cs @@ -0,0 +1,622 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using JinYuan.ControlLib.UCHelper; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.Forms +{ + /// + /// Class FrmBase. + /// Implements the + /// + /// + [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))] + public partial class FrmBase : Form + { + /// + /// Gets or sets the hot keys. + /// + /// The hot keys. + [Description("定义的热键列表"), Category("自定义")] + public Dictionary HotKeys { get; set; } + /// + /// Delegate HotKeyEventHandler + /// + /// The string hot key. + /// true if XXXX, false otherwise. + public delegate bool HotKeyEventHandler(string strHotKey); + /// + /// 热键事件 + /// + [Description("热键事件"), Category("自定义")] + public event HotKeyEventHandler HotKeyDown; + #region 字段属性 + + /// + /// 失去焦点关闭 + /// + bool _isLoseFocusClose = false; + /// + /// 是否重绘边框样式 + /// + private bool _redraw = false; + /// + /// 是否显示圆角 + /// + private bool _isShowRegion = false; + /// + /// 边圆角大小 + /// + private int _regionRadius = 10; + /// + /// 边框颜色 + /// + private Color _borderStyleColor; + /// + /// 边框宽度 + /// + private int _borderStyleSize; + /// + /// 边框样式 + /// + private ButtonBorderStyle _borderStyleType; + /// + /// 是否显示模态 + /// + private bool _isShowMaskDialog = false; + /// + /// 蒙版窗体 + /// + /// true if this instance is show mask dialog; otherwise, false. + [Description("是否显示蒙版窗体")] + public bool IsShowMaskDialog + { + get + { + return this._isShowMaskDialog; + } + set + { + this._isShowMaskDialog = value; + } + } + /// + /// 边框宽度 + /// + /// The size of the border style. + [Description("边框宽度")] + public int BorderStyleSize + { + get + { + return this._borderStyleSize; + } + set + { + this._borderStyleSize = value; + } + } + /// + /// 边框颜色 + /// + /// The color of the border style. + [Description("边框颜色")] + public Color BorderStyleColor + { + get + { + return this._borderStyleColor; + } + set + { + this._borderStyleColor = value; + } + } + /// + /// 边框样式 + /// + /// The type of the border style. + [Description("边框样式")] + public ButtonBorderStyle BorderStyleType + { + get + { + return this._borderStyleType; + } + set + { + this._borderStyleType = value; + } + } + /// + /// 边框圆角 + /// + /// The region radius. + [Description("边框圆角")] + public int RegionRadius + { + get + { + return this._regionRadius; + } + set + { + this._regionRadius = Math.Max(value, 1); + } + } + /// + /// 是否显示自定义绘制内容 + /// + /// true if this instance is show region; otherwise, false. + [Description("是否显示自定义绘制内容")] + public bool IsShowRegion + { + get + { + return this._isShowRegion; + } + set + { + this._isShowRegion = value; + } + } + /// + /// 是否显示重绘边框 + /// + /// true if redraw; otherwise, false. + [Description("是否显示重绘边框")] + public bool Redraw + { + get + { + return this._redraw; + } + set + { + this._redraw = value; + } + } + + /// + /// The is full size + /// + private bool _isFullSize = true; + /// + /// 是否全屏 + /// + /// true if this instance is full size; otherwise, false. + [Description("是否全屏")] + public virtual bool IsFullSize + { + get { return _isFullSize; } + set { _isFullSize = value; } + } + /// + /// 失去焦点自动关闭 + /// + /// true if this instance is lose focus close; otherwise, false. + [Description("失去焦点自动关闭")] + public bool IsLoseFocusClose + { + get + { + return this._isLoseFocusClose; + } + set + { + this._isLoseFocusClose = value; + } + } + #endregion + + /// + /// Gets a value indicating whether this instance is desing mode. + /// + /// true if this instance is desing mode; otherwise, false. + private bool IsDesingMode + { + get + { + bool ReturnFlag = false; + if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) + ReturnFlag = true; + else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") + ReturnFlag = true; + return ReturnFlag; + } + } + + #region 初始化 + /// + /// Initializes a new instance of the class. + /// + public FrmBase() + { + InitializeComponent(); + base.SetStyle(ControlStyles.UserPaint, true); + base.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + base.SetStyle(ControlStyles.DoubleBuffer, true); + //base.HandleCreated += new EventHandler(this.FrmBase_HandleCreated); + //base.HandleDestroyed += new EventHandler(this.FrmBase_HandleDestroyed); + this.KeyDown += FrmBase_KeyDown; + this.FormClosing += FrmBase_FormClosing; + } + + /// + /// Handles the FormClosing event of the FrmBase control. + /// + /// The source of the event. + /// The instance containing the event data. + void FrmBase_FormClosing(object sender, FormClosingEventArgs e) + { + if (_isLoseFocusClose) + { + MouseHook.OnMouseActivity -= hook_OnMouseActivity; + } + } + + + /// + /// Handles the Load event of the FrmBase control. + /// + /// The source of the event. + /// The instance containing the event data. + private void FrmBase_Load(object sender, EventArgs e) + { + if (!IsDesingMode) + { + if (_isFullSize) + SetFullSize(); + } + if (_isLoseFocusClose) + { + MouseHook.OnMouseActivity += hook_OnMouseActivity; + } + } + + #endregion + + #region 方法区 + + + /// + /// Handles the OnMouseActivity event of the hook control. + /// + /// The source of the event. + /// The instance containing the event data. + void hook_OnMouseActivity(object sender, MouseEventArgs e) + { + try + { + if (this._isLoseFocusClose && e.Clicks > 0) + { + if (e.Button == System.Windows.Forms.MouseButtons.Left || e.Button == System.Windows.Forms.MouseButtons.Right) + { + if (!this.IsDisposed) + { + if (!this.ClientRectangle.Contains(this.PointToClient(e.Location))) + { + base.Close(); + } + } + } + } + } + catch { } + } + + + /// + /// 全屏 + /// + public void SetFullSize() + { + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + } + /// + /// Does the escape. + /// + protected virtual void DoEsc() + { + base.Close(); + } + + /// + /// Does the enter. + /// + protected virtual void DoEnter() + { + } + + /// + /// 设置重绘区域 + /// + public void SetWindowRegion() + { + GraphicsPath path = new GraphicsPath(); + Rectangle rect = new Rectangle(-1, -1, base.Width + 1, base.Height); + path = this.GetRoundedRectPath(rect, this._regionRadius); + base.Region = new Region(path); + } + /// + /// 获取重绘区域 + /// + /// The rect. + /// The radius. + /// GraphicsPath. + private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius) + { + Rectangle rect2 = new Rectangle(rect.Location, new Size(radius, radius)); + GraphicsPath graphicsPath = new GraphicsPath(); + graphicsPath.AddArc(rect2, 180f, 90f); + rect2.X = rect.Right - radius; + graphicsPath.AddArc(rect2, 270f, 90f); + rect2.Y = rect.Bottom - radius; + rect2.Width += 1; + rect2.Height += 1; + graphicsPath.AddArc(rect2, 360f, 90f); + rect2.X = rect.Left; + graphicsPath.AddArc(rect2, 90f, 90f); + graphicsPath.CloseFigure(); + return graphicsPath; + } + + /// + /// 将窗体显示为具有指定所有者的模式对话框。 + /// + /// 任何实现 (表示将拥有模式对话框的顶级窗口)的对象。 + /// 值之一。 + /// + /// + /// + /// + /// + /// + /// + public new DialogResult ShowDialog(IWin32Window owner) + { + try + { + if (this._isShowMaskDialog && owner != null) + { + var frmOwner = (Control)owner; + FrmTransparent _frmTransparent = new FrmTransparent(); + _frmTransparent.Width = frmOwner.Width; + _frmTransparent.Height = frmOwner.Height; + Point location = frmOwner.PointToScreen(new Point(0, 0)); + _frmTransparent.Location = location; + _frmTransparent.frmchild = this; + _frmTransparent.IsShowMaskDialog = false; + return _frmTransparent.ShowDialog(owner); + } + else + { + return base.ShowDialog(owner); + } + } + catch (NullReferenceException) + { + return System.Windows.Forms.DialogResult.None; + } + } + + /// + /// 将窗体显示为模式对话框,并将当前活动窗口设置为它的所有者。 + /// + /// 值之一。 + /// + /// + /// + /// + /// + /// + /// + public new DialogResult ShowDialog() + { + return base.ShowDialog(); + } + #endregion + + #region 事件区 + + + /// + /// 关闭时发生 + /// + /// 一个包含事件数据的 。 + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + if (base.Owner != null && base.Owner is FrmTransparent) + { + (base.Owner as FrmTransparent).Close(); + } + } + + /// + /// 快捷键 + /// + /// 通过引用传递的 ,它表示要处理的 Win32 消息。 + /// 值之一,它表示要处理的键。 + /// 如果控件处理并使用击键,则为 true;否则为 false,以允许进一步处理。 + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + int num = 256; + int num2 = 260; + bool result; + if (msg.Msg == num | msg.Msg == num2) + { + if (keyData == (Keys)262259) + { + result = true; + return result; + } + if (keyData != Keys.Enter) + { + if (keyData == Keys.Escape) + { + this.DoEsc(); + } + } + else + { + this.DoEnter(); + } + } + result = false; + if (result) + return result; + else + return base.ProcessCmdKey(ref msg, keyData); + } + + /// + /// Handles the KeyDown event of the FrmBase control. + /// + /// The source of the event. + /// The instance containing the event data. + protected void FrmBase_KeyDown(object sender, KeyEventArgs e) + { + if (HotKeyDown != null && HotKeys != null) + { + bool blnCtrl = false; + bool blnAlt = false; + bool blnShift = false; + if (e.Control) + blnCtrl = true; + if (e.Alt) + blnAlt = true; + if (e.Shift) + blnShift = true; + if (HotKeys.ContainsKey(e.KeyValue)) + { + string strKey = string.Empty; + if (blnCtrl) + { + strKey += "Ctrl+"; + } + if (blnAlt) + { + strKey += "Alt+"; + } + if (blnShift) + { + strKey += "Shift+"; + } + strKey += HotKeys[e.KeyValue]; + + if (HotKeyDown(strKey)) + { + e.Handled = true; + e.SuppressKeyPress = true; + } + } + } + } + + /// + /// 重绘事件 + /// + /// 包含事件数据的 。 + protected override void OnPaint(PaintEventArgs e) + { + if (this._isShowRegion) + { + this.SetWindowRegion(); + } + base.OnPaint(e); + if (this._redraw) + { + ControlPaint.DrawBorder(e.Graphics, base.ClientRectangle, this._borderStyleColor, this._borderStyleSize, this._borderStyleType, this._borderStyleColor, this._borderStyleSize, this._borderStyleType, this._borderStyleColor, this._borderStyleSize, this._borderStyleType, this._borderStyleColor, this._borderStyleSize, this._borderStyleType); + } + } + #endregion + + + #region 窗体拖动 English:Form drag + /// + /// Releases the capture. + /// + /// true if XXXX, false otherwise. + [DllImport("user32.dll")] + public static extern bool ReleaseCapture(); + /// + /// Sends the message. + /// + /// The HWND. + /// The w MSG. + /// The w parameter. + /// The l parameter. + /// true if XXXX, false otherwise. + [DllImport("user32.dll")] + public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); + + /// + /// The wm syscommand + /// + public const int WM_SYSCOMMAND = 0x0112; + /// + /// The sc move + /// + public const int SC_MOVE = 0xF010; + /// + /// The htcaption + /// + public const int HTCAPTION = 0x0002; + + /// + /// 通过Windows的API控制窗体的拖动 + /// + /// The HWND. + public static void MouseDown(IntPtr hwnd) + { + ReleaseCapture(); + SendMessage(hwnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); + } + #endregion + + /// + /// 在构造函数中调用设置窗体移动 + /// + /// The cs. + protected void InitFormMove(params Control[] cs) + { + foreach (Control c in cs) + { + if (c != null && !c.IsDisposed) + c.MouseDown += c_MouseDown; + } + } + + /// + /// Handles the MouseDown event of the c control. + /// + /// The source of the event. + /// The instance containing the event data. + void c_MouseDown(object sender, MouseEventArgs e) + { + MouseDown(this.Handle); + } + } +} diff --git a/JinYuan.ControlLib/Forms/FrmBase.resx b/JinYuan.ControlLib/Forms/FrmBase.resx new file mode 100644 index 0000000..be524d1 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmBase.resx @@ -0,0 +1,1185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAeIAAAAEAIAAo+AAAFgAAACgAAAB4AAAAAAEAAAEAIAAAAAAAAPAAAGDqAABg6gAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVAG9vbwBCQkQAPz9LADw9 + RQA7P0cAPEBHAD1ARgA9QUYAO0BGADtDRQA7QUEAO0BAADk+PgA9QkIAPkJCADtBRAA4RkgAOUZGADxA + QAA8QEAAOUZGADhGSAA7QUQAPkJCAD1CQgA5Pj4AO0BAADtAQQA7QEUAO0BGAD1BRgA9QEYAPEBHADs/ + RwA8PUUAPz9LAEJCRABvb28AVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUAGRksAD4+ + RAA4QUUAOEBEADk7PABBQ0MAO0NFADs/RwA6QUUAPENDADxDQwA8Q0MAPENDADtCQwA1REIASjRkADw3 + RgE6PUoBPD9JAT0/RwI9QEcCO0BGAjtDRQI7QUEDO0BABDk+PgQ+QkIEPkJCBTtBRAU4R0gFOUZGBTxA + QAY8QEAGOUZGBThHSAU7QUQFPkJCBT5CQgQ5Pj4EO0BABDtAQQM7QEUCO0BGAj1ARwI9P0cCPD9JATo9 + SgE8N0YBSjRkADVEQgA7QkMAPENDADxDQwA8Q0MAPENDADxBQwA8QUcAPUFIADdGSQA3SUkAOz9DADlC + RgBAP0UAGxsvAFVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tQwAkIz8APDxLADxCRAA8QkUAO0JEADtE + QwBaUDUAMztIADo8PwFBQ0MDO0NFBDtARgY4P0cIPEFDCz1BRQ08QkUPPEFDETtBRBM8Q0MVPENEFzxC + Qxk8QkQaPEJEGzxCRBw8QkQdPEJEHjxDRB88Q0MgPENDIDxDQyA8Q0MhPENDITxDQyE8Q0QhPENDITxD + QyI8Q0MiPENDITxDRCE8Q0MhPENDITxDQyE8Q0MgPENDIDxDQyA8QkQfPEJEHjxCRB08QkQcPEJEGzxC + RBo8QkMZPENEFzxDQxU7QUQTPEFDETxCRQ89QUUNPEFBCzo/QQg8QUcGPUFHBTdFSAM4R0gBNTtIAFFJ + MAA6REMAO0JEADxCRQA8QEQAPD1LACQjPwAtLUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMzMzAERQVAA+RkgAPkNFAD1CRABETUMAPDtNATxCRAQ8QkUIO0JFDDxC + RBA7QkQVO0JEGTxCQxw8Q0MePENDIDxCRCI8Q0QkPENDJTxDQyU8Q0MmPENDJjxDQyY8Q0MnPENDJzxD + Qyc8Q0MnPENDJzxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxD + Qyc8Q0MnPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MlPENDJTxDQyQ8Q0QjPENEITtDRB88Q0QcO0JEGTtD + RBU8QkQQO0JFDDxBRQg8P0QEPDtNAURMQwA8QkQAPkNFAEBHSgBHUlYAMzMzAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPkREAEBGRwA4SlMAPUJEBTtBQgw8Q0QUPEJEGzxDQyA8Q0MjPENDJTxD + QyY8Q0MmPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MnPENDJzxD + QyY8Q0MmPENDJTxDQyM8QkMgPEJEGzxERBQ8QUIMPUJEBUJVXwBBRkcAPkREAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAP0REAEFDRAI8QkMTPENDIDxDQyU8Q0MmPENDJzxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxDQyY8Q0MlPENEIDxCRBNBQ0QCP0REAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPkNDAD9ERAY8QkMhPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MnPENDJz1CQyFAREQGPkNEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAP0BAAD86PAA7P0IIPUJEFDxCRB48Q0MjPENDJjxDQyY8Q0MnPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyc8Q0MmPENDJjxDQyM8QkMePUJDFDtAQghDP0AAQ0NEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQEBAAEE+QAA7P0IAEjkEADlDRgM5QkIIOkNEDjxCRBQ8Q0MZPEJDHjxD + QyE8Q0MjPENDJTxDQyY8Q0MmPENDJjxDQyc8Q0MnPENDJzxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJTxDQyQ8Q0MjPENDIzxDQyQ8Q0MlPENDJTxD + QyY8Q0MmPENDJTxDQyU8Q0MkPENDIzxDQyI8Q0MjPENDJTxDQyU8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxDQyc8Q0MnPENDJjxDQyY8Q0MmPENDJTxD + QyM8Q0MhPEJDHjxDQxk8QkQUO0NFDjpDQgg7PkYDE3Y6ADs/QgBFQUQAREREAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQAAADYAPUZMADhERQA7Q0MAPENCAEFJSAA8QkQBO0BEAjtB + RgU5Q0QIPUFECzxBQg49Q0IRPENEFDxBRRc8QkUaPEJDHTxDQx48Q0MgPEJDITxDRCM8Q0MkPENDJDxD + QyU8Q0MlPENDJTxDQyY8Q0MmPENDJDxDQyM8Q0MlPENDMDxCREM8QkVcPEFFdDxBRYs8QUWdPEFFqTxB + RbA8QUWyPEFFrjxBRaU8QUWXPEFFhDxCRW08QkRVPEJDPTxCQy08Q0MkPENDIzxDQyU8Q0MmPENDJTxD + QyU8Q0MlPENDJDxDQyQ8Q0QjPEJDITxDQyA8Q0MePEJDHTxCRBo8QkUYPEJFFTxDRBI9QkMPPkFECzpE + RQg7QUcFOz9EAj5ERgE+RkYAPUNDADxERAA6PkYAPTtHAAAABwBVVVUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4ADAzMgA8QkQAO0BEADtC + RgA6Q0QAPUFEAD5ERgA6REQAPkM+AAAA/wBAQ1sBOjxHAjxCRQM7QEUEOkBFBTtCRQY9Q0MIPEFECTxC + Qws9QkUMO0JEDTxBRAs9Q0QRPEFGLTxBRWA8QUWaPEFFxjxBReQ8QUX1O0BE/jtARP87QET/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/87QET/O0BE/zxBRfw8QUXwPEFF3jxBRb08QUWNPEFFUjxCRSM8QUUNO0NECztC + RQw8QkMLPEFECT1DQwg7QkUGOkBFBTtARQQ8QkUDOjxHAkRDWQFAL24AOksuADxDQAA8QkQAPUFEADpE + RQA7QkYAO0BEAD1ERQA1OTgAPz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAARkZGAC0tLQBAQUEAO0NFAEhPOgBGR2MAOjtHAD1CRgA7QEYAOj9FADtCRQA8Q0MAPEJDADxC + RAA8QUUAO0JGDDxBRUQ8QUWUPEFF1TxBRfc7QET/Oj9D/zo/Q/88QUX/REhM/0tQU/9SV1r/Wl5i/19j + Zv9hZWj/XWFl/1dbX/9PVFf/SU1R/0FGSv87QET/Oj9D/zo/Q/87QET/PEFF8jxBRck8QUWBPEFFMztD + SAU8QUUAO0JEADxDQwA7QkUAOj9FADtARgA9QkYAOjtHAEdHYwBHUDwAPUFIADxDRwBCQkEAR0dHAEBA + QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0BGADxBRQA8QEYAPEFGAD1B + RQ08QUVUPEFFtjxBRfI7QET/Oj9D/z1CRv9MUVT/aGxv/4mMjv+oqqv/vr/A/8/Q0f/b3Nz/4ODh/+Li + 4//j4+P/4eHi/97f3//X2Nn/ysvM/7i5u/+goqT/gIOG/2FlaP9HTFD/O0BE/zo/Q/87QET/PEFF6DxB + RaA8QUU+OUJGBTxCRQBCQ0UAP0NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QUQASzZFADxBRQA8P0gDPEFFRjxB + RbM8QUX2O0BE/zo/RP9KT1P/c3d5/6aoqf/P0NH/5+fn//Dw8P/z8/P/8/Pz//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vH/8vLy//Pz8//y8vL/7+/v/+Lj4//HyMn/m52f/2hsb/9ESU3/Oj9D/ztA + RP88QUXsPEFFljxBRSg5P0QAPEFFAD1ARQA2Q0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBM + UwAmWGIAPEFGADxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRR08QUWMPEFF7TtA + RP87QET/UlZa/42Qkv/Jy8v/6urq//Ly8v/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/y8vL/8vLy/+Xl5f+9vr//fH+C/0hN + Uf86P0P/PEFF/zxBRdc8QUVgPEBEBzxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRQA8QUUAO0FFADRL + TwA2SEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRQA7REQAPEFFADxB + RQA8QUQAPUJEADxARQI8QUUFPEFFBzxBRQg8QUUIPEFFCDxBRQg8QUUIPEFFPzxBRcU8QUX/Oj9D/0pP + U/+LjZD/0NHS//Dw8P/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/z8vL/6+zs/8HD + xP90eHr/QUZJ/zo/RP88QUX1PEFFkTxBRRo8QUUHPEFFCDxBRQg8QUUIPEFFCDxBRgY7QkYDPUBEADxB + RQA8QUUAPEFFAD1DQwA9Q0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA9QUUAPEFFADxBRQA3W0UAPEFFFDxB + RTQ8QUVdPEFFgDxBRZ08QUWxPEFFvDxBRcI8QUXDPEFFwzxBRcM8QUXEPEFF5ztARP89Qkb/bXF0/8LD + xP/u7u7/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/n5+j/qKmr/1RYXP86P0P/PEFF/TxBRdM8QUXCPEFFwzxBRcM8QUXDPEFFvjxBRbM8QUWfPEFFgzxB + RWA8QUU3PEFFFT1HPwE8QUUAPUFFAD1ARAA9QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/RUcAP0RGAD1BRQA7QUUAPEFFFDxBRUs8QUWSPEFFyzxB + Re08QUX8O0BE/zo/Q/86P0P/Oj9D/zo/Q/86P0P/Oj9D/zo/Q/86P0P/OT5C/0VKTv+SlZf/4uPj//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx/8vMzf9rb3L/O0BE/zk+Q/86P0P/Oj9D/zo/Q/86P0P/Oj9D/zo/Q/86P0P/O0BE/zxB + Rf08QUXuPEFFzjxBRZU8QUVQPUFGFztCRgA8QUUAO0BCAD0+QAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAOkVGAC5fRwA8QUUAOj9FAD1BRSI8QUV1PEFFyDxBRfU7QET/OT5D/ztA + RP9BRkr/TlNW/1tfYv9mam3/b3N1/3N2ef90d3r/c3d6/3N3ev9zdnn/eHx+/7O1t//t7e3/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/c3N3/j5GT/3N2ef9zd3r/c3d6/3N3ev9zd3r/cHR3/2hsbv9cYGP/T1RX/0JH + Sv87QET/OT5D/ztARP88QUX3PEFFyzxBRXc8QUUjPUNGADxBRAAoblQAOkVGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA8QEUAPUFGADxARQA8QUUZPEFFdjxBRdY8QUX+Oj9D/zxBRf9NUlX/cHN2/5ib + nf+7vb7/0dLT/+Dh4f/o6On/6urr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/7+/v/+vr6//r6+v/6+vr/+vr6//r6+v/6uvr/+np6f/i4uL/09TU/72/ + wP+bnZ//cnZ4/05TVv88QUX/Oj9D/zxBRf88QUXYPEFFdztCRBk8QEUAPUFEAD1ARAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOkJCAD1BRgA8QUQAPT9GBDxBRU88QUXFPEFF/jo/Q/8/REj/YmZp/5yeoP/Pz9D/6enq//Ly + 8v/z8/P/8vLy//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8vLy//Pz + 8v/y8vL/6urq/9DR0v+eoKL/Y2dq/0BFSf86P0P/PEFF/jxBRcY8QUVPPkBEBD1BRQA7QUQAP0BHAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA+QUYAQEFGADxBRQA8QUQVPEFFijxBRfA7QET/PUJG/2Jmaf+qrK3/4OHh//Ly8v/y8vL/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/y8vL/4eHi/6utr/9jZ2r/PUJG/ztARP88QUXwPEFFij1BRRU8QUUAOEdJADpF + RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpE + RwA8Q0cAO0FFADxBRSo8QUW1PEFF/jo/Q/9NUlb/mJqc/97e3//y8vL/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/9PU + 1P/T1NT/7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/e39//mZud/05TVv86P0P/PEFF/jxBRbQ8QUUrPj9DADtB + RAA7PkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOURIADpE + RwA9P0UAPEJGOzxBRc07QUX/PEFF/2hsb//Excb/8PDw//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/0NHS/1ld + YP9ZXWD/0NHS//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8PDw/8XGx/9pbXD/PEFF/zxBRf88QUXNPEFFOjxD + RwA9QEMAP0NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEMAO0JGAD1A + QwA8QUVAPEFF1ztARP8/REj/goWI/93d3v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0BF + SP9ARUj/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/d3t7/goSH/z9ESP87QET/PEFF1jxB + RT48QEQAPUFFADw/QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlCQwA6P0IAPEJGADxB + RTk8QUXXO0BE/0JHSv+TlZf/5+jo//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0FG + Sf9BRkn/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8fH/5+fn/5GUlv9BRkr/O0BE/zxB + RdU8QUU3PEJGAD09QABAQEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1ARQA8QEUAPEFFKDxB + Rcs7QET/QUZK/5eanP/r6+v/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0FG + Sf9BRkn/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+vr6/+WmZv/QUZK/ztA + RP88QUXJPEFFJzxBRQA7QUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBGADxARQA7QEQTPEFFsDxB + Rf8+Q0f/kZOV/+vr6//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/19fX/ury9/0FG + Sf9BRkn/ury9//X19f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/q6+v/kJOV/z5D + R/88QUX/PEFFrj1BRRI8QUUAPEJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PUcAPEBGADw/RwM8QUWEPEFF/TtA + RP9/goX/5ufn//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/6+vs/9LT0/+xs7T/fH+C/z5D + R/8+Q0f/fYCD/7O1tv/U1db/7e3t//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5ubm/36B + hP87QET/PEFF/TxBRYM7REQDPEJFAD09SQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAA/wAAPEFFADxBRUw8QUXuOj9D/2Zq + bf/b29z/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/+vr6/+8vr//en1//09TV/8+Q0f/O0BE/zxB + Rf88QUX/O0BE/z9DR/9RVln/gIOF/8PFxv/t7e7/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9rb + 2/9laWz/Oj9D/zxBRe48QUVLPEJEADtMKQArVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRgA8QUUAPEFFGTxBRcU7QET/TVFV/8LD + xP/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/2NnZ/4SHif9GSk7/OT5C/zo/Q/89Qkb/QEVI/0JG + Sf9CRkn/QERI/z1CRv86P0P/OT9D/0pOUv+Mj5H/3t/f//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/BwsP/TFBU/ztARP88QUXDPEFFGDxBRQA5QUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRQA/OUIAPEFFezxBRf49Qkb/l5qc//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/KzMz/ZGdr/zo/Q/87QET/QEVI/01QUf9aW1r/YmFg/2Rj + Yf9kY2H/YWFg/1laWv9MTlD/P0RH/zpARP88QUX/bnF0/9TV1f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/v7+//lpmb/z1CRv88QUX+PEFFeEM+RQA5QkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JEADxBRQA8QUUrPEFF3To/Q/9kaGv/39/g//Hx + 8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9DR0v9eYmb/OT9D/zxBRf9KTU//X19e/2hnZf9qaGX/aWdl/2ln + Zf9pZ2X/aWdl/2poZf9oZmT/XV1d/0hLTf88QUX/Oj9D/2lsb//Y2dr/8vHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/3t/f/2Roa/86P0P/PEFF3DxBRSk8QUUAPEJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0FFADpCQwE8QUWJPEFF/0JHS/+xs7T/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/5OTk/3J1eP86P0P/PUJG/1BSU/9mZWP/amdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/amhl/2VjYv9NT1H/PEFF/zpARP98gIL/6Ojo//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy/7Cys/9CRkr/PEFF/zxBRYc+QEkBPEFGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5RkgAPEJFADxBRSc8QUXeOj9D/25ydf/m5+f/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/y8vL/qKqr/z5DR/88QUX/TlBS/2dlZP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9mZGP/S05Q/ztARP9BRkr/sLKz//Ly8v/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx/+bm5v9tcXT/Oj9D/zxBRd08QUUmPEFFAD1ARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1SkwAPz5CADxBRXg8QUX/QUZK/7K0tf/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/m5+f/am5x/zk+Qv9ESEv/Y2Jh/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qZ2X/YWFg/0JGSf85PkL/b3J1/+jo6P/x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v+xs7T/QUZK/zxBRf88QUV1PEFGADs/QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAA8QUUAPEFGFDxBRcg6P0P/ZGhr/+Li4//x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/U1NX/TlJW/zo/RP9RU1T/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1BSU/86P0P/T1NX/9XW1v/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/h4uL/YmZq/zo/Q/88QUXGPEJFEjxBRQA9PUkAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA7OQA8QUUAPEFFSjxBRfU8QUX/nJ6g//Ly8v/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/Oz9D/Sk9S/ztARP9UVVb/amhm/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amhm/1RVVv87QET/Sk9S/87P0P/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/y8fH/mpye/ztARP88QUX0PEFFSDxBRQA5L1QAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBRAAfAAAAPEFFjztARP9MUVT/zs7P//Ly8v/w8PD/8fHw//Hx + 8P/v7/D/7/Dw//Hx8P/x8fD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/f4OD/XWFk/zk/Q/9FSUv/YWFg/2poZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qaGX/YWFg/0VIS/85P0P/XWFk/9/g4P/x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8P/x8fD/7/Dw/+/v + 8P/x8fD/8fHw//Dw8P/y8vL/zM7O/0tQVP87QET/PEFFjStPRAA+QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBRQA7QUUTPEFFyzo/Q/9vc3b/6enp//Hx8P/w8PD/4eTy/8bO + 9/+2wvn/t8L5/8jQ9v/k5vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/nZ+h/z1CRv87QET/RUhL/1lZWf9lZGL/aWdl/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2pnZf9qaGX/aWdl/2ZkY/9ZWVr/REhL/ztARP8+Q0f/nqCi//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+Tm8v/I0Pb/t8L5/7bC + +f/Gzvf/4eTy//Dw8P/x8fD/6Onp/25xdP86P0P/PEFFyT1BRhI9QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQEBAADxBRQA8QUU5PEFF7ztARP+bnZ//8vLy/+/w8P/P1vX/obD9/5Sm + //+Spf//kqX//5Sm//+ks/z/1dr1//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/5eXm/4SHif8+Q0f/Oj9D/z1CRv9GSUz/UVNU/1pbW/9gYF//Y2Jh/2Rj + Yv9kY2L/Y2Jh/2BgX/9aW1v/UVNU/0ZJTP89Qkb/Oj9D/z5DR/+Fh4r/5ebm//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/1Nr1/6Sz/P+Upv//kqX//5Kl + //+Upv//obD9/8/W9f/w8PD/8vLy/5mcnv87QET/PEFF7jxBRTg8QUUAN0lJAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMUVXADxBRQA8QUVpO0BE/kRJTf/BwsP/8/Py/9fc9P+crP7/k6X//5Sm + //+Upv//lKb//5Sm//+Tpf//oLD9/93h8//x8fD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+bm5/+eoKL/VFlc/zxBRf85PkL/O0BE/z1CRv8/REf/QkZJ/0NH + Sv9DR0r/QkZJ/z9ER/89Qkb/O0BE/zk+Qv87QET/VFhc/56gov/m5+f/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8P/d4fP/oLD9/5Ol//+Upv//lKb//5Sm + //+Upv//k6X//5yt/v/Y3PT/8/Py/8DCw/9ESEz/O0FF/jxBRWg8QUUATC0+AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFAD5CRQE8QUWYOj9E/1ZaXv/b29z/7u/y/7K++v+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//7nE+f/v7/D/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/w8PD/1dXW/5yfoP9obG//TFBU/z5DR/87QET/OT9D/zk+ + Qv85PkL/OT9D/ztARP8+Q0f/TFBU/2hsb/+anJ7/09TV//Dw8P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v8P+5xPn/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+yvvr/7u/y/9rb2/9VWl3/OkBE/zxBRZY+RUkBPEJGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRQw8QUW9OT5C/21xdP/r6+r/5Ofy/5+v/f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6Wz/P/p6vH/8PDw//Dw8P/w8PD/8PDw//Ly8v/x8fH/6Ojo/+Hh + 4f/g4OH/5eXm/+7u7v/y8vL/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//Hx8f/n5+f/z9DQ/7W3uP+doKH/j5GU/4eK + jP+Hioz/j5GU/52gof+2t7j/z9DQ/+fn5//x8fH/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//Ly8v/u7u7/5eXm/+Dg + 4f/h4eH/6Ojo//Hx8f/y8vL/8PDw//Dw8P/w8PD/8PDw/+jq8f+ls/z/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+fr/3/5Ofy/+rq6v9scHP/OT5C/zxBRbw8QUULPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFGADxBRho8QUXZOj9D/4aJi//x8fD/4OPz/5ys/v+Tpv//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6Gw/f/l5/L/8fHw//Dw8P/x8fH/7e3t/8bHyP+PkpT/bHBz/1xg + ZP9bX2L/Zmpt/36ChP+mqKr/0dLT/+zs7P/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8vLy//Pz8//y8vL/8vLy//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8vLy//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/s7Oz/0dLT/6aoqf9+gYT/Zmpt/1tf + Yv9cYGT/bHBz/4+SlP/Gx8j/7Ozt//Hx8f/w8PD/8fHw/+Xn8v+hsP3/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Om//+crP7/4OPz//Hx8P+FiIr/Oj9D/zxBRdk8QUUaPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRS88QUXoO0BE/52fof/z8vL/5ujy/6Kx/f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6i2/P/q6/H/8PDw//Ly8f/e3t//i46Q/0lOUv86P0P/OT5C/zk/ + Q/85P0P/OT5C/zk+Qv89Qkb/T1NX/3p9gP+3ubr/5eXl//Ly8v/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/y8vL/5eXl/7e5uv97foH/T1NX/z1BRf85PkL/OT5C/zk/ + Q/85P0P/OT5C/zo/Q/9JTlH/iYyP/97e3//y8vH/8PDw/+rr8f+ntvz/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+isf3/5ujy//Py8v+cnqD/O0BE/zxBRec8QUUuPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRUE8QUXzPEFF/66wsf/z8/P/7+/w/7nE+f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//lKb//8HK+P/w8PD/8fHx/9vb3P9xdHf/O0BE/ztARP8/REf/R0tN/01P + Uf9OUFL/Sk1P/0NHSv89Qkb/Oj9E/zk+Q/9DR0v/am1w/6+wsv/k5eX/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/+Tl5f+usLL/am1w/0JHS/85PkP/Oj9E/z1CRv9DR0r/Sk1P/05Q + Uv9NUFH/R0tN/z9DR/87QET/O0BE/3F1eP/b3Nz/8fHx//Dw8P/Byvj/k6b//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+6xPn/7+/w//Pz8/+tr7H/PEFF/zxBRfI8QUVAPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRU08QUX6QUZJ/7m6vP/z8/P/8fHw/+Dj8/+ks/z/k6X//5Sm + //+Upv//lKb//5Sm//+Tpf//qbf8/+Xn8v/x8fH/6Ojo/36Bg/87QET/PEFF/0lMTv9dXV3/Z2Vj/2ln + Zf9pZ2X/aGZk/2RjYf9bW1v/TU9R/0FFSf87QET/OT5C/0BFSf9tcXP/vL2+/+zt7f/y8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Lx8f/s7O3/u72+/21wc/9ARUn/OT5C/ztARP9BRUj/TU9R/1tbW/9kY2H/aGZk/2ln + Zf9pZ2X/Z2Vj/11dXf9ITE7/PEFF/ztARP9+goT/6Ojp//Hx8P/k5/L/qbf8/5Ol//+Upv//lKb//5Sm + //+Upv//k6X//6Sz/f/g4/P/8fHw//Pz8/+4urv/QEVJ/zxBRfo8QUVNPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVc7QET+RUlN/8DCw//z8/L/8PDw//Hw8P/c4PP/rrv7/5ip + /v+Upv//lKb//5mq/v+yvvr/4OPz//Hx8P/y8vL/rK6w/0FFSf87QET/Sk1P/2VjYv9qaGX/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/aGZl/2FgX/9SU1T/QkZJ/ztARf85PkP/R0tP/4mLjv/a2tv/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy/9ra2/+Ii47/RktP/zk+Q/87QEX/QkZJ/1JUVf9hYF//aGZl/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2poZf9lY2L/Sk1P/ztARP9BRkr/ra+w//Ly8v/x8fD/4OPz/7K++v+Zqv7/lKb//5Sm + //+Yqf7/rrv7/9zg8//w8PD/8PDw//Pz8//AwcL/RElN/ztARP48QUVWPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRV07QET/R0tP/8XHyP/y8vL/8PDw//Dw8P/x8fD/6uvx/9fc + 9P/J0fb/ytL2/9nd9P/s7PH/8fHw//Hx8f/i4uP/ZWls/zk+Q/9DR0r/YmFg/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/YmFg/1FTVP9ARUj/O0BE/ztARP9jZ2r/wcLD//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/wMLD/2Jmaf87QET/O0BE/0BFSP9RU1T/YmFg/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/YWFg/0NHSv85PkL/Zmpt/+Lj4//x8fH/8fHw/+zs8f/Z3fT/ytH2/8nR + 9v/X3PT/6uvx//Hx8P/w8PD/8PDw//Ly8v/Fxsf/RktP/ztARP88QUVcPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVw7QET/R0tP/8jJyv/z8/P/8PDw//Dw8P/w8PD/8PDw//Hx + 8P/x8fD/8fHw//Hx8P/w8PD/8PDw//Py8v+5urv/QkdK/zxBRf9UVVb/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9fXl7/SUxO/zxBRf86P0P/TlNW/6yu + sP/u7u7/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+7u + 7v+srrD/TlNW/zo/Q/88QUX/SUxO/15eXv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1NVVf87QET/QkdL/7m7vP/z8vL/8PDw//Dw8P/x8fD/8fHw//Hx + 8P/x8fD/8PDw//Dw8P/w8PD/8PDw//Pz8//Hycr/RktP/ztARP88QUVbPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVY7QET+RUlN/8fIyf/09PT/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+KjY//OT9D/0FFSP9hYF//aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qZ2X/ZmRj/1JUVf8/Q0f/Oj9D/0ZL + T/+jpaf/7u7u//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fD/7e7u/6Kk + pv9GS0//Oj9D/z9DR/9TVFX/ZmRj/2pnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2FgX/9ARUj/OT9D/4qNj//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//T09P/GyMn/RElN/ztARP48QUVVPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRUw8QUX6QEVJ/8HCw//39vb/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+bm5/9na27/OT5C/0lLTv9nZWT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9ZWVr/QUVJ/zo/ + Q/9GSk7/p6mr/+/v7//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/p6mr/0ZK + Tv86P0P/QUVJ/1laWv9oZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dlZP9IS07/OT5C/2hrbv/m5+f/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//f39v/AwsP/QEVJ/zxBRfk8QUVLPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRT88QUXxPEFF/7W3uf/6+vr/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vHx/9jZ2f9TV1v/Oj9D/1BSVP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/XFtb/0FF + Sf86P0P/S1BU/7u9vv/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Lx8f+8vb7/TFBU/zo/ + Q/9BRUn/W1tc/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9QUlP/Oj9D/1NXW//Y2dr/8vHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//r6+v+1t7j/PEFF/zxBRfE8QUU+PEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRSw8QUXmOj9D/6Kkpv/8/Pz/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8zNzv9HTE//O0BE/1ZXV/9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1pa + Wv8/REf/Oj9D/15iZf/X2Nn/8vLx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLx/9fY2P9eYWX/Oj9D/z9E + R/9aWlv/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9WV1f/O0BE/0dMUP/Mzs7/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//z8/P+hpKb/Oj9D/zxBReY8QUUsPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRBg8QUXXOT5C/4mMjv/9/f3/8/Pz//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8LDxP9ESEz/PEFF/1lZWv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9UVVb/PUJF/ztARP+Ii43/7e3t//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7e3t/4eKjf87QET/PUJG/1RV + Vv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9ZWVn/PEFF/0RITP/CxMX/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8/Pz//39/f+JjI7/OT5C/zxBRdc8QUUYPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxCRQs8QUW5OT5C/29ydf/39/f/9/f3//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/7/Awf9DSEv/PEFF/1paWv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2lnZf9pZ2X/aWdl/2ln + Zf9mZWP/Sk1P/zpARP9JTlL/xcbH//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/xMXG/0lOUf86QET/Sk1P/2Zl + Y/9pZ2X/aWdl/2lnZf9pZ2X/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9aWlr/PEFF/0NIS/+/wMH/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/9/f3//f39/9vcnX/OT5C/zxBRbk8QUUKPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAO0FEADZFOAA8QUWVOj9D/1ldYf/o6en//Pz8//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8XGx/9ESU3/PEFF/1hZWf9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ZlY/9hYF//YF9e/2NiYf9oZmT/aWdl/2ln + Zf9qaGX/Xl1d/z9ER/86P0P/gIOF/+3t7f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/t7e3/f4OF/zo/Q/8/REf/Xl1d/2po + Zf9pZ2X/aWdl/2hmZP9jYmH/YF9e/2FgX/9mZWP/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9YWFn/PEFF/0RJTf/Fx8j/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH//f38/+jp6f9YXWD/Oj9D/zxBRZVCLzwAPEBEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATE9YADxBRQA8QUVuO0BE/0dLT//S09T///////T09P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9DR0v9KTlL/O0BE/1RVVv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9nZWP/V1dY/0ZKTP9ARUj/P0RH/0JGSf9NT1H/YF9f/2ln + Zf9pZ2X/aGZk/0xPUf86P0P/TlNW/9DR0v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/S09P/T1RY/zo/Q/9MT1H/aGZk/2ln + Zf9pZ2X/YF9f/01PUf9CRkn/P0RH/0BFSP9GSkz/V1dY/2dlY/9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9UVVb/O0BE/0pPU//R0tL/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/09PT//////9HS0/9GS0//O0BE/zxBRW08QUUAR1JRAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAACwwMADxBRQA8QUVCPEFF9D1CRv+wsrP///////j4+P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/9zc3f9YXF//Oj9D/09RUv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ZlY/9OUFL/PUJG/ztARf88QUX/PEFF/zxBRf87QEX/QkZJ/1xc + XP9pZ2X/amhl/1tbW/89Qkb/PEFF/6Olp//y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v+kpqj/PUJG/z1CRv9bW1v/amhl/2ln + Zf9cXFz/QkZJ/ztARf88QUX/PEFF/zxBRf87QEX/PUJG/05QUv9mZWP/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9PUVL/Oj9D/1hcYP/c3d3/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/4+Pj//////6+xs/89Qkb/PEFF9DxBRUE8QUUACwsMAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUgPEFF2zk+Qv+LjpD//v7+//39/f/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+np6f9rb3L/OT5C/0hLTf9nZWT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1RWVv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/O0BF/0RI + S/9jYmH/amhl/2VjYv9ER0r/OT5C/3p9gP/s7e3/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+zs7f95fX//OT5C/0RIS/9lY2L/amhl/2Ni + Yf9ESEv/O0BF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf9UVlb/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dlZP9IS03/OT5C/2xwc//p6en/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/9/f3//v7+/4uOkP85PkL/PEFF2jxBRR88QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRQA9QkUIPEFFtDo/Q/9laWz/8vLy///////39/f/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+JjI7/OT5D/0FGSf9jYmD/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZGNi/0RHSv87QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxB + Rf9VVlf/aWdl/2hmZf9MTlD/OT9D/11hZf/i4uP/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+Hi4v9dYWT/OT9D/0xOUP9oZ2X/aWdl/1RW + Vv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztBRf9ER0v/ZGNi/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2JiYP9BRkn/OT5D/4qNj//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//f39///////8fLy/2VpbP86P0P/PEFFsztCRQc7QkUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRwA9P0MAPEFFfTtARP9KT1P/1tfY///////8/Pz/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Pz8/+usLL/PkNH/z1CRv9aW1v/amhl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/XV1d/z5DRv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + RP9LTU//aGZk/2lnZf9TVFX/Oj9E/09UV//T09T/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9LT0/9PU1f/Oj9E/1NUVf9qZ2X/aGZk/0tN + T/87QET/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf8+Q0b/XV1d/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/amhl/1paW/89Qkb/PkNH/6+xs//z8/P/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy//z8/P//////1tfY/0pPUv87QET/PEFFfD5BRgA7QUQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEpMgA8QUUAPEFFRzxBRfU8QUX/ra+x////////////9vb2//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/S09T/T1RX/zo/Q/9PUVL/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/Wltb/z1CRv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + Rf9IS07/Z2Vk/2poZv9XWFj/O0BE/0dMUP/Iycr/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8fIyf9HS0//O0BE/1dYWP9qaGb/Z2Vj/0hL + Tf87QEX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf89Qkb/Wltb/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/05RUv86P0P/UFRY/9PU1P/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/9vb2////////////rK+w/zxBRf88QUX0PEFERjxBRQBDSlUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACtVVQA8QUUAPEFFGjxBRdQ5PkL/fICC//r6+////////Pz8//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/q6ur/c3d6/zk+Qv9DR0r/ZGNh/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/Xl5d/z5DR/88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + RP9MTlD/aGZk/2poZv9ZWVn/PEFF/0NITP/CxMX/8/Pz//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8/Pz/8LDxP9DSEz/PEFF/1lZWv9qaGb/aGZk/0tO + UP87QET/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf8+Q0f/Xl5d/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZGJh/0NHSv85PkL/dXh7/+rr6//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL//Pz8///////6+vr/fH+C/zk+Qv88QUXUPEFFGjxBRQAzMzMAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkUAP0NGAjxBRZw6QET/VFlc/+Pk5P////////////f3 + 9//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/qaus/z5DR/89QUX/WFlZ/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZWRi/0VJTP87QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxB + Rf9XV1j/amdl/2poZv9ZWVn/PEFF/0RJTf/DxMX/8/Pz//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8/Pz/8LExf9DSEz/PEFF/1lZWf9qaGb/amdl/1ZX + WP88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztBRf9FSUz/ZWRi/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/WFhZ/z1BRf8+Q0f/qqyu//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/39/f////////////j4+T/VFhc/zpARP88QUWcPkJFAj1CRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkYAPEFFADxBRVk8QUX7PkNH/7W3uP////////////39 + /f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/2dra/1hcX/86P0P/SEtN/2ZlY/9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1dYWf89Qkb/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/O0BF/0dK + Tf9lY2L/aWdl/2poZv9XV1j/O0BE/0hNUP/Jysv/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8jKyv9ITVD/O0BE/1dXWP9qaGb/aWdl/2Vj + Yv9HSk3/O0BF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/z1CRv9YWFj/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9mZWP/SEtN/zo/Q/9ZXWD/2tvb//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/9/f3///////////+0trj/PkNH/zxBRfo8QUVZPEFFADxCRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAPEFFADxBRSA8QUXZOT5C/32Ag//6+/v///////// + ///5+fn/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/5OVl/87QET/PUJG/1laWv9qZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dmZP9SVFX/PkNH/ztARf88QUX/PEFF/ztARf88QUX/RklM/2Bf + Xv9pZ2X/aWdl/2lnZf9SVFX/Oj9D/1BVWP/U1dX/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9TU1f9QVFj/Oj9D/1JUVf9pZ2X/aWdl/2ln + Zf9fX17/RUlM/zxBRf87QEX/PEFF/zxBRf87QEX/PkNH/1JUVf9oZmT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2pnZf9ZWlr/PUJG/ztARP+Ulpj/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//n5 + +f////////////r6+v98f4L/OT5C/zxBRdk8QUUfPEFFAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JGADtERgM8QUWbO0BE/1BUWP/c3d7///////// + ///+/v7/9PT0//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9PU1P9UWFz/Oj9D/0ZKTP9lY2L/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9oZmT/W1tb/0tOUP9ER0r/QkZK/0ZKTP9SVFX/Y2Jh/2ln + Zf9pZ2X/aWdl/2hnZf9MTlD/OT9D/11hZf/i4+P/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+Lj4/9dYWT/OT9D/0xOUP9pZ2X/aWdl/2ln + Zf9pZ2X/Y2Jh/1JUVf9GSkz/QkZK/0RHSv9LTlD/W1tb/2hmZP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2VkYv9GSkz/Oj9D/1VZXP/T1NX/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/9PT0//7+ + /v///////////9vc3f9PVFf/O0BE/zxBRZk8Q0gCPEJGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITo9ADxBRQA8QUVNPEFF9jxBRf+jpaf///////// + ////////+/v7//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+Zm53/PEFF/zxBRf9TVFX/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2hmZP9kY2L/Y2Jh/2ZlY/9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2RjYf9DR0r/OT5C/3h8f//s7Oz/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+zs7P94e37/OT5C/0RHSv9kY2L/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9mZWP/Y2Jh/2RjYv9oZmT/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/1JUVf88QUX/PEFF/5mcnv/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/+/v7//// + /////////////6Kkpv88QUX/PEFF9TxBRUw8QUQASysyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASUtNAD1BRQA9QUUTPEFFxjo/Q/9mam3/7/Dw//// + //////////////f39//w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/e39//ZWls/zo/Q/9AREj/XFxc/2pn + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/1ZXWP88QUX/PkNH/6epq//y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v+nqav/PUJG/zxBRf9WV1j/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9qZ2X/XFxc/0BER/86P0P/Zmpt/97f3//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/39/f///////// + ////////7+/v/2VpbP86P0P/PEFFxjxBRBI8QUQAJVtdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9BQgA7QUUAPEFFdjxBRf9BRkr/vL6///// + //////////////7+/v/09PT/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/vL6//0pOUv86P0T/REhL/2Fg + X/9qZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9qZ2X/YmFg/0NHSv86P0P/XGBk/9vc3P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/b29z/XGBj/zo/Q/9DR0r/YmFg/2pn + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2pn + Zf9gYF//REhL/zo/Q/9KT1P/vb/A//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//T09P/+/v7///////// + ////////vL2//0FGSv88QUX/PEFFdTxCRgA3NTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtCQQA8QUUAPEFFJzxBRd45PkL/d3p9//f3 + 9//////////////////8/Pz/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/5yeoP9ARUn/O0BE/0dK + TP9hYWD/amhl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9lZGL/Sk1P/ztARP9ARUn/p6qr//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/p6mr/0BFSf87QET/Sk1P/2Vk + Yv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amhl/2Fh + YP9GSkz/O0BE/0BFSf+dn6H/7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//z8/P////////////// + ///39/f/dnp8/zk+Qv88QUXdPEFFJjxBRQA4OT4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBASAA9QEUAPz9GATxBRZA7QET/RktP/8fJ + yv//////////////////////+fn5//Hx8f/w8PD/8PDw//Dw8P/w8PD/8fHx/+np6f+Ii47/PUJG/ztA + RP9FSUz/Xl5d/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2Rj + Yv9MT1D/PEFF/ztARP9+gYT/5+jo//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5+jo/36Bg/87QET/PEFF/0xO + UP9kY2L/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/Xl5d/0ZJ + TP87QET/PUJG/4mMjv/p6en/8fHx//Dw8P/w8PD/8PDw//Dw8P/x8fH/+fn5//////////////////// + ///HyMn/RktP/ztARP88QUWPPkBCAT1BRAA8REQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUYAPEFFADxBRTQ8QUXnOj9D/3x/ + gv/4+Pn///////////////////////f39//w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/k5OX/hYiK/z5D + R/87QET/QUVJ/1ZWV/9mZGP/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9pZ2X/Xl5d/0hL + Tf88QUX/Oj9D/21xdP/b3Nz/8vHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vHx/9vb3P9tcHP/Oj9D/zxB + Rf9IS03/Xl5d/2lnZf9qaGX/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2ZkY/9VVlf/QUVJ/ztA + RP8+Q0f/hYiL/+Tl5f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/39/f///////////////////////j4 + +f97f4L/Oj9D/zxBRec8QUUzPEFFADxBRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAPUFEAD5ARAM8QUWXO0BE/0ZL + T//Gx8n///////////////////////7+/v/19fX/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5ubn/5KV + l/9FSk3/Oj9D/z1BRf9HSk3/V1hY/2NiYf9nZmT/aWdl/2lnZf9oZ2X/ZmRj/15eXf9PUVL/QERI/ztA + RP88QUX/cnZ4/9fY2f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/X2Nj/cnV4/zxB + Rf87QET/QERI/09RU/9eXl3/ZmRj/2lnZf9pZ2X/aWdl/2dmZP9jYmH/V1hY/0dKTf89QkX/Oj9D/0VK + Tv+TlZf/5ufn//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//X19f/+/v7//////////////////////8bH + yP9GS0//O0BE/zxBRZY9QUYDPUFFAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0FGADxBRQA8QUU0PEFF5To/ + Q/91eHv/9PX1///////////////////////9/f3/9PT0//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+zt + 7f+xs7T/XWFk/ztBRf86P0P/PEFF/0JGSf9JTE7/TlBS/09RUv9MTlD/RklM/z9DR/87QET/OT5D/0dM + UP+NkJL/4ODg//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/4ODg/42P + kv9HTFD/OT5D/ztARP8/Q0f/RklM/0xOUP9PUVL/TlBS/0lMTv9CRkn/PEFF/zo/Q/88QUX/XWFl/7Kz + tf/t7e3/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/9PT0//39/f//////////////////////9PT1/3R4 + e/86P0P/PEFF5D1BRTQ8QUUAP0VBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRQA8QUUhPEFF1TtB + Rf9CRkr/t7m7/////////////////////////////Pz8//Pz8//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL/2dra/5aYmv9ZXWD/PkNH/zk+Qv85PkL/OT5D/zk/Q/85PkL/OT5C/zo/Q/9HTFD/dHd6/76/ + wP/t7e3/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+3t + 7f+9v8D/dHd6/0dMT/86P0P/OT5C/zk+Qv85P0P/OT5D/zk+Qv85PkL/PkNH/1ldYf+WmJv/2dra//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/z8/P//Pz8////////////////////////////t7i6/0JG + Sv88QUX/PEFF0zxBRR88QUUAPUFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQkUAPEFFADtBRQc8QUWWPEFF/zxB + Rf86P0P/YmZp/+jp6f////////////////////////////z8/P/z8/P/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx//Dw8P/a2tv/r7Cy/4KFh/9obG//XGBj/1ldYf9hZWj/dHd6/5eZm//Fxsf/6enp//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL/6Onp/8XGx/+XmZv/dHd6/2FlaP9ZXWH/XGBj/2hsb/+ChYf/r7Gy/9rb2//w8PD/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/8/Pz////////////////////////////o6en/YmZp/zo/ + Q/88QUX/PEFF/jxBRZI+QUQGPUFEAD5AQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRUYAO0FFADxBRVU8QUX0PEFF/0FF + SP89Qkb/PEFF/5mbnf/9/f3////////////////////////////8/Pz/8/Pz//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8vLy/+/v7//m5uf/3+Dg/97e3//i4uP/6+zs//Ly8v/y8vL/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx//Ly8v/y8vL/6+zs/+Li4//e3t//3+Dg/+bm5//v7+//8vLy//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8/Pz//v7+/////////////////////////////39/f+Ym53/PEFF/z1C + Rf9BRUj/PEFF/zxBRfI8QUVSPEFFAEY8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5BRgA8QUUAPEFFGTxBRcg8QUX/QUZJ/1xc + XP9IS03/Oj9E/0xQVP/Mzc7//////////////////////////////////Pz8//Pz8//w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/z8/P//Pz8/////////////////////////////////8vMzf9LUFP/Oj9E/0hL + Tf9bW1v/QUVJ/zxBRf88QUXGPUBFGDxBRQA9QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRgA8QUYAPEFFcTxBRf08QUX/VFVW/2po + Zf9dXVz/P0RH/zk/Q/9ucXT/7e3u//////////////////////////////////z8/P/09PT/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//T09P/8/Pz/////////////////////////////////7e3t/21xdP85P0P/P0RI/11d + XP9qZ2X/U1VW/zxBRf88QUX9PEFFcDtCRgA+QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPUBFADxBRQA8QUUfPEFF0zxBRf9FSUv/ZWNi/2ln + Zf9pZ2X/UVNU/zxBRf88QUX/lpmb//z8/P/////////////////////////////////9/f3/9fX1//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/9fX1//39/f/////////////////////////////////8/Pz/lpmb/zxBRf88QUX/UVNU/2ln + Zf9pZ2X/ZGNi/0VJS/88QUX/PEFF0jxBRR48QUUAPkFGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkBGADtCRQA8QUVtPEFF/j1CRv9XWFj/aWdl/2ln + Zf9pZ2X/ZWNi/0dLTf87QET/R0xQ/72/wP///////////////////////////////////////v7+//f3 + 9//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx + 8f/39/f//v7+//////////////////////////////////////++v8D/R0xQ/ztARP9HSk3/ZWNi/2ln + Zf9pZ2X/aWdl/1dXWP89QkX/PEFF/TxBRW06QUQAP0FHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBFADxARRE8QUXBPEFF/0RIS/9lY2L/aWdl/2ln + Zf9pZ2X/aWdl/1FSVP88QUX/Oj9D/1ldYf/Z2tv///////////////////////////////////////// + ///6+vr/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//r6 + +v///////////////////////////////////////////9na2v9ZXmH/Oj9D/ztBRf9OUFL/aWdl/2ln + Zf9pZ2X/aWdl/2VjYv9FSEv/PEFF/zxBRcE8QEURPEBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkQAPEFFADxBRUU8QUX0PEFF/1NUVf9pZ2X/aWdl/2ln + Zf9pZ2X/Y2Jh/0NHSv87QEX/O0BE/zo/Q/9xdXf/6+zs//////////////////////////////////// + /////////Pz8//X19f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/19fX//Pz8//// + ////////////////////////////////////////6+zs/3B0d/86P0P/O0BE/ztBRf9BRUj/YGBf/2ln + Zf9pZ2X/aWdl/2lnZf9TVFX/PEFF/zxBRfQ8QUVGPEFFADtARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Q0QAOkBFADxBRYc8QUX/QERH/2BfXv9qZ2X/aWdl/2ln + Zf9pZ2X/VldX/zxBRf9BRkr/Wl5h/z5DR/87QUT/hYmL//X19f////////////////////////////// + //////////////7+/v/5+fn/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//n5+f/+/v7///////// + ///////////////////////////////////09fX/homL/zxBRf89Qkb/YWVp/0VKTf87QET/UlNV/2ln + Zf9pZ2X/aWdl/2pnZf9gX1//QERI/zxBRf88QUWJPURCADs/RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEFFEDxBRcQ7QEX/SEtN/2dlY/9pZ2X/aWdl/2ln + Zf9nZWP/SEtN/zo/Q/9cYGT/wMHC/21xc/86P0P/P0RI/5eanP/5+fn///////////////////////// + /////////////////////////Pz8//b29v/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/29vb//Pz8//////////////////// + //////////////////////////////n5+f+Xmpz/P0NH/zo/Q/9tcXT/x8jI/2drbv85P0P/RUhL/2Vk + Yv9pZ2X/aWdl/2lnZf9nZWT/SEtO/ztARf88QUXGPEFFETxBRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFGRgA8QUUAPEFFLjxBRek8QUX/UlRV/2lnZf9pZ2X/aWdl/2pn + Zf9gX17/QERH/zo/Q/+JjI7/4uLi/8fHyP9eYmX/OT5C/0FGSv+ipaf//Pz8//////////////////// + ///////////////////////////////////7+/v/9fX1//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/9PT0//v7+/////////////////////////////// + /////////////////////////Pz8/6Olp/9CR0r/OT5C/15iZf/Hx8j/5OPj/5eZm/88QUX/PkNG/11d + XP9qaGX/aWdl/2lnZf9pZ2X/U1RV/zxBRf88QUXqPEFFMDxBRQA7PkIAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVJRwA8QUUAPEFFVzxBRfo9Qkb/W1tb/2poZf9pZ2X/aWdl/2po + Zf9XWFj/PEFF/0NHS/+ztLX/4uLi/+Li4v+8vb7/Vlte/zk+Qv9FSU3/p6mr//v7+/////////////// + /////////////////////////////////////////v7+//r6+v/19fX/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//T09P/6+vr//v7+//////////////////////////////////// + ///////////////////7+/z/p6qr/0VKTf85PkL/Vlpd/7y9vv/i4uL/4uLi/72+v/9ITVD/O0BE/1RV + Vv9pZ2X/aWdl/2lnZf9qaGX/W1xb/z1CRv88QUX7PEFFWjxBRQA6PUEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1CRAA7QEYAPEFFfTxBRf9ARUj/YWBf/2lnZf9pZ2X/aWdl/2ln + Zf9PUVL/Oj9D/1NXW//Mzc3/4eHh/+Dg4P/i4eH/tba4/1JWWf85PkL/RElN/6Wnqf/6+vr///////// + ///////////////////////////////////////////////////+/v7/+/v7//b29v/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/29vb/+/v7//7+/v////////////////////////////////////////////// + //////////////v7+/+lqKr/RElN/zk+Qv9RVln/tba3/+Hh4f/g4OD/4eHh/9PT1P9bX2L/Oj9D/0xO + UP9oZmX/aWdl/2lnZf9pZ2X/YmFg/0FFSP88QUX/PEFFgTxBRgA8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA9QkUBPEFFmjxBRf9DR0r/ZWRi/2lnZf9pZ2X/aWdl/2hm + ZP9JTE7/OT5C/2VpbP/Z2dr/4ODg/+Dg4P/g4OD/4eHh/7K0tf9SVln/OT5C/0NITP+cnqD/9/f3//// + ///////////////////////////////////////////////////////////////////9/f3/+Pj4//T0 + 9P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx + 8f/09PT/+Pj4//z8/P////////////////////////////////////////////////////////////// + ////////9/f3/52fof9DSEz/OT5C/1FVWf+xs7T/4eHh/+Dg4P/g4OD/4ODg/9zc3P9vc3b/OT5C/0ZK + TP9nZWT/aWdl/2lnZf9pZ2X/ZWRj/0RIS/88QUX/PEFFnz1ARgI8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUFPEFFsztBRf9HSk3/Z2Vk/2lnZf9pZ2X/aWdl/2Zl + Y/9GSUz/OT5C/3V4e//d3d3/4ODg/+Dg4P/g4OD/4ODg/+Hh4f+ztLX/VFhb/zk+Qv9ARUn/jpGT/+/v + 7/////////////////////////////////////////////////////////////////////////////7+ + /v/8/Pz/+Pj4//X19f/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/19fX/+Pj4//z8 + /P/+/v7///////////////////////////////////////////////////////////////////////// + ///v7/D/jZCT/0BFSf85PkL/VFhb/7O0tf/h4eH/4ODg/+Dg4P/g4OD/4ODg/9/f3/9/goT/OT5C/0RI + Sv9lY2L/aWdl/2lnZf9pZ2X/Z2Zk/0hLTf87QUX/PEFFuDpDRwY6REcAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADlFRwA6Q0cIPEFFvztARf9KTU//aGZk/2lnZf9pZ2X/aWdl/2Vk + Yv9ESEv/OT5C/3t+gP/e3t7/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/h4eH/ubq8/1peYf86P0P/PEFF/3h8 + fv/h4uP///////////////////////////////////////////////////////////////////////// + ///////////////////9/f3/+/v7//j4+P/29vb/9PT0//Ly8v/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/9PT0//b29v/4+Pj/+/v7//39/f////////////// + /////////////////////////////////////////////////////////////////////////////+Hi + 4v95fH//PEFF/zo/Q/9aXmH/ubq7/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P+ChYf/OT5C/0NH + Sv9kY2H/aWdl/2lnZf9pZ2X/aGZk/0tNUP87QEX/PEFFxDtCRQs7Q0UAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpCRAA7QkQLPEFFxDtARf9LTlD/aGZk/2lnZf9pZ2X/aWdl/2Zk + Y/9FSEv/OT5D/3R3ef/b29v/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4uHh/8LDw/9nam3/O0BE/zo/ + Q/9hZWn/x8nK//7+/v////////////////////////////////////////////////////////////// + /////////////////////////////////////////v7+//7+/v/8/Pz/+/v7//r6+v/6+vr/+fn5//n5 + +f/5+fn/+fn5//r6+v/6+vr/+/v7//z8/P/+/v7//v7+//////////////////////////////////// + ///////////////////////////////////////////////////////////////////+/v7/yMnK/2Jl + af86P0P/O0BE/2Zqbf/CwsP/4uLh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9ra2v96fH7/OT9D/0NH + Sv9kY2H/aWdl/2lnZf9pZ2X/aGZk/0xOUP87QEX/PEFFyDxBRhA7QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpCRgA7QkYLPEFFwztARf9LTU//aGZk/2lnZf9pZ2X/aWdl/2dl + ZP9GSkz/Oj9D/2dqbP/Pzs7/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Li4v/Nzs7/eHt+/z9E + R/85PkL/TVFV/6Olp//y8vP///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////Lz8/+jpaf/TFFU/zk+ + Qv8/Q0f/eHt+/83Ozv/i4uL/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/83My/9tb3L/Oj9D/0VI + S/9mZGP/aWdl/2lnZf9pZ2X/aGZk/0xOUP87QEX/PEFFyTxBRhA8QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRgA7QkYGPEFFuTtARf9JTE//aGZk/2lnZf9pZ2X/aWdl/2hm + ZP9KTU//Oj9D/1hcX/+9u7v/2tra/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/h4eH/2NjY/5KU + lv9ITFD/OT5C/z5DR/93en3/1NXW//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1NbW/3d7ff8+Q0f/OT5C/0hN + UP+SlZb/19jY/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/19fW/727u/9dYGP/Oj9D/0lM + Tv9oZmT/aWdl/2lnZf9pZ2X/aGZk/0tNT/87QEX/PEFFwTxARgk9QEYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUDPEFFqTtARf9IS07/aGZl/2lnZf9pZ2X/aWdl/2ln + Zf9RU1T/O0BE/0pOUf+qqan/ysnI/93d3P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4eHh/9/f + 3/+vsLL/XWFk/ztARP85PkL/UVVZ/6Gjpf/s7e3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+zt7f+hpKb/UVVZ/zk+Qv87QET/XWFk/66w + sf/f39//4eHh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/b29r/yMbF/62srP9MUVT/OkBE/09R + U/9pZ2X/aWdl/2lnZf9pZ2X/aGdl/0lMT/87QEX/PEFFszxBRAU8QUQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA6REkAPEFFiztARf9GSk3/amlo/2lnZf9pZ2X/aWdl/2po + Zf9aWlr/PUJG/z5DRv+QkJH/wsC//8vKyf/d3Nz/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/i4uL/y8zM/4CDhf9ESU3/OT5C/z1CRv9mam3/ury9//T19f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09fX/uru9/2drbv89Qkb/OT5C/0RJTf9/goX/y8vM/+Li + 4v/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9vb2//Ix8b/wsC+/5OUlP8/REf/PEFF/1lZ + Wf9qaGX/aWdl/2lnZf9pZ2X/a2lo/0dLTv87QET/PEFFljpAQwE8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRwA8QUUAPEFFaTxBRf9BRUn/bm1t/2xqZ/9pZ2X/aWdl/2ln + Zf9jYmH/QkZJ/zo/Q/9oa23/vLu6/8C+vf/Ix8b/2djY/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/g4OD/4eHh/9zc3P+sra//YGRn/z1CRv84PkL/QkdL/3J2eP/AwcP/9PT0//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9PX1/8HCw/9zd3n/QkdL/zg+Qv88QUX/YGRn/6utrv/c3Nz/4eHh/+Dg + 4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/2NjY/8fGxf/Avr3/vbu7/2tucP86P0P/QkZJ/2Jh + YP9pZ2X/aWdl/2lnZf9raWf/b25t/0JHSv88QUX/PEFFczxBRQA8QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpARgA8QUUAPEFFQDxBRfE8QUX/aGhp/3VzcP9pZ2X/aWdl/2ln + Zf9pZ2X/TlBS/ztARP9GSk7/oKCg/8LAv//Avr3/w8LB/9HQz//c3Nz/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/g4OD/4ODg/+Dg4P/i4uL/0NHR/5SWmP9SVln/O0BE/zk+Qv9DSEz/b3N2/7W3uP/r7Oz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+vs7P+3ubr/cXV4/0NITP85PkL/O0BE/1FWWf+SlZb/0NDR/+Li4v/g4OD/4ODg/+Dg + 4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9zc3P/R0M//w8LB/8C+vf/CwL//oqGh/0dLT/87QET/TU9R/2hm + Zf9pZ2X/aWdl/2lnZf9zcW//a2tr/z1CRv88QUX2PEFFSjxBRQAxNjoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEFFGTxBRdQ7QET/WFpc/4J/ff9samj/aWdl/2ln + Zf9qZ2X/Xl5d/z9ER/86P0T/aGtt/7q5uP/Bv77/wL69/8C+vf/GxMP/0M/P/9nY2P/d3d3/4N/f/+Dg + 4P/g4OD/4ODg/+Dg4P/e3t7/3Nvb/9TT0/+xsLD/eHp8/0tPUv86P0P/OD1B/z9ESP9fY2b/mJud/9PU + 1f/19fX///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////X1 + 9f/T1NX/mpye/2BkZ/8/REj/OD1B/zo/Q/9LT1P/eHp7/7CwsP/U09P/3Nvb/97e3v/g4OD/4ODg/+Dg + 4P/g4OD/4N/f/93d3f/Z2Nj/0M/O/8bEw//Avr3/wL69/8G/vv+6ubj/aWtu/zpARP8/Q0f/XV1d/2pn + Zf9pZ2X/aWdl/2tpZ/+Bfnz/W11f/ztARP88QUXcO0FFIDxBRQBVVVUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QkUAO0NFAzxBRaA7QET/RkpN/4B+ff97eHf/aWdl/2ln + Zf9pZ2X/aGZk/05QUv87QET/QEVI/4iJiv/Avr3/wL69/8C+vf/Avr3/wL69/8LAv//GxcT/ysnI/83M + y//Ozc3/zczM/8vKyf/HxsX/w8HA/8C+vv/Bv77/v728/6inp/96fH3/UVVY/z5DR/86P0P/O0BE/0lO + Uv9ucXX/oKOl/8zNzv/t7e7//Pz8//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////Pz8/+7u7//P0NH/oKOl/21x + dP9JTlL/O0BE/zo/Q/8+Q0b/UFRX/3p8ff+op6f/v728/8G/vv/Av77/w8HA/8fGxf/Lysn/zczM/87N + zf/NzMv/ysnI/8bFxP/CwL//wL69/8C+vf/Avr3/wL69/8C+vf+HiIn/QEVI/ztARP9NUFL/aGZk/2ln + Zf9pZ2X/aWdl/3l2dP+CgH//SU1Q/ztARP88QUWsO0BEBztARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEQAPEFFADxBRVg8QUX6PEFF/2pqa/+Kh4X/dHJw/2ln + Zf9pZ2X/aWdl/2JhYP9DR0r/O0BE/0dMT/+VlZb/wb++/8C+vf/Avr3/wL69/8C+vf/Avr3/v728/8C+ + vf/Avr3/wL69/7+9vP/Avr3/wL69/8C+vf/Avr3/wL69/8LAvv/CwL//mpqb/0pOUv87QET/PEFF/ztA + RP85PkL/Oj9D/0VKTv9fY2b/goWI/6epq//Iycr/39/g/+/v8P/5+fn//f39//////////////////// + /////////////////////////f39//n5+f/v7/D/39/g/8jJyv+nqav/goWI/2BkZ/9HTE//Oj9D/zk+ + Qv87QET/PEFF/ztARP9FSU3/kJGR/8G/vv/CwL//wL69/8C+vf/Avr3/wL69/8C+vf+/vbz/wL69/8C+ + vf/Avr3/v728/8C+vf/Avr3/wL69/8C+vf/Avr3/wL69/5KTk/9HS07/O0BE/0NHSv9iYWD/aWdl/2ln + Zf9pZ2X/cnBu/4qGhP9ubm//PUJG/zxBRf08QUVlPEFFAEFGSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRhk8QUXOO0BE/05RVP+Gg4L/iIWD/3Fv + bf9pZ2X/aWdl/2lnZf9bW1v/P0RH/zpARP9JTVH/j4+Q/768u//Bv77/wL69/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wL69/8C+vf/Avr3/wb++/7+9vP+bm5v/WFxf/zxBRf88QUX/SEtO/1FS + VP9KTVD/QUZJ/ztARP86P0P/OT5C/zxBRf9CR0r/UFRY/2BkZ/9xdHf/g4eJ/5GUlv+doKL/pKao/6iq + rP+oqqz/pKao/52gov+RlJb/g4aJ/3B0d/9gZGf/UFRY/0JHSv88QUX/OT5C/zo/Q/87QET/QUVJ/0pN + UP9RU1T/TE5Q/z1BRf88QUX/TlJV/42Ojv+7ubj/wsC//8C+vf/Avr3/wL69/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wL69/8G/vv+9u7r/i4yN/0hMUP86QET/QERI/1tbW/9pZ2X/aWdl/2ln + Zf9vbWv/hoOB/4iFhP9SVVf/O0BE/zxBRdk8QUUhPEFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JGAD5AQwA8QUV3PEFF/j1CRv9ra2v/jYqI/4aD + gf9xb23/aWdl/2lnZf9pZ2X/V1hY/z9DR/87QET/Q0hL/3Z4ev+ura3/wb++/8G/vv/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wb++/8LAv/+/vr3/qqqp/3d4ev9GSk7/OkBE/zxBRf9MTlD/ZWRj/3h1 + c/+DgX//enl4/2ZnaP9ESEv/PEFF/zxBRf88QUX9O0BE/zo/Q/85PkL/OT5C/zk/Q/86P0P/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/85P0P/OT5C/zk+Qv86P0P/O0BE/zxBRf48QUX/PEFF/0RJTP9mZ2j/eXh3/4OB + f/93dXP/aGZk/1FSVP8+Q0b/OkBE/0BFSf9pa27/oJ+g/7y6uv/CwL//wb++/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8G/vv/CwL//wL69/6qpqf9xc3X/QUZK/ztARP8/REf/WFlZ/2lnZf9pZ2X/aWdl/3Bt + a/+EgX//jYqI/3BwcP8/Q0f/PEFF/zxBRYY/UEsAPEJGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPT9EADxBRQA8QUYfPEFF0TtARP9JTE//f359/42K + iP+HhIL/c3Fv/2lnZf9pZ2X/aWdl/1hZWf9BRUn/O0BE/zxBRf9SVVn/gIGD/6empv+6uLf/wL69/8G/ + vv/CwL//wsC//8G/vv++vbz/tLOz/52dnf91d3n/TVFU/ztARP87QET/P0RH/1NUVf9raWf/fnx5/4uI + hv+Nioj/jYqI/25ubv9ARUn/PEFF/zxBRco8QUVoPEFFgjxBRaE8QUW8PEFFzzxBRdk8QUXiPEFF5jxB + Rek8QUXpPEFF5jxBReI8QUXZPEFFzzxBRbw8QUWhPEFFgTxBRWo8QUXOPEFF/0FGSf9wcHD/jYqI/42K + iP+LiIb/fnt5/2xqaf9YWFn/QkZJ/ztARP86P0P/RUpO/2hrbf+RkpL/rays/7u5uP+/vr3/wb++/8G/ + vv/Avr3/vry8/7a0tP+goKD/eHp7/01RVf87QET/O0BE/0JGSf9aWlr/aWdl/2lnZf9pZ2X/cnBu/4aD + gf+Nioj/g4GA/01QU/87QET/PEFF3TxBRSk8QUUAPUFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAD9BQgA7QUYAPEFFZTxBRfk7QEX/WVtd/4iG + hP+Nioj/iYaE/3l3df9samf/aWdl/2lnZf9fXl7/SUxO/z1CRf86P0T/PEFF/0hMUP9dYGP/c3V3/4KD + hP+IiYr/hoeI/3x+f/9qbW//VVhc/0JHS/86QET/OkBE/z1CRv9IS07/X19f/3Vzcf+Gg4H/jImH/4yJ + h/+MiYf/cXFx/0NHS/87QEX/PEFF4TxBRT48QUQAPEFDADtBRQQ7QkUJPEFFEjxBRR08QkUoPEFFLTxB + RTE8QUUxPEFFLTxCRSg7QUUdPEFFEjtCRQk8Q0QEO0BGADxBRQA8QUVEPEFF5TtARP9ESEz/dHNz/42K + h/+MiYf/jImH/4aDgf92dHL/Y2Jh/01PUf8/REf/O0BE/zo/Q/8+Q0f/TFBU/19iZP9wcnT/enx+/31/ + gP93eXv/aWtu/1ZaXf9ESEz/O0BE/zpARP89Qkb/Sk1P/2BfX/9pZ2X/aWdl/2tpZ/95d3X/iIaE/42K + iP+Kh4X/X2Bi/zxBRf88QUX9PEFFdjtETgA9QEIAOkZGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1BRAA8QUYAPEJGDTxBRag8QUX/PkNG/2Zn + aP+LiIb/jImH/4yJh/+DgH7/dHFv/2tpZ/9pZ2X/ZmRj/1dYWP9HSkz/PkJG/ztARP86P0P/Oj9D/zpA + RP87QET/O0BE/zo/Q/86P0P/Oj9D/ztARP8/Q0f/SUxO/1xcXP9ycG7/goB+/4uIhv+MiYf/jImH/4yJ + h/9wb3D/REhM/ztARP88QUXsPEFFWT5CRwA7QUYAPEFHADxBRQA7QUUAPEFFADxBRQA8QkUAPEFFADxB + RQA8QUUAPEFFADxCRQA7QUUAPEFFADtCRQA8QkUAPUNEADxBRgA7P0QAPEFFXzxBRe87QET/RUpN/3Jy + cv+MiYf/jImH/4yJh/+LiIb/g4B+/3Nxb/9gYF//TVBR/0FGSf88QUX/OkBE/zk/Q/86P0P/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/87QET/P0NH/0lMTv9aWlr/ZmVj/2lnZf9raWf/dHFv/4OAfv+MiYf/jImH/4yJ + h/9sbG3/P0RI/zxBRf88QUW5PEBFFDxARQA9QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QUUAPEFGADtBRSk8QUXRPEFF/0BF + SP9ra2z/i4iG/4yJh/+MiYf/ioeF/4J/ff92dHL/bWtp/2poZv9lZGL/XFxb/1BSU/9HS03/QkZJ/0BE + SP8/REf/P0RH/0FFSP9ER0r/S01P/1ZXWP9mZWT/d3Vz/4SBf/+LiIb/jImH/4yJh/+Nioj/ioeF/2lq + a/9CRkr/O0BE/zxBRe88QUVmQUhCATxCRAA7QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRgA8QUYAPENJAjxBRW48QUXzO0BE/0NH + S/9sbW3/i4iG/42KiP+MiYf/jImH/4uIhv+EgX//eHZ0/2loZ/9aW1v/T1FS/0dKTf9DR0r/QUVJ/0FF + Sf9CRkn/RUhL/0tNT/9TVFX/Xl5d/2ZlY/9qaGb/bmtp/3Z0cv+Cf33/ioeF/4yJh/+MiYf/jImH/3Fx + cf9DR0v/O0BF/zxBRd48QUU3PUFFAEBFSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkcAPEJGADxBRAA8QUVFPEFF4jtB + Rf9BRUn/aGlp/4qHhf+Nioj/jImH/4yJh/+LiIb/h4SC/4B9e/94dnT/c3Fv/29ta/9raWf/Z2Zk/2Rj + Yv9jYmL/ZWRk/2ppaP9ycG7/enh2/4OAfv+JhoT/jImH/4yJh/+MiYf/jImH/42KiP+DgYD/XV9g/z9E + R/87QUX/PEFF6DxBRWA8PEICPEFEAD1CRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQA8QUYAPEFGADxARwQ8QUVpPEFF7DtA + Rf9AREj/YGJj/4WCgf+Nioj/jImH/4yJh/+MiYf/jImH/4mGhP+DgH7/e3l2/3Nxb/9ta2r/aGdl/2Zl + ZP9mZWT/aWdm/2xqaP9wbWv/c3Fv/3h2dP+AfXv/h4SC/4uIhv+MiYf/jImH/4yJh/+LiIb/b29v/0RI + S/87QET/PEFF7DxBRVY5QUMAPUBFADI2OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFGADxBRQA8QEcAPEFFUTxB + ReQ7QUX/P0NH/15fYf+DgX//jYqI/4yJh/+MiYf/jImH/42Jh/+MiYf/i4iG/4mGhP+HhIL/hoOB/4aD + gf+IhYL/iYaE/4qHhf+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+Nioj/ioeF/3Nycv9OUVT/PEFF/zxB + Rf88QUXaPEFFT0Y0XgA8QEQAPEBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBGADxARQA3REIBPEFFVzxB + ReA8QUX/PEFF/1FTVv92dXX/i4iG/42KiP+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+Kh4X/iYaD/4eE + gv+Gg4H/hoOB/4eEgv+JhoT/i4iG/4yJh/+MiYf/jImH/4yJh/+MiYf/jYqI/4aEgv9kZWb/QUVJ/ztA + RP88QUXuPEFFZTtGRAE9QUUAPUFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRAA8QUQAPEJGADxB + RUo8QUXYPEFF/zxBRf9NUFP/cnFx/4mGhP+Nioj/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jYqI/4qHhv95eHf/Wlxe/0BFSP87QET/PEFF/jxB + RbU8QUUyPEFGADxBRAA8QkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRAA8QkUAPUBGADxB + RTo8QUW/PEFF/ztARP9CRkr/Xl9h/317ev+LiIb/jYqI/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/42KiP+LiIb/eHd3/1NWWP89Qkb/PEFF/zxB + ReU8QUVdO0hIAjxCRgA9QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEBFADxB + RAA8QUUzPEFFtzxBRf07QET/QERI/1VYWv9zcnL/hoOC/4yJh/+Nioj/jYqI/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+Nioj/jYqI/4yJh/+Fg4H/c3Jy/1lbXf9CR0r/O0BE/zxBRf88QUXkPEFFfDxB + RRQ8QUUAPEJEADxCRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEJFADtA + RAA8QUUaPEFFiTxBReo8QUX/O0FF/0RJTP9dX2D/d3Z2/4eFg/+Niof/jYqI/42KiP+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jYmH/42KiP+Nioj/iYaE/3l4d/9cXV//QkdK/ztARP88QUX/PEFFyTxB + REQ/TEYAO0JFADtDRgBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + RdI8QUXZPEFF1zxBRc48QUW5PEFFmzxBRXM8QUVCPEFGFzA9XwA8QUUAPEFEAD5ESAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPj5EADY/QQA5PEAAO0FEADxBRQA8QUUAPEBGADxCRQU8QUULPEFFDjxB + RQ88QUUMPEFECDtAQgI8QUUAPEFFADxARQA9P0UAO0NGAEM6PwAAgIAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAyR08APEJFADxBRQA8QUUAPEFFADtBQwA8QUYHPEFFDTxB + RhI8QUUZPEFFFjxBRRA7QUUKO0BHAjxBRQA8QUUAPEFGADtBRwA9O0oAOkVGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QkYAPEJEADxBRQA8QUUAPEFFADxB + RQA8QUUAPEFFADxBRAA/PkMAPj5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAOkFJAD1BRgA8QUYAPEFFADxB + RgA8QUUAPEFFADxBRQA7QUUAPEFGADk9QgA6PkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////8A////////////////////AP///////////////////wD///////////// + //////8A//////8AAAAAAP//////AP///+AAAAAAAAAAB////wD///4AAAAAAAAAAAB///8A///gAAAA + AAAAAAAAB///AP//4AAAAAAAAAAAAAf//wD//+AAAAAAAAAAAAAH//8A///gAAAAAAAAAAAAB///AP// + 4AAAAAAAAAAAAAf//wD//+AAAAAAAAAAAAAH//8A///wAAAAAAAAAAAAD///AP///4AAAAAAAAAAAf// + /wD////8AAAAAAAAAD////8A//////8AAAAAAP//////AP/////+AAAAAAA//////wD////4AAAAAAAA + AB////8A////wAAAAAAAAAAD////AP///gAAAAAAAAAAAH///wD///AAAAAAAAAAAAAP//8A///gAAAA + AAAAAAAAB///AP//wAAAAAAAAAAAAAP//wD//wAAAAAAAAAAAAAA//8A//4AAAAAAAAAAAAAAH//AP/8 + AAAAAAAAAAAAAAA//wD/+AAAAAAAAAAAAAAAH/8A//AAAAAAAAAAAAAAAA//AP/gAAAAAAAAAAAAAAAH + /wD/4AAAAAAAAAAAAAAAB/8A/8AAAAAAAAAAAAAAAAP/AP+AAAAAAAAAAAAAAAAB/wD/AAAAAAAAAAAA + AAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD+AAAAAAAAAAAAAAAAAH8A/gAAAAAA + AAAAAAAAAAB/APwAAAAAAAAAAAAAAAAAPwD8AAAAAAAAAAAAAAAAAD8A+AAAAAAAAAAAAAAAAAAfAPgA + AAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPAAAAAAAAAAAAAAAAAA + DwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAA + AAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAA + AAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAA + AAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAA + DwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAA + AAAAAA8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAA + AAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD8AAAAAAAAAAAAAAAAAD8A/AAAAAAAAAAAAAAAAAA/APwA + AAAAAAAAAAAAAAAAPwD+AAAAAAAAAAAAAAAAAH8A/gAAAAAAAAAAAAAAAAB/AP4AAAAAAAAAAAAAAAAA + fwD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/gAAAAAAAAAAA + AAAAAf8A/4AAAAAAAAAAAAAAAAH/AP/AAAAAAAAAAAAAAAAD/wD/wAAAAAAAAAAAAAAAA/8A/4AAAAAA + AAAAAAAAAAH/AP+AAAAAAAAAAAAAAAAB/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP4A + AAAAAAAAAAAAAAAAfwD+AAAAAAAAAAAAAAAAAH8A/gAAAAAAAAAAAAAAAAB/APwAAAAAAAAAAAAAAAAA + PwD8AAAAAAAAAAAAAAAAAD8A/AAAAAAAAAAAAAAAAAA/APgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAA + AAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAA + AAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgA + AAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAA + HwD8AAAAAAAAAAAAAAAAAB8A/AAAAAAAAAAAAAAAAAA/APwAAAAAAAAAAAAAAAAAPwD+AAAAAAAAAAAA + AAAAAD8A/gAAAAAAAAAAAAAAAAB/AP4AAAAAAAAAAAAAAAAAfwD+AAAAAAAAAAAAAAAAAH8A/wAAAAAA + AAAAAAAAAAD/AP+AAAAAAA//8AAAAAAA/wD/gAAAAAAf//AAAAAAAf8A/8AAAAAAP//8AAAAAAP/AP/g + AAAAAH///gAAAAAH/wD/8AAAAAD///8AAAAAB/8A//gAAAAB////gAAAAB//AP/8AAAAA////8AAAAA/ + /wD//wAAAA/////wAAAAf/8A///AAAA//////AAAAf//AP//4AAA//////8AAAf//wD///8AH/////// + 8AB///8A////////////////////AP///////////////////wD///////////////////8A//////// + ////////////AA== + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Forms/FrmTransparent.Designer.cs b/JinYuan.ControlLib/Forms/FrmTransparent.Designer.cs new file mode 100644 index 0000000..73670a4 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmTransparent.Designer.cs @@ -0,0 +1,73 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib.Forms +{ + /// + /// Class FrmTransparent. + /// Implements the + /// + /// + partial class FrmTransparent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmTransparent)); + this.SuspendLayout(); + // + // FrmTransparent + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.Black; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmTransparent"; + this.Opacity = 0.5D; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "FrmTransparent"; + this.Load += new System.EventHandler(this.FrmTransparent_Load); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/JinYuan.ControlLib/Forms/FrmTransparent.cs b/JinYuan.ControlLib/Forms/FrmTransparent.cs new file mode 100644 index 0000000..a7689f2 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmTransparent.cs @@ -0,0 +1,169 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.Forms +{ + /// + /// Class FrmTransparent. + /// Implements the + /// + /// + public partial class FrmTransparent : FrmBase + { + /// + /// The wm activate + /// + private const int WM_ACTIVATE = 6; + + /// + /// The wm activateapp + /// + private const int WM_ACTIVATEAPP = 28; + + /// + /// The wm ncactivate + /// + private const int WM_NCACTIVATE = 134; + + /// + /// The wa inactive + /// + private const int WA_INACTIVE = 0; + + /// + /// The wm mouseactivate + /// + private const int WM_MOUSEACTIVATE = 33; + + /// + /// The ma noactivate + /// + private const int MA_NOACTIVATE = 3; + /// + /// Gets the create parameters. + /// + /// The create parameters. + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED + return cp; + } + } + /// + /// Gets or sets the frmchild. + /// + /// The frmchild. + public FrmBase frmchild + { + get; + set; + } + /// + /// Initializes a new instance of the class. + /// + public FrmTransparent() + { + InitializeComponent(); + + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + + MethodInfo method = base.GetType().GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod); + method.Invoke(this, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, new object[] + { + ControlStyles.Selectable, + false + }, Application.CurrentCulture); + } + + /// + /// 引发 事件。 + /// + /// 一个包含事件数据的 。 + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + base.ShowInTaskbar = false; + base.ShowIcon = true; + } + /// + /// Sets the active window. + /// + /// The handle. + /// IntPtr. + [DllImport("user32.dll")] + private static extern IntPtr SetActiveWindow(IntPtr handle); + + /// + /// WNDs the proc. + /// + /// 要处理的 Windows 。 + protected override void WndProc(ref Message m) + { + if (m.Msg == 33) + { + m.Result = new IntPtr(3); + } + else + { + if (m.Msg == 134) + { + if (((int)m.WParam & 65535) != 0) + { + if (m.LParam != IntPtr.Zero) + { + FrmTransparent.SetActiveWindow(m.LParam); + } + else + { + FrmTransparent.SetActiveWindow(IntPtr.Zero); + } + } + } + else if (m.Msg == 2000) + { + } + base.WndProc(ref m); + } + } + + /// + /// Handles the Load event of the FrmTransparent control. + /// + /// The source of the event. + /// The instance containing the event data. + private void FrmTransparent_Load(object sender, EventArgs e) + { + if (frmchild != null) + { + frmchild.IsShowMaskDialog = false; + var dia = frmchild.ShowDialog(this); + this.DialogResult = dia; + } + } + } +} diff --git a/JinYuan.ControlLib/Forms/FrmTransparent.resx b/JinYuan.ControlLib/Forms/FrmTransparent.resx new file mode 100644 index 0000000..be524d1 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmTransparent.resx @@ -0,0 +1,1185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAeIAAAAEAIAAo+AAAFgAAACgAAAB4AAAAAAEAAAEAIAAAAAAAAPAAAGDqAABg6gAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVAG9vbwBCQkQAPz9LADw9 + RQA7P0cAPEBHAD1ARgA9QUYAO0BGADtDRQA7QUEAO0BAADk+PgA9QkIAPkJCADtBRAA4RkgAOUZGADxA + QAA8QEAAOUZGADhGSAA7QUQAPkJCAD1CQgA5Pj4AO0BAADtAQQA7QEUAO0BGAD1BRgA9QEYAPEBHADs/ + RwA8PUUAPz9LAEJCRABvb28AVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUAGRksAD4+ + RAA4QUUAOEBEADk7PABBQ0MAO0NFADs/RwA6QUUAPENDADxDQwA8Q0MAPENDADtCQwA1REIASjRkADw3 + RgE6PUoBPD9JAT0/RwI9QEcCO0BGAjtDRQI7QUEDO0BABDk+PgQ+QkIEPkJCBTtBRAU4R0gFOUZGBTxA + QAY8QEAGOUZGBThHSAU7QUQFPkJCBT5CQgQ5Pj4EO0BABDtAQQM7QEUCO0BGAj1ARwI9P0cCPD9JATo9 + SgE8N0YBSjRkADVEQgA7QkMAPENDADxDQwA8Q0MAPENDADxBQwA8QUcAPUFIADdGSQA3SUkAOz9DADlC + RgBAP0UAGxsvAFVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tQwAkIz8APDxLADxCRAA8QkUAO0JEADtE + QwBaUDUAMztIADo8PwFBQ0MDO0NFBDtARgY4P0cIPEFDCz1BRQ08QkUPPEFDETtBRBM8Q0MVPENEFzxC + Qxk8QkQaPEJEGzxCRBw8QkQdPEJEHjxDRB88Q0MgPENDIDxDQyA8Q0MhPENDITxDQyE8Q0QhPENDITxD + QyI8Q0MiPENDITxDRCE8Q0MhPENDITxDQyE8Q0MgPENDIDxDQyA8QkQfPEJEHjxCRB08QkQcPEJEGzxC + RBo8QkMZPENEFzxDQxU7QUQTPEFDETxCRQ89QUUNPEFBCzo/QQg8QUcGPUFHBTdFSAM4R0gBNTtIAFFJ + MAA6REMAO0JEADxCRQA8QEQAPD1LACQjPwAtLUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMzMzAERQVAA+RkgAPkNFAD1CRABETUMAPDtNATxCRAQ8QkUIO0JFDDxC + RBA7QkQVO0JEGTxCQxw8Q0MePENDIDxCRCI8Q0QkPENDJTxDQyU8Q0MmPENDJjxDQyY8Q0MnPENDJzxD + Qyc8Q0MnPENDJzxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxD + Qyc8Q0MnPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MlPENDJTxDQyQ8Q0QjPENEITtDRB88Q0QcO0JEGTtD + RBU8QkQQO0JFDDxBRQg8P0QEPDtNAURMQwA8QkQAPkNFAEBHSgBHUlYAMzMzAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPkREAEBGRwA4SlMAPUJEBTtBQgw8Q0QUPEJEGzxDQyA8Q0MjPENDJTxD + QyY8Q0MmPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MnPENDJzxD + QyY8Q0MmPENDJTxDQyM8QkMgPEJEGzxERBQ8QUIMPUJEBUJVXwBBRkcAPkREAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAP0REAEFDRAI8QkMTPENDIDxDQyU8Q0MmPENDJzxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxDQyY8Q0MlPENEIDxCRBNBQ0QCP0REAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPkNDAD9ERAY8QkMhPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MnPENDJz1CQyFAREQGPkNEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAP0BAAD86PAA7P0IIPUJEFDxCRB48Q0MjPENDJjxDQyY8Q0MnPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyc8Q0MmPENDJjxDQyM8QkMePUJDFDtAQghDP0AAQ0NEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQEBAAEE+QAA7P0IAEjkEADlDRgM5QkIIOkNEDjxCRBQ8Q0MZPEJDHjxD + QyE8Q0MjPENDJTxDQyY8Q0MmPENDJjxDQyc8Q0MnPENDJzxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJTxDQyQ8Q0MjPENDIzxDQyQ8Q0MlPENDJTxD + QyY8Q0MmPENDJTxDQyU8Q0MkPENDIzxDQyI8Q0MjPENDJTxDQyU8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxDQyc8Q0MnPENDJjxDQyY8Q0MmPENDJTxD + QyM8Q0MhPEJDHjxDQxk8QkQUO0NFDjpDQgg7PkYDE3Y6ADs/QgBFQUQAREREAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQAAADYAPUZMADhERQA7Q0MAPENCAEFJSAA8QkQBO0BEAjtB + RgU5Q0QIPUFECzxBQg49Q0IRPENEFDxBRRc8QkUaPEJDHTxDQx48Q0MgPEJDITxDRCM8Q0MkPENDJDxD + QyU8Q0MlPENDJTxDQyY8Q0MmPENDJDxDQyM8Q0MlPENDMDxCREM8QkVcPEFFdDxBRYs8QUWdPEFFqTxB + RbA8QUWyPEFFrjxBRaU8QUWXPEFFhDxCRW08QkRVPEJDPTxCQy08Q0MkPENDIzxDQyU8Q0MmPENDJTxD + QyU8Q0MlPENDJDxDQyQ8Q0QjPEJDITxDQyA8Q0MePEJDHTxCRBo8QkUYPEJFFTxDRBI9QkMPPkFECzpE + RQg7QUcFOz9EAj5ERgE+RkYAPUNDADxERAA6PkYAPTtHAAAABwBVVVUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4ADAzMgA8QkQAO0BEADtC + RgA6Q0QAPUFEAD5ERgA6REQAPkM+AAAA/wBAQ1sBOjxHAjxCRQM7QEUEOkBFBTtCRQY9Q0MIPEFECTxC + Qws9QkUMO0JEDTxBRAs9Q0QRPEFGLTxBRWA8QUWaPEFFxjxBReQ8QUX1O0BE/jtARP87QET/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/87QET/O0BE/zxBRfw8QUXwPEFF3jxBRb08QUWNPEFFUjxCRSM8QUUNO0NECztC + RQw8QkMLPEFECT1DQwg7QkUGOkBFBTtARQQ8QkUDOjxHAkRDWQFAL24AOksuADxDQAA8QkQAPUFEADpE + RQA7QkYAO0BEAD1ERQA1OTgAPz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAARkZGAC0tLQBAQUEAO0NFAEhPOgBGR2MAOjtHAD1CRgA7QEYAOj9FADtCRQA8Q0MAPEJDADxC + RAA8QUUAO0JGDDxBRUQ8QUWUPEFF1TxBRfc7QET/Oj9D/zo/Q/88QUX/REhM/0tQU/9SV1r/Wl5i/19j + Zv9hZWj/XWFl/1dbX/9PVFf/SU1R/0FGSv87QET/Oj9D/zo/Q/87QET/PEFF8jxBRck8QUWBPEFFMztD + SAU8QUUAO0JEADxDQwA7QkUAOj9FADtARgA9QkYAOjtHAEdHYwBHUDwAPUFIADxDRwBCQkEAR0dHAEBA + QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0BGADxBRQA8QEYAPEFGAD1B + RQ08QUVUPEFFtjxBRfI7QET/Oj9D/z1CRv9MUVT/aGxv/4mMjv+oqqv/vr/A/8/Q0f/b3Nz/4ODh/+Li + 4//j4+P/4eHi/97f3//X2Nn/ysvM/7i5u/+goqT/gIOG/2FlaP9HTFD/O0BE/zo/Q/87QET/PEFF6DxB + RaA8QUU+OUJGBTxCRQBCQ0UAP0NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QUQASzZFADxBRQA8P0gDPEFFRjxB + RbM8QUX2O0BE/zo/RP9KT1P/c3d5/6aoqf/P0NH/5+fn//Dw8P/z8/P/8/Pz//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vH/8vLy//Pz8//y8vL/7+/v/+Lj4//HyMn/m52f/2hsb/9ESU3/Oj9D/ztA + RP88QUXsPEFFljxBRSg5P0QAPEFFAD1ARQA2Q0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBM + UwAmWGIAPEFGADxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRR08QUWMPEFF7TtA + RP87QET/UlZa/42Qkv/Jy8v/6urq//Ly8v/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/y8vL/8vLy/+Xl5f+9vr//fH+C/0hN + Uf86P0P/PEFF/zxBRdc8QUVgPEBEBzxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRQA8QUUAO0FFADRL + TwA2SEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRQA7REQAPEFFADxB + RQA8QUQAPUJEADxARQI8QUUFPEFFBzxBRQg8QUUIPEFFCDxBRQg8QUUIPEFFPzxBRcU8QUX/Oj9D/0pP + U/+LjZD/0NHS//Dw8P/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/z8vL/6+zs/8HD + xP90eHr/QUZJ/zo/RP88QUX1PEFFkTxBRRo8QUUHPEFFCDxBRQg8QUUIPEFFCDxBRgY7QkYDPUBEADxB + RQA8QUUAPEFFAD1DQwA9Q0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA9QUUAPEFFADxBRQA3W0UAPEFFFDxB + RTQ8QUVdPEFFgDxBRZ08QUWxPEFFvDxBRcI8QUXDPEFFwzxBRcM8QUXEPEFF5ztARP89Qkb/bXF0/8LD + xP/u7u7/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/n5+j/qKmr/1RYXP86P0P/PEFF/TxBRdM8QUXCPEFFwzxBRcM8QUXDPEFFvjxBRbM8QUWfPEFFgzxB + RWA8QUU3PEFFFT1HPwE8QUUAPUFFAD1ARAA9QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/RUcAP0RGAD1BRQA7QUUAPEFFFDxBRUs8QUWSPEFFyzxB + Re08QUX8O0BE/zo/Q/86P0P/Oj9D/zo/Q/86P0P/Oj9D/zo/Q/86P0P/OT5C/0VKTv+SlZf/4uPj//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx/8vMzf9rb3L/O0BE/zk+Q/86P0P/Oj9D/zo/Q/86P0P/Oj9D/zo/Q/86P0P/O0BE/zxB + Rf08QUXuPEFFzjxBRZU8QUVQPUFGFztCRgA8QUUAO0BCAD0+QAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAOkVGAC5fRwA8QUUAOj9FAD1BRSI8QUV1PEFFyDxBRfU7QET/OT5D/ztA + RP9BRkr/TlNW/1tfYv9mam3/b3N1/3N2ef90d3r/c3d6/3N3ev9zdnn/eHx+/7O1t//t7e3/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/c3N3/j5GT/3N2ef9zd3r/c3d6/3N3ev9zd3r/cHR3/2hsbv9cYGP/T1RX/0JH + Sv87QET/OT5D/ztARP88QUX3PEFFyzxBRXc8QUUjPUNGADxBRAAoblQAOkVGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA8QEUAPUFGADxARQA8QUUZPEFFdjxBRdY8QUX+Oj9D/zxBRf9NUlX/cHN2/5ib + nf+7vb7/0dLT/+Dh4f/o6On/6urr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/7+/v/+vr6//r6+v/6+vr/+vr6//r6+v/6uvr/+np6f/i4uL/09TU/72/ + wP+bnZ//cnZ4/05TVv88QUX/Oj9D/zxBRf88QUXYPEFFdztCRBk8QEUAPUFEAD1ARAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOkJCAD1BRgA8QUQAPT9GBDxBRU88QUXFPEFF/jo/Q/8/REj/YmZp/5yeoP/Pz9D/6enq//Ly + 8v/z8/P/8vLy//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8vLy//Pz + 8v/y8vL/6urq/9DR0v+eoKL/Y2dq/0BFSf86P0P/PEFF/jxBRcY8QUVPPkBEBD1BRQA7QUQAP0BHAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA+QUYAQEFGADxBRQA8QUQVPEFFijxBRfA7QET/PUJG/2Jmaf+qrK3/4OHh//Ly8v/y8vL/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/y8vL/4eHi/6utr/9jZ2r/PUJG/ztARP88QUXwPEFFij1BRRU8QUUAOEdJADpF + RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpE + RwA8Q0cAO0FFADxBRSo8QUW1PEFF/jo/Q/9NUlb/mJqc/97e3//y8vL/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/9PU + 1P/T1NT/7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/e39//mZud/05TVv86P0P/PEFF/jxBRbQ8QUUrPj9DADtB + RAA7PkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOURIADpE + RwA9P0UAPEJGOzxBRc07QUX/PEFF/2hsb//Excb/8PDw//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/0NHS/1ld + YP9ZXWD/0NHS//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8PDw/8XGx/9pbXD/PEFF/zxBRf88QUXNPEFFOjxD + RwA9QEMAP0NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEMAO0JGAD1A + QwA8QUVAPEFF1ztARP8/REj/goWI/93d3v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0BF + SP9ARUj/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/d3t7/goSH/z9ESP87QET/PEFF1jxB + RT48QEQAPUFFADw/QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlCQwA6P0IAPEJGADxB + RTk8QUXXO0BE/0JHSv+TlZf/5+jo//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0FG + Sf9BRkn/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8fH/5+fn/5GUlv9BRkr/O0BE/zxB + RdU8QUU3PEJGAD09QABAQEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1ARQA8QEUAPEFFKDxB + Rcs7QET/QUZK/5eanP/r6+v/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0FG + Sf9BRkn/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+vr6/+WmZv/QUZK/ztA + RP88QUXJPEFFJzxBRQA7QUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBGADxARQA7QEQTPEFFsDxB + Rf8+Q0f/kZOV/+vr6//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/19fX/ury9/0FG + Sf9BRkn/ury9//X19f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/q6+v/kJOV/z5D + R/88QUX/PEFFrj1BRRI8QUUAPEJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PUcAPEBGADw/RwM8QUWEPEFF/TtA + RP9/goX/5ufn//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/6+vs/9LT0/+xs7T/fH+C/z5D + R/8+Q0f/fYCD/7O1tv/U1db/7e3t//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5ubm/36B + hP87QET/PEFF/TxBRYM7REQDPEJFAD09SQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAA/wAAPEFFADxBRUw8QUXuOj9D/2Zq + bf/b29z/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/+vr6/+8vr//en1//09TV/8+Q0f/O0BE/zxB + Rf88QUX/O0BE/z9DR/9RVln/gIOF/8PFxv/t7e7/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9rb + 2/9laWz/Oj9D/zxBRe48QUVLPEJEADtMKQArVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRgA8QUUAPEFFGTxBRcU7QET/TVFV/8LD + xP/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/2NnZ/4SHif9GSk7/OT5C/zo/Q/89Qkb/QEVI/0JG + Sf9CRkn/QERI/z1CRv86P0P/OT9D/0pOUv+Mj5H/3t/f//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/BwsP/TFBU/ztARP88QUXDPEFFGDxBRQA5QUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRQA/OUIAPEFFezxBRf49Qkb/l5qc//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/KzMz/ZGdr/zo/Q/87QET/QEVI/01QUf9aW1r/YmFg/2Rj + Yf9kY2H/YWFg/1laWv9MTlD/P0RH/zpARP88QUX/bnF0/9TV1f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/v7+//lpmb/z1CRv88QUX+PEFFeEM+RQA5QkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JEADxBRQA8QUUrPEFF3To/Q/9kaGv/39/g//Hx + 8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9DR0v9eYmb/OT9D/zxBRf9KTU//X19e/2hnZf9qaGX/aWdl/2ln + Zf9pZ2X/aWdl/2poZf9oZmT/XV1d/0hLTf88QUX/Oj9D/2lsb//Y2dr/8vHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/3t/f/2Roa/86P0P/PEFF3DxBRSk8QUUAPEJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0FFADpCQwE8QUWJPEFF/0JHS/+xs7T/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/5OTk/3J1eP86P0P/PUJG/1BSU/9mZWP/amdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/amhl/2VjYv9NT1H/PEFF/zpARP98gIL/6Ojo//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy/7Cys/9CRkr/PEFF/zxBRYc+QEkBPEFGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5RkgAPEJFADxBRSc8QUXeOj9D/25ydf/m5+f/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/y8vL/qKqr/z5DR/88QUX/TlBS/2dlZP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9mZGP/S05Q/ztARP9BRkr/sLKz//Ly8v/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx/+bm5v9tcXT/Oj9D/zxBRd08QUUmPEFFAD1ARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1SkwAPz5CADxBRXg8QUX/QUZK/7K0tf/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/m5+f/am5x/zk+Qv9ESEv/Y2Jh/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qZ2X/YWFg/0JGSf85PkL/b3J1/+jo6P/x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v+xs7T/QUZK/zxBRf88QUV1PEFGADs/QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAA8QUUAPEFGFDxBRcg6P0P/ZGhr/+Li4//x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/U1NX/TlJW/zo/RP9RU1T/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1BSU/86P0P/T1NX/9XW1v/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/h4uL/YmZq/zo/Q/88QUXGPEJFEjxBRQA9PUkAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA7OQA8QUUAPEFFSjxBRfU8QUX/nJ6g//Ly8v/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/Oz9D/Sk9S/ztARP9UVVb/amhm/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amhm/1RVVv87QET/Sk9S/87P0P/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/y8fH/mpye/ztARP88QUX0PEFFSDxBRQA5L1QAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBRAAfAAAAPEFFjztARP9MUVT/zs7P//Ly8v/w8PD/8fHw//Hx + 8P/v7/D/7/Dw//Hx8P/x8fD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/f4OD/XWFk/zk/Q/9FSUv/YWFg/2poZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qaGX/YWFg/0VIS/85P0P/XWFk/9/g4P/x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8P/x8fD/7/Dw/+/v + 8P/x8fD/8fHw//Dw8P/y8vL/zM7O/0tQVP87QET/PEFFjStPRAA+QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBRQA7QUUTPEFFyzo/Q/9vc3b/6enp//Hx8P/w8PD/4eTy/8bO + 9/+2wvn/t8L5/8jQ9v/k5vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/nZ+h/z1CRv87QET/RUhL/1lZWf9lZGL/aWdl/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2pnZf9qaGX/aWdl/2ZkY/9ZWVr/REhL/ztARP8+Q0f/nqCi//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+Tm8v/I0Pb/t8L5/7bC + +f/Gzvf/4eTy//Dw8P/x8fD/6Onp/25xdP86P0P/PEFFyT1BRhI9QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQEBAADxBRQA8QUU5PEFF7ztARP+bnZ//8vLy/+/w8P/P1vX/obD9/5Sm + //+Spf//kqX//5Sm//+ks/z/1dr1//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/5eXm/4SHif8+Q0f/Oj9D/z1CRv9GSUz/UVNU/1pbW/9gYF//Y2Jh/2Rj + Yv9kY2L/Y2Jh/2BgX/9aW1v/UVNU/0ZJTP89Qkb/Oj9D/z5DR/+Fh4r/5ebm//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/1Nr1/6Sz/P+Upv//kqX//5Kl + //+Upv//obD9/8/W9f/w8PD/8vLy/5mcnv87QET/PEFF7jxBRTg8QUUAN0lJAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMUVXADxBRQA8QUVpO0BE/kRJTf/BwsP/8/Py/9fc9P+crP7/k6X//5Sm + //+Upv//lKb//5Sm//+Tpf//oLD9/93h8//x8fD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+bm5/+eoKL/VFlc/zxBRf85PkL/O0BE/z1CRv8/REf/QkZJ/0NH + Sv9DR0r/QkZJ/z9ER/89Qkb/O0BE/zk+Qv87QET/VFhc/56gov/m5+f/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8P/d4fP/oLD9/5Ol//+Upv//lKb//5Sm + //+Upv//k6X//5yt/v/Y3PT/8/Py/8DCw/9ESEz/O0FF/jxBRWg8QUUATC0+AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFAD5CRQE8QUWYOj9E/1ZaXv/b29z/7u/y/7K++v+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//7nE+f/v7/D/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/w8PD/1dXW/5yfoP9obG//TFBU/z5DR/87QET/OT9D/zk+ + Qv85PkL/OT9D/ztARP8+Q0f/TFBU/2hsb/+anJ7/09TV//Dw8P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v8P+5xPn/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+yvvr/7u/y/9rb2/9VWl3/OkBE/zxBRZY+RUkBPEJGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRQw8QUW9OT5C/21xdP/r6+r/5Ofy/5+v/f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6Wz/P/p6vH/8PDw//Dw8P/w8PD/8PDw//Ly8v/x8fH/6Ojo/+Hh + 4f/g4OH/5eXm/+7u7v/y8vL/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//Hx8f/n5+f/z9DQ/7W3uP+doKH/j5GU/4eK + jP+Hioz/j5GU/52gof+2t7j/z9DQ/+fn5//x8fH/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//Ly8v/u7u7/5eXm/+Dg + 4f/h4eH/6Ojo//Hx8f/y8vL/8PDw//Dw8P/w8PD/8PDw/+jq8f+ls/z/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+fr/3/5Ofy/+rq6v9scHP/OT5C/zxBRbw8QUULPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFGADxBRho8QUXZOj9D/4aJi//x8fD/4OPz/5ys/v+Tpv//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6Gw/f/l5/L/8fHw//Dw8P/x8fH/7e3t/8bHyP+PkpT/bHBz/1xg + ZP9bX2L/Zmpt/36ChP+mqKr/0dLT/+zs7P/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8vLy//Pz8//y8vL/8vLy//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8vLy//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/s7Oz/0dLT/6aoqf9+gYT/Zmpt/1tf + Yv9cYGT/bHBz/4+SlP/Gx8j/7Ozt//Hx8f/w8PD/8fHw/+Xn8v+hsP3/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Om//+crP7/4OPz//Hx8P+FiIr/Oj9D/zxBRdk8QUUaPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRS88QUXoO0BE/52fof/z8vL/5ujy/6Kx/f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6i2/P/q6/H/8PDw//Ly8f/e3t//i46Q/0lOUv86P0P/OT5C/zk/ + Q/85P0P/OT5C/zk+Qv89Qkb/T1NX/3p9gP+3ubr/5eXl//Ly8v/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/y8vL/5eXl/7e5uv97foH/T1NX/z1BRf85PkL/OT5C/zk/ + Q/85P0P/OT5C/zo/Q/9JTlH/iYyP/97e3//y8vH/8PDw/+rr8f+ntvz/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+isf3/5ujy//Py8v+cnqD/O0BE/zxBRec8QUUuPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRUE8QUXzPEFF/66wsf/z8/P/7+/w/7nE+f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//lKb//8HK+P/w8PD/8fHx/9vb3P9xdHf/O0BE/ztARP8/REf/R0tN/01P + Uf9OUFL/Sk1P/0NHSv89Qkb/Oj9E/zk+Q/9DR0v/am1w/6+wsv/k5eX/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/+Tl5f+usLL/am1w/0JHS/85PkP/Oj9E/z1CRv9DR0r/Sk1P/05Q + Uv9NUFH/R0tN/z9DR/87QET/O0BE/3F1eP/b3Nz/8fHx//Dw8P/Byvj/k6b//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+6xPn/7+/w//Pz8/+tr7H/PEFF/zxBRfI8QUVAPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRU08QUX6QUZJ/7m6vP/z8/P/8fHw/+Dj8/+ks/z/k6X//5Sm + //+Upv//lKb//5Sm//+Tpf//qbf8/+Xn8v/x8fH/6Ojo/36Bg/87QET/PEFF/0lMTv9dXV3/Z2Vj/2ln + Zf9pZ2X/aGZk/2RjYf9bW1v/TU9R/0FFSf87QET/OT5C/0BFSf9tcXP/vL2+/+zt7f/y8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Lx8f/s7O3/u72+/21wc/9ARUn/OT5C/ztARP9BRUj/TU9R/1tbW/9kY2H/aGZk/2ln + Zf9pZ2X/Z2Vj/11dXf9ITE7/PEFF/ztARP9+goT/6Ojp//Hx8P/k5/L/qbf8/5Ol//+Upv//lKb//5Sm + //+Upv//k6X//6Sz/f/g4/P/8fHw//Pz8/+4urv/QEVJ/zxBRfo8QUVNPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVc7QET+RUlN/8DCw//z8/L/8PDw//Hw8P/c4PP/rrv7/5ip + /v+Upv//lKb//5mq/v+yvvr/4OPz//Hx8P/y8vL/rK6w/0FFSf87QET/Sk1P/2VjYv9qaGX/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/aGZl/2FgX/9SU1T/QkZJ/ztARf85PkP/R0tP/4mLjv/a2tv/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy/9ra2/+Ii47/RktP/zk+Q/87QEX/QkZJ/1JUVf9hYF//aGZl/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2poZf9lY2L/Sk1P/ztARP9BRkr/ra+w//Ly8v/x8fD/4OPz/7K++v+Zqv7/lKb//5Sm + //+Yqf7/rrv7/9zg8//w8PD/8PDw//Pz8//AwcL/RElN/ztARP48QUVWPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRV07QET/R0tP/8XHyP/y8vL/8PDw//Dw8P/x8fD/6uvx/9fc + 9P/J0fb/ytL2/9nd9P/s7PH/8fHw//Hx8f/i4uP/ZWls/zk+Q/9DR0r/YmFg/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/YmFg/1FTVP9ARUj/O0BE/ztARP9jZ2r/wcLD//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/wMLD/2Jmaf87QET/O0BE/0BFSP9RU1T/YmFg/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/YWFg/0NHSv85PkL/Zmpt/+Lj4//x8fH/8fHw/+zs8f/Z3fT/ytH2/8nR + 9v/X3PT/6uvx//Hx8P/w8PD/8PDw//Ly8v/Fxsf/RktP/ztARP88QUVcPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVw7QET/R0tP/8jJyv/z8/P/8PDw//Dw8P/w8PD/8PDw//Hx + 8P/x8fD/8fHw//Hx8P/w8PD/8PDw//Py8v+5urv/QkdK/zxBRf9UVVb/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9fXl7/SUxO/zxBRf86P0P/TlNW/6yu + sP/u7u7/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+7u + 7v+srrD/TlNW/zo/Q/88QUX/SUxO/15eXv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1NVVf87QET/QkdL/7m7vP/z8vL/8PDw//Dw8P/x8fD/8fHw//Hx + 8P/x8fD/8PDw//Dw8P/w8PD/8PDw//Pz8//Hycr/RktP/ztARP88QUVbPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVY7QET+RUlN/8fIyf/09PT/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+KjY//OT9D/0FFSP9hYF//aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qZ2X/ZmRj/1JUVf8/Q0f/Oj9D/0ZL + T/+jpaf/7u7u//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fD/7e7u/6Kk + pv9GS0//Oj9D/z9DR/9TVFX/ZmRj/2pnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2FgX/9ARUj/OT9D/4qNj//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//T09P/GyMn/RElN/ztARP48QUVVPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRUw8QUX6QEVJ/8HCw//39vb/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+bm5/9na27/OT5C/0lLTv9nZWT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9ZWVr/QUVJ/zo/ + Q/9GSk7/p6mr/+/v7//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/p6mr/0ZK + Tv86P0P/QUVJ/1laWv9oZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dlZP9IS07/OT5C/2hrbv/m5+f/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//f39v/AwsP/QEVJ/zxBRfk8QUVLPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRT88QUXxPEFF/7W3uf/6+vr/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vHx/9jZ2f9TV1v/Oj9D/1BSVP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/XFtb/0FF + Sf86P0P/S1BU/7u9vv/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Lx8f+8vb7/TFBU/zo/ + Q/9BRUn/W1tc/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9QUlP/Oj9D/1NXW//Y2dr/8vHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//r6+v+1t7j/PEFF/zxBRfE8QUU+PEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRSw8QUXmOj9D/6Kkpv/8/Pz/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8zNzv9HTE//O0BE/1ZXV/9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1pa + Wv8/REf/Oj9D/15iZf/X2Nn/8vLx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLx/9fY2P9eYWX/Oj9D/z9E + R/9aWlv/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9WV1f/O0BE/0dMUP/Mzs7/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//z8/P+hpKb/Oj9D/zxBReY8QUUsPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRBg8QUXXOT5C/4mMjv/9/f3/8/Pz//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8LDxP9ESEz/PEFF/1lZWv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9UVVb/PUJF/ztARP+Ii43/7e3t//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7e3t/4eKjf87QET/PUJG/1RV + Vv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9ZWVn/PEFF/0RITP/CxMX/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8/Pz//39/f+JjI7/OT5C/zxBRdc8QUUYPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxCRQs8QUW5OT5C/29ydf/39/f/9/f3//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/7/Awf9DSEv/PEFF/1paWv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2lnZf9pZ2X/aWdl/2ln + Zf9mZWP/Sk1P/zpARP9JTlL/xcbH//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/xMXG/0lOUf86QET/Sk1P/2Zl + Y/9pZ2X/aWdl/2lnZf9pZ2X/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9aWlr/PEFF/0NIS/+/wMH/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/9/f3//f39/9vcnX/OT5C/zxBRbk8QUUKPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAO0FEADZFOAA8QUWVOj9D/1ldYf/o6en//Pz8//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8XGx/9ESU3/PEFF/1hZWf9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ZlY/9hYF//YF9e/2NiYf9oZmT/aWdl/2ln + Zf9qaGX/Xl1d/z9ER/86P0P/gIOF/+3t7f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/t7e3/f4OF/zo/Q/8/REf/Xl1d/2po + Zf9pZ2X/aWdl/2hmZP9jYmH/YF9e/2FgX/9mZWP/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9YWFn/PEFF/0RJTf/Fx8j/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH//f38/+jp6f9YXWD/Oj9D/zxBRZVCLzwAPEBEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATE9YADxBRQA8QUVuO0BE/0dLT//S09T///////T09P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9DR0v9KTlL/O0BE/1RVVv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9nZWP/V1dY/0ZKTP9ARUj/P0RH/0JGSf9NT1H/YF9f/2ln + Zf9pZ2X/aGZk/0xPUf86P0P/TlNW/9DR0v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/S09P/T1RY/zo/Q/9MT1H/aGZk/2ln + Zf9pZ2X/YF9f/01PUf9CRkn/P0RH/0BFSP9GSkz/V1dY/2dlY/9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9UVVb/O0BE/0pPU//R0tL/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/09PT//////9HS0/9GS0//O0BE/zxBRW08QUUAR1JRAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAACwwMADxBRQA8QUVCPEFF9D1CRv+wsrP///////j4+P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/9zc3f9YXF//Oj9D/09RUv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ZlY/9OUFL/PUJG/ztARf88QUX/PEFF/zxBRf87QEX/QkZJ/1xc + XP9pZ2X/amhl/1tbW/89Qkb/PEFF/6Olp//y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v+kpqj/PUJG/z1CRv9bW1v/amhl/2ln + Zf9cXFz/QkZJ/ztARf88QUX/PEFF/zxBRf87QEX/PUJG/05QUv9mZWP/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9PUVL/Oj9D/1hcYP/c3d3/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/4+Pj//////6+xs/89Qkb/PEFF9DxBRUE8QUUACwsMAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUgPEFF2zk+Qv+LjpD//v7+//39/f/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+np6f9rb3L/OT5C/0hLTf9nZWT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1RWVv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/O0BF/0RI + S/9jYmH/amhl/2VjYv9ER0r/OT5C/3p9gP/s7e3/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+zs7f95fX//OT5C/0RIS/9lY2L/amhl/2Ni + Yf9ESEv/O0BF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf9UVlb/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dlZP9IS03/OT5C/2xwc//p6en/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/9/f3//v7+/4uOkP85PkL/PEFF2jxBRR88QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRQA9QkUIPEFFtDo/Q/9laWz/8vLy///////39/f/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+JjI7/OT5D/0FGSf9jYmD/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZGNi/0RHSv87QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxB + Rf9VVlf/aWdl/2hmZf9MTlD/OT9D/11hZf/i4uP/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+Hi4v9dYWT/OT9D/0xOUP9oZ2X/aWdl/1RW + Vv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztBRf9ER0v/ZGNi/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2JiYP9BRkn/OT5D/4qNj//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//f39///////8fLy/2VpbP86P0P/PEFFsztCRQc7QkUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRwA9P0MAPEFFfTtARP9KT1P/1tfY///////8/Pz/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Pz8/+usLL/PkNH/z1CRv9aW1v/amhl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/XV1d/z5DRv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + RP9LTU//aGZk/2lnZf9TVFX/Oj9E/09UV//T09T/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9LT0/9PU1f/Oj9E/1NUVf9qZ2X/aGZk/0tN + T/87QET/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf8+Q0b/XV1d/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/amhl/1paW/89Qkb/PkNH/6+xs//z8/P/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy//z8/P//////1tfY/0pPUv87QET/PEFFfD5BRgA7QUQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEpMgA8QUUAPEFFRzxBRfU8QUX/ra+x////////////9vb2//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/S09T/T1RX/zo/Q/9PUVL/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/Wltb/z1CRv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + Rf9IS07/Z2Vk/2poZv9XWFj/O0BE/0dMUP/Iycr/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8fIyf9HS0//O0BE/1dYWP9qaGb/Z2Vj/0hL + Tf87QEX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf89Qkb/Wltb/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/05RUv86P0P/UFRY/9PU1P/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/9vb2////////////rK+w/zxBRf88QUX0PEFERjxBRQBDSlUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACtVVQA8QUUAPEFFGjxBRdQ5PkL/fICC//r6+////////Pz8//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/q6ur/c3d6/zk+Qv9DR0r/ZGNh/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/Xl5d/z5DR/88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + RP9MTlD/aGZk/2poZv9ZWVn/PEFF/0NITP/CxMX/8/Pz//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8/Pz/8LDxP9DSEz/PEFF/1lZWv9qaGb/aGZk/0tO + UP87QET/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf8+Q0f/Xl5d/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZGJh/0NHSv85PkL/dXh7/+rr6//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL//Pz8///////6+vr/fH+C/zk+Qv88QUXUPEFFGjxBRQAzMzMAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkUAP0NGAjxBRZw6QET/VFlc/+Pk5P////////////f3 + 9//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/qaus/z5DR/89QUX/WFlZ/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZWRi/0VJTP87QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxB + Rf9XV1j/amdl/2poZv9ZWVn/PEFF/0RJTf/DxMX/8/Pz//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8/Pz/8LExf9DSEz/PEFF/1lZWf9qaGb/amdl/1ZX + WP88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztBRf9FSUz/ZWRi/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/WFhZ/z1BRf8+Q0f/qqyu//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/39/f////////////j4+T/VFhc/zpARP88QUWcPkJFAj1CRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkYAPEFFADxBRVk8QUX7PkNH/7W3uP////////////39 + /f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/2dra/1hcX/86P0P/SEtN/2ZlY/9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1dYWf89Qkb/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/O0BF/0dK + Tf9lY2L/aWdl/2poZv9XV1j/O0BE/0hNUP/Jysv/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8jKyv9ITVD/O0BE/1dXWP9qaGb/aWdl/2Vj + Yv9HSk3/O0BF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/z1CRv9YWFj/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9mZWP/SEtN/zo/Q/9ZXWD/2tvb//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/9/f3///////////+0trj/PkNH/zxBRfo8QUVZPEFFADxCRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAPEFFADxBRSA8QUXZOT5C/32Ag//6+/v///////// + ///5+fn/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/5OVl/87QET/PUJG/1laWv9qZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dmZP9SVFX/PkNH/ztARf88QUX/PEFF/ztARf88QUX/RklM/2Bf + Xv9pZ2X/aWdl/2lnZf9SVFX/Oj9D/1BVWP/U1dX/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9TU1f9QVFj/Oj9D/1JUVf9pZ2X/aWdl/2ln + Zf9fX17/RUlM/zxBRf87QEX/PEFF/zxBRf87QEX/PkNH/1JUVf9oZmT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2pnZf9ZWlr/PUJG/ztARP+Ulpj/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//n5 + +f////////////r6+v98f4L/OT5C/zxBRdk8QUUfPEFFAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JGADtERgM8QUWbO0BE/1BUWP/c3d7///////// + ///+/v7/9PT0//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9PU1P9UWFz/Oj9D/0ZKTP9lY2L/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9oZmT/W1tb/0tOUP9ER0r/QkZK/0ZKTP9SVFX/Y2Jh/2ln + Zf9pZ2X/aWdl/2hnZf9MTlD/OT9D/11hZf/i4+P/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+Lj4/9dYWT/OT9D/0xOUP9pZ2X/aWdl/2ln + Zf9pZ2X/Y2Jh/1JUVf9GSkz/QkZK/0RHSv9LTlD/W1tb/2hmZP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2VkYv9GSkz/Oj9D/1VZXP/T1NX/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/9PT0//7+ + /v///////////9vc3f9PVFf/O0BE/zxBRZk8Q0gCPEJGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITo9ADxBRQA8QUVNPEFF9jxBRf+jpaf///////// + ////////+/v7//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+Zm53/PEFF/zxBRf9TVFX/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2hmZP9kY2L/Y2Jh/2ZlY/9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2RjYf9DR0r/OT5C/3h8f//s7Oz/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+zs7P94e37/OT5C/0RHSv9kY2L/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9mZWP/Y2Jh/2RjYv9oZmT/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/1JUVf88QUX/PEFF/5mcnv/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/+/v7//// + /////////////6Kkpv88QUX/PEFF9TxBRUw8QUQASysyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASUtNAD1BRQA9QUUTPEFFxjo/Q/9mam3/7/Dw//// + //////////////f39//w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/e39//ZWls/zo/Q/9AREj/XFxc/2pn + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/1ZXWP88QUX/PkNH/6epq//y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v+nqav/PUJG/zxBRf9WV1j/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9qZ2X/XFxc/0BER/86P0P/Zmpt/97f3//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/39/f///////// + ////////7+/v/2VpbP86P0P/PEFFxjxBRBI8QUQAJVtdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9BQgA7QUUAPEFFdjxBRf9BRkr/vL6///// + //////////////7+/v/09PT/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/vL6//0pOUv86P0T/REhL/2Fg + X/9qZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9qZ2X/YmFg/0NHSv86P0P/XGBk/9vc3P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/b29z/XGBj/zo/Q/9DR0r/YmFg/2pn + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2pn + Zf9gYF//REhL/zo/Q/9KT1P/vb/A//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//T09P/+/v7///////// + ////////vL2//0FGSv88QUX/PEFFdTxCRgA3NTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtCQQA8QUUAPEFFJzxBRd45PkL/d3p9//f3 + 9//////////////////8/Pz/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/5yeoP9ARUn/O0BE/0dK + TP9hYWD/amhl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9lZGL/Sk1P/ztARP9ARUn/p6qr//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/p6mr/0BFSf87QET/Sk1P/2Vk + Yv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amhl/2Fh + YP9GSkz/O0BE/0BFSf+dn6H/7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//z8/P////////////// + ///39/f/dnp8/zk+Qv88QUXdPEFFJjxBRQA4OT4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBASAA9QEUAPz9GATxBRZA7QET/RktP/8fJ + yv//////////////////////+fn5//Hx8f/w8PD/8PDw//Dw8P/w8PD/8fHx/+np6f+Ii47/PUJG/ztA + RP9FSUz/Xl5d/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2Rj + Yv9MT1D/PEFF/ztARP9+gYT/5+jo//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5+jo/36Bg/87QET/PEFF/0xO + UP9kY2L/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/Xl5d/0ZJ + TP87QET/PUJG/4mMjv/p6en/8fHx//Dw8P/w8PD/8PDw//Dw8P/x8fH/+fn5//////////////////// + ///HyMn/RktP/ztARP88QUWPPkBCAT1BRAA8REQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUYAPEFFADxBRTQ8QUXnOj9D/3x/ + gv/4+Pn///////////////////////f39//w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/k5OX/hYiK/z5D + R/87QET/QUVJ/1ZWV/9mZGP/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9pZ2X/Xl5d/0hL + Tf88QUX/Oj9D/21xdP/b3Nz/8vHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vHx/9vb3P9tcHP/Oj9D/zxB + Rf9IS03/Xl5d/2lnZf9qaGX/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2ZkY/9VVlf/QUVJ/ztA + RP8+Q0f/hYiL/+Tl5f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/39/f///////////////////////j4 + +f97f4L/Oj9D/zxBRec8QUUzPEFFADxBRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAPUFEAD5ARAM8QUWXO0BE/0ZL + T//Gx8n///////////////////////7+/v/19fX/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5ubn/5KV + l/9FSk3/Oj9D/z1BRf9HSk3/V1hY/2NiYf9nZmT/aWdl/2lnZf9oZ2X/ZmRj/15eXf9PUVL/QERI/ztA + RP88QUX/cnZ4/9fY2f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/X2Nj/cnV4/zxB + Rf87QET/QERI/09RU/9eXl3/ZmRj/2lnZf9pZ2X/aWdl/2dmZP9jYmH/V1hY/0dKTf89QkX/Oj9D/0VK + Tv+TlZf/5ufn//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//X19f/+/v7//////////////////////8bH + yP9GS0//O0BE/zxBRZY9QUYDPUFFAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0FGADxBRQA8QUU0PEFF5To/ + Q/91eHv/9PX1///////////////////////9/f3/9PT0//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+zt + 7f+xs7T/XWFk/ztBRf86P0P/PEFF/0JGSf9JTE7/TlBS/09RUv9MTlD/RklM/z9DR/87QET/OT5D/0dM + UP+NkJL/4ODg//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/4ODg/42P + kv9HTFD/OT5D/ztARP8/Q0f/RklM/0xOUP9PUVL/TlBS/0lMTv9CRkn/PEFF/zo/Q/88QUX/XWFl/7Kz + tf/t7e3/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/9PT0//39/f//////////////////////9PT1/3R4 + e/86P0P/PEFF5D1BRTQ8QUUAP0VBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRQA8QUUhPEFF1TtB + Rf9CRkr/t7m7/////////////////////////////Pz8//Pz8//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL/2dra/5aYmv9ZXWD/PkNH/zk+Qv85PkL/OT5D/zk/Q/85PkL/OT5C/zo/Q/9HTFD/dHd6/76/ + wP/t7e3/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+3t + 7f+9v8D/dHd6/0dMT/86P0P/OT5C/zk+Qv85P0P/OT5D/zk+Qv85PkL/PkNH/1ldYf+WmJv/2dra//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/z8/P//Pz8////////////////////////////t7i6/0JG + Sv88QUX/PEFF0zxBRR88QUUAPUFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQkUAPEFFADtBRQc8QUWWPEFF/zxB + Rf86P0P/YmZp/+jp6f////////////////////////////z8/P/z8/P/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx//Dw8P/a2tv/r7Cy/4KFh/9obG//XGBj/1ldYf9hZWj/dHd6/5eZm//Fxsf/6enp//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL/6Onp/8XGx/+XmZv/dHd6/2FlaP9ZXWH/XGBj/2hsb/+ChYf/r7Gy/9rb2//w8PD/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/8/Pz////////////////////////////o6en/YmZp/zo/ + Q/88QUX/PEFF/jxBRZI+QUQGPUFEAD5AQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRUYAO0FFADxBRVU8QUX0PEFF/0FF + SP89Qkb/PEFF/5mbnf/9/f3////////////////////////////8/Pz/8/Pz//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8vLy/+/v7//m5uf/3+Dg/97e3//i4uP/6+zs//Ly8v/y8vL/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx//Ly8v/y8vL/6+zs/+Li4//e3t//3+Dg/+bm5//v7+//8vLy//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8/Pz//v7+/////////////////////////////39/f+Ym53/PEFF/z1C + Rf9BRUj/PEFF/zxBRfI8QUVSPEFFAEY8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5BRgA8QUUAPEFFGTxBRcg8QUX/QUZJ/1xc + XP9IS03/Oj9E/0xQVP/Mzc7//////////////////////////////////Pz8//Pz8//w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/z8/P//Pz8/////////////////////////////////8vMzf9LUFP/Oj9E/0hL + Tf9bW1v/QUVJ/zxBRf88QUXGPUBFGDxBRQA9QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRgA8QUYAPEFFcTxBRf08QUX/VFVW/2po + Zf9dXVz/P0RH/zk/Q/9ucXT/7e3u//////////////////////////////////z8/P/09PT/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//T09P/8/Pz/////////////////////////////////7e3t/21xdP85P0P/P0RI/11d + XP9qZ2X/U1VW/zxBRf88QUX9PEFFcDtCRgA+QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPUBFADxBRQA8QUUfPEFF0zxBRf9FSUv/ZWNi/2ln + Zf9pZ2X/UVNU/zxBRf88QUX/lpmb//z8/P/////////////////////////////////9/f3/9fX1//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/9fX1//39/f/////////////////////////////////8/Pz/lpmb/zxBRf88QUX/UVNU/2ln + Zf9pZ2X/ZGNi/0VJS/88QUX/PEFF0jxBRR48QUUAPkFGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkBGADtCRQA8QUVtPEFF/j1CRv9XWFj/aWdl/2ln + Zf9pZ2X/ZWNi/0dLTf87QET/R0xQ/72/wP///////////////////////////////////////v7+//f3 + 9//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx + 8f/39/f//v7+//////////////////////////////////////++v8D/R0xQ/ztARP9HSk3/ZWNi/2ln + Zf9pZ2X/aWdl/1dXWP89QkX/PEFF/TxBRW06QUQAP0FHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBFADxARRE8QUXBPEFF/0RIS/9lY2L/aWdl/2ln + Zf9pZ2X/aWdl/1FSVP88QUX/Oj9D/1ldYf/Z2tv///////////////////////////////////////// + ///6+vr/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//r6 + +v///////////////////////////////////////////9na2v9ZXmH/Oj9D/ztBRf9OUFL/aWdl/2ln + Zf9pZ2X/aWdl/2VjYv9FSEv/PEFF/zxBRcE8QEURPEBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkQAPEFFADxBRUU8QUX0PEFF/1NUVf9pZ2X/aWdl/2ln + Zf9pZ2X/Y2Jh/0NHSv87QEX/O0BE/zo/Q/9xdXf/6+zs//////////////////////////////////// + /////////Pz8//X19f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/19fX//Pz8//// + ////////////////////////////////////////6+zs/3B0d/86P0P/O0BE/ztBRf9BRUj/YGBf/2ln + Zf9pZ2X/aWdl/2lnZf9TVFX/PEFF/zxBRfQ8QUVGPEFFADtARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Q0QAOkBFADxBRYc8QUX/QERH/2BfXv9qZ2X/aWdl/2ln + Zf9pZ2X/VldX/zxBRf9BRkr/Wl5h/z5DR/87QUT/hYmL//X19f////////////////////////////// + //////////////7+/v/5+fn/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//n5+f/+/v7///////// + ///////////////////////////////////09fX/homL/zxBRf89Qkb/YWVp/0VKTf87QET/UlNV/2ln + Zf9pZ2X/aWdl/2pnZf9gX1//QERI/zxBRf88QUWJPURCADs/RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEFFEDxBRcQ7QEX/SEtN/2dlY/9pZ2X/aWdl/2ln + Zf9nZWP/SEtN/zo/Q/9cYGT/wMHC/21xc/86P0P/P0RI/5eanP/5+fn///////////////////////// + /////////////////////////Pz8//b29v/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/29vb//Pz8//////////////////// + //////////////////////////////n5+f+Xmpz/P0NH/zo/Q/9tcXT/x8jI/2drbv85P0P/RUhL/2Vk + Yv9pZ2X/aWdl/2lnZf9nZWT/SEtO/ztARf88QUXGPEFFETxBRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFGRgA8QUUAPEFFLjxBRek8QUX/UlRV/2lnZf9pZ2X/aWdl/2pn + Zf9gX17/QERH/zo/Q/+JjI7/4uLi/8fHyP9eYmX/OT5C/0FGSv+ipaf//Pz8//////////////////// + ///////////////////////////////////7+/v/9fX1//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/9PT0//v7+/////////////////////////////// + /////////////////////////Pz8/6Olp/9CR0r/OT5C/15iZf/Hx8j/5OPj/5eZm/88QUX/PkNG/11d + XP9qaGX/aWdl/2lnZf9pZ2X/U1RV/zxBRf88QUXqPEFFMDxBRQA7PkIAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVJRwA8QUUAPEFFVzxBRfo9Qkb/W1tb/2poZf9pZ2X/aWdl/2po + Zf9XWFj/PEFF/0NHS/+ztLX/4uLi/+Li4v+8vb7/Vlte/zk+Qv9FSU3/p6mr//v7+/////////////// + /////////////////////////////////////////v7+//r6+v/19fX/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//T09P/6+vr//v7+//////////////////////////////////// + ///////////////////7+/z/p6qr/0VKTf85PkL/Vlpd/7y9vv/i4uL/4uLi/72+v/9ITVD/O0BE/1RV + Vv9pZ2X/aWdl/2lnZf9qaGX/W1xb/z1CRv88QUX7PEFFWjxBRQA6PUEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1CRAA7QEYAPEFFfTxBRf9ARUj/YWBf/2lnZf9pZ2X/aWdl/2ln + Zf9PUVL/Oj9D/1NXW//Mzc3/4eHh/+Dg4P/i4eH/tba4/1JWWf85PkL/RElN/6Wnqf/6+vr///////// + ///////////////////////////////////////////////////+/v7/+/v7//b29v/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/29vb/+/v7//7+/v////////////////////////////////////////////// + //////////////v7+/+lqKr/RElN/zk+Qv9RVln/tba3/+Hh4f/g4OD/4eHh/9PT1P9bX2L/Oj9D/0xO + UP9oZmX/aWdl/2lnZf9pZ2X/YmFg/0FFSP88QUX/PEFFgTxBRgA8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA9QkUBPEFFmjxBRf9DR0r/ZWRi/2lnZf9pZ2X/aWdl/2hm + ZP9JTE7/OT5C/2VpbP/Z2dr/4ODg/+Dg4P/g4OD/4eHh/7K0tf9SVln/OT5C/0NITP+cnqD/9/f3//// + ///////////////////////////////////////////////////////////////////9/f3/+Pj4//T0 + 9P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx + 8f/09PT/+Pj4//z8/P////////////////////////////////////////////////////////////// + ////////9/f3/52fof9DSEz/OT5C/1FVWf+xs7T/4eHh/+Dg4P/g4OD/4ODg/9zc3P9vc3b/OT5C/0ZK + TP9nZWT/aWdl/2lnZf9pZ2X/ZWRj/0RIS/88QUX/PEFFnz1ARgI8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUFPEFFsztBRf9HSk3/Z2Vk/2lnZf9pZ2X/aWdl/2Zl + Y/9GSUz/OT5C/3V4e//d3d3/4ODg/+Dg4P/g4OD/4ODg/+Hh4f+ztLX/VFhb/zk+Qv9ARUn/jpGT/+/v + 7/////////////////////////////////////////////////////////////////////////////7+ + /v/8/Pz/+Pj4//X19f/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/19fX/+Pj4//z8 + /P/+/v7///////////////////////////////////////////////////////////////////////// + ///v7/D/jZCT/0BFSf85PkL/VFhb/7O0tf/h4eH/4ODg/+Dg4P/g4OD/4ODg/9/f3/9/goT/OT5C/0RI + Sv9lY2L/aWdl/2lnZf9pZ2X/Z2Zk/0hLTf87QUX/PEFFuDpDRwY6REcAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADlFRwA6Q0cIPEFFvztARf9KTU//aGZk/2lnZf9pZ2X/aWdl/2Vk + Yv9ESEv/OT5C/3t+gP/e3t7/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/h4eH/ubq8/1peYf86P0P/PEFF/3h8 + fv/h4uP///////////////////////////////////////////////////////////////////////// + ///////////////////9/f3/+/v7//j4+P/29vb/9PT0//Ly8v/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/9PT0//b29v/4+Pj/+/v7//39/f////////////// + /////////////////////////////////////////////////////////////////////////////+Hi + 4v95fH//PEFF/zo/Q/9aXmH/ubq7/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P+ChYf/OT5C/0NH + Sv9kY2H/aWdl/2lnZf9pZ2X/aGZk/0tNUP87QEX/PEFFxDtCRQs7Q0UAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpCRAA7QkQLPEFFxDtARf9LTlD/aGZk/2lnZf9pZ2X/aWdl/2Zk + Y/9FSEv/OT5D/3R3ef/b29v/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4uHh/8LDw/9nam3/O0BE/zo/ + Q/9hZWn/x8nK//7+/v////////////////////////////////////////////////////////////// + /////////////////////////////////////////v7+//7+/v/8/Pz/+/v7//r6+v/6+vr/+fn5//n5 + +f/5+fn/+fn5//r6+v/6+vr/+/v7//z8/P/+/v7//v7+//////////////////////////////////// + ///////////////////////////////////////////////////////////////////+/v7/yMnK/2Jl + af86P0P/O0BE/2Zqbf/CwsP/4uLh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9ra2v96fH7/OT9D/0NH + Sv9kY2H/aWdl/2lnZf9pZ2X/aGZk/0xOUP87QEX/PEFFyDxBRhA7QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpCRgA7QkYLPEFFwztARf9LTU//aGZk/2lnZf9pZ2X/aWdl/2dl + ZP9GSkz/Oj9D/2dqbP/Pzs7/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Li4v/Nzs7/eHt+/z9E + R/85PkL/TVFV/6Olp//y8vP///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////Lz8/+jpaf/TFFU/zk+ + Qv8/Q0f/eHt+/83Ozv/i4uL/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/83My/9tb3L/Oj9D/0VI + S/9mZGP/aWdl/2lnZf9pZ2X/aGZk/0xOUP87QEX/PEFFyTxBRhA8QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRgA7QkYGPEFFuTtARf9JTE//aGZk/2lnZf9pZ2X/aWdl/2hm + ZP9KTU//Oj9D/1hcX/+9u7v/2tra/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/h4eH/2NjY/5KU + lv9ITFD/OT5C/z5DR/93en3/1NXW//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1NbW/3d7ff8+Q0f/OT5C/0hN + UP+SlZb/19jY/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/19fW/727u/9dYGP/Oj9D/0lM + Tv9oZmT/aWdl/2lnZf9pZ2X/aGZk/0tNT/87QEX/PEFFwTxARgk9QEYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUDPEFFqTtARf9IS07/aGZl/2lnZf9pZ2X/aWdl/2ln + Zf9RU1T/O0BE/0pOUf+qqan/ysnI/93d3P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4eHh/9/f + 3/+vsLL/XWFk/ztARP85PkL/UVVZ/6Gjpf/s7e3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+zt7f+hpKb/UVVZ/zk+Qv87QET/XWFk/66w + sf/f39//4eHh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/b29r/yMbF/62srP9MUVT/OkBE/09R + U/9pZ2X/aWdl/2lnZf9pZ2X/aGdl/0lMT/87QEX/PEFFszxBRAU8QUQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA6REkAPEFFiztARf9GSk3/amlo/2lnZf9pZ2X/aWdl/2po + Zf9aWlr/PUJG/z5DRv+QkJH/wsC//8vKyf/d3Nz/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/i4uL/y8zM/4CDhf9ESU3/OT5C/z1CRv9mam3/ury9//T19f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09fX/uru9/2drbv89Qkb/OT5C/0RJTf9/goX/y8vM/+Li + 4v/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9vb2//Ix8b/wsC+/5OUlP8/REf/PEFF/1lZ + Wf9qaGX/aWdl/2lnZf9pZ2X/a2lo/0dLTv87QET/PEFFljpAQwE8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRwA8QUUAPEFFaTxBRf9BRUn/bm1t/2xqZ/9pZ2X/aWdl/2ln + Zf9jYmH/QkZJ/zo/Q/9oa23/vLu6/8C+vf/Ix8b/2djY/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/g4OD/4eHh/9zc3P+sra//YGRn/z1CRv84PkL/QkdL/3J2eP/AwcP/9PT0//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9PX1/8HCw/9zd3n/QkdL/zg+Qv88QUX/YGRn/6utrv/c3Nz/4eHh/+Dg + 4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/2NjY/8fGxf/Avr3/vbu7/2tucP86P0P/QkZJ/2Jh + YP9pZ2X/aWdl/2lnZf9raWf/b25t/0JHSv88QUX/PEFFczxBRQA8QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpARgA8QUUAPEFFQDxBRfE8QUX/aGhp/3VzcP9pZ2X/aWdl/2ln + Zf9pZ2X/TlBS/ztARP9GSk7/oKCg/8LAv//Avr3/w8LB/9HQz//c3Nz/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/g4OD/4ODg/+Dg4P/i4uL/0NHR/5SWmP9SVln/O0BE/zk+Qv9DSEz/b3N2/7W3uP/r7Oz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+vs7P+3ubr/cXV4/0NITP85PkL/O0BE/1FWWf+SlZb/0NDR/+Li4v/g4OD/4ODg/+Dg + 4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9zc3P/R0M//w8LB/8C+vf/CwL//oqGh/0dLT/87QET/TU9R/2hm + Zf9pZ2X/aWdl/2lnZf9zcW//a2tr/z1CRv88QUX2PEFFSjxBRQAxNjoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEFFGTxBRdQ7QET/WFpc/4J/ff9samj/aWdl/2ln + Zf9qZ2X/Xl5d/z9ER/86P0T/aGtt/7q5uP/Bv77/wL69/8C+vf/GxMP/0M/P/9nY2P/d3d3/4N/f/+Dg + 4P/g4OD/4ODg/+Dg4P/e3t7/3Nvb/9TT0/+xsLD/eHp8/0tPUv86P0P/OD1B/z9ESP9fY2b/mJud/9PU + 1f/19fX///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////X1 + 9f/T1NX/mpye/2BkZ/8/REj/OD1B/zo/Q/9LT1P/eHp7/7CwsP/U09P/3Nvb/97e3v/g4OD/4ODg/+Dg + 4P/g4OD/4N/f/93d3f/Z2Nj/0M/O/8bEw//Avr3/wL69/8G/vv+6ubj/aWtu/zpARP8/Q0f/XV1d/2pn + Zf9pZ2X/aWdl/2tpZ/+Bfnz/W11f/ztARP88QUXcO0FFIDxBRQBVVVUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QkUAO0NFAzxBRaA7QET/RkpN/4B+ff97eHf/aWdl/2ln + Zf9pZ2X/aGZk/05QUv87QET/QEVI/4iJiv/Avr3/wL69/8C+vf/Avr3/wL69/8LAv//GxcT/ysnI/83M + y//Ozc3/zczM/8vKyf/HxsX/w8HA/8C+vv/Bv77/v728/6inp/96fH3/UVVY/z5DR/86P0P/O0BE/0lO + Uv9ucXX/oKOl/8zNzv/t7e7//Pz8//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////Pz8/+7u7//P0NH/oKOl/21x + dP9JTlL/O0BE/zo/Q/8+Q0b/UFRX/3p8ff+op6f/v728/8G/vv/Av77/w8HA/8fGxf/Lysn/zczM/87N + zf/NzMv/ysnI/8bFxP/CwL//wL69/8C+vf/Avr3/wL69/8C+vf+HiIn/QEVI/ztARP9NUFL/aGZk/2ln + Zf9pZ2X/aWdl/3l2dP+CgH//SU1Q/ztARP88QUWsO0BEBztARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEQAPEFFADxBRVg8QUX6PEFF/2pqa/+Kh4X/dHJw/2ln + Zf9pZ2X/aWdl/2JhYP9DR0r/O0BE/0dMT/+VlZb/wb++/8C+vf/Avr3/wL69/8C+vf/Avr3/v728/8C+ + vf/Avr3/wL69/7+9vP/Avr3/wL69/8C+vf/Avr3/wL69/8LAvv/CwL//mpqb/0pOUv87QET/PEFF/ztA + RP85PkL/Oj9D/0VKTv9fY2b/goWI/6epq//Iycr/39/g/+/v8P/5+fn//f39//////////////////// + /////////////////////////f39//n5+f/v7/D/39/g/8jJyv+nqav/goWI/2BkZ/9HTE//Oj9D/zk+ + Qv87QET/PEFF/ztARP9FSU3/kJGR/8G/vv/CwL//wL69/8C+vf/Avr3/wL69/8C+vf+/vbz/wL69/8C+ + vf/Avr3/v728/8C+vf/Avr3/wL69/8C+vf/Avr3/wL69/5KTk/9HS07/O0BE/0NHSv9iYWD/aWdl/2ln + Zf9pZ2X/cnBu/4qGhP9ubm//PUJG/zxBRf08QUVlPEFFAEFGSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRhk8QUXOO0BE/05RVP+Gg4L/iIWD/3Fv + bf9pZ2X/aWdl/2lnZf9bW1v/P0RH/zpARP9JTVH/j4+Q/768u//Bv77/wL69/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wL69/8C+vf/Avr3/wb++/7+9vP+bm5v/WFxf/zxBRf88QUX/SEtO/1FS + VP9KTVD/QUZJ/ztARP86P0P/OT5C/zxBRf9CR0r/UFRY/2BkZ/9xdHf/g4eJ/5GUlv+doKL/pKao/6iq + rP+oqqz/pKao/52gov+RlJb/g4aJ/3B0d/9gZGf/UFRY/0JHSv88QUX/OT5C/zo/Q/87QET/QUVJ/0pN + UP9RU1T/TE5Q/z1BRf88QUX/TlJV/42Ojv+7ubj/wsC//8C+vf/Avr3/wL69/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wL69/8G/vv+9u7r/i4yN/0hMUP86QET/QERI/1tbW/9pZ2X/aWdl/2ln + Zf9vbWv/hoOB/4iFhP9SVVf/O0BE/zxBRdk8QUUhPEFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JGAD5AQwA8QUV3PEFF/j1CRv9ra2v/jYqI/4aD + gf9xb23/aWdl/2lnZf9pZ2X/V1hY/z9DR/87QET/Q0hL/3Z4ev+ura3/wb++/8G/vv/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wb++/8LAv/+/vr3/qqqp/3d4ev9GSk7/OkBE/zxBRf9MTlD/ZWRj/3h1 + c/+DgX//enl4/2ZnaP9ESEv/PEFF/zxBRf88QUX9O0BE/zo/Q/85PkL/OT5C/zk/Q/86P0P/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/85P0P/OT5C/zk+Qv86P0P/O0BE/zxBRf48QUX/PEFF/0RJTP9mZ2j/eXh3/4OB + f/93dXP/aGZk/1FSVP8+Q0b/OkBE/0BFSf9pa27/oJ+g/7y6uv/CwL//wb++/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8G/vv/CwL//wL69/6qpqf9xc3X/QUZK/ztARP8/REf/WFlZ/2lnZf9pZ2X/aWdl/3Bt + a/+EgX//jYqI/3BwcP8/Q0f/PEFF/zxBRYY/UEsAPEJGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPT9EADxBRQA8QUYfPEFF0TtARP9JTE//f359/42K + iP+HhIL/c3Fv/2lnZf9pZ2X/aWdl/1hZWf9BRUn/O0BE/zxBRf9SVVn/gIGD/6empv+6uLf/wL69/8G/ + vv/CwL//wsC//8G/vv++vbz/tLOz/52dnf91d3n/TVFU/ztARP87QET/P0RH/1NUVf9raWf/fnx5/4uI + hv+Nioj/jYqI/25ubv9ARUn/PEFF/zxBRco8QUVoPEFFgjxBRaE8QUW8PEFFzzxBRdk8QUXiPEFF5jxB + Rek8QUXpPEFF5jxBReI8QUXZPEFFzzxBRbw8QUWhPEFFgTxBRWo8QUXOPEFF/0FGSf9wcHD/jYqI/42K + iP+LiIb/fnt5/2xqaf9YWFn/QkZJ/ztARP86P0P/RUpO/2hrbf+RkpL/rays/7u5uP+/vr3/wb++/8G/ + vv/Avr3/vry8/7a0tP+goKD/eHp7/01RVf87QET/O0BE/0JGSf9aWlr/aWdl/2lnZf9pZ2X/cnBu/4aD + gf+Nioj/g4GA/01QU/87QET/PEFF3TxBRSk8QUUAPUFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAD9BQgA7QUYAPEFFZTxBRfk7QEX/WVtd/4iG + hP+Nioj/iYaE/3l3df9samf/aWdl/2lnZf9fXl7/SUxO/z1CRf86P0T/PEFF/0hMUP9dYGP/c3V3/4KD + hP+IiYr/hoeI/3x+f/9qbW//VVhc/0JHS/86QET/OkBE/z1CRv9IS07/X19f/3Vzcf+Gg4H/jImH/4yJ + h/+MiYf/cXFx/0NHS/87QEX/PEFF4TxBRT48QUQAPEFDADtBRQQ7QkUJPEFFEjxBRR08QkUoPEFFLTxB + RTE8QUUxPEFFLTxCRSg7QUUdPEFFEjtCRQk8Q0QEO0BGADxBRQA8QUVEPEFF5TtARP9ESEz/dHNz/42K + h/+MiYf/jImH/4aDgf92dHL/Y2Jh/01PUf8/REf/O0BE/zo/Q/8+Q0f/TFBU/19iZP9wcnT/enx+/31/ + gP93eXv/aWtu/1ZaXf9ESEz/O0BE/zpARP89Qkb/Sk1P/2BfX/9pZ2X/aWdl/2tpZ/95d3X/iIaE/42K + iP+Kh4X/X2Bi/zxBRf88QUX9PEFFdjtETgA9QEIAOkZGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1BRAA8QUYAPEJGDTxBRag8QUX/PkNG/2Zn + aP+LiIb/jImH/4yJh/+DgH7/dHFv/2tpZ/9pZ2X/ZmRj/1dYWP9HSkz/PkJG/ztARP86P0P/Oj9D/zpA + RP87QET/O0BE/zo/Q/86P0P/Oj9D/ztARP8/Q0f/SUxO/1xcXP9ycG7/goB+/4uIhv+MiYf/jImH/4yJ + h/9wb3D/REhM/ztARP88QUXsPEFFWT5CRwA7QUYAPEFHADxBRQA7QUUAPEFFADxBRQA8QkUAPEFFADxB + RQA8QUUAPEFFADxCRQA7QUUAPEFFADtCRQA8QkUAPUNEADxBRgA7P0QAPEFFXzxBRe87QET/RUpN/3Jy + cv+MiYf/jImH/4yJh/+LiIb/g4B+/3Nxb/9gYF//TVBR/0FGSf88QUX/OkBE/zk/Q/86P0P/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/87QET/P0NH/0lMTv9aWlr/ZmVj/2lnZf9raWf/dHFv/4OAfv+MiYf/jImH/4yJ + h/9sbG3/P0RI/zxBRf88QUW5PEBFFDxARQA9QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QUUAPEFGADtBRSk8QUXRPEFF/0BF + SP9ra2z/i4iG/4yJh/+MiYf/ioeF/4J/ff92dHL/bWtp/2poZv9lZGL/XFxb/1BSU/9HS03/QkZJ/0BE + SP8/REf/P0RH/0FFSP9ER0r/S01P/1ZXWP9mZWT/d3Vz/4SBf/+LiIb/jImH/4yJh/+Nioj/ioeF/2lq + a/9CRkr/O0BE/zxBRe88QUVmQUhCATxCRAA7QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRgA8QUYAPENJAjxBRW48QUXzO0BE/0NH + S/9sbW3/i4iG/42KiP+MiYf/jImH/4uIhv+EgX//eHZ0/2loZ/9aW1v/T1FS/0dKTf9DR0r/QUVJ/0FF + Sf9CRkn/RUhL/0tNT/9TVFX/Xl5d/2ZlY/9qaGb/bmtp/3Z0cv+Cf33/ioeF/4yJh/+MiYf/jImH/3Fx + cf9DR0v/O0BF/zxBRd48QUU3PUFFAEBFSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkcAPEJGADxBRAA8QUVFPEFF4jtB + Rf9BRUn/aGlp/4qHhf+Nioj/jImH/4yJh/+LiIb/h4SC/4B9e/94dnT/c3Fv/29ta/9raWf/Z2Zk/2Rj + Yv9jYmL/ZWRk/2ppaP9ycG7/enh2/4OAfv+JhoT/jImH/4yJh/+MiYf/jImH/42KiP+DgYD/XV9g/z9E + R/87QUX/PEFF6DxBRWA8PEICPEFEAD1CRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQA8QUYAPEFGADxARwQ8QUVpPEFF7DtA + Rf9AREj/YGJj/4WCgf+Nioj/jImH/4yJh/+MiYf/jImH/4mGhP+DgH7/e3l2/3Nxb/9ta2r/aGdl/2Zl + ZP9mZWT/aWdm/2xqaP9wbWv/c3Fv/3h2dP+AfXv/h4SC/4uIhv+MiYf/jImH/4yJh/+LiIb/b29v/0RI + S/87QET/PEFF7DxBRVY5QUMAPUBFADI2OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFGADxBRQA8QEcAPEFFUTxB + ReQ7QUX/P0NH/15fYf+DgX//jYqI/4yJh/+MiYf/jImH/42Jh/+MiYf/i4iG/4mGhP+HhIL/hoOB/4aD + gf+IhYL/iYaE/4qHhf+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+Nioj/ioeF/3Nycv9OUVT/PEFF/zxB + Rf88QUXaPEFFT0Y0XgA8QEQAPEBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBGADxARQA3REIBPEFFVzxB + ReA8QUX/PEFF/1FTVv92dXX/i4iG/42KiP+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+Kh4X/iYaD/4eE + gv+Gg4H/hoOB/4eEgv+JhoT/i4iG/4yJh/+MiYf/jImH/4yJh/+MiYf/jYqI/4aEgv9kZWb/QUVJ/ztA + RP88QUXuPEFFZTtGRAE9QUUAPUFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRAA8QUQAPEJGADxB + RUo8QUXYPEFF/zxBRf9NUFP/cnFx/4mGhP+Nioj/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jYqI/4qHhv95eHf/Wlxe/0BFSP87QET/PEFF/jxB + RbU8QUUyPEFGADxBRAA8QkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRAA8QkUAPUBGADxB + RTo8QUW/PEFF/ztARP9CRkr/Xl9h/317ev+LiIb/jYqI/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/42KiP+LiIb/eHd3/1NWWP89Qkb/PEFF/zxB + ReU8QUVdO0hIAjxCRgA9QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEBFADxB + RAA8QUUzPEFFtzxBRf07QET/QERI/1VYWv9zcnL/hoOC/4yJh/+Nioj/jYqI/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+Nioj/jYqI/4yJh/+Fg4H/c3Jy/1lbXf9CR0r/O0BE/zxBRf88QUXkPEFFfDxB + RRQ8QUUAPEJEADxCRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEJFADtA + RAA8QUUaPEFFiTxBReo8QUX/O0FF/0RJTP9dX2D/d3Z2/4eFg/+Niof/jYqI/42KiP+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jYmH/42KiP+Nioj/iYaE/3l4d/9cXV//QkdK/ztARP88QUX/PEFFyTxB + REQ/TEYAO0JFADtDRgBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + RdI8QUXZPEFF1zxBRc48QUW5PEFFmzxBRXM8QUVCPEFGFzA9XwA8QUUAPEFEAD5ESAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPj5EADY/QQA5PEAAO0FEADxBRQA8QUUAPEBGADxCRQU8QUULPEFFDjxB + RQ88QUUMPEFECDtAQgI8QUUAPEFFADxARQA9P0UAO0NGAEM6PwAAgIAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAyR08APEJFADxBRQA8QUUAPEFFADtBQwA8QUYHPEFFDTxB + RhI8QUUZPEFFFjxBRRA7QUUKO0BHAjxBRQA8QUUAPEFGADtBRwA9O0oAOkVGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QkYAPEJEADxBRQA8QUUAPEFFADxB + RQA8QUUAPEFFADxBRAA/PkMAPj5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAOkFJAD1BRgA8QUYAPEFFADxB + RgA8QUUAPEFFADxBRQA7QUUAPEFGADk9QgA6PkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////8A////////////////////AP///////////////////wD///////////// + //////8A//////8AAAAAAP//////AP///+AAAAAAAAAAB////wD///4AAAAAAAAAAAB///8A///gAAAA + AAAAAAAAB///AP//4AAAAAAAAAAAAAf//wD//+AAAAAAAAAAAAAH//8A///gAAAAAAAAAAAAB///AP// + 4AAAAAAAAAAAAAf//wD//+AAAAAAAAAAAAAH//8A///wAAAAAAAAAAAAD///AP///4AAAAAAAAAAAf// + /wD////8AAAAAAAAAD////8A//////8AAAAAAP//////AP/////+AAAAAAA//////wD////4AAAAAAAA + AB////8A////wAAAAAAAAAAD////AP///gAAAAAAAAAAAH///wD///AAAAAAAAAAAAAP//8A///gAAAA + AAAAAAAAB///AP//wAAAAAAAAAAAAAP//wD//wAAAAAAAAAAAAAA//8A//4AAAAAAAAAAAAAAH//AP/8 + AAAAAAAAAAAAAAA//wD/+AAAAAAAAAAAAAAAH/8A//AAAAAAAAAAAAAAAA//AP/gAAAAAAAAAAAAAAAH + /wD/4AAAAAAAAAAAAAAAB/8A/8AAAAAAAAAAAAAAAAP/AP+AAAAAAAAAAAAAAAAB/wD/AAAAAAAAAAAA + AAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD+AAAAAAAAAAAAAAAAAH8A/gAAAAAA + AAAAAAAAAAB/APwAAAAAAAAAAAAAAAAAPwD8AAAAAAAAAAAAAAAAAD8A+AAAAAAAAAAAAAAAAAAfAPgA + AAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPAAAAAAAAAAAAAAAAAA + DwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAA + AAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAA + AAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAA + AAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAA + DwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAA + AAAAAA8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAA + AAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD8AAAAAAAAAAAAAAAAAD8A/AAAAAAAAAAAAAAAAAA/APwA + AAAAAAAAAAAAAAAAPwD+AAAAAAAAAAAAAAAAAH8A/gAAAAAAAAAAAAAAAAB/AP4AAAAAAAAAAAAAAAAA + fwD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/gAAAAAAAAAAA + AAAAAf8A/4AAAAAAAAAAAAAAAAH/AP/AAAAAAAAAAAAAAAAD/wD/wAAAAAAAAAAAAAAAA/8A/4AAAAAA + AAAAAAAAAAH/AP+AAAAAAAAAAAAAAAAB/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP4A + AAAAAAAAAAAAAAAAfwD+AAAAAAAAAAAAAAAAAH8A/gAAAAAAAAAAAAAAAAB/APwAAAAAAAAAAAAAAAAA + PwD8AAAAAAAAAAAAAAAAAD8A/AAAAAAAAAAAAAAAAAA/APgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAA + AAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAA + AAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgA + AAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAA + HwD8AAAAAAAAAAAAAAAAAB8A/AAAAAAAAAAAAAAAAAA/APwAAAAAAAAAAAAAAAAAPwD+AAAAAAAAAAAA + AAAAAD8A/gAAAAAAAAAAAAAAAAB/AP4AAAAAAAAAAAAAAAAAfwD+AAAAAAAAAAAAAAAAAH8A/wAAAAAA + AAAAAAAAAAD/AP+AAAAAAA//8AAAAAAA/wD/gAAAAAAf//AAAAAAAf8A/8AAAAAAP//8AAAAAAP/AP/g + AAAAAH///gAAAAAH/wD/8AAAAAD///8AAAAAB/8A//gAAAAB////gAAAAB//AP/8AAAAA////8AAAAA/ + /wD//wAAAA/////wAAAAf/8A///AAAA//////AAAAf//AP//4AAA//////8AAAf//wD///8AH/////// + 8AB///8A////////////////////AP///////////////////wD///////////////////8A//////// + ////////////AA== + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Forms/FrmWaiting.Designer.cs b/JinYuan.ControlLib/Forms/FrmWaiting.Designer.cs new file mode 100644 index 0000000..6ff2b7a --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmWaiting.Designer.cs @@ -0,0 +1,162 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib.Forms +{ + /// + /// Class FrmWaiting. + /// Implements the + /// + /// + partial class FrmWaiting + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmWaiting)); + this.imageList1 = new System.Windows.Forms.ImageList(this.components); + this.label1 = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.label2 = new System.Windows.Forms.Label(); + this.timer2 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // imageList1 + // + this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); + this.imageList1.TransparentColor = System.Drawing.Color.White; + this.imageList1.Images.SetKeyName(0, "0.png"); + this.imageList1.Images.SetKeyName(1, "1.png"); + this.imageList1.Images.SetKeyName(2, "2.png"); + this.imageList1.Images.SetKeyName(3, "3.png"); + this.imageList1.Images.SetKeyName(4, "4.png"); + this.imageList1.Images.SetKeyName(5, "5.png"); + this.imageList1.Images.SetKeyName(6, "6.png"); + this.imageList1.Images.SetKeyName(7, "7.png"); + this.imageList1.Images.SetKeyName(8, "8.png"); + this.imageList1.Images.SetKeyName(9, "9.png"); + this.imageList1.Images.SetKeyName(10, "10.png"); + this.imageList1.Images.SetKeyName(11, "11.png"); + this.imageList1.Images.SetKeyName(12, "12.png"); + this.imageList1.Images.SetKeyName(13, "13.png"); + this.imageList1.Images.SetKeyName(14, "14.png"); + this.imageList1.Images.SetKeyName(15, "15.png"); + this.imageList1.Images.SetKeyName(16, "16.png"); + this.imageList1.Images.SetKeyName(17, "17.png"); + this.imageList1.Images.SetKeyName(18, "18.png"); + this.imageList1.Images.SetKeyName(19, "19.png"); + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Top; + this.label1.Image = global::JinYuan.ControlLib.Properties.Resources.loading; + this.label1.Location = new System.Drawing.Point(0, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(276, 196); + this.label1.TabIndex = 0; + // + // timer1 + // + this.timer1.Interval = 20; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // label2 + // + this.label2.Dock = System.Windows.Forms.DockStyle.Top; + this.label2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.label2.Location = new System.Drawing.Point(0, 196); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(276, 30); + this.label2.TabIndex = 1; + this.label2.Text = "处理正在进行中,请稍候..."; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // timer2 + // + this.timer2.Tick += new System.EventHandler(this.timer2_Tick); + // + // FrmWaiting + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(247)))), ((int)(((byte)(247))))); + this.ClientSize = new System.Drawing.Size(276, 244); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.IsFullSize = false; + this.Name = "FrmWaiting"; + this.Opacity = 0D; + this.RegionRadius = 20; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = ""; + this.TopMost = true; + this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(247)))), ((int)(((byte)(247))))); + this.VisibleChanged += new System.EventHandler(this.FrmWaiting_VisibleChanged); + this.ResumeLayout(false); + + } + + #endregion + + /// + /// The image list1 + /// + private System.Windows.Forms.ImageList imageList1; + /// + /// The label1 + /// + private System.Windows.Forms.Label label1; + /// + /// The timer1 + /// + private System.Windows.Forms.Timer timer1; + /// + /// The label2 + /// + private System.Windows.Forms.Label label2; + /// + /// The timer2 + /// + private System.Windows.Forms.Timer timer2; + + + } +} \ No newline at end of file diff --git a/JinYuan.ControlLib/Forms/FrmWaiting.cs b/JinYuan.ControlLib/Forms/FrmWaiting.cs new file mode 100644 index 0000000..541c783 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmWaiting.cs @@ -0,0 +1,103 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.Forms +{ + /// + /// Class FrmWaiting. + /// Implements the + /// + /// + public partial class FrmWaiting : FrmBase + { + /// + /// Gets or sets the MSG. + /// + /// The MSG. + public string Msg { get { return label2.Text; } set { label2.Text = value; } } + /// + /// Initializes a new instance of the class. + /// + public FrmWaiting() + { + base.SetStyle(ControlStyles.UserPaint, true); + base.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + base.SetStyle(ControlStyles.DoubleBuffer, true); + InitializeComponent(); + } + + /// + /// Handles the Tick event of the timer1 control. + /// + /// The source of the event. + /// The instance containing the event data. + private void timer1_Tick(object sender, EventArgs e) + { + if (this.label1.ImageIndex == this.imageList1.Images.Count - 1) + this.label1.ImageIndex = 0; + else + this.label1.ImageIndex++; + + } + + /// + /// Handles the VisibleChanged event of the FrmWaiting control. + /// + /// The source of the event. + /// The instance containing the event data. + private void FrmWaiting_VisibleChanged(object sender, EventArgs e) + { + //this.timer1.Enabled = this.Visible; + } + + /// + /// Does the escape. + /// + protected override void DoEsc() + { + + } + + /// + /// Handles the Tick event of the timer2 control. + /// + /// The source of the event. + /// The instance containing the event data. + private void timer2_Tick(object sender, EventArgs e) + { + base.Opacity = 1.0; + this.timer2.Enabled = false; + } + + /// + /// Shows the form. + /// + /// The int sleep. + public void ShowForm(int intSleep = 1) + { + base.Opacity = 0.0; + if (intSleep <= 0) + { + intSleep = 1; + } + base.Show(); + this.timer2.Interval = intSleep; + this.timer2.Enabled = true; + } + } +} diff --git a/JinYuan.ControlLib/Forms/FrmWaiting.resx b/JinYuan.ControlLib/Forms/FrmWaiting.resx new file mode 100644 index 0000000..c182949 --- /dev/null +++ b/JinYuan.ControlLib/Forms/FrmWaiting.resx @@ -0,0 +1,2214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 132, 17 + + + 222, 17 + + + + + AAABAAEAeIAAAAEAIAAo+AAAFgAAACgAAAB4AAAAAAEAAAEAIAAAAAAAAPAAAGDqAABg6gAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVAG9vbwBCQkQAPz9LADw9 + RQA7P0cAPEBHAD1ARgA9QUYAO0BGADtDRQA7QUEAO0BAADk+PgA9QkIAPkJCADtBRAA4RkgAOUZGADxA + QAA8QEAAOUZGADhGSAA7QUQAPkJCAD1CQgA5Pj4AO0BAADtAQQA7QEUAO0BGAD1BRgA9QEYAPEBHADs/ + RwA8PUUAPz9LAEJCRABvb28AVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUAGRksAD4+ + RAA4QUUAOEBEADk7PABBQ0MAO0NFADs/RwA6QUUAPENDADxDQwA8Q0MAPENDADtCQwA1REIASjRkADw3 + RgE6PUoBPD9JAT0/RwI9QEcCO0BGAjtDRQI7QUEDO0BABDk+PgQ+QkIEPkJCBTtBRAU4R0gFOUZGBTxA + QAY8QEAGOUZGBThHSAU7QUQFPkJCBT5CQgQ5Pj4EO0BABDtAQQM7QEUCO0BGAj1ARwI9P0cCPD9JATo9 + SgE8N0YBSjRkADVEQgA7QkMAPENDADxDQwA8Q0MAPENDADxBQwA8QUcAPUFIADdGSQA3SUkAOz9DADlC + RgBAP0UAGxsvAFVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tQwAkIz8APDxLADxCRAA8QkUAO0JEADtE + QwBaUDUAMztIADo8PwFBQ0MDO0NFBDtARgY4P0cIPEFDCz1BRQ08QkUPPEFDETtBRBM8Q0MVPENEFzxC + Qxk8QkQaPEJEGzxCRBw8QkQdPEJEHjxDRB88Q0MgPENDIDxDQyA8Q0MhPENDITxDQyE8Q0QhPENDITxD + QyI8Q0MiPENDITxDRCE8Q0MhPENDITxDQyE8Q0MgPENDIDxDQyA8QkQfPEJEHjxCRB08QkQcPEJEGzxC + RBo8QkMZPENEFzxDQxU7QUQTPEFDETxCRQ89QUUNPEFBCzo/QQg8QUcGPUFHBTdFSAM4R0gBNTtIAFFJ + MAA6REMAO0JEADxCRQA8QEQAPD1LACQjPwAtLUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMzMzAERQVAA+RkgAPkNFAD1CRABETUMAPDtNATxCRAQ8QkUIO0JFDDxC + RBA7QkQVO0JEGTxCQxw8Q0MePENDIDxCRCI8Q0QkPENDJTxDQyU8Q0MmPENDJjxDQyY8Q0MnPENDJzxD + Qyc8Q0MnPENDJzxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxD + Qyc8Q0MnPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MlPENDJTxDQyQ8Q0QjPENEITtDRB88Q0QcO0JEGTtD + RBU8QkQQO0JFDDxBRQg8P0QEPDtNAURMQwA8QkQAPkNFAEBHSgBHUlYAMzMzAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPkREAEBGRwA4SlMAPUJEBTtBQgw8Q0QUPEJEGzxDQyA8Q0MjPENDJTxD + QyY8Q0MmPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MnPENDJzxD + QyY8Q0MmPENDJTxDQyM8QkMgPEJEGzxERBQ8QUIMPUJEBUJVXwBBRkcAPkREAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAP0REAEFDRAI8QkMTPENDIDxDQyU8Q0MmPENDJzxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxDQyY8Q0MlPENEIDxCRBNBQ0QCP0REAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPkNDAD9ERAY8QkMhPENDJzxDQyc8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MnPENDJz1CQyFAREQGPkNEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAP0BAAD86PAA7P0IIPUJEFDxCRB48Q0MjPENDJjxDQyY8Q0MnPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyc8Q0MmPENDJjxDQyM8QkMePUJDFDtAQghDP0AAQ0NEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQEBAAEE+QAA7P0IAEjkEADlDRgM5QkIIOkNEDjxCRBQ8Q0MZPEJDHjxD + QyE8Q0MjPENDJTxDQyY8Q0MmPENDJjxDQyc8Q0MnPENDJzxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJTxDQyQ8Q0MjPENDIzxDQyQ8Q0MlPENDJTxD + QyY8Q0MmPENDJTxDQyU8Q0MkPENDIzxDQyI8Q0MjPENDJTxDQyU8Q0MmPENDJjxDQyY8Q0MmPENDJjxD + QyY8Q0MmPENDJjxDQyY8Q0MmPENDJjxDQyY8Q0MmPENDJzxDQyc8Q0MnPENDJjxDQyY8Q0MmPENDJTxD + QyM8Q0MhPEJDHjxDQxk8QkQUO0NFDjpDQgg7PkYDE3Y6ADs/QgBFQUQAREREAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQAAADYAPUZMADhERQA7Q0MAPENCAEFJSAA8QkQBO0BEAjtB + RgU5Q0QIPUFECzxBQg49Q0IRPENEFDxBRRc8QkUaPEJDHTxDQx48Q0MgPEJDITxDRCM8Q0MkPENDJDxD + QyU8Q0MlPENDJTxDQyY8Q0MmPENDJDxDQyM8Q0MlPENDMDxCREM8QkVcPEFFdDxBRYs8QUWdPEFFqTxB + RbA8QUWyPEFFrjxBRaU8QUWXPEFFhDxCRW08QkRVPEJDPTxCQy08Q0MkPENDIzxDQyU8Q0MmPENDJTxD + QyU8Q0MlPENDJDxDQyQ8Q0QjPEJDITxDQyA8Q0MePEJDHTxCRBo8QkUYPEJFFTxDRBI9QkMPPkFECzpE + RQg7QUcFOz9EAj5ERgE+RkYAPUNDADxERAA6PkYAPTtHAAAABwBVVVUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4ADAzMgA8QkQAO0BEADtC + RgA6Q0QAPUFEAD5ERgA6REQAPkM+AAAA/wBAQ1sBOjxHAjxCRQM7QEUEOkBFBTtCRQY9Q0MIPEFECTxC + Qws9QkUMO0JEDTxBRAs9Q0QRPEFGLTxBRWA8QUWaPEFFxjxBReQ8QUX1O0BE/jtARP87QET/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/87QET/O0BE/zxBRfw8QUXwPEFF3jxBRb08QUWNPEFFUjxCRSM8QUUNO0NECztC + RQw8QkMLPEFECT1DQwg7QkUGOkBFBTtARQQ8QkUDOjxHAkRDWQFAL24AOksuADxDQAA8QkQAPUFEADpE + RQA7QkYAO0BEAD1ERQA1OTgAPz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAARkZGAC0tLQBAQUEAO0NFAEhPOgBGR2MAOjtHAD1CRgA7QEYAOj9FADtCRQA8Q0MAPEJDADxC + RAA8QUUAO0JGDDxBRUQ8QUWUPEFF1TxBRfc7QET/Oj9D/zo/Q/88QUX/REhM/0tQU/9SV1r/Wl5i/19j + Zv9hZWj/XWFl/1dbX/9PVFf/SU1R/0FGSv87QET/Oj9D/zo/Q/87QET/PEFF8jxBRck8QUWBPEFFMztD + SAU8QUUAO0JEADxDQwA7QkUAOj9FADtARgA9QkYAOjtHAEdHYwBHUDwAPUFIADxDRwBCQkEAR0dHAEBA + QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0BGADxBRQA8QEYAPEFGAD1B + RQ08QUVUPEFFtjxBRfI7QET/Oj9D/z1CRv9MUVT/aGxv/4mMjv+oqqv/vr/A/8/Q0f/b3Nz/4ODh/+Li + 4//j4+P/4eHi/97f3//X2Nn/ysvM/7i5u/+goqT/gIOG/2FlaP9HTFD/O0BE/zo/Q/87QET/PEFF6DxB + RaA8QUU+OUJGBTxCRQBCQ0UAP0NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QUQASzZFADxBRQA8P0gDPEFFRjxB + RbM8QUX2O0BE/zo/RP9KT1P/c3d5/6aoqf/P0NH/5+fn//Dw8P/z8/P/8/Pz//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vH/8vLy//Pz8//y8vL/7+/v/+Lj4//HyMn/m52f/2hsb/9ESU3/Oj9D/ztA + RP88QUXsPEFFljxBRSg5P0QAPEFFAD1ARQA2Q0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBM + UwAmWGIAPEFGADxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRR08QUWMPEFF7TtA + RP87QET/UlZa/42Qkv/Jy8v/6urq//Ly8v/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/y8vL/8vLy/+Xl5f+9vr//fH+C/0hN + Uf86P0P/PEFF/zxBRdc8QUVgPEBEBzxBRQA8QUUAPEFFADxBRQA8QUUAPEFFADxBRQA8QUUAO0FFADRL + TwA2SEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRQA7REQAPEFFADxB + RQA8QUQAPUJEADxARQI8QUUFPEFFBzxBRQg8QUUIPEFFCDxBRQg8QUUIPEFFPzxBRcU8QUX/Oj9D/0pP + U/+LjZD/0NHS//Dw8P/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/z8vL/6+zs/8HD + xP90eHr/QUZJ/zo/RP88QUX1PEFFkTxBRRo8QUUHPEFFCDxBRQg8QUUIPEFFCDxBRgY7QkYDPUBEADxB + RQA8QUUAPEFFAD1DQwA9Q0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA9QUUAPEFFADxBRQA3W0UAPEFFFDxB + RTQ8QUVdPEFFgDxBRZ08QUWxPEFFvDxBRcI8QUXDPEFFwzxBRcM8QUXEPEFF5ztARP89Qkb/bXF0/8LD + xP/u7u7/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/n5+j/qKmr/1RYXP86P0P/PEFF/TxBRdM8QUXCPEFFwzxBRcM8QUXDPEFFvjxBRbM8QUWfPEFFgzxB + RWA8QUU3PEFFFT1HPwE8QUUAPUFFAD1ARAA9QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/RUcAP0RGAD1BRQA7QUUAPEFFFDxBRUs8QUWSPEFFyzxB + Re08QUX8O0BE/zo/Q/86P0P/Oj9D/zo/Q/86P0P/Oj9D/zo/Q/86P0P/OT5C/0VKTv+SlZf/4uPj//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx/8vMzf9rb3L/O0BE/zk+Q/86P0P/Oj9D/zo/Q/86P0P/Oj9D/zo/Q/86P0P/O0BE/zxB + Rf08QUXuPEFFzjxBRZU8QUVQPUFGFztCRgA8QUUAO0BCAD0+QAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAOkVGAC5fRwA8QUUAOj9FAD1BRSI8QUV1PEFFyDxBRfU7QET/OT5D/ztA + RP9BRkr/TlNW/1tfYv9mam3/b3N1/3N2ef90d3r/c3d6/3N3ev9zdnn/eHx+/7O1t//t7e3/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/c3N3/j5GT/3N2ef9zd3r/c3d6/3N3ev9zd3r/cHR3/2hsbv9cYGP/T1RX/0JH + Sv87QET/OT5D/ztARP88QUX3PEFFyzxBRXc8QUUjPUNGADxBRAAoblQAOkVGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA8QEUAPUFGADxARQA8QUUZPEFFdjxBRdY8QUX+Oj9D/zxBRf9NUlX/cHN2/5ib + nf+7vb7/0dLT/+Dh4f/o6On/6urr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/7+/v/+vr6//r6+v/6+vr/+vr6//r6+v/6uvr/+np6f/i4uL/09TU/72/ + wP+bnZ//cnZ4/05TVv88QUX/Oj9D/zxBRf88QUXYPEFFdztCRBk8QEUAPUFEAD1ARAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOkJCAD1BRgA8QUQAPT9GBDxBRU88QUXFPEFF/jo/Q/8/REj/YmZp/5yeoP/Pz9D/6enq//Ly + 8v/z8/P/8vLy//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8vLy//Pz + 8v/y8vL/6urq/9DR0v+eoKL/Y2dq/0BFSf86P0P/PEFF/jxBRcY8QUVPPkBEBD1BRQA7QUQAP0BHAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA+QUYAQEFGADxBRQA8QUQVPEFFijxBRfA7QET/PUJG/2Jmaf+qrK3/4OHh//Ly8v/y8vL/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/y8vL/4eHi/6utr/9jZ2r/PUJG/ztARP88QUXwPEFFij1BRRU8QUUAOEdJADpF + RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpE + RwA8Q0cAO0FFADxBRSo8QUW1PEFF/jo/Q/9NUlb/mJqc/97e3//y8vL/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/9PU + 1P/T1NT/7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/e39//mZud/05TVv86P0P/PEFF/jxBRbQ8QUUrPj9DADtB + RAA7PkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOURIADpE + RwA9P0UAPEJGOzxBRc07QUX/PEFF/2hsb//Excb/8PDw//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/0NHS/1ld + YP9ZXWD/0NHS//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8PDw/8XGx/9pbXD/PEFF/zxBRf88QUXNPEFFOjxD + RwA9QEMAP0NGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEMAO0JGAD1A + QwA8QUVAPEFF1ztARP8/REj/goWI/93d3v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0BF + SP9ARUj/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/d3t7/goSH/z9ESP87QET/PEFF1jxB + RT48QEQAPUFFADw/QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlCQwA6P0IAPEJGADxB + RTk8QUXXO0BE/0JHSv+TlZf/5+jo//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0FG + Sf9BRkn/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8fH/5+fn/5GUlv9BRkr/O0BE/zxB + RdU8QUU3PEJGAD09QABAQEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1ARQA8QEUAPEFFKDxB + Rcs7QET/QUZK/5eanP/r6+v/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/ubu8/0FG + Sf9BRkn/ubu8//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+vr6/+WmZv/QUZK/ztA + RP88QUXJPEFFJzxBRQA7QUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBGADxARQA7QEQTPEFFsDxB + Rf8+Q0f/kZOV/+vr6//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/19fX/ury9/0FG + Sf9BRkn/ury9//X19f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/q6+v/kJOV/z5D + R/88QUX/PEFFrj1BRRI8QUUAPEJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PUcAPEBGADw/RwM8QUWEPEFF/TtA + RP9/goX/5ufn//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/6+vs/9LT0/+xs7T/fH+C/z5D + R/8+Q0f/fYCD/7O1tv/U1db/7e3t//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5ubm/36B + hP87QET/PEFF/TxBRYM7REQDPEJFAD09SQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAA/wAAPEFFADxBRUw8QUXuOj9D/2Zq + bf/b29z/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/+vr6/+8vr//en1//09TV/8+Q0f/O0BE/zxB + Rf88QUX/O0BE/z9DR/9RVln/gIOF/8PFxv/t7e7/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9rb + 2/9laWz/Oj9D/zxBRe48QUVLPEJEADtMKQArVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRgA8QUUAPEFFGTxBRcU7QET/TVFV/8LD + xP/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/2NnZ/4SHif9GSk7/OT5C/zo/Q/89Qkb/QEVI/0JG + Sf9CRkn/QERI/z1CRv86P0P/OT9D/0pOUv+Mj5H/3t/f//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/BwsP/TFBU/ztARP88QUXDPEFFGDxBRQA5QUMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRQA/OUIAPEFFezxBRf49Qkb/l5qc//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/KzMz/ZGdr/zo/Q/87QET/QEVI/01QUf9aW1r/YmFg/2Rj + Yf9kY2H/YWFg/1laWv9MTlD/P0RH/zpARP88QUX/bnF0/9TV1f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/v7+//lpmb/z1CRv88QUX+PEFFeEM+RQA5QkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JEADxBRQA8QUUrPEFF3To/Q/9kaGv/39/g//Hx + 8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9DR0v9eYmb/OT9D/zxBRf9KTU//X19e/2hnZf9qaGX/aWdl/2ln + Zf9pZ2X/aWdl/2poZf9oZmT/XV1d/0hLTf88QUX/Oj9D/2lsb//Y2dr/8vHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/3t/f/2Roa/86P0P/PEFF3DxBRSk8QUUAPEJFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0FFADpCQwE8QUWJPEFF/0JHS/+xs7T/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/5OTk/3J1eP86P0P/PUJG/1BSU/9mZWP/amdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/amhl/2VjYv9NT1H/PEFF/zpARP98gIL/6Ojo//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy/7Cys/9CRkr/PEFF/zxBRYc+QEkBPEFGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5RkgAPEJFADxBRSc8QUXeOj9D/25ydf/m5+f/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/y8vL/qKqr/z5DR/88QUX/TlBS/2dlZP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9mZGP/S05Q/ztARP9BRkr/sLKz//Ly8v/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx/+bm5v9tcXT/Oj9D/zxBRd08QUUmPEFFAD1ARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1SkwAPz5CADxBRXg8QUX/QUZK/7K0tf/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/m5+f/am5x/zk+Qv9ESEv/Y2Jh/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qZ2X/YWFg/0JGSf85PkL/b3J1/+jo6P/x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v+xs7T/QUZK/zxBRf88QUV1PEFGADs/QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAA8QUUAPEFGFDxBRcg6P0P/ZGhr/+Li4//x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/U1NX/TlJW/zo/RP9RU1T/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1BSU/86P0P/T1NX/9XW1v/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/h4uL/YmZq/zo/Q/88QUXGPEJFEjxBRQA9PUkAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA7OQA8QUUAPEFFSjxBRfU8QUX/nJ6g//Ly8v/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/Oz9D/Sk9S/ztARP9UVVb/amhm/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amhm/1RVVv87QET/Sk9S/87P0P/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/y8fH/mpye/ztARP88QUX0PEFFSDxBRQA5L1QAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBRAAfAAAAPEFFjztARP9MUVT/zs7P//Ly8v/w8PD/8fHw//Hx + 8P/v7/D/7/Dw//Hx8P/x8fD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Hx8f/f4OD/XWFk/zk/Q/9FSUv/YWFg/2poZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qaGX/YWFg/0VIS/85P0P/XWFk/9/g4P/x8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8P/x8fD/7/Dw/+/v + 8P/x8fD/8fHw//Dw8P/y8vL/zM7O/0tQVP87QET/PEFFjStPRAA+QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBRQA7QUUTPEFFyzo/Q/9vc3b/6enp//Hx8P/w8PD/4eTy/8bO + 9/+2wvn/t8L5/8jQ9v/k5vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/nZ+h/z1CRv87QET/RUhL/1lZWf9lZGL/aWdl/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2pnZf9qaGX/aWdl/2ZkY/9ZWVr/REhL/ztARP8+Q0f/nqCi//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+Tm8v/I0Pb/t8L5/7bC + +f/Gzvf/4eTy//Dw8P/x8fD/6Onp/25xdP86P0P/PEFFyT1BRhI9QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAQEBAADxBRQA8QUU5PEFF7ztARP+bnZ//8vLy/+/w8P/P1vX/obD9/5Sm + //+Spf//kqX//5Sm//+ks/z/1dr1//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/5eXm/4SHif8+Q0f/Oj9D/z1CRv9GSUz/UVNU/1pbW/9gYF//Y2Jh/2Rj + Yv9kY2L/Y2Jh/2BgX/9aW1v/UVNU/0ZJTP89Qkb/Oj9D/z5DR/+Fh4r/5ebm//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/1Nr1/6Sz/P+Upv//kqX//5Kl + //+Upv//obD9/8/W9f/w8PD/8vLy/5mcnv87QET/PEFF7jxBRTg8QUUAN0lJAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMUVXADxBRQA8QUVpO0BE/kRJTf/BwsP/8/Py/9fc9P+crP7/k6X//5Sm + //+Upv//lKb//5Sm//+Tpf//oLD9/93h8//x8fD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+bm5/+eoKL/VFlc/zxBRf85PkL/O0BE/z1CRv8/REf/QkZJ/0NH + Sv9DR0r/QkZJ/z9ER/89Qkb/O0BE/zk+Qv87QET/VFhc/56gov/m5+f/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8P/d4fP/oLD9/5Ol//+Upv//lKb//5Sm + //+Upv//k6X//5yt/v/Y3PT/8/Py/8DCw/9ESEz/O0FF/jxBRWg8QUUATC0+AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFAD5CRQE8QUWYOj9E/1ZaXv/b29z/7u/y/7K++v+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//7nE+f/v7/D/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/w8PD/1dXW/5yfoP9obG//TFBU/z5DR/87QET/OT9D/zk+ + Qv85PkL/OT9D/ztARP8+Q0f/TFBU/2hsb/+anJ7/09TV//Dw8P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v8P+5xPn/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+yvvr/7u/y/9rb2/9VWl3/OkBE/zxBRZY+RUkBPEJGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRQw8QUW9OT5C/21xdP/r6+r/5Ofy/5+v/f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6Wz/P/p6vH/8PDw//Dw8P/w8PD/8PDw//Ly8v/x8fH/6Ojo/+Hh + 4f/g4OH/5eXm/+7u7v/y8vL/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//Hx8f/n5+f/z9DQ/7W3uP+doKH/j5GU/4eK + jP+Hioz/j5GU/52gof+2t7j/z9DQ/+fn5//x8fH/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//Ly8v/u7u7/5eXm/+Dg + 4f/h4eH/6Ojo//Hx8f/y8vL/8PDw//Dw8P/w8PD/8PDw/+jq8f+ls/z/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+fr/3/5Ofy/+rq6v9scHP/OT5C/zxBRbw8QUULPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFGADxBRho8QUXZOj9D/4aJi//x8fD/4OPz/5ys/v+Tpv//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6Gw/f/l5/L/8fHw//Dw8P/x8fH/7e3t/8bHyP+PkpT/bHBz/1xg + ZP9bX2L/Zmpt/36ChP+mqKr/0dLT/+zs7P/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8vLy//Pz8//y8vL/8vLy//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8vLy//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/s7Oz/0dLT/6aoqf9+gYT/Zmpt/1tf + Yv9cYGT/bHBz/4+SlP/Gx8j/7Ozt//Hx8f/w8PD/8fHw/+Xn8v+hsP3/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Om//+crP7/4OPz//Hx8P+FiIr/Oj9D/zxBRdk8QUUaPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRS88QUXoO0BE/52fof/z8vL/5ujy/6Kx/f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//k6X//6i2/P/q6/H/8PDw//Ly8f/e3t//i46Q/0lOUv86P0P/OT5C/zk/ + Q/85P0P/OT5C/zk+Qv89Qkb/T1NX/3p9gP+3ubr/5eXl//Ly8v/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/y8vL/5eXl/7e5uv97foH/T1NX/z1BRf85PkL/OT5C/zk/ + Q/85P0P/OT5C/zo/Q/9JTlH/iYyP/97e3//y8vH/8PDw/+rr8f+ntvz/k6X//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+isf3/5ujy//Py8v+cnqD/O0BE/zxBRec8QUUuPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRUE8QUXzPEFF/66wsf/z8/P/7+/w/7nE+f+Tpf//lKb//5Sm + //+Upv//lKb//5Sm//+Upv//lKb//8HK+P/w8PD/8fHx/9vb3P9xdHf/O0BE/ztARP8/REf/R0tN/01P + Uf9OUFL/Sk1P/0NHSv89Qkb/Oj9E/zk+Q/9DR0v/am1w/6+wsv/k5eX/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/+Tl5f+usLL/am1w/0JHS/85PkP/Oj9E/z1CRv9DR0r/Sk1P/05Q + Uv9NUFH/R0tN/z9DR/87QET/O0BE/3F1eP/b3Nz/8fHx//Dw8P/Byvj/k6b//5Sm//+Upv//lKb//5Sm + //+Upv//lKb//5Ol//+6xPn/7+/w//Pz8/+tr7H/PEFF/zxBRfI8QUVAPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRU08QUX6QUZJ/7m6vP/z8/P/8fHw/+Dj8/+ks/z/k6X//5Sm + //+Upv//lKb//5Sm//+Tpf//qbf8/+Xn8v/x8fH/6Ojo/36Bg/87QET/PEFF/0lMTv9dXV3/Z2Vj/2ln + Zf9pZ2X/aGZk/2RjYf9bW1v/TU9R/0FFSf87QET/OT5C/0BFSf9tcXP/vL2+/+zt7f/y8fH/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Lx8f/s7O3/u72+/21wc/9ARUn/OT5C/ztARP9BRUj/TU9R/1tbW/9kY2H/aGZk/2ln + Zf9pZ2X/Z2Vj/11dXf9ITE7/PEFF/ztARP9+goT/6Ojp//Hx8P/k5/L/qbf8/5Ol//+Upv//lKb//5Sm + //+Upv//k6X//6Sz/f/g4/P/8fHw//Pz8/+4urv/QEVJ/zxBRfo8QUVNPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVc7QET+RUlN/8DCw//z8/L/8PDw//Hw8P/c4PP/rrv7/5ip + /v+Upv//lKb//5mq/v+yvvr/4OPz//Hx8P/y8vL/rK6w/0FFSf87QET/Sk1P/2VjYv9qaGX/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/aGZl/2FgX/9SU1T/QkZJ/ztARf85PkP/R0tP/4mLjv/a2tv/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy/9ra2/+Ii47/RktP/zk+Q/87QEX/QkZJ/1JUVf9hYF//aGZl/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2poZf9lY2L/Sk1P/ztARP9BRkr/ra+w//Ly8v/x8fD/4OPz/7K++v+Zqv7/lKb//5Sm + //+Yqf7/rrv7/9zg8//w8PD/8PDw//Pz8//AwcL/RElN/ztARP48QUVWPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRV07QET/R0tP/8XHyP/y8vL/8PDw//Dw8P/x8fD/6uvx/9fc + 9P/J0fb/ytL2/9nd9P/s7PH/8fHw//Hx8f/i4uP/ZWls/zk+Q/9DR0r/YmFg/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/YmFg/1FTVP9ARUj/O0BE/ztARP9jZ2r/wcLD//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/wMLD/2Jmaf87QET/O0BE/0BFSP9RU1T/YmFg/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/YWFg/0NHSv85PkL/Zmpt/+Lj4//x8fH/8fHw/+zs8f/Z3fT/ytH2/8nR + 9v/X3PT/6uvx//Hx8P/w8PD/8PDw//Ly8v/Fxsf/RktP/ztARP88QUVcPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVw7QET/R0tP/8jJyv/z8/P/8PDw//Dw8P/w8PD/8PDw//Hx + 8P/x8fD/8fHw//Hx8P/w8PD/8PDw//Py8v+5urv/QkdK/zxBRf9UVVb/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9fXl7/SUxO/zxBRf86P0P/TlNW/6yu + sP/u7u7/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+7u + 7v+srrD/TlNW/zo/Q/88QUX/SUxO/15eXv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1NVVf87QET/QkdL/7m7vP/z8vL/8PDw//Dw8P/x8fD/8fHw//Hx + 8P/x8fD/8PDw//Dw8P/w8PD/8PDw//Pz8//Hycr/RktP/ztARP88QUVbPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRVY7QET+RUlN/8fIyf/09PT/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+KjY//OT9D/0FFSP9hYF//aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9qZ2X/ZmRj/1JUVf8/Q0f/Oj9D/0ZL + T/+jpaf/7u7u//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fD/7e7u/6Kk + pv9GS0//Oj9D/z9DR/9TVFX/ZmRj/2pnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2FgX/9ARUj/OT9D/4qNj//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//T09P/GyMn/RElN/ztARP48QUVVPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRUw8QUX6QEVJ/8HCw//39vb/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+bm5/9na27/OT5C/0lLTv9nZWT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9ZWVr/QUVJ/zo/ + Q/9GSk7/p6mr/+/v7//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/p6mr/0ZK + Tv86P0P/QUVJ/1laWv9oZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dlZP9IS07/OT5C/2hrbv/m5+f/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//f39v/AwsP/QEVJ/zxBRfk8QUVLPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRT88QUXxPEFF/7W3uf/6+vr/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vHx/9jZ2f9TV1v/Oj9D/1BSVP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/XFtb/0FF + Sf86P0P/S1BU/7u9vv/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Lx8f+8vb7/TFBU/zo/ + Q/9BRUn/W1tc/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9QUlP/Oj9D/1NXW//Y2dr/8vHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//r6+v+1t7j/PEFF/zxBRfE8QUU+PEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRSw8QUXmOj9D/6Kkpv/8/Pz/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8zNzv9HTE//O0BE/1ZXV/9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1pa + Wv8/REf/Oj9D/15iZf/X2Nn/8vLx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLx/9fY2P9eYWX/Oj9D/z9E + R/9aWlv/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9WV1f/O0BE/0dMUP/Mzs7/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//z8/P+hpKb/Oj9D/zxBReY8QUUsPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRBg8QUXXOT5C/4mMjv/9/f3/8/Pz//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8LDxP9ESEz/PEFF/1lZWv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9UVVb/PUJF/ztARP+Ii43/7e3t//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7e3t/4eKjf87QET/PUJG/1RV + Vv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9ZWVn/PEFF/0RITP/CxMX/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8/Pz//39/f+JjI7/OT5C/zxBRdc8QUUYPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPEFFADxCRQs8QUW5OT5C/29ydf/39/f/9/f3//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/7/Awf9DSEv/PEFF/1paWv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2lnZf9pZ2X/aWdl/2ln + Zf9mZWP/Sk1P/zpARP9JTlL/xcbH//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/xMXG/0lOUf86QET/Sk1P/2Zl + Y/9pZ2X/aWdl/2lnZf9pZ2X/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9aWlr/PEFF/0NIS/+/wMH/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/9/f3//f39/9vcnX/OT5C/zxBRbk8QUUKPEFFAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAO0FEADZFOAA8QUWVOj9D/1ldYf/o6en//Pz8//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8XGx/9ESU3/PEFF/1hZWf9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ZlY/9hYF//YF9e/2NiYf9oZmT/aWdl/2ln + Zf9qaGX/Xl1d/z9ER/86P0P/gIOF/+3t7f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/t7e3/f4OF/zo/Q/8/REf/Xl1d/2po + Zf9pZ2X/aWdl/2hmZP9jYmH/YF9e/2FgX/9mZWP/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9YWFn/PEFF/0RJTf/Fx8j/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH//f38/+jp6f9YXWD/Oj9D/zxBRZVCLzwAPEBEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATE9YADxBRQA8QUVuO0BE/0dLT//S09T///////T09P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9DR0v9KTlL/O0BE/1RVVv9qaGX/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9nZWP/V1dY/0ZKTP9ARUj/P0RH/0JGSf9NT1H/YF9f/2ln + Zf9pZ2X/aGZk/0xPUf86P0P/TlNW/9DR0v/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/S09P/T1RY/zo/Q/9MT1H/aGZk/2ln + Zf9pZ2X/YF9f/01PUf9CRkn/P0RH/0BFSP9GSkz/V1dY/2dlY/9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9UVVb/O0BE/0pPU//R0tL/8vLy//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/09PT//////9HS0/9GS0//O0BE/zxBRW08QUUAR1JRAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAACwwMADxBRQA8QUVCPEFF9D1CRv+wsrP///////j4+P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx/9zc3f9YXF//Oj9D/09RUv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ZlY/9OUFL/PUJG/ztARf88QUX/PEFF/zxBRf87QEX/QkZJ/1xc + XP9pZ2X/amhl/1tbW/89Qkb/PEFF/6Olp//y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v+kpqj/PUJG/z1CRv9bW1v/amhl/2ln + Zf9cXFz/QkZJ/ztARf88QUX/PEFF/zxBRf87QEX/PUJG/05QUv9mZWP/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9PUVL/Oj9D/1hcYP/c3d3/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/4+Pj//////6+xs/89Qkb/PEFF9DxBRUE8QUUACwsMAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUgPEFF2zk+Qv+LjpD//v7+//39/f/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+np6f9rb3L/OT5C/0hLTf9nZWT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1RWVv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/O0BF/0RI + S/9jYmH/amhl/2VjYv9ER0r/OT5C/3p9gP/s7e3/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+zs7f95fX//OT5C/0RIS/9lY2L/amhl/2Ni + Yf9ESEv/O0BF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf9UVlb/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dlZP9IS03/OT5C/2xwc//p6en/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/9/f3//v7+/4uOkP85PkL/PEFF2jxBRR88QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRQA9QkUIPEFFtDo/Q/9laWz/8vLy///////39/f/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+JjI7/OT5D/0FGSf9jYmD/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZGNi/0RHSv87QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxB + Rf9VVlf/aWdl/2hmZf9MTlD/OT9D/11hZf/i4uP/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+Hi4v9dYWT/OT9D/0xOUP9oZ2X/aWdl/1RW + Vv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztBRf9ER0v/ZGNi/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2JiYP9BRkn/OT5D/4qNj//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//f39///////8fLy/2VpbP86P0P/PEFFsztCRQc7QkUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRwA9P0MAPEFFfTtARP9KT1P/1tfY///////8/Pz/8vLy//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Pz8/+usLL/PkNH/z1CRv9aW1v/amhl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/XV1d/z5DRv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + RP9LTU//aGZk/2lnZf9TVFX/Oj9E/09UV//T09T/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9LT0/9PU1f/Oj9E/1NUVf9qZ2X/aGZk/0tN + T/87QET/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf8+Q0b/XV1d/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/amhl/1paW/89Qkb/PkNH/6+xs//z8/P/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8vLy//z8/P//////1tfY/0pPUv87QET/PEFFfD5BRgA7QUQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEpMgA8QUUAPEFFRzxBRfU8QUX/ra+x////////////9vb2//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/S09T/T1RX/zo/Q/9PUVL/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qaGX/Wltb/z1CRv88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + Rf9IS07/Z2Vk/2poZv9XWFj/O0BE/0dMUP/Iycr/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8fIyf9HS0//O0BE/1dYWP9qaGb/Z2Vj/0hL + Tf87QEX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf89Qkb/Wltb/2poZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/05RUv86P0P/UFRY/9PU1P/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/9vb2////////////rK+w/zxBRf88QUX0PEFERjxBRQBDSlUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACtVVQA8QUUAPEFFGjxBRdQ5PkL/fICC//r6+////////Pz8//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/q6ur/c3d6/zk+Qv9DR0r/ZGNh/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/Xl5d/z5DR/88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztA + RP9MTlD/aGZk/2poZv9ZWVn/PEFF/0NITP/CxMX/8/Pz//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8/Pz/8LDxP9DSEz/PEFF/1lZWv9qaGb/aGZk/0tO + UP87QET/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf8+Q0f/Xl5d/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZGJh/0NHSv85PkL/dXh7/+rr6//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL//Pz8///////6+vr/fH+C/zk+Qv88QUXUPEFFGjxBRQAzMzMAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkUAP0NGAjxBRZw6QET/VFlc/+Pk5P////////////f3 + 9//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/qaus/z5DR/89QUX/WFlZ/2pnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/ZWRi/0VJTP87QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/zxB + Rf9XV1j/amdl/2poZv9ZWVn/PEFF/0RJTf/DxMX/8/Pz//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8/Pz/8LExf9DSEz/PEFF/1lZWf9qaGb/amdl/1ZX + WP88QUX/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/ztBRf9FSUz/ZWRi/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9qZ2X/WFhZ/z1BRf8+Q0f/qqyu//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/39/f////////////j4+T/VFhc/zpARP88QUWcPkJFAj1CRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkYAPEFFADxBRVk8QUX7PkNH/7W3uP////////////39 + /f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/2dra/1hcX/86P0P/SEtN/2ZlY/9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/1dYWf89Qkb/PEFF/zxBRf88QUX/PEFF/zxBRf88QUX/O0BF/0dK + Tf9lY2L/aWdl/2poZv9XV1j/O0BE/0hNUP/Jysv/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/8jKyv9ITVD/O0BE/1dXWP9qaGb/aWdl/2Vj + Yv9HSk3/O0BF/zxBRf88QUX/PEFF/zxBRf88QUX/PEFF/z1CRv9YWFj/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9mZWP/SEtN/zo/Q/9ZXWD/2tvb//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly + 8v/9/f3///////////+0trj/PkNH/zxBRfo8QUVZPEFFADxCRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAPEFFADxBRSA8QUXZOT5C/32Ag//6+/v///////// + ///5+fn/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/5OVl/87QET/PUJG/1laWv9qZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2dmZP9SVFX/PkNH/ztARf88QUX/PEFF/ztARf88QUX/RklM/2Bf + Xv9pZ2X/aWdl/2lnZf9SVFX/Oj9D/1BVWP/U1dX/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9TU1f9QVFj/Oj9D/1JUVf9pZ2X/aWdl/2ln + Zf9fX17/RUlM/zxBRf87QEX/PEFF/zxBRf87QEX/PkNH/1JUVf9oZmT/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2pnZf9ZWlr/PUJG/ztARP+Ulpj/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//n5 + +f////////////r6+v98f4L/OT5C/zxBRdk8QUUfPEFFAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JGADtERgM8QUWbO0BE/1BUWP/c3d7///////// + ///+/v7/9PT0//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy/9PU1P9UWFz/Oj9D/0ZKTP9lY2L/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9oZmT/W1tb/0tOUP9ER0r/QkZK/0ZKTP9SVFX/Y2Jh/2ln + Zf9pZ2X/aWdl/2hnZf9MTlD/OT9D/11hZf/i4+P/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+Lj4/9dYWT/OT9D/0xOUP9pZ2X/aWdl/2ln + Zf9pZ2X/Y2Jh/1JUVf9GSkz/QkZK/0RHSv9LTlD/W1tb/2hmZP9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2VkYv9GSkz/Oj9D/1VZXP/T1NX/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/9PT0//7+ + /v///////////9vc3f9PVFf/O0BE/zxBRZk8Q0gCPEJGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITo9ADxBRQA8QUVNPEFF9jxBRf+jpaf///////// + ////////+/v7//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P+Zm53/PEFF/zxBRf9TVFX/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2hmZP9kY2L/Y2Jh/2ZlY/9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/2RjYf9DR0r/OT5C/3h8f//s7Oz/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+zs7P94e37/OT5C/0RHSv9kY2L/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9mZWP/Y2Jh/2RjYv9oZmT/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/1JUVf88QUX/PEFF/5mcnv/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/+/v7//// + /////////////6Kkpv88QUX/PEFF9TxBRUw8QUQASysyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASUtNAD1BRQA9QUUTPEFFxjo/Q/9mam3/7/Dw//// + //////////////f39//w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/e39//ZWls/zo/Q/9AREj/XFxc/2pn + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9pZ2X/aWdl/1ZXWP88QUX/PkNH/6epq//y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v+nqav/PUJG/zxBRf9WV1j/aWdl/2ln + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9qZ2X/XFxc/0BER/86P0P/Zmpt/97f3//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/39/f///////// + ////////7+/v/2VpbP86P0P/PEFFxjxBRBI8QUQAJVtdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9BQgA7QUUAPEFFdjxBRf9BRkr/vL6///// + //////////////7+/v/09PT/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/vL6//0pOUv86P0T/REhL/2Fg + X/9qZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9qZ2X/YmFg/0NHSv86P0P/XGBk/9vc3P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/b29z/XGBj/zo/Q/9DR0r/YmFg/2pn + Zf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2pn + Zf9gYF//REhL/zo/Q/9KT1P/vb/A//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//T09P/+/v7///////// + ////////vL2//0FGSv88QUX/PEFFdTxCRgA3NTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtCQQA8QUUAPEFFJzxBRd45PkL/d3p9//f3 + 9//////////////////8/Pz/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/5yeoP9ARUn/O0BE/0dK + TP9hYWD/amhl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2ln + Zf9lZGL/Sk1P/ztARP9ARUn/p6qr//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/p6mr/0BFSf87QET/Sk1P/2Vk + Yv9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amhl/2Fh + YP9GSkz/O0BE/0BFSf+dn6H/7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//z8/P////////////// + ///39/f/dnp8/zk+Qv88QUXdPEFFJjxBRQA4OT4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBASAA9QEUAPz9GATxBRZA7QET/RktP/8fJ + yv//////////////////////+fn5//Hx8f/w8PD/8PDw//Dw8P/w8PD/8fHx/+np6f+Ii47/PUJG/ztA + RP9FSUz/Xl5d/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2Rj + Yv9MT1D/PEFF/ztARP9+gYT/5+jo//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5+jo/36Bg/87QET/PEFF/0xO + UP9kY2L/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/Xl5d/0ZJ + TP87QET/PUJG/4mMjv/p6en/8fHx//Dw8P/w8PD/8PDw//Dw8P/x8fH/+fn5//////////////////// + ///HyMn/RktP/ztARP88QUWPPkBCAT1BRAA8REQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUYAPEFFADxBRTQ8QUXnOj9D/3x/ + gv/4+Pn///////////////////////f39//w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/k5OX/hYiK/z5D + R/87QET/QUVJ/1ZWV/9mZGP/amdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/aWdl/2poZf9pZ2X/Xl5d/0hL + Tf88QUX/Oj9D/21xdP/b3Nz/8vHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vHx/9vb3P9tcHP/Oj9D/zxB + Rf9IS03/Xl5d/2lnZf9qaGX/aWdl/2lnZf9pZ2X/aWdl/2lnZf9pZ2X/amdl/2ZkY/9VVlf/QUVJ/ztA + RP8+Q0f/hYiL/+Tl5f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/39/f///////////////////////j4 + +f97f4L/Oj9D/zxBRec8QUUzPEFFADxBRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAPUFEAD5ARAM8QUWXO0BE/0ZL + T//Gx8n///////////////////////7+/v/19fX/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/5ubn/5KV + l/9FSk3/Oj9D/z1BRf9HSk3/V1hY/2NiYf9nZmT/aWdl/2lnZf9oZ2X/ZmRj/15eXf9PUVL/QERI/ztA + RP88QUX/cnZ4/9fY2f/y8vL/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/X2Nj/cnV4/zxB + Rf87QET/QERI/09RU/9eXl3/ZmRj/2lnZf9pZ2X/aWdl/2dmZP9jYmH/V1hY/0dKTf89QkX/Oj9D/0VK + Tv+TlZf/5ufn//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//X19f/+/v7//////////////////////8bH + yP9GS0//O0BE/zxBRZY9QUYDPUFFAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0FGADxBRQA8QUU0PEFF5To/ + Q/91eHv/9PX1///////////////////////9/f3/9PT0//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+zt + 7f+xs7T/XWFk/ztBRf86P0P/PEFF/0JGSf9JTE7/TlBS/09RUv9MTlD/RklM/z9DR/87QET/OT5D/0dM + UP+NkJL/4ODg//Ly8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/y8vL/4ODg/42P + kv9HTFD/OT5D/ztARP8/Q0f/RklM/0xOUP9PUVL/TlBS/0lMTv9CRkn/PEFF/zo/Q/88QUX/XWFl/7Kz + tf/t7e3/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/9PT0//39/f//////////////////////9PT1/3R4 + e/86P0P/PEFF5D1BRTQ8QUUAP0VBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRQA8QUUhPEFF1TtB + Rf9CRkr/t7m7/////////////////////////////Pz8//Pz8//w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL/2dra/5aYmv9ZXWD/PkNH/zk+Qv85PkL/OT5D/zk/Q/85PkL/OT5C/zo/Q/9HTFD/dHd6/76/ + wP/t7e3/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx/+3t + 7f+9v8D/dHd6/0dMT/86P0P/OT5C/zk+Qv85P0P/OT5D/zk+Qv85PkL/PkNH/1ldYf+WmJv/2dra//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/z8/P//Pz8////////////////////////////t7i6/0JG + Sv88QUX/PEFF0zxBRR88QUUAPUFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQkUAPEFFADtBRQc8QUWWPEFF/zxB + Rf86P0P/YmZp/+jp6f////////////////////////////z8/P/z8/P/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx//Dw8P/a2tv/r7Cy/4KFh/9obG//XGBj/1ldYf9hZWj/dHd6/5eZm//Fxsf/6enp//Ly + 8v/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/y8vL/6Onp/8XGx/+XmZv/dHd6/2FlaP9ZXWH/XGBj/2hsb/+ChYf/r7Gy/9rb2//w8PD/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/8/Pz////////////////////////////o6en/YmZp/zo/ + Q/88QUX/PEFF/jxBRZI+QUQGPUFEAD5AQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRUYAO0FFADxBRVU8QUX0PEFF/0FF + SP89Qkb/PEFF/5mbnf/9/f3////////////////////////////8/Pz/8/Pz//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8vLy/+/v7//m5uf/3+Dg/97e3//i4uP/6+zs//Ly8v/y8vL/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8fHx//Ly8v/y8vL/6+zs/+Li4//e3t//3+Dg/+bm5//v7+//8vLy//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8/Pz//v7+/////////////////////////////39/f+Ym53/PEFF/z1C + Rf9BRUj/PEFF/zxBRfI8QUVSPEFFAEY8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5BRgA8QUUAPEFFGTxBRcg8QUX/QUZJ/1xc + XP9IS03/Oj9E/0xQVP/Mzc7//////////////////////////////////Pz8//Pz8//w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/z8/P//Pz8/////////////////////////////////8vMzf9LUFP/Oj9E/0hL + Tf9bW1v/QUVJ/zxBRf88QUXGPUBFGDxBRQA9QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRgA8QUYAPEFFcTxBRf08QUX/VFVW/2po + Zf9dXVz/P0RH/zk/Q/9ucXT/7e3u//////////////////////////////////z8/P/09PT/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//T09P/8/Pz/////////////////////////////////7e3t/21xdP85P0P/P0RI/11d + XP9qZ2X/U1VW/zxBRf88QUX9PEFFcDtCRgA+QUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPUBFADxBRQA8QUUfPEFF0zxBRf9FSUv/ZWNi/2ln + Zf9pZ2X/UVNU/zxBRf88QUX/lpmb//z8/P/////////////////////////////////9/f3/9fX1//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/9fX1//39/f/////////////////////////////////8/Pz/lpmb/zxBRf88QUX/UVNU/2ln + Zf9pZ2X/ZGNi/0VJS/88QUX/PEFF0jxBRR48QUUAPkFGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkBGADtCRQA8QUVtPEFF/j1CRv9XWFj/aWdl/2ln + Zf9pZ2X/ZWNi/0dLTf87QET/R0xQ/72/wP///////////////////////////////////////v7+//f3 + 9//x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx + 8f/39/f//v7+//////////////////////////////////////++v8D/R0xQ/ztARP9HSk3/ZWNi/2ln + Zf9pZ2X/aWdl/1dXWP89QkX/PEFF/TxBRW06QUQAP0FHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBFADxARRE8QUXBPEFF/0RIS/9lY2L/aWdl/2ln + Zf9pZ2X/aWdl/1FSVP88QUX/Oj9D/1ldYf/Z2tv///////////////////////////////////////// + ///6+vr/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//r6 + +v///////////////////////////////////////////9na2v9ZXmH/Oj9D/ztBRf9OUFL/aWdl/2ln + Zf9pZ2X/aWdl/2VjYv9FSEv/PEFF/zxBRcE8QEURPEBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkQAPEFFADxBRUU8QUX0PEFF/1NUVf9pZ2X/aWdl/2ln + Zf9pZ2X/Y2Jh/0NHSv87QEX/O0BE/zo/Q/9xdXf/6+zs//////////////////////////////////// + /////////Pz8//X19f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/19fX//Pz8//// + ////////////////////////////////////////6+zs/3B0d/86P0P/O0BE/ztBRf9BRUj/YGBf/2ln + Zf9pZ2X/aWdl/2lnZf9TVFX/PEFF/zxBRfQ8QUVGPEFFADtARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Q0QAOkBFADxBRYc8QUX/QERH/2BfXv9qZ2X/aWdl/2ln + Zf9pZ2X/VldX/zxBRf9BRkr/Wl5h/z5DR/87QUT/hYmL//X19f////////////////////////////// + //////////////7+/v/5+fn/8vLy//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8vLy//n5+f/+/v7///////// + ///////////////////////////////////09fX/homL/zxBRf89Qkb/YWVp/0VKTf87QET/UlNV/2ln + Zf9pZ2X/aWdl/2pnZf9gX1//QERI/zxBRf88QUWJPURCADs/RwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEFFEDxBRcQ7QEX/SEtN/2dlY/9pZ2X/aWdl/2ln + Zf9nZWP/SEtN/zo/Q/9cYGT/wMHC/21xc/86P0P/P0RI/5eanP/5+fn///////////////////////// + /////////////////////////Pz8//b29v/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/29vb//Pz8//////////////////// + //////////////////////////////n5+f+Xmpz/P0NH/zo/Q/9tcXT/x8jI/2drbv85P0P/RUhL/2Vk + Yv9pZ2X/aWdl/2lnZf9nZWT/SEtO/ztARf88QUXGPEFFETxBRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFGRgA8QUUAPEFFLjxBRek8QUX/UlRV/2lnZf9pZ2X/aWdl/2pn + Zf9gX17/QERH/zo/Q/+JjI7/4uLi/8fHyP9eYmX/OT5C/0FGSv+ipaf//Pz8//////////////////// + ///////////////////////////////////7+/v/9fX1//Hx8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/9PT0//v7+/////////////////////////////// + /////////////////////////Pz8/6Olp/9CR0r/OT5C/15iZf/Hx8j/5OPj/5eZm/88QUX/PkNG/11d + XP9qaGX/aWdl/2lnZf9pZ2X/U1RV/zxBRf88QUXqPEFFMDxBRQA7PkIAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVJRwA8QUUAPEFFVzxBRfo9Qkb/W1tb/2poZf9pZ2X/aWdl/2po + Zf9XWFj/PEFF/0NHS/+ztLX/4uLi/+Li4v+8vb7/Vlte/zk+Qv9FSU3/p6mr//v7+/////////////// + /////////////////////////////////////////v7+//r6+v/19fX/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//T09P/6+vr//v7+//////////////////////////////////// + ///////////////////7+/z/p6qr/0VKTf85PkL/Vlpd/7y9vv/i4uL/4uLi/72+v/9ITVD/O0BE/1RV + Vv9pZ2X/aWdl/2lnZf9qaGX/W1xb/z1CRv88QUX7PEFFWjxBRQA6PUEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1CRAA7QEYAPEFFfTxBRf9ARUj/YWBf/2lnZf9pZ2X/aWdl/2ln + Zf9PUVL/Oj9D/1NXW//Mzc3/4eHh/+Dg4P/i4eH/tba4/1JWWf85PkL/RElN/6Wnqf/6+vr///////// + ///////////////////////////////////////////////////+/v7/+/v7//b29v/y8vL/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Ly8v/29vb/+/v7//7+/v////////////////////////////////////////////// + //////////////v7+/+lqKr/RElN/zk+Qv9RVln/tba3/+Hh4f/g4OD/4eHh/9PT1P9bX2L/Oj9D/0xO + UP9oZmX/aWdl/2lnZf9pZ2X/YmFg/0FFSP88QUX/PEFFgTxBRgA8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA9QkUBPEFFmjxBRf9DR0r/ZWRi/2lnZf9pZ2X/aWdl/2hm + ZP9JTE7/OT5C/2VpbP/Z2dr/4ODg/+Dg4P/g4OD/4eHh/7K0tf9SVln/OT5C/0NITP+cnqD/9/f3//// + ///////////////////////////////////////////////////////////////////9/f3/+Pj4//T0 + 9P/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx + 8f/09PT/+Pj4//z8/P////////////////////////////////////////////////////////////// + ////////9/f3/52fof9DSEz/OT5C/1FVWf+xs7T/4eHh/+Dg4P/g4OD/4ODg/9zc3P9vc3b/OT5C/0ZK + TP9nZWT/aWdl/2lnZf9pZ2X/ZWRj/0RIS/88QUX/PEFFnz1ARgI8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUFPEFFsztBRf9HSk3/Z2Vk/2lnZf9pZ2X/aWdl/2Zl + Y/9GSUz/OT5C/3V4e//d3d3/4ODg/+Dg4P/g4OD/4ODg/+Hh4f+ztLX/VFhb/zk+Qv9ARUn/jpGT/+/v + 7/////////////////////////////////////////////////////////////////////////////7+ + /v/8/Pz/+Pj4//X19f/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Ly8v/19fX/+Pj4//z8 + /P/+/v7///////////////////////////////////////////////////////////////////////// + ///v7/D/jZCT/0BFSf85PkL/VFhb/7O0tf/h4eH/4ODg/+Dg4P/g4OD/4ODg/9/f3/9/goT/OT5C/0RI + Sv9lY2L/aWdl/2lnZf9pZ2X/Z2Zk/0hLTf87QUX/PEFFuDpDRwY6REcAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADlFRwA6Q0cIPEFFvztARf9KTU//aGZk/2lnZf9pZ2X/aWdl/2Vk + Yv9ESEv/OT5C/3t+gP/e3t7/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/h4eH/ubq8/1peYf86P0P/PEFF/3h8 + fv/h4uP///////////////////////////////////////////////////////////////////////// + ///////////////////9/f3/+/v7//j4+P/29vb/9PT0//Ly8v/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/9PT0//b29v/4+Pj/+/v7//39/f////////////// + /////////////////////////////////////////////////////////////////////////////+Hi + 4v95fH//PEFF/zo/Q/9aXmH/ubq7/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P+ChYf/OT5C/0NH + Sv9kY2H/aWdl/2lnZf9pZ2X/aGZk/0tNUP87QEX/PEFFxDtCRQs7Q0UAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpCRAA7QkQLPEFFxDtARf9LTlD/aGZk/2lnZf9pZ2X/aWdl/2Zk + Y/9FSEv/OT5D/3R3ef/b29v/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4uHh/8LDw/9nam3/O0BE/zo/ + Q/9hZWn/x8nK//7+/v////////////////////////////////////////////////////////////// + /////////////////////////////////////////v7+//7+/v/8/Pz/+/v7//r6+v/6+vr/+fn5//n5 + +f/5+fn/+fn5//r6+v/6+vr/+/v7//z8/P/+/v7//v7+//////////////////////////////////// + ///////////////////////////////////////////////////////////////////+/v7/yMnK/2Jl + af86P0P/O0BE/2Zqbf/CwsP/4uLh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9ra2v96fH7/OT9D/0NH + Sv9kY2H/aWdl/2lnZf9pZ2X/aGZk/0xOUP87QEX/PEFFyDxBRhA7QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpCRgA7QkYLPEFFwztARf9LTU//aGZk/2lnZf9pZ2X/aWdl/2dl + ZP9GSkz/Oj9D/2dqbP/Pzs7/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Li4v/Nzs7/eHt+/z9E + R/85PkL/TVFV/6Olp//y8vP///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////Lz8/+jpaf/TFFU/zk+ + Qv8/Q0f/eHt+/83Ozv/i4uL/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/83My/9tb3L/Oj9D/0VI + S/9mZGP/aWdl/2lnZf9pZ2X/aGZk/0xOUP87QEX/PEFFyTxBRhA8QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADtDRgA7QkYGPEFFuTtARf9JTE//aGZk/2lnZf9pZ2X/aWdl/2hm + ZP9KTU//Oj9D/1hcX/+9u7v/2tra/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/h4eH/2NjY/5KU + lv9ITFD/OT5C/z5DR/93en3/1NXW//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1NbW/3d7ff8+Q0f/OT5C/0hN + UP+SlZb/19jY/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/19fW/727u/9dYGP/Oj9D/0lM + Tv9oZmT/aWdl/2lnZf9pZ2X/aGZk/0tNT/87QEX/PEFFwTxARgk9QEYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA8QUUDPEFFqTtARf9IS07/aGZl/2lnZf9pZ2X/aWdl/2ln + Zf9RU1T/O0BE/0pOUf+qqan/ysnI/93d3P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4eHh/9/f + 3/+vsLL/XWFk/ztARP85PkL/UVVZ/6Gjpf/s7e3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+zt7f+hpKb/UVVZ/zk+Qv87QET/XWFk/66w + sf/f39//4eHh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/b29r/yMbF/62srP9MUVT/OkBE/09R + U/9pZ2X/aWdl/2lnZf9pZ2X/aGdl/0lMT/87QEX/PEFFszxBRAU8QUQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRQA6REkAPEFFiztARf9GSk3/amlo/2lnZf9pZ2X/aWdl/2po + Zf9aWlr/PUJG/z5DRv+QkJH/wsC//8vKyf/d3Nz/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/i4uL/y8zM/4CDhf9ESU3/OT5C/z1CRv9mam3/ury9//T19f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09fX/uru9/2drbv89Qkb/OT5C/0RJTf9/goX/y8vM/+Li + 4v/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9vb2//Ix8b/wsC+/5OUlP8/REf/PEFF/1lZ + Wf9qaGX/aWdl/2lnZf9pZ2X/a2lo/0dLTv87QET/PEFFljpAQwE8QUUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5CRwA8QUUAPEFFaTxBRf9BRUn/bm1t/2xqZ/9pZ2X/aWdl/2ln + Zf9jYmH/QkZJ/zo/Q/9oa23/vLu6/8C+vf/Ix8b/2djY/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/g4OD/4eHh/9zc3P+sra//YGRn/z1CRv84PkL/QkdL/3J2eP/AwcP/9PT0//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9PX1/8HCw/9zd3n/QkdL/zg+Qv88QUX/YGRn/6utrv/c3Nz/4eHh/+Dg + 4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/2NjY/8fGxf/Avr3/vbu7/2tucP86P0P/QkZJ/2Jh + YP9pZ2X/aWdl/2lnZf9raWf/b25t/0JHSv88QUX/PEFFczxBRQA8QUYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADpARgA8QUUAPEFFQDxBRfE8QUX/aGhp/3VzcP9pZ2X/aWdl/2ln + Zf9pZ2X/TlBS/ztARP9GSk7/oKCg/8LAv//Avr3/w8LB/9HQz//c3Nz/4ODg/+Dg4P/g4OD/4ODg/+Dg + 4P/g4OD/4ODg/+Dg4P/i4uL/0NHR/5SWmP9SVln/O0BE/zk+Qv9DSEz/b3N2/7W3uP/r7Oz///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+vs7P+3ubr/cXV4/0NITP85PkL/O0BE/1FWWf+SlZb/0NDR/+Li4v/g4OD/4ODg/+Dg + 4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9zc3P/R0M//w8LB/8C+vf/CwL//oqGh/0dLT/87QET/TU9R/2hm + Zf9pZ2X/aWdl/2lnZf9zcW//a2tr/z1CRv88QUX2PEFFSjxBRQAxNjoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEFFGTxBRdQ7QET/WFpc/4J/ff9samj/aWdl/2ln + Zf9qZ2X/Xl5d/z9ER/86P0T/aGtt/7q5uP/Bv77/wL69/8C+vf/GxMP/0M/P/9nY2P/d3d3/4N/f/+Dg + 4P/g4OD/4ODg/+Dg4P/e3t7/3Nvb/9TT0/+xsLD/eHp8/0tPUv86P0P/OD1B/z9ESP9fY2b/mJud/9PU + 1f/19fX///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////X1 + 9f/T1NX/mpye/2BkZ/8/REj/OD1B/zo/Q/9LT1P/eHp7/7CwsP/U09P/3Nvb/97e3v/g4OD/4ODg/+Dg + 4P/g4OD/4N/f/93d3f/Z2Nj/0M/O/8bEw//Avr3/wL69/8G/vv+6ubj/aWtu/zpARP8/Q0f/XV1d/2pn + Zf9pZ2X/aWdl/2tpZ/+Bfnz/W11f/ztARP88QUXcO0FFIDxBRQBVVVUAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QkUAO0NFAzxBRaA7QET/RkpN/4B+ff97eHf/aWdl/2ln + Zf9pZ2X/aGZk/05QUv87QET/QEVI/4iJiv/Avr3/wL69/8C+vf/Avr3/wL69/8LAv//GxcT/ysnI/83M + y//Ozc3/zczM/8vKyf/HxsX/w8HA/8C+vv/Bv77/v728/6inp/96fH3/UVVY/z5DR/86P0P/O0BE/0lO + Uv9ucXX/oKOl/8zNzv/t7e7//Pz8//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////Pz8/+7u7//P0NH/oKOl/21x + dP9JTlL/O0BE/zo/Q/8+Q0b/UFRX/3p8ff+op6f/v728/8G/vv/Av77/w8HA/8fGxf/Lysn/zczM/87N + zf/NzMv/ysnI/8bFxP/CwL//wL69/8C+vf/Avr3/wL69/8C+vf+HiIn/QEVI/ztARP9NUFL/aGZk/2ln + Zf9pZ2X/aWdl/3l2dP+CgH//SU1Q/ztARP88QUWsO0BEBztARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QEQAPEFFADxBRVg8QUX6PEFF/2pqa/+Kh4X/dHJw/2ln + Zf9pZ2X/aWdl/2JhYP9DR0r/O0BE/0dMT/+VlZb/wb++/8C+vf/Avr3/wL69/8C+vf/Avr3/v728/8C+ + vf/Avr3/wL69/7+9vP/Avr3/wL69/8C+vf/Avr3/wL69/8LAvv/CwL//mpqb/0pOUv87QET/PEFF/ztA + RP85PkL/Oj9D/0VKTv9fY2b/goWI/6epq//Iycr/39/g/+/v8P/5+fn//f39//////////////////// + /////////////////////////f39//n5+f/v7/D/39/g/8jJyv+nqav/goWI/2BkZ/9HTE//Oj9D/zk+ + Qv87QET/PEFF/ztARP9FSU3/kJGR/8G/vv/CwL//wL69/8C+vf/Avr3/wL69/8C+vf+/vbz/wL69/8C+ + vf/Avr3/v728/8C+vf/Avr3/wL69/8C+vf/Avr3/wL69/5KTk/9HS07/O0BE/0NHSv9iYWD/aWdl/2ln + Zf9pZ2X/cnBu/4qGhP9ubm//PUJG/zxBRf08QUVlPEFFAEFGSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFFADxBRhk8QUXOO0BE/05RVP+Gg4L/iIWD/3Fv + bf9pZ2X/aWdl/2lnZf9bW1v/P0RH/zpARP9JTVH/j4+Q/768u//Bv77/wL69/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wL69/8C+vf/Avr3/wb++/7+9vP+bm5v/WFxf/zxBRf88QUX/SEtO/1FS + VP9KTVD/QUZJ/ztARP86P0P/OT5C/zxBRf9CR0r/UFRY/2BkZ/9xdHf/g4eJ/5GUlv+doKL/pKao/6iq + rP+oqqz/pKao/52gov+RlJb/g4aJ/3B0d/9gZGf/UFRY/0JHSv88QUX/OT5C/zo/Q/87QET/QUVJ/0pN + UP9RU1T/TE5Q/z1BRf88QUX/TlJV/42Ojv+7ubj/wsC//8C+vf/Avr3/wL69/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wL69/8G/vv+9u7r/i4yN/0hMUP86QET/QERI/1tbW/9pZ2X/aWdl/2ln + Zf9vbWv/hoOB/4iFhP9SVVf/O0BE/zxBRdk8QUUhPEFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0JGAD5AQwA8QUV3PEFF/j1CRv9ra2v/jYqI/4aD + gf9xb23/aWdl/2lnZf9pZ2X/V1hY/z9DR/87QET/Q0hL/3Z4ev+ura3/wb++/8G/vv/Avr3/wL69/8C+ + vf/Avr3/wL69/8C+vf/Avr3/wb++/8LAv/+/vr3/qqqp/3d4ev9GSk7/OkBE/zxBRf9MTlD/ZWRj/3h1 + c/+DgX//enl4/2ZnaP9ESEv/PEFF/zxBRf88QUX9O0BE/zo/Q/85PkL/OT5C/zk/Q/86P0P/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/85P0P/OT5C/zk+Qv86P0P/O0BE/zxBRf48QUX/PEFF/0RJTP9mZ2j/eXh3/4OB + f/93dXP/aGZk/1FSVP8+Q0b/OkBE/0BFSf9pa27/oJ+g/7y6uv/CwL//wb++/8C+vf/Avr3/wL69/8C+ + vf/Avr3/wL69/8G/vv/CwL//wL69/6qpqf9xc3X/QUZK/ztARP8/REf/WFlZ/2lnZf9pZ2X/aWdl/3Bt + a/+EgX//jYqI/3BwcP8/Q0f/PEFF/zxBRYY/UEsAPEJGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPT9EADxBRQA8QUYfPEFF0TtARP9JTE//f359/42K + iP+HhIL/c3Fv/2lnZf9pZ2X/aWdl/1hZWf9BRUn/O0BE/zxBRf9SVVn/gIGD/6empv+6uLf/wL69/8G/ + vv/CwL//wsC//8G/vv++vbz/tLOz/52dnf91d3n/TVFU/ztARP87QET/P0RH/1NUVf9raWf/fnx5/4uI + hv+Nioj/jYqI/25ubv9ARUn/PEFF/zxBRco8QUVoPEFFgjxBRaE8QUW8PEFFzzxBRdk8QUXiPEFF5jxB + Rek8QUXpPEFF5jxBReI8QUXZPEFFzzxBRbw8QUWhPEFFgTxBRWo8QUXOPEFF/0FGSf9wcHD/jYqI/42K + iP+LiIb/fnt5/2xqaf9YWFn/QkZJ/ztARP86P0P/RUpO/2hrbf+RkpL/rays/7u5uP+/vr3/wb++/8G/ + vv/Avr3/vry8/7a0tP+goKD/eHp7/01RVf87QET/O0BE/0JGSf9aWlr/aWdl/2lnZf9pZ2X/cnBu/4aD + gf+Nioj/g4GA/01QU/87QET/PEFF3TxBRSk8QUUAPUFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAD9BQgA7QUYAPEFFZTxBRfk7QEX/WVtd/4iG + hP+Nioj/iYaE/3l3df9samf/aWdl/2lnZf9fXl7/SUxO/z1CRf86P0T/PEFF/0hMUP9dYGP/c3V3/4KD + hP+IiYr/hoeI/3x+f/9qbW//VVhc/0JHS/86QET/OkBE/z1CRv9IS07/X19f/3Vzcf+Gg4H/jImH/4yJ + h/+MiYf/cXFx/0NHS/87QEX/PEFF4TxBRT48QUQAPEFDADtBRQQ7QkUJPEFFEjxBRR08QkUoPEFFLTxB + RTE8QUUxPEFFLTxCRSg7QUUdPEFFEjtCRQk8Q0QEO0BGADxBRQA8QUVEPEFF5TtARP9ESEz/dHNz/42K + h/+MiYf/jImH/4aDgf92dHL/Y2Jh/01PUf8/REf/O0BE/zo/Q/8+Q0f/TFBU/19iZP9wcnT/enx+/31/ + gP93eXv/aWtu/1ZaXf9ESEz/O0BE/zpARP89Qkb/Sk1P/2BfX/9pZ2X/aWdl/2tpZ/95d3X/iIaE/42K + iP+Kh4X/X2Bi/zxBRf88QUX9PEFFdjtETgA9QEIAOkZGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1BRAA8QUYAPEJGDTxBRag8QUX/PkNG/2Zn + aP+LiIb/jImH/4yJh/+DgH7/dHFv/2tpZ/9pZ2X/ZmRj/1dYWP9HSkz/PkJG/ztARP86P0P/Oj9D/zpA + RP87QET/O0BE/zo/Q/86P0P/Oj9D/ztARP8/Q0f/SUxO/1xcXP9ycG7/goB+/4uIhv+MiYf/jImH/4yJ + h/9wb3D/REhM/ztARP88QUXsPEFFWT5CRwA7QUYAPEFHADxBRQA7QUUAPEFFADxBRQA8QkUAPEFFADxB + RQA8QUUAPEFFADxCRQA7QUUAPEFFADtCRQA8QkUAPUNEADxBRgA7P0QAPEFFXzxBRe87QET/RUpN/3Jy + cv+MiYf/jImH/4yJh/+LiIb/g4B+/3Nxb/9gYF//TVBR/0FGSf88QUX/OkBE/zk/Q/86P0P/Oj9D/zo/ + Q/86P0P/Oj9D/zo/Q/87QET/P0NH/0lMTv9aWlr/ZmVj/2lnZf9raWf/dHFv/4OAfv+MiYf/jImH/4yJ + h/9sbG3/P0RI/zxBRf88QUW5PEBFFDxARQA9QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QUUAPEFGADtBRSk8QUXRPEFF/0BF + SP9ra2z/i4iG/4yJh/+MiYf/ioeF/4J/ff92dHL/bWtp/2poZv9lZGL/XFxb/1BSU/9HS03/QkZJ/0BE + SP8/REf/P0RH/0FFSP9ER0r/S01P/1ZXWP9mZWT/d3Vz/4SBf/+LiIb/jImH/4yJh/+Nioj/ioeF/2lq + a/9CRkr/O0BE/zxBRe88QUVmQUhCATxCRAA7QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRgA8QUYAPENJAjxBRW48QUXzO0BE/0NH + S/9sbW3/i4iG/42KiP+MiYf/jImH/4uIhv+EgX//eHZ0/2loZ/9aW1v/T1FS/0dKTf9DR0r/QUVJ/0FF + Sf9CRkn/RUhL/0tNT/9TVFX/Xl5d/2ZlY/9qaGb/bmtp/3Z0cv+Cf33/ioeF/4yJh/+MiYf/jImH/3Fx + cf9DR0v/O0BF/zxBRd48QUU3PUFFAEBFSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9QkcAPEJGADxBRAA8QUVFPEFF4jtB + Rf9BRUn/aGlp/4qHhf+Nioj/jImH/4yJh/+LiIb/h4SC/4B9e/94dnT/c3Fv/29ta/9raWf/Z2Zk/2Rj + Yv9jYmL/ZWRk/2ppaP9ycG7/enh2/4OAfv+JhoT/jImH/4yJh/+MiYf/jImH/42KiP+DgYD/XV9g/z9E + R/87QUX/PEFF6DxBRWA8PEICPEFEAD1CRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQA8QUYAPEFGADxARwQ8QUVpPEFF7DtA + Rf9AREj/YGJj/4WCgf+Nioj/jImH/4yJh/+MiYf/jImH/4mGhP+DgH7/e3l2/3Nxb/9ta2r/aGdl/2Zl + ZP9mZWT/aWdm/2xqaP9wbWv/c3Fv/3h2dP+AfXv/h4SC/4uIhv+MiYf/jImH/4yJh/+LiIb/b29v/0RI + S/87QET/PEFF7DxBRVY5QUMAPUBFADI2OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEFGADxBRQA8QEcAPEFFUTxB + ReQ7QUX/P0NH/15fYf+DgX//jYqI/4yJh/+MiYf/jImH/42Jh/+MiYf/i4iG/4mGhP+HhIL/hoOB/4aD + gf+IhYL/iYaE/4qHhf+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+Nioj/ioeF/3Nycv9OUVT/PEFF/zxB + Rf88QUXaPEFFT0Y0XgA8QEQAPEBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBGADxARQA3REIBPEFFVzxB + ReA8QUX/PEFF/1FTVv92dXX/i4iG/42KiP+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+Kh4X/iYaD/4eE + gv+Gg4H/hoOB/4eEgv+JhoT/i4iG/4yJh/+MiYf/jImH/4yJh/+MiYf/jYqI/4aEgv9kZWb/QUVJ/ztA + RP88QUXuPEFFZTtGRAE9QUUAPUFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRAA8QUQAPEJGADxB + RUo8QUXYPEFF/zxBRf9NUFP/cnFx/4mGhP+Nioj/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jYqI/4qHhv95eHf/Wlxe/0BFSP87QET/PEFF/jxB + RbU8QUUyPEFGADxBRAA8QkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxBRAA8QkUAPUBGADxB + RTo8QUW/PEFF/ztARP9CRkr/Xl9h/317ev+LiIb/jYqI/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jImH/4yJh/+MiYf/jImH/42KiP+LiIb/eHd3/1NWWP89Qkb/PEFF/zxB + ReU8QUVdO0hIAjxCRgA9QUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEBFADxB + RAA8QUUzPEFFtzxBRf07QET/QERI/1VYWv9zcnL/hoOC/4yJh/+Nioj/jYqI/4yJh/+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+Nioj/jYqI/4yJh/+Fg4H/c3Jy/1lbXf9CR0r/O0BE/zxBRf88QUXkPEFFfDxB + RRQ8QUUAPEJEADxCRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QUUAPEJFADtA + RAA8QUUaPEFFiTxBReo8QUX/O0FF/0RJTP9dX2D/d3Z2/4eFg/+Niof/jYqI/42KiP+MiYf/jImH/4yJ + h/+MiYf/jImH/4yJh/+MiYf/jYmH/42KiP+Nioj/iYaE/3l4d/9cXV//QkdK/ztARP88QUX/PEFFyTxB + REQ/TEYAO0JFADtDRgBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + RdI8QUXZPEFF1zxBRc48QUW5PEFFmzxBRXM8QUVCPEFGFzA9XwA8QUUAPEFEAD5ESAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAPj5EADY/QQA5PEAAO0FEADxBRQA8QUUAPEBGADxCRQU8QUULPEFFDjxB + RQ88QUUMPEFECDtAQgI8QUUAPEFFADxARQA9P0UAO0NGAEM6PwAAgIAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAyR08APEJFADxBRQA8QUUAPEFFADtBQwA8QUYHPEFFDTxB + RhI8QUUZPEFFFjxBRRA7QUUKO0BHAjxBRQA8QUUAPEFGADtBRwA9O0oAOkVGAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QkYAPEJEADxBRQA8QUUAPEFFADxB + RQA8QUUAPEFFADxBRAA/PkMAPj5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAOkFJAD1BRgA8QUYAPEFFADxB + RgA8QUUAPEFFADxBRQA7QUUAPEFGADk9QgA6PkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////8A////////////////////AP///////////////////wD///////////// + //////8A//////8AAAAAAP//////AP///+AAAAAAAAAAB////wD///4AAAAAAAAAAAB///8A///gAAAA + AAAAAAAAB///AP//4AAAAAAAAAAAAAf//wD//+AAAAAAAAAAAAAH//8A///gAAAAAAAAAAAAB///AP// + 4AAAAAAAAAAAAAf//wD//+AAAAAAAAAAAAAH//8A///wAAAAAAAAAAAAD///AP///4AAAAAAAAAAAf// + /wD////8AAAAAAAAAD////8A//////8AAAAAAP//////AP/////+AAAAAAA//////wD////4AAAAAAAA + AB////8A////wAAAAAAAAAAD////AP///gAAAAAAAAAAAH///wD///AAAAAAAAAAAAAP//8A///gAAAA + AAAAAAAAB///AP//wAAAAAAAAAAAAAP//wD//wAAAAAAAAAAAAAA//8A//4AAAAAAAAAAAAAAH//AP/8 + AAAAAAAAAAAAAAA//wD/+AAAAAAAAAAAAAAAH/8A//AAAAAAAAAAAAAAAA//AP/gAAAAAAAAAAAAAAAH + /wD/4AAAAAAAAAAAAAAAB/8A/8AAAAAAAAAAAAAAAAP/AP+AAAAAAAAAAAAAAAAB/wD/AAAAAAAAAAAA + AAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD+AAAAAAAAAAAAAAAAAH8A/gAAAAAA + AAAAAAAAAAB/APwAAAAAAAAAAAAAAAAAPwD8AAAAAAAAAAAAAAAAAD8A+AAAAAAAAAAAAAAAAAAfAPgA + AAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPAAAAAAAAAAAAAAAAAA + DwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAA + AAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAA + AAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAA + AAAAAAAAAAAAAAAADwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAA + DwDwAAAAAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAPAPAAAAAAAAAAAAAAAAAADwDwAAAAAAAAAAAA + AAAAAA8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAA + AAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD8AAAAAAAAAAAAAAAAAD8A/AAAAAAAAAAAAAAAAAA/APwA + AAAAAAAAAAAAAAAAPwD+AAAAAAAAAAAAAAAAAH8A/gAAAAAAAAAAAAAAAAB/AP4AAAAAAAAAAAAAAAAA + fwD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAA/wD/gAAAAAAAAAAA + AAAAAf8A/4AAAAAAAAAAAAAAAAH/AP/AAAAAAAAAAAAAAAAD/wD/wAAAAAAAAAAAAAAAA/8A/4AAAAAA + AAAAAAAAAAH/AP+AAAAAAAAAAAAAAAAB/wD/AAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAD/AP4A + AAAAAAAAAAAAAAAAfwD+AAAAAAAAAAAAAAAAAH8A/gAAAAAAAAAAAAAAAAB/APwAAAAAAAAAAAAAAAAA + PwD8AAAAAAAAAAAAAAAAAD8A/AAAAAAAAAAAAAAAAAA/APgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAA + AAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAA + AAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgA + AAAAAAAAAAAAAAAAHwD4AAAAAAAAAAAAAAAAAB8A+AAAAAAAAAAAAAAAAAAfAPgAAAAAAAAAAAAAAAAA + HwD8AAAAAAAAAAAAAAAAAB8A/AAAAAAAAAAAAAAAAAA/APwAAAAAAAAAAAAAAAAAPwD+AAAAAAAAAAAA + AAAAAD8A/gAAAAAAAAAAAAAAAAB/AP4AAAAAAAAAAAAAAAAAfwD+AAAAAAAAAAAAAAAAAH8A/wAAAAAA + AAAAAAAAAAD/AP+AAAAAAA//8AAAAAAA/wD/gAAAAAAf//AAAAAAAf8A/8AAAAAAP//8AAAAAAP/AP/g + AAAAAH///gAAAAAH/wD/8AAAAAD///8AAAAAB/8A//gAAAAB////gAAAAB//AP/8AAAAA////8AAAAA/ + /wD//wAAAA/////wAAAAf/8A///AAAA//////AAAAf//AP//4AAA//////8AAAf//wD///8AH/////// + 8AB///8A////////////////////AP///////////////////wD///////////////////8A//////// + ////////////AA== + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAs + 7QAAAk1TRnQBSQFMAgEBFAEAAaABAAGgAQABxgEAAcYBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABGAEDAgABpAEEAgABAQEAAQgFAAFgAVsBDhcAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPA + AQABwAHcAcABAAHwAcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANN + AQADQgEAAzkBAAGAAXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGt + AgAB/wEzAwABZgMAAZkDAAHMAgABMwMAAjMCAAEzAWYCAAEzAZkCAAEzAcwCAAEzAf8CAAFmAwABZgEz + AgACZgIAAWYBmQIAAWYBzAIAAWYB/wIAAZkDAAGZATMCAAGZAWYCAAKZAgABmQHMAgABmQH/AgABzAMA + AcwBMwIAAcwBZgIAAcwBmQIAAswCAAHMAf8CAAH/AWYCAAH/AZkCAAH/AcwBAAEzAf8CAAH/AQABMwEA + ATMBAAFmAQABMwEAAZkBAAEzAQABzAEAATMBAAH/AQAB/wEzAgADMwEAAjMBZgEAAjMBmQEAAjMBzAEA + AjMB/wEAATMBZgIAATMBZgEzAQABMwJmAQABMwFmAZkBAAEzAWYBzAEAATMBZgH/AQABMwGZAgABMwGZ + ATMBAAEzAZkBZgEAATMCmQEAATMBmQHMAQABMwGZAf8BAAEzAcwCAAEzAcwBMwEAATMBzAFmAQABMwHM + AZkBAAEzAswBAAEzAcwB/wEAATMB/wEzAQABMwH/AWYBAAEzAf8BmQEAATMB/wHMAQABMwL/AQABZgMA + AWYBAAEzAQABZgEAAWYBAAFmAQABmQEAAWYBAAHMAQABZgEAAf8BAAFmATMCAAFmAjMBAAFmATMBZgEA + AWYBMwGZAQABZgEzAcwBAAFmATMB/wEAAmYCAAJmATMBAANmAQACZgGZAQACZgHMAQABZgGZAgABZgGZ + ATMBAAFmAZkBZgEAAWYCmQEAAWYBmQHMAQABZgGZAf8BAAFmAcwCAAFmAcwBMwEAAWYBzAGZAQABZgLM + AQABZgHMAf8BAAFmAf8CAAFmAf8BMwEAAWYB/wGZAQABZgH/AcwBAAHMAQAB/wEAAf8BAAHMAQACmQIA + AZkBMwGZAQABmQEAAZkBAAGZAQABzAEAAZkDAAGZAjMBAAGZAQABZgEAAZkBMwHMAQABmQEAAf8BAAGZ + AWYCAAGZAWYBMwEAAZkBMwFmAQABmQFmAZkBAAGZAWYBzAEAAZkBMwH/AQACmQEzAQACmQFmAQADmQEA + ApkBzAEAApkB/wEAAZkBzAIAAZkBzAEzAQABZgHMAWYBAAGZAcwBmQEAAZkCzAEAAZkBzAH/AQABmQH/ + AgABmQH/ATMBAAGZAcwBZgEAAZkB/wGZAQABmQH/AcwBAAGZAv8BAAHMAwABmQEAATMBAAHMAQABZgEA + AcwBAAGZAQABzAEAAcwBAAGZATMCAAHMAjMBAAHMATMBZgEAAcwBMwGZAQABzAEzAcwBAAHMATMB/wEA + AcwBZgIAAcwBZgEzAQABmQJmAQABzAFmAZkBAAHMAWYBzAEAAZkBZgH/AQABzAGZAgABzAGZATMBAAHM + AZkBZgEAAcwCmQEAAcwBmQHMAQABzAGZAf8BAALMAgACzAEzAQACzAFmAQACzAGZAQADzAEAAswB/wEA + AcwB/wIAAcwB/wEzAQABmQH/AWYBAAHMAf8BmQEAAcwB/wHMAQABzAL/AQABzAEAATMBAAH/AQABZgEA + Af8BAAGZAQABzAEzAgAB/wIzAQAB/wEzAWYBAAH/ATMBmQEAAf8BMwHMAQAB/wEzAf8BAAH/AWYCAAH/ + AWYBMwEAAcwCZgEAAf8BZgGZAQAB/wFmAcwBAAHMAWYB/wEAAf8BmQIAAf8BmQEzAQAB/wGZAWYBAAH/ + ApkBAAH/AZkBzAEAAf8BmQH/AQAB/wHMAgAB/wHMATMBAAH/AcwBZgEAAf8BzAGZAQAB/wLMAQAB/wHM + Af8BAAL/ATMBAAHMAf8BZgEAAv8BmQEAAv8BzAEAAmYB/wEAAWYB/wFmAQABZgL/AQAB/wJmAQAB/wFm + Af8BAAL/AWYBAAEhAQABpQEAA18BAAN3AQADhgEAA5YBAAPLAQADsgEAA9cBAAPdAQAD4wEAA+oBAAPx + AQAD+AEAAfAB+wH/AQABpAKgAQADgAMAAf8CAAH/AwAC/wEAAf8DAAH/AQAB/wEAAv8CAAP//wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + 7QABTQH0LAABGwEsAXWVAAFNAfQsAAEbASwBdZUAAU0B9CwAARsBLAF1lQABTQH0LAABGwEsAXWSAAF1 + BiwB9icAARsFLAGUkAABdQYsAfYnAAEbBSwBlJAAAXUGLAH2JwABGwUsAZSQAAF1BiwB9icAARsFLAGU + jwABdQgsAfYkAAHzCSwBlI0AAXUILAH2JAAB8wksAZSNAAF1CCwB9iQAAfMJLAGUjQABdQgsAfYkAAHz + CSwBlIwAAXUKLCQAARsJLAGUjAABdQosJAABGwksAZSMAAF1CiwkAAEbCSwBlIwAAXUKLCQAARsJLAGU + jAABdQosIwAB9AssAZqLAAF1CiwjAAH0CywBmosAAXUKLCMAAfQLLAGaiwABdQosIwAB9AssAZqKAAF1 + CywjAAH0CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMA + AfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMAAfQLLAGaigABlAFNCiwjAAH0 + CywBmooAAZQBTQosIwAB9AssAZqKAAGUAU0KLCMAAfQLLAGaigABlAFNCiwjAAH0CywBmosAAXUKLCMA + AfQBTQksAU0BGosAAXUKLCMAAfQBTQksAU0BGosAAXUKLCMAAfQBTQksAU0BGosAAXUKLCMAAfQBTQks + AU0BGosAAZQBTQgsAU0kAAH0AU0HLAFNARqMAAGUAU0ILAFNJAAB9AFNBywBTQEajAABlAFNCCwBTSQA + AfQBTQcsAU0BGowAAZQBTQgsAU0kAAH0AU0HLAFNARqNAAGUAU0GLAFNJgAB9AFNBSwBTQGajgABlAFN + BiwBTSYAAfQBTQUsAU0Bmo4AAZQBTQYsAU0mAAH0AU0FLAFNAZqOAAGUAU0GLAFNJgAB9AFNBSwBTQGa + jwABlAZ1KAAB9AV1AZqQAAGUBnUoAAH0BXUBmpAAAZQGdSgAAfQFdQGakAABlAZ1KAAB9AV1AZr/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD9AAH2N/SOAAH2N/SOAAH2N/SOAAH2N/SMAAH2AfQBTTcsAXWLAAH2 + AfQBTTcsAXWLAAH2AfQBTTcsAXWLAAH2AfQBTTcsAXWJAAH2AfMBTTosAXWIAAH2AfMBTTosAXWIAAH2 + AfMBTTosAXWIAAH2AfMBTTosAXWHAAH0AXU9LAGahgAB9AF1PSwBmoYAAfQBdT0sAZqGAAH0AXU9LAGa + hQAB9AF1PSwBTQEahQAB9AF1PSwBTQEahQAB9AF1PSwBTQEahQAB9AF1PSwBTQEahAAB9AF1PSwBTQEa + hQAB9AF1PSwBTQEahQAB9AF1PSwBTQEahQAB9AF1PSwBTQEahQABdQYsOHUBGoYAAXUGLDh1ARqGAAF1 + Biw4dQEahgABdQYsOHUBGoUAAfQBdQUsAXW+AAH0AXUFLAF1vgAB9AF1BSwBdb4AAfQBdQUsAXW+AAF1 + BSwBdb8AAXUFLAF1vwABdQUsAXW/AAF1BSwBdb4AAfQBdQUsAfS+AAH0AXUFLAH0vgAB9AF1BSwB9L4A + AfQBdQUsAfS+AAF1BSwBdb8AAXUFLAF1vwABdQUsAXW/AAF1BSwBdb8AAXUFLAH0vwABdQUsAfS/AAF1 + BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0 + vwABdQUsAfS/AAF1BSwB9L8AAXUFLCMaARucAAF1BSwjGgEbnAABdQUsIxoBG5wAAXUFLCMaARubAAHz + AXUoLAFNDRoB840AAfMBdSgsAU0NGgHzjQAB8wF1KCwBTQ0aAfONAAHzAXUoLAFNDRoB840AAXU3LAF1 + AhoB84oAAXU3LAF1AhoB84oAAXU3LAF1AhoB84oAAXU3LAF1AhoB84oAAXU6LAF1ARoB84gAAXU6LAF1 + ARoB84gAAXU6LAF1ARoB84gAAXU6LAF1ARoB84gAAXU8LAF1ARoB84YAAXU8LAF1ARoB84YAAXU8LAF1 + ARoB84YAAXU8LAF1ARoB84YAAXU+LAF1AfOFAAF1PiwBdQHzhQABdT4sAXUB84UAAXU+LAF1AfOFAAF1 + PywBdQHzhAABdT8sAXUB84QAAXU/LAF1AfOEAAF1PywBdQHzhAABdUAsAZqEAAF1QCwBmoQAAXVALAGa + hAABdUAsAZqEAAF1QCwBdQHzgwABdUAsAXUB84MAAXVALAF1AfODAAF1QCwBdQHzggABGwFNQSwBmoIA + ARsBTUEsAZqCAAEbAU1BLAGaggABGwFNQSwBmoIAAXVCLAF1AfOBAAF1QiwBdQHzgQABdUIsAXUB84EA + AXVCLAF1AfOBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1 + QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBdQEbgAABdUMs + AXUBG4AAAXVDLAF1ARuAAAF1QywBdQEbgAABdUQsAZqAAAF1RCwBmoAAAXVELAGagAABdUQsAZp/AAEa + AU1ELAGafwABGgFNRCwBmn8AARoBTUQsAZp/AAEaAU1ELAGafwABlEUsAZp/AAGURSwBmn8AAZRFLAGa + fwABlEUsAZp/AAGURSwBdQEbfgABlEUsAXUBG34AAZRFLAF1ARt+AAGURSwBdQEbfgABlEYsAZp+AAGU + RiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGa + fgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAXUBG30AAZRGLAF1ARt9AAGURiwBdQEbfQABlEYs + AXUBG30AAZRHLAGafQABlEcsAZp9AAGURywBmn0AAZRHLAGafAABGgFNRywBmnwAARoBTUcsAZp8AAEa + AU1HLAGafAABGgFNRywBmnwAAZRILAGafAABlEgsAZp8AAGUSCwBmnwAAZRILAGafAABlEgsAU0BGnsA + AZRILAFNARp7AAGUSCwBTQEaewABlEgsAU0BGnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGa + ewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGU + SSwBmnsAAZRJLAFNARp6AAGUSSwBTQEaegABlEksAU0BGnoAAZRJLAFNARp6AAGUSiwBmnoAAZRKLAGa + egABlEosAZp6AAGUSiwBmnkAARoBTUosAZp5AAEaAU1KLAGaeQABGgFNSiwBmnkAARoBTUosAZp5AAGU + SywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGa + eQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGU + SywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGa + eQABlEssAZp4AAEaAU1LLAGaeAABGgFNSywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABlEssAZQB9ngA + AZRLLAGUAfZ4AAGUSywBlAH2eAABlEssAZQB9ncAARoBTUssAZp4AAEaAU1LLAGaeAABGgFNSywBmngA + ARoBTUssAZp4AAGUSywBlAH2eAABlEssAZQB9ngAAZRLLAGUAfZ4AAGUSywBlAH2dgABGgF1AU1KLAGU + eAABGgF1AU1KLAGUeAABGgF1AU1KLAGUeAABGgF1AU1KLAGUbgABGgl1AU0ULAErBCwBKwEsBk0BKwNN + ASsjLAGUcQABGgl1AU1JLAGUcQABGgl1AU1JLAGUcQABGgl1AU1JLAGUcAABGgFNDywBGrQAARoBTQ8s + ARq0AAEaAU0PLAEatAABGgFNDywBGrQAARoQLAEbtAABGhAsARu0AAEaECwBG7QAARoQLAEbtAABGg8s + ARq1AAEaDywBGrUAARoPLAEatQABGg8sARq1AAEaDSwBGrcAARoNLAEatwABGg0sARq3AAEaDSwBGrkA + AZoILAEavAABmggsARq8AAGaCCwBGrwAAZoILAEavQAI9r4ACPa+AAj2vgAI9v8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + VQABFhRN/wD/AP8ABgABFhRN/wD/AP8ABgABFhRN/wD/AP8ABgABFhRNEwAB9AGMAbX/AP8A7wABFhRN + EAAB9AHPArQBjQF1AZMBjQG1/wD/ACYAARYTTbIAARYUTQ8AAfQBzwPbAewDegGTAbX/AP8AJQABFhNN + sgABFhRNDwABrgG0A9sB7AJ6AXQBjQGuAbX/AP8AJAABFhNNEgAB9AGuAc8BrgGNAa4BtZkAARYUTQ4A + AfQDtAHPAbQBjQF6AZMBjQGTAXUBB/8A/wAkAAEWE00RAAH0AbQC2wHsAnoBkwHvmAABFhRNDgABzwTb + Aa4BjQGTAY0BdQJ6AZMBtf8A/wAjAAEWE00QAAH0AbQD2wHsA3oBkwHvlwABFhRNDgABzwPbAbQBjQGT + Aa4BkwF6AXUBkwGNAbX/AFwAARYTTbIAARYTTQ8AAfQCzwG0AdsBugGNAXoBdQGTAY0BHAHvlgABFhRN + DgABzwK0Aa4BkwF0AewBkwONAogBtv8AXAABFhNNEQAB9AGuAc8BtAGNApMBjQG1mAABFhNNDwABzwPb + AbQBzwHtAXQBkwHtAnoBkwG1lQABFhRNDgABrgKTAXoBdQKTAXUBkwGMAYgBjwGIAbb/AFwAARYTTRAA + AfQBzwHVAtsB7AJ6AXUBkwG1lwABFhNNDwABzwPbAbQBrgKNAe0CegF1AZMBtZUAARYUTQ4AAY0BdQJ6 + AZMBjQF6AZMBjQGIAYIBiAGOAQf/AFwAARYTTRAAAa4BtAPbAewCegF0AZMBrgG1lgABFhNNDwABzwLb + AbQB7AKTAY0B7QF0AZMCjQG1lQABFhRNDwABkwF6AXUB7QGTAXoBkwGIAY8BiAGCAba9AAHzAq4BjQH3 + mgABFhNNDwAB9AW0AY0BegGTAY0BkwF1AQeWAAEWE00PAAGuAc8BjQGTAXUBkwGNAXUBkwGuAYIBjwGI + AbaVAAEWFE0PAAGNApMBjQF6AXUBjgGIAY8BiAGNAQe7AAHzAc8BtAHbAewBegF1AZMB95gAARYTTQ8A + Ac8D2wG0Aa4B7AGTAY0BkwJ6AZMBtZUAARYTTQ8AAY0DegF0AY0BdAF1AY0CggGPAYgBtZUAARYUTRAA + A40CdQGOAogBjgG2lgABlBRNEAAB8wHPA9sBjQN6AZMB75cAARYTTQ8AAc8D2wG0AY0B7QGuAZMCdQGT + AY4BtZUAARYTTQ8AAa8BkwJ6ApMBegGTAYIBjwKIAY4BB5IAAfYBFgEbARYUTQEAARcPAAGvAfcBkwGZ + AZMCrwEHlwABlBRNEAABzwK0AdsBtAGNAXoBdQGTAo0B75YAARYTTQ8AAc8BugK0Ae0BkwGNAZMBjQHt + AY0CggG2lQABFhNNEAAB9wJ1AewCdQGTAYgBjwGIAY0BvJMAARYZTQEXrQABlBRNDwAB8wLbArQBzwHs + AXUBkwGNAXUBegGTAbWVAAEWE00PAAGuAY0BkwF0AXUCkwF1AZMBjAGIAY8BiAG2lQABFhNNEQACkwGN + AXoBdQGOAYgBjwGOAbyTAAEWG00BF6wAAZQUTQ8AAc8E2wGuA40CegF1AZMBtZUAARYTTQ8AAfcBdQJ6 + AZMBjQF1AXQBjQGIAYIBiAGOAQeVAAEWE00SAAH3AY0BdAGTAY4BggGOAbyTAAEWHU0BF6sAAZQUTQ8A + Ac8C2wK0ApMBjQGTAXQBkwKNAbWVAAEWE00QAAGTAXoBdQKTAXoBkwGCAY8BiAGCAbaWAAEWE00SAAH0 + AbUB9wHvAfcBtQEHkwABvQEXHU0BFwGUqgABlBRNDwABzwK0AY0CkwGNAZMB7QGNAYICiAG2lQABFhNN + EAAB9wGTAXQBjQF6AXUBkwGIAY8BiAGNAbyUAAL0ARYTTQL0AfaqAAG9AeMbTQEXAZSrAAGUFE0PAAGu + AXQBdQF6AXUB7QGTAXUBjgGCAYgBjwGIAbaVAAEWE00RAAH3AZMBjQF6AXUBkwKIAY4BB5QAARYYTQEX + AfSqAAG9ARcLTQEWApQBFwpNARcBlKwAAZQUTQ8AAbUBkwJ6AZMBjQF6AZMBjQGPAogBjgG8lQABFhNN + EgABtQH3ApMCjQG2AQeUAAEWGk0BFwH0qgABvQEXCE0BFgGUAwAClAEXB00BFwGUrQABlBRNDwAB9AGN + AnUBjQGTAXoBkwGIAY8BiAGCAbaWAAEWE00TAAH0A7UBB5UAARYcTQEXAfSqAAG9AeMHTQcAAeMHTQGU + rgABlBRNEAABtQHtAZMBjQF6AXUBkwGIAY8BiAGNAbyWAAEWE02sAAGUHk0BF6sAAb0BFwVNARYHAAGU + ARcFTQGUrwABlBRNEQABtQHvAY0BdAKTAYIBjgG2AbyVAAL0ARYTTQL0qgABvQHjHE0BFwGUrAABvQWU + CQAGlLAAAZQUTRMAAbUB7wIHAbUBvJUAAfYBFhdNARcB9KoAAb0B4xpNARcBlP8AcwABlBRNrQAB9gEW + GU0BFwHzqgABvQHjCU0GlAEXCE0BFwGU/wB0AAGUFE2sAAH0ARYbTQEXAfOqAAG9AeMHTQGUBgABlAEX + Bk0BFwGU/wB1AAGUFE2sAAGUHU0BFwHzqgABvQHjBk0IAAHjBk0BlP8AdAAB9AEAAZQUTQLzqgABGgHj + HE0BFwGUqwABvQaUCAABmgaU/wB0AAH0ARYBvQEWFU0BFwHzqgABGgHjGk0BFwGU/wD/ADYAAfQBFhlN + ARcB86oAARoB4wlNBZQBFwlNARcBlP8A/wA2AAH0ARYbTQEXAfOqAAEaAeMHTQGUBQABmgEXB00BFwGU + /wD/ADYAAfQBFh1NARerAAEaAeMGTQcAAb0BFwZNAZT/AP8ANwABGgHjHU0BF6wAARoGmggAAb0Gmv8A + /wA5AAEaAeMbTQEXAZr/AP8A/AABGgHjCk0BlASaARcJTQEXAZr/AP8A/gABGgHjCE0BlAUAAb0BFwdN + ARcBvf8A/wD/AAEAARoB4wZNAZQHAAHjB00Bvf8A/wD/AAMAARoGvQgACL3/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wDQAAFNAfQsAAEbASwBdZUAAU0B9CwAARsBLAF1lQABTQH0 + LAABGwEsAXWVAAFNAfQsAAEbASwBdZIAAXUGLAH2JwABGwUsAZSQAAF1BiwB9icAARsFLAGUkAABdQYs + AfYnAAEbBSwBlJAAAXUGLAH2JwABGwUsAZSPAAF1CCwB9iQAAfMJLAGUjQABdQgsAfYkAAHzCSwBlI0A + AXUILAH2JAAB8wksAZSNAAF1CCwB9iQAAfMJLAGUjAABdQosJAABGwksAZSMAAF1CiwkAAEbCSwBlIwA + AXUKLCQAARsJLAGUjAABdQosJAABGwksAZSMAAF1CiwjAAH0CywBmosAAXUKLCMAAfQLLAGaiwABdQos + IwAB9AssAZqLAAF1CiwjAAH0CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0 + CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMAAfQLLAGa + igABdQssIwAB9AssAZqKAAGUAU0KLCMAAfQLLAGaigABlAFNCiwjAAH0CywBmooAAZQBTQosIwAB9Ass + AZqKAAGUAU0KLCMAAfQLLAGaiwABdQosIwAB9AFNCSwBTQEaiwABdQosIwAB9AFNCSwBTQEaiwABdQos + IwAB9AFNCSwBTQEaiwABdQosIwAB9AFNCSwBTQEaiwABlAFNCCwBTSQAAfQBTQcsAU0BGowAAZQBTQgs + AU0kAAH0AU0HLAFNARqMAAGUAU0ILAFNJAAB9AFNBywBTQEajAABlAFNCCwBTSQAAfQBTQcsAU0BGo0A + AZQBTQYsAU0mAAH0AU0FLAFNAZqOAAGUAU0GLAFNJgAB9AFNBSwBTQGajgABlAFNBiwBTSYAAfQBTQUs + AU0Bmo4AAZQBTQYsAU0mAAH0AU0FLAFNAZqPAAGUBnUoAAH0BXUBmpAAAZQGdSgAAfQFdQGakAABlAZ1 + KAAB9AV1AZqQAAGUBnUoAAH0BXUBmv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP0AAfY39I4AAfY39I4A + AfY39I4AAfY39IwAAfYB9AFNNywBdYsAAfYB9AFNNywBdYsAAfYB9AFNNywBdYsAAfYB9AFNNywBdYkA + AfYB8wFNOiwBdYgAAfYB8wFNOiwBdYgAAfYB8wFNOiwBdYgAAfYB8wFNOiwBdYcAAfQBdT0sAZqGAAH0 + AXU9LAGahgAB9AF1PSwBmoYAAfQBdT0sAZqFAAH0AXU9LAFNARqFAAH0AXU9LAFNARqFAAH0AXU9LAFN + ARqFAAH0AXU9LAFNARqEAAH0AXU9LAFNARqFAAH0AXU9LAFNARqFAAH0AXU9LAFNARqFAAH0AXU9LAFN + ARqFAAF1Biw4dQEahgABdQYsOHUBGoYAAXUGLDh1ARqGAAF1Biw4dQEahQAB9AF1BSwBdb4AAfQBdQUs + AXW+AAH0AXUFLAF1vgAB9AF1BSwBdb4AAXUFLAF1vwABdQUsAXW/AAF1BSwBdb8AAXUFLAF1vgAB9AF1 + BSwB9L4AAfQBdQUsAfS+AAH0AXUFLAH0vgAB9AF1BSwB9L4AAXUFLAF1vwABdQUsAXW/AAF1BSwBdb8A + AXUFLAF1vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUs + AfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsIxoBG5wAAXUFLCMa + ARucAAF1BSwjGgEbnAABdQUsIxoBG5sAAfMBdSgsAU0NGgHzjQAB8wF1KCwBTQ0aAfONAAHzAXUoLAFN + DRoB840AAfMBdSgsAU0NGgHzjQABdTcsAXUCGgHzigABdTcsAXUCGgHzigABdTcsAXUCGgHzigABdTcs + AXUCGgHzigABdTosAXUBGgHziAABdTosAXUBGgHziAABdTosAXUBGgHziAABdTosAXUBGgHziAABdTws + AXUBGgHzhgABdTwsAXUBGgHzhgABdTwsAXUBGgHzhgABdTwsAXUBGgHzhgABdT4sAXUB84UAAXU+LAF1 + AfOFAAF1PiwBdQHzhQABdT4sAXUB84UAAXU/LAF1AfOEAAF1PywBdQHzhAABdT8sAXUB84QAAXU/LAF1 + AfOEAAF1QCwBmoQAAXVALAGahAABdUAsAZqEAAF1QCwBmoQAAXVALAF1AfODAAF1QCwBdQHzgwABdUAs + AXUB84MAAXVALAF1AfOCAAEbAU1BLAGaggABGwFNQSwBmoIAARsBTUEsAZqCAAEbAU1BLAGaggABdUIs + AXUB84EAAXVCLAF1AfOBAAF1QiwBdQHzgQABdUIsAXUB84EAAXVDLAGagQABdUMsAZqBAAF1QywBmoEA + AXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMs + AZqBAAF1QywBmoEAAXVDLAF1ARuAAAF1QywBdQEbgAABdUMsAXUBG4AAAXVDLAF1ARuAAAF1RCwBmoAA + AXVELAGagAABdUQsAZqAAAF1RCwBmn8AARoBTUQsAZp/AAEaAU1ELAGafwABGgFNRCwBmn8AARoBTUQs + AZp/AAGURSwBmn8AAZRFLAGafwABlEUsAZp/AAGURSwBmn8AAZRFLAF1ARt+AAGURSwBdQEbfgABlEUs + AXUBG34AAZRFLAF1ARt+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYs + AZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBdQEb + fQABlEYsAXUBG30AAZRGLAF1ARt9AAGURiwBdQEbfQABlEcsAZp9AAGURywBmn0AAZRHLAGafQABlEcs + AZp8AAEaAU1HLAGafAABGgFNRywBmnwAARoBTUcsAZp8AAEaAU1HLAGafAABlEgsAZp8AAGUSCwBmnwA + AZRILAGafAABlEgsAZp8AAGUSCwBTQEaewABlEgsAU0BGnsAAZRILAFNARp7AAGUSCwBTQEaewABlEks + AZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsA + AZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAU0BGnoAAZRJLAFNARp6AAGUSSwBTQEa + egABlEksAU0BGnoAAZRKLAGaegABlEosAZp6AAGUSiwBmnoAAZRKLAGaeQABGgFNSiwBmnkAARoBTUos + AZp5AAEaAU1KLAGaeQABGgFNSiwBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEss + AZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkA + AZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEss + AZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABGgFN + SywBmngAARoBTUssAZp4AAGUSywBlAH2eAABlEssAZQB9ngAAZRLLAGUAfZ4AAGUSywBlAH2dwABGgFN + SywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABGgFNSywBmngAAZRLLAGUAfZ4AAGUSywBlAH2eAABlEss + AZQB9ngAAZRLLAGUAfZ2AAEaAXUBTUosAZR4AAEaAXUBTUosAZR4AAEaAXUBTUosAZR4AAEaAXUBTUos + AZRuAAEaCXUBTTAsASUYLAGUcQABGgl1AU0tLAwlECwBlHEAARoJdQFNMywEKxIsAZRxAAEaCXUBTR0s + AyUBLAErAiUlLAGUcAABGgFNDywBGigAAfMDQwHqhwABGgFNDywBGrQAARoBTQ8sARq0AAEaAU0PLAEa + GwABSgFzAUqWAAEaECwBGygAAeoBEQESAfQB8wHshgABGhAsARu0AAEaECwBG7QAARoQLAEbGQAB7QGZ + AhwBc5YAARoPLAEaKAAB6gJFAfMB6gHsAvQB7IQAARoPLAEatQABGg8sARocAAHqARKXAAEaDywBGhcA + AewBHAGZAZgEmQHrlQABGg0sARoqAAERAUQB6gH0AhEB6gHsAfIB6gHtggABGg0sARq3AAEaDSwBGhsA + AeoBEgEAAfQBEJcAARoNLAEaFwAB7QIcAZgDmQGYApkBcpcAAZoILAEaLQABEQETAfMBEgMRAUMB7AH0 + AfIB7YMAAZoILAEavAABmggsARocAAFtAQAC9AEAARICE5gAAZoILAEaGAABkgEcAZgEmQEcAhQBEgGZ + ARyYAAj2LgAB8wESAQAB8wQRAUMB7AHzAUMB7YMACPa+AAj2GwABbQEAAfYBAAESAeoB7AEcAZgBFJkA + CPYWAAHsAZIBbQFzBpkBEgHtAQcBbQFzAZkB7M4AAfQBEgHrAfMDEQFtAfMBEwERAev/AGoAAesBFAMA + AeoBbQHrARwBmAKZAXMBFLQAAZIBHAG8ARoBbQFzAZkB9AMAAZkBEwGTAb0C69IAAfMB6wEAAfMBEQFt + AfQCRAHrqwABEwMUuAAB6wH0AwABbQHrAXMBmAaZARXBAAEUAerWAAH0AesBAAHzARQBRAFuqQABEgIU + AfQBAAIQtgAB6wH0AgABbQESAewBHAGYA5kBmAJtARwBmQHr/wCbAAHzARQBFQERAW2oAAESARUB9AIA + ARQB6gHrAXMBFbIAAesBFQH0AgABbQESARQBHAaZARMBbgHsARUBmQGYARP/AP8ARgAB6gEVAfQBAAET + ARUBbQFzAZgCmQEUsQAB6wHzAgAC6wEcAbwBFAEcBZkBmAEVARoBvQETARwBmQES/wCHAAEVAUO5AAFt + AkMB9AEAARIBFAHqARwBmASZAXMBFbEAAesBFQHsAZMBGgK9ARMBHAGZAfYCAAKZARQB7QEcAUMDAAEV + /wCDAAEUAkMCAAFDtgABbQFDAfQCAAESARMB6wGYBJkBHAGYApkBQ7AAAesB8wYAARIB9AcAAeoEAAFD + /wCCAAEUAREDAAEVARIBFbQAAesBEQH0AQAB6gERARMBcwGYBZkBSgEUAUMBcwGZAW0BQ7AAAesB9AUA + ARMB9gEAARMBEQcAARH/AIIAARMBEAIAARUBEQFtARwBmQFzARCxAAHrARAB8wEAAeoBQwFtAW4BbQGY + BZkBcwESARoBkwEVAZkBHAERsQABbQUQAQ8B9gQAARQBEAIAAUP/AIEAARICEAH0AQABFAEVAesBmASZ + ARWwAAHrAfMBAAFtARQB7AEaAb0BBwESAZgFmQFzAeoBvQEHAUMCmQFDvwABQ/8AgQABEgEPAfQCAAIU + AXMHmQHrARCvAAHrAg8B9AEaA70BGgEUAfQFAAGZARMBFQERAwABEP8A/wBAAAHqAQ8B9AEAARMBEAFK + ARwFmQFyARMBcgKZARGwAAFtAfQGAAETAfYKAAIP/wD/AD4AAW0CEAH0AQABEgEVAREBcwaZAXIBEgGT + ARIB6wGZAW2xAAFtARAB9AIAARIIEAMAAREBEP8A/wA/AAHrAfMCAAHqARMB7QEaAewB6wEcBZkBSgGT + Ab0BHAESAZkBHAEQsgABbQMQAfQHAAEVAhD/AP8AQQAB6wEPARABEgGTAxoB7QFtAZgBmQIAApkBcwES + ARwBEgHrAgABEP8A/wD/AAMAAesBDwHzBQAB6wERAfQGAAFzARUDAAERAUP/AP8A/wAEAAHrAUMB8wQA + ARMBEQRDAfQFAAJD/wD/AP8ACAAB6wVDAfQEAAETAUMBAAEUAkP/AP8A/wAXAAET/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AegAF9P8A + /wD/ABQAAfQB8wHPAbQBrgGTAY0B9wH0/wD/AP8AEQAB8wHPAbQC2wHsAnoBdQGNAbX/AP8ATQAE9L4A + Aa4BtAPbAY0CegF0AZMBjQG1/wD/AEoAAfQB8gHPAq4B9wL0lwABlBNNEAAB8wHPBLQBjQF6AZMB7QOT + AfT/AP8ASAAB8wHPArQB7AF6AXQBkwH3AfSWAAGUE00QAAHPA9sBtAGuAY0BkwGNAZMCegGTAbX/AP8A + RwAB8gHPA9sBrgJ6AXUBkwH3AfSVAAGUE00QAAHPA9sBtAHsAY0BrgGTAnUCkwHv/wCDAAb0vQABzwK0 + AdsBtAHsAXoBdQGTAo0B9wH0lAABlBNNEAABzwG6ArQB7QKTAo0BkwGNAoIBtv8AggAB8gLPAa4BkwGN + AfcC9JYAFPQQAAHyAbQB2wO0AY0BdQGTAY0BdAF6AZMBtZQAAZQTTRAAAa4BjQHtAZMBdQGTAe0BdQGT + AYwBiAGPAYgBtv8AgQAB8gG0AtsBjQJ6AXUBjQG1AfSUAAGUFE0QAAHPBNsBrgONAXUBegF1AZMBtZQA + AZQTTRAAAbUBdQJ6AXQBjQJ1AY0BiAGCAogBtb4AAfMB9L8AAfIBtAPbAa4CegF1AZMBjQG1lAABlBRN + EAABzwLbArQCkwGNA5MBjgGNAbaUAAGUE00RAAGTAXoBdQKTAXoBkwGCAY8BiAGCAY4BvLsAAfMB9AHx + Aa4B9wH0AfMB9LsAAfIBzwS0AewBegKTAe0BkwHvAfSTAAGUFE0QAAGuArQB7QKTAY0BkwKNAYICiAG2 + lAABlBNNEQAB7wGTAXQBjQJ1AZMBiAGPAYgBjQG8uwAB8QHPArQB7AF1AZMB7QH3AfS6AAHPA9sBtAHP + AY0BkwHtAZMCegGTAbWTAAGUFE0QAAGuAZMBdAF6AXUCkwF1AZMBggGIAY8BiAG2lAABlBNNEgAB7wGT + AY0BegF1AZMCiAGOAby7AAHwAc8D2wHPA3oBkwH3AfSUAAH0E/MRAAHPA9sBtASNAXoBdQKTAe+TAAGU + FE0QAAG1AZMCegGTAY0BegGTAY0DiAGOAbyUAAGUE00TAAG1Ae8CkwGOAY0BtgG8vAABzwK0AtsBrgF6 + AXUCkwGNAfcB9JMAAZQTTREAAc8DtAHtApMCjQGTAY4BjQGCAbaTAAGUFE0QAAH0AY0CdQHtAZMBegGT + AYgBjwGIAYIBtpUAAZQTTRUAAbUB7wG1Aby9AAHxAbQB1QO0AY0BdQGTAe0BkwF6AZMBtZMAAZQTTREA + Aa4C7QGTAXUBkwHtAXUBkwGMAYIBjwGIAbaTAAGUFE0RAAG1Ae0BkwGNAXoBdQGTAYgBjwGIAY0BvJUA + AZQTTdYAAc8E2wGuAY0B7QGNAXQBegF1AZMBtZMAAZQTTREAAe8BdQJ6AXQBjQF0AXUBjQGIAYICiAG1 + kwABlBRNEgACBwGNAnQBkwGCAYgBjQG8lgABlBNN1gABzwLbArQB7QGTAY0B7QOTAY0B75MAAZQTTRIA + AZMBegF1ApMBegGTAYIBjwGIAYIBjgHwkwABlBRNFAABBwO8ArYBvJcAAZQTTbEAAfQTGxEAAc8CtAHt + ApMB7QGTAe0CjQKIAbaTAAGUE00SAAEHAZMBdQGNAXUBegGTAYgBjwGIAYIBtZQAAZQUTbIAAZQTTbEA + AZQTTREAAa4CkwJ1ApMBdQGTAYIBiAGPAYgBtpMAAZQTTRMAAQcBkwGNAnoBkwGIAY8BjgG2AfCUAAGU + FE2wAAHzAQABlBNNAQABG68AAZQTTREAAe8BkwJ6AZMBjQF6AZMBjQSIAbWTAAGUE00UAAIHApMBjgGC + AY4B8JYAAZQUTa8AAfMBFgEaARYTTQEbAU0BG64AAZQTTREAAfQBjQJ1ApMBegGTAYIBjwGIAYIBjQHw + kwABlBNNFgAEBwHwlwABlBRNrgAB8wEWGE0BFwEbrQABlBNNEgABBwKTAY0CegGTAYgBjwGIAY0B8JQA + AZQTTbIAAZQUTa0AAfMBFhpNARcBG6wAAZQTTRMAAQcCjQJ1AZMBggGIAY4B8ZUAAZQTTbIAAZQUTawA + AfMBFhxNARcBGqsAAZQTTRQAAQcCvAGNAZICvAHwlgABlBNNsAAB8wEAAZQUTQEAARqqAAEaAeMcTQEX + Ab2rAAGUE00XAAEHAfCZAAGUE02vAAHzARYBvQEWFE0BGgFNARqqAAEaAeMaTQEXAb2sAAGUE02yAAGU + E02uAAHzARYZTQEXARqqAAEaAeMKTQGaA70BFwlNARcBva0AAZQTTbIAAZQTTa0AAfMBFhtNARcBGqoA + ARoB4whNAZoEAAEaARcITQG9rgABlBNNsgABlBNNrAAB8wEWHU0BFwEaqgABGgHjBk0BmgYAARoBFwZN + Ab2vAAGUE02wAAEbAQABlBNNrAABGwEWHU0BFwEaqwABGgHjBE0BmggAAeMFTQG9sAABlBNNrwABGwEW + AZoB4xNNARoCvaoAARsB4xtNARcBva0AARoEvQkAARoFvbEAAZQTTa4AARsBFhlNARqqAAEbAeMLTQO9 + ARcKTQEXARr/AHQAAZQTTa0AARsBFhpNARcBGqoAARsB4whNAb0BGgMAAhoBFwhNARr/AHUAAZQTTawA + ARsBFhxNARcBGqoAARsB4wdNBwAB4wdNARr/AHYAAZQTTawAAZQeTQEXqwABGwHjBU0BvQcAARoBFwVN + ARr/AHQAARoCvQHjE00DvakAARsBFhxNARcBGqwAARsFvQkAARoFvf8AdAABGgHjGU0BvakAAfMBFgxN + Ar0B4wtNARcBGv8A/wA2AAEaAeMaTQEXAb2pAAHzARYJTQG9ARoCAAIaARcJTQEa/wD/ADYAARoB4xxN + ARcBvakAAfMBFgdNAb0GAAEaARcHTQEa/wD/ADcAAZQeTQEXqgAB8wEWBk0IAAHjBk0BGv8A/wA4AAHz + ARYcTQEXARqrAAHzBhoIAAca/wD/ADoAAfMBFgxNAhoB4wtNARcBGv8A/wD9AAHzARYJTQIaAgABGwEa + AeMJTQEa/wD/AP8AAfMBFgdNARoGAAEbARcHTQEa/wD/AP8AAgAB8wEWBk0IAAHjBk0BGv8A/wD/AAQA + AfMGGwgABxv/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AJkAAU0B9CwAARsBLAF1lQABTQH0 + LAABGwEsAXWVAAFNAfQsAAEbASwBdZUAAU0B9CwAARsBLAF1kgABdQYsAfYnAAEbBSwBlJAAAXUGLAH2 + JwABGwUsAZSQAAF1BiwB9icAARsFLAGUkAABdQYsAfYnAAEbBSwBlI8AAXUILAH2JAAB8wksAZSNAAF1 + CCwB9iQAAfMJLAGUjQABdQgsAfYkAAHzCSwBlI0AAXUILAH2JAAB8wksAZSMAAF1CiwkAAEbCSwBlIwA + AXUKLCQAARsJLAGUjAABdQosJAABGwksAZSMAAF1CiwkAAEbCSwBlIwAAXUKLCMAAfQLLAGaiwABdQos + IwAB9AssAZqLAAF1CiwjAAH0CywBmosAAXUKLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0 + CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMAAfQLLAGa + igABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAZQBTQosIwAB9AssAZqKAAGUAU0KLCMAAfQLLAGa + igABlAFNCiwjAAH0CywBmooAAZQBTQosIwAB9AssAZqLAAF1CiwjAAH0AU0JLAFNARqLAAF1CiwjAAH0 + AU0JLAFNARqLAAF1CiwjAAH0AU0JLAFNARqLAAF1CiwjAAH0AU0JLAFNARqLAAGUAU0ILAFNJAAB9AFN + BywBTQEajAABlAFNCCwBTSQAAfQBTQcsAU0BGowAAZQBTQgsAU0kAAH0AU0HLAFNARqMAAGUAU0ILAFN + JAAB9AFNBywBTQEajQABlAFNBiwBTSYAAfQBTQUsAU0Bmo4AAZQBTQYsAU0mAAH0AU0FLAFNAZqOAAGU + AU0GLAFNJgAB9AFNBSwBTQGajgABlAFNBiwBTSYAAfQBTQUsAU0Bmo8AAZQGdSgAAfQFdQGakAABlAZ1 + KAAB9AV1AZqQAAGUBnUoAAH0BXUBmpAAAZQGdSgAAfQFdQGa/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /QAB9jf0jgAB9jf0jgAB9jf0jgAB9jf0jAAB9gH0AU03LAF1iwAB9gH0AU03LAF1iwAB9gH0AU03LAF1 + iwAB9gH0AU03LAF1iQAB9gHzAU06LAF1iAAB9gHzAU06LAF1iAAB9gHzAU06LAF1iAAB9gHzAU06LAF1 + hwAB9AF1PSwBmoYAAfQBdT0sAZqGAAH0AXU9LAGahgAB9AF1PSwBmoUAAfQBdT0sAU0BGoUAAfQBdT0s + AU0BGoUAAfQBdT0sAU0BGoUAAfQBdT0sAU0BGoQAAfQBdT0sAU0BGoUAAfQBdT0sAU0BGoUAAfQBdT0s + AU0BGoUAAfQBdT0sAU0BGoUAAXUGLDh1ARqGAAF1Biw4dQEahgABdQYsOHUBGoYAAXUGLDh1ARqFAAH0 + AXUFLAF1vgAB9AF1BSwBdb4AAfQBdQUsAXW+AAH0AXUFLAF1vgABdQUsAXW/AAF1BSwBdb8AAXUFLAF1 + vwABdQUsAXW+AAH0AXUFLAH0vgAB9AF1BSwB9L4AAfQBdQUsAfS+AAH0AXUFLAH0vgABdQUsAXW/AAF1 + BSwBdb8AAXUFLAF1vwABdQUsAXW/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0 + vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1 + BSwjGgEbnAABdQUsIxoBG5wAAXUFLCMaARucAAF1BSwjGgEbmwAB8wF1KCwBTQ0aAfONAAHzAXUoLAFN + DRoB840AAfMBdSgsAU0NGgHzjQAB8wF1KCwBTQ0aAfONAAF1NywBdQIaAfOKAAF1NywBdQIaAfOKAAF1 + NywBdQIaAfOKAAF1NywBdQIaAfOKAAF1OiwBdQEaAfOIAAF1OiwBdQEaAfOIAAF1OiwBdQEaAfOIAAF1 + OiwBdQEaAfOIAAF1PCwBdQEaAfOGAAF1PCwBdQEaAfOGAAF1PCwBdQEaAfOGAAF1PCwBdQEaAfOGAAF1 + PiwBdQHzhQABdT4sAXUB84UAAXU+LAF1AfOFAAF1PiwBdQHzhQABdT8sAXUB84QAAXU/LAF1AfOEAAF1 + PywBdQHzhAABdT8sAXUB84QAAXVALAGahAABdUAsAZqEAAF1QCwBmoQAAXVALAGahAABdUAsAXUB84MA + AXVALAF1AfODAAF1QCwBdQHzgwABdUAsAXUB84IAARsBTUEsAZqCAAEbAU1BLAGaggABGwFNQSwBmoIA + ARsBTUEsAZqCAAF1QiwBdQHzgQABdUIsAXUB84EAAXVCLAF1AfOBAAF1QiwBdQHzgQABdUMsAZqBAAF1 + QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGa + gQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAXUBG4AAAXVDLAF1ARuAAAF1QywBdQEbgAABdUMs + AXUBG4AAAXVELAGagAABdUQsAZqAAAF1RCwBmoAAAXVELAGafwABGgFNRCwBmn8AARoBTUQsAZp/AAEa + AU1ELAGafwABGgFNRCwBmn8AAZRFLAGafwABlEUsAZp/AAGURSwBmn8AAZRFLAGafwABlEUsAXUBG34A + AZRFLAF1ARt+AAGURSwBdQEbfgABlEUsAXUBG34AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGa + fgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGU + RiwBmn4AAZRGLAF1ARt9AAGURiwBdQEbfQABlEYsAXUBG30AAZRGLAF1ARt9AAGURywBmn0AAZRHLAGa + fQABlEcsAZp9AAGURywBmnwAARoBTUcsAZp8AAEaAU1HLAGafAABGgFNRywBmnwAARoBTUcsAZp8AAGU + SCwBmnwAAZRILAGafAABlEgsAZp8AAGUSCwBmnwAAZRILAFNARp7AAGUSCwBTQEaewABlEgsAU0BGnsA + AZRILAFNARp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGU + SSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBTQEaegABlEks + AU0BGnoAAZRJLAFNARp6AAGUSSwBTQEaegABlEosAZp6AAGUSiwBmnoAAZRKLAGaegABlEosAZp5AAEa + AU1KLAGaeQABGgFNSiwBmnkAARoBTUosAZp5AAEaAU1KLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGa + eQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGU + SywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGa + eQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeAABGgFNSywBmngA + ARoBTUssAZp4AAEaAU1LLAGaeAABGgFNSywBmngAAZRLLAGUAfZ4AAGUSywBlAH2eAABlEssAZQB9ngA + AZRLLAGUAfZ3AAEaAU1LLAGaeAABGgFNSywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABlEssAZQB9ngA + AZRLLAGUAfZ4AAGUSywBlAH2eAABlEssAZQB9nYAARoBdQFNSiwBlHgAARoBdQFNSiwBlHgAARoBdQFN + SiwBlHgAARoBdQFNSiwBlG4AARoJdQFNSSwBlHEAARoJdQFNSSwBlHEAARoJdQFNSSwBlHEAARoJdQFN + SSwBlHAAARoBTQ8sARq0AAEaAU0PLAEatAABGgFNDywBGrQAARoBTQ8sARq0AAEaECwBG7QAARoQLAEb + tAABGhAsARu0AAEaECwBG7QAARoPLAEatQABGg8sARq1AAEaDywBGrUAARoPLAEatQABGg0sARq3AAEa + DSwBGrcAARoNLAEatwABGg0sARq5AAGaCCwBGrwAAZoILAEavAABmggsARq8AAGaCCwBGjAAAeyMAAj2 + vgAI9r4ACPa+AAj2LwABEgETARECEgHs/wD/AP8AFQACRAQRARIB7P8A/wD/ABIAARQBRAFFBhEB7P8A + /wD/ABEAChEBEwHs/wD/AEsAAhQB68AAAfQIEQFtAfMBEQHs/wD/AEgAARQBFQMRARQB678ACREBFQER + Aev/AP8ASAABQwFFBREB674AAfQIEQJDAev/AP8ASAABQwFFAUMFEQEVAey+AAH0BhECRAHr/wD/AEgA + ChEBQwHsvgAB9AURAev/AIMAAfQDQwFtwAALEQHrwAAB9AIRAW3/AIQABREBbb8AAfQLEQHs/wD/AEcA + AUQBRQFEBREBbb4AAfQHEQFDAUQBQwHsqQABQwEPAQABEf8AmQABEQJEBxEB674AAfQGEQFEAW6oAAEV + AQ8CAAERAg//AJgACxEB674AAfQEEQJDAeulAAEUAhACAAJDAW0BmAEU0gAB9AMRAW3AAAwRAey/AAH0 + AkMB66UAARIBEAH0AgABFQEUAXMDmQFzAQ/QAAH0AREBQwQRAW2/AAJDCREB7KoAARUBEQEPuQAB6gER + AfQBAAEUARABSgFzBpkBQ9AAARECRQYRAW2+AAH0AUMGEQJEAeynAAEUAhECAAERtgABbQIRAfQBAAET + AUMBbQEcBJkCHAKZAesBD88AAREBRAFDCBEB670AAfQBFQFDBBECRAHspQABEwFDAwABQwEUAeoBD7MA + AesBQwHzAgABEgERAesGmQHrARUCEwGZAZgBEc8AARULEQHsvgAB9AIVAhEBFAHspAABEgFDAfQCAAEV + ARIBcwKZARSxAAHrAUMB8wEAAeoBEAFtARwBFAEcBpkBFQEHAb0B6gFzAZkBbdAAARQKEQHsqwABFBQA + AfQBFAHsowABbQIVAfQBAAEUAUMBbQEcBJkBcwEPsAAB6wHyAesBFAHrAQcCvQHqARwGmQEUAZMBGgET + ARwBmQEAARDQAAEUCREB7KgAARMCFQEAARC3AAHrARUB9AIAARMBFAHrAZgDmQKYApkBQ7AAAesBDwH0 + AQABGwMaAeoB9AYAARwBEgETARQDAAEU0AAB9AETARQFEQJEAeymAAESARQB9AIAAkO1AAHrARQB8wIA + AhIBcwWZAXMCEgFzAZkBbbAAAewBEAHyBQABEwHzCwACFNMAAfQBEwEUAxECRAHtpAAB6gEUAfQBAAEV + AUMBSgEcAXMBD7EAAW0BFQEUAfMBAAHqAUMBEwESAZgFmQGYARUBkwHtARQBmQEcARCwAAHsAhQB8wEA + ARMBFQcUAfQCAAETARTDAAL2EwAB9AQSAeyhAAH2AesCFAH0AQACFAHrAZgDmQEVAfavAAHrAQ8B8gEA + AW0BFAHsARoBvAETARwFmQEcARMCGgFDApkBbbMAAewCFAH0BwAB6gIUwgAC9AESARMBDwH0twAB9AHr + ARMB8wH0AfYBEwESAXMGmQHrAQ+vAAHtARABFAESARwEGgEUApkDAAEIAZkBFAFuAe0BbQEAAvT/AIEA + A/QB6gETAvQBQwEPtAAC9AHrARMB8wH0ARMBQwFKAXMEmQEcAnMBmQGYARGwAAHsAfIGAAETAfME9AIA + ARwB6wEAAvQBEwES/wB/AAL0AesCEgL0ARUBFAHrARQB9LAAAfYB9AHsAhIB8gH0AeoBEQHqARwFmQEc + ARQBbQEUAXMBmQHqAfSwAAHsAfIF9AEUARMEEgL0AQAC9AIS/wB/AAL0AesBEgHzAvQBFAESAXMCmQFz + AQ+wAAHrARQB8gL0AW0B6gHtAW4B6wGYBZkBbQFuAb0BkwEUAZkBHAEPsQAB7AYSBQAB6wESAfQB6gES + /wB+AAP0AesBEgHzAfQBFAFDAeoBcwWZAUOwAAHrAfEB7AHqAesBkwEaAb0BkwHqAZkFCAFzAW0BBwLs + AQgBAAEQvwABbf8AfgAC9AHsAuoB8gH0ARIBFAHrARwDmQIcAZgBmQHrAfSvAAHtAREB8wEAARsDGgEH + ARQB9AUAAQgB7AHrAeoBAAL0Aer/AP8APQAC9AHsAeoB8gL0AhMBcwGYBJkBHAHqARIBbQGYARwBEbAA + Ae0B8Qb0ARQB8gX0AgAD9AFtAer/AP8APQAB9AHtAW0B8QH0AeoBFQFtARUBHAaZARIB7AG8ARIBcwGZ + AeoB9LAAAe0CbQERAQ8BEghtAfMB9AHrAm3/AP8APwAB6wHwAfMBbQETAewBBwG9AW0BcwGZBAgBmQEU + AZMBGgFtAXIBCAEcAQ+zAAHtAW0B9AgAAesBbf8A/wBCAAHrAQ8B6gGSARoDGwHrAZIBCAQAAQgBHAHq + AW0B6wEcAQAB8wHr/wD/AP8AAwAB9wFDAfAFAAESAfEF8wIAAe8B6wPzAev/AP8A/wAFAAH3AesB8QTz + ARQBbQXrAfID8wPr/wD/AP8ACAAB9wXrBgAB7AEQAuv/AP8A/wAYAAHs/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AEAAE8wH0/wD/AP8AFAAB8wHxAc8BrgKNAfcB9P8A/wD/ABIA + AfEBtALbAa4CegKTAfMB9P8A/wD/AA8AAfABzwPbAc8CegF1AZMBjQG1/wD/AEsAAfIF8wH0vAABzwS0 + AewBegF0A5MB7wH0/wD/AEgAAfIB8QK0Aa4CkwGNAfcB87oAAfAD2wG0Ac8BjQOTAXUBegGTAbX/AP8A + RwAB8AHPAbQC2wG0AnoBdQGTAbUB87kAAc8D2wG0BI0BegF1ApMB7/8AhAAD8QHzvgABzwK0AtsBkQJ6 + ApMBjQHvuQABzwHVArQB7QKTAY0B7QGTAo4BjQG2/wCCAAHyAfABzwGuAY0B9wLzuwAB8AW0AY0BdQOT + AXUBmQHzuAABrgLtAZMBdAGTAe0BdQGTAa4BggGPAYgBtv8AgQAB8AG0AdUB2wGuAXoBdQKTAfO6AAHP + A9sBtAGuAY0BkwGNAZMCegGTAe+4AAEHAXUCegF1AY0BkwF1AY4CggKIAbb/AIAAAbwBzwPbAbQCegF1 + AZMB9wHzuQABzwLbAdUBtAHtAZMCjQF0ApMBjgHvkgAB8xMaEwABkwJ6ApMBegGTAY0BjwGIAYIBjgHx + vQAE8QHzvQABzwS0AY0BegF1A5MB9wHzuAABzwK0AZICkwHtApMCjQKIAbaSAAGUE00TAAEHAZMBdQGN + AXQBegGTAYgBjwGIAYIBtrwAAfEBGQG0Aa4DkwHxAfO6AAG8AdUC2wG0Ac8BjQOTAXUBegGTAbW4AAGu + ApMBdAF1ApMBdQGTAoIBjwGIAbaSAAGUE00UAAG8AZMBjQJ6AZMBiAGPAYgBjQHwuwAB8AG0AtsBtAJ6 + AXUBkwGvAfO5AAHPA9sBtAGuA40CdQGTARwB77gAAQcBkwJ6AZMBjQJ1AY0EiAG1kgABlBNNFQABBwGu + A5MBggGOAbwB8LsAAbwCtALbAc8CegKTAewB77kAAc8B1QK0AZICkwGNAe0BkwKOAY0BtrgAAfQBjQJ1 + ApMBegGTAYIBjwGIAYIBjgHxkgABlBNNFgAFvAHxvQAFtAGNAXUDkwF0AZMB87gAAa4B9wGSA5MBjQKT + Aa4BggKIAbaSAAEbE70TAAEHApMBjQF1AXoBkwGIAY8BiAGNAfGTAAGUE03YAAEJA9sBtAHPAY0BkwHt + AZMCegGTAe+4AAG8AZMBdQF6AXUB7QGTAXUBjgKCAogBtpIAAZQTTRQAAQcCjQF1AXoBkwGCAYgBjgHy + lAABlBNN2AABzwPbAbQB7QGTAa4BjQF1ApMBjgHvuQABkwJ6AZMB7QF6AZMBjQGPAYgBggGOAfKSAAGU + E00VAAG8AQcEjQHwAfGVAAGUE03YAAHPArQBtQEcAZMB7QKTAo0CiAG2uQABvAGTAXUB7QGTAXoBkwGC + AY8BiAGCAbaTAAGUE00XAAO8AfGXAAGUE03YAAG8ARwCkwF1ApMBdQGTAoIBjwGIAba6AAG8AZMBjQJ6 + AZMBiAGPAYgBrwHykwABlBNNsgABlBNN2QABkwJ6AZMBjQJ1AY0DiAGxAfK7AAG8Aa4DkwGCAY4B8AHy + lAABlBNNsgABlBNN2AAB9AGNAXoBdQKTAXoBkwGCAY8BiAGCAba9AALwAvEB8AHylgABlBNNsgABlBNN + 2QABvAGTAXQBjQF1AXoBkwGIAY8BiAGvAfP/AFoAAZQTTbIAAZQTTdoAAbwCjQJ6AZMBggGIAY4B8/8A + WwABlBNNsgABlBNN2wAC8AEaAe0BjQGvAfIB8/8AXAABlBNNsgABlBNN3gAC8QHz/wBeAAGUE02yAAGU + E03/AP8AQAABlBNNsAABGgEAAZQTTQEAAr3/AP8APQABlBNNrwABGgHjAZQB4xNNAZoBFwFNAb3/AP8A + PAABlBNNrgABGgHjGk0Bvf8A/wA7AAGUE02tAAEaAeMcTQG9/wD/ADoAAZQTTa0AAZQdTQEX/wD/ADoA + AZQTTa0AAfQBFhtNARcBG/8A/wA3AAG9AZoBAAGUE00BAAKaqwAB9AEWDE0BGgHjDE0BG/8A/wA3AAG9 + AeMBTQGUAeMTTQGUARcBTQGUqwAB9AEWCE0BGgIbAQAB8wEbAeMJTQEb/wD/ADcAAb0B4xtNrAAB9AEW + Bk0BGgYAAfMB4wdNARv/AP8AOAABlBxNAZSsAAH0ARYFTQgAAfMB4wVNARv/AP8AOQAB9AEWG00B860A + AfQF8wkABvP/AP8AOwAB9AEWCk0BGgPzAeMKTQHz/wD/AP8AAfQBFgdNARoB8wQAAfQB8wHjB00B8/8A + /wD/AAIAAfQBFgZNCAAB4wZNAfP/AP8A/wAEAAH2ARYETQEaCAAB9AHjBE0B8/8A/wD/AAYAAfYE9AoA + BfT/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP4AAU0B9CwAARsBLAF1lQABTQH0LAABGwEsAXWVAAFN + AfQsAAEbASwBdZUAAU0B9CwAARsBLAF1kgABdQYsAfYnAAEbBSwBlJAAAXUGLAH2JwABGwUsAZSQAAF1 + BiwB9icAARsFLAGUkAABdQYsAfYnAAEbBSwBlI8AAXUILAH2JAAB8wksAZSNAAF1CCwB9iQAAfMJLAGU + jQABdQgsAfYkAAHzCSwBlI0AAXUILAH2JAAB8wksAZSMAAF1CiwkAAEbCSwBlIwAAXUKLCQAARsJLAGU + jAABdQosJAABGwksAZSMAAF1CiwkAAEbCSwBlIwAAXUKLCMAAfQLLAGaiwABdQosIwAB9AssAZqLAAF1 + CiwjAAH0CywBmosAAXUKLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMA + AfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9Ass + AZqKAAF1CywjAAH0CywBmooAAZQBTQosIwAB9AssAZqKAAGUAU0KLCMAAfQLLAGaigABlAFNCiwjAAH0 + CywBmooAAZQBTQosIwAB9AssAZqLAAF1CiwjAAH0AU0JLAFNARqLAAF1CiwjAAH0AU0JLAFNARqLAAF1 + CiwjAAH0AU0JLAFNARqLAAF1CiwjAAH0AU0JLAFNARqLAAGUAU0ILAFNJAAB9AFNBywBTQEajAABlAFN + CCwBTSQAAfQBTQcsAU0BGowAAZQBTQgsAU0kAAH0AU0HLAFNARqMAAGUAU0ILAFNJAAB9AFNBywBTQEa + jQABlAFNBiwBTSYAAfQBTQUsAU0Bmo4AAZQBTQYsAU0mAAH0AU0FLAFNAZqOAAGUAU0GLAFNJgAB9AFN + BSwBTQGajgABlAFNBiwBTSYAAfQBTQUsAU0Bmo8AAZQGdSgAAfQFdQGakAABlAZ1KAAB9AV1AZqQAAGU + BnUoAAH0BXUBmpAAAZQGdSgAAfQFdQGa/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/QAB9jf0jgAB9jf0 + jgAB9jf0jgAB9jf0jAAB9gH0AU03LAF1iwAB9gH0AU03LAF1iwAB9gH0AU03LAF1iwAB9gH0AU03LAF1 + iQAB9gHzAU06LAF1iAAB9gHzAU06LAF1iAAB9gHzAU06LAF1iAAB9gHzAU06LAF1hwAB9AF1PSwBmoYA + AfQBdT0sAZqGAAH0AXU9LAGahgAB9AF1PSwBmoUAAfQBdT0sAU0BGoUAAfQBdT0sAU0BGoUAAfQBdT0s + AU0BGoUAAfQBdT0sAU0BGoQAAfQBdT0sAU0BGoUAAfQBdT0sAU0BGoUAAfQBdT0sAU0BGoUAAfQBdT0s + AU0BGoUAAXUGLDh1ARqGAAF1Biw4dQEahgABdQYsOHUBGoYAAXUGLDh1ARqFAAH0AXUFLAF1vgAB9AF1 + BSwBdb4AAfQBdQUsAXW+AAH0AXUFLAF1vgABdQUsAXW/AAF1BSwBdb8AAXUFLAF1vwABdQUsAXW+AAH0 + AXUFLAH0vgAB9AF1BSwB9L4AAfQBdQUsAfS+AAH0AXUFLAH0vgABdQUsAXW/AAF1BSwBdb8AAXUFLAF1 + vwABdQUsAXW/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1 + BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwjGgEbnAABdQUs + IxoBG5wAAXUFLCMaARucAAF1BSwjGgEbmwAB8wF1KCwBTQ0aAfONAAHzAXUoLAFNDRoB840AAfMBdSgs + AU0NGgHzjQAB8wF1KCwBTQ0aAfONAAF1NywBdQIaAfOKAAF1NywBdQIaAfOKAAF1NywBdQIaAfOKAAF1 + NywBdQIaAfOKAAF1OiwBdQEaAfOIAAF1OiwBdQEaAfOIAAF1OiwBdQEaAfOIAAF1OiwBdQEaAfOIAAF1 + PCwBdQEaAfOGAAF1PCwBdQEaAfOGAAF1PCwBdQEaAfOGAAF1PCwBdQEaAfOGAAF1PiwBdQHzhQABdT4s + AXUB84UAAXU+LAF1AfOFAAF1PiwBdQHzhQABdT8sAXUB84QAAXU/LAF1AfOEAAF1PywBdQHzhAABdT8s + AXUB84QAAXVALAGahAABdUAsAZqEAAF1QCwBmoQAAXVALAGahAABdUAsAXUB84MAAXVALAF1AfODAAF1 + QCwBdQHzgwABdUAsAXUB84IAARsBTUEsAZqCAAEbAU1BLAGaggABGwFNQSwBmoIAARsBTUEsAZqCAAF1 + QiwBdQHzgQABdUIsAXUB84EAAXVCLAF1AfOBAAF1QiwBdQHzgQABdUMsAZqBAAF1QywBmoEAAXVDLAGa + gQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1 + QywBmoEAAXVDLAGagQABdUMsAXUBG4AAAXVDLAF1ARuAAAF1QywBdQEbgAABdUMsAXUBG4AAAXVELAGa + gAABdUQsAZqAAAF1RCwBmoAAAXVELAGafwABGgFNRCwBmn8AARoBTUQsAZp/AAEaAU1ELAGafwABGgFN + RCwBmn8AAZRFLAGafwABlEUsAZp/AAGURSwBmn8AAZRFLAGafwABlEUsAXUBG34AAZRFLAF1ARt+AAGU + RSwBdQEbfgABlEUsAXUBG34AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGU + RiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAF1 + ARt9AAGURiwBdQEbfQABlEYsAXUBG30AAZRGLAF1ARt9AAGURywBmn0AAZRHLAGafQABlEcsAZp9AAGU + RywBmnwAARoBTUcsAZp8AAEaAU1HLAGafAABGgFNRywBmnwAARoBTUcsAZp8AAGUSCwBmnwAAZRILAGa + fAABlEgsAZp8AAGUSCwBmnwAAZRILAFNARp7AAGUSCwBTQEaewABlEgsAU0BGnsAAZRILAFNARp7AAGU + SSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGa + ewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBTQEaegABlEksAU0BGnoAAZRJLAFN + ARp6AAGUSSwBTQEaegABlEosAZp6AAGUSiwBmnoAAZRKLAGaegABlEosAZp5AAEaAU1KLAGaeQABGgFN + SiwBmnkAARoBTUosAZp5AAEaAU1KLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGU + SywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGa + eQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGU + SywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeAABGgFNSywBmngAARoBTUssAZp4AAEa + AU1LLAGaeAABGgFNSywBmngAAZRLLAGUAfZ4AAGUSywBlAH2eAABlEssAZQB9ngAAZRLLAGUAfZ3AAEa + AU1LLAGaeAABGgFNSywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABlEssAZQB9ngAAZRLLAGUAfZ4AAGU + SywBlAH2eAABlEssAZQB9nYAARoBdQFNSiwBlHgAARoBdQFNSiwBlHgAARoBdQFNSiwBlHgAARoBdQFN + SiwBlG4AARoJdQFNECwUTSUsAZRxAAEaCXUBTUksAZRxAAEaCXUBTUksAZRxAAEaCXUBTUksAZRwAAEa + AU0PLAEaCgABFhNNlgABGgFNDywBGgoAARYTTZYAARoBTQ8sARoLAAEWEk2WAAEaAU0PLAEatAABGhAs + ARsKAAEWE02WAAEaECwBGwoAARYTTZYAARoQLAEbCwABFhJNlgABGhAsARu0AAEaDywBGgsAARYTTZYA + ARoPLAEaCwABFhNNlgABGg8sARoMAAEWEk2WAAEaDywBGrUAARoNLAEaDQABFhNNlgABGg0sARoNAAEW + E02WAAEaDSwBGg4AARYSTZYAARoNLAEauQABmggsARoQAAEWE02YAAGaCCwBGhAAARYTTZgAAZoILAEa + DgABlAIWARcSTQMWlQABmggsARq9AAj2EQABFhNNmQAI9hEAARYTTZkACPYNAAGUAeMBFxdNARcB4wEW + lAAI9tcAARYTTbIAARYTTa0AAZQBFxtNARcBFv8AcwABFhNNsgABFhNNrgABFhtNARf/AHQAARYTTbAA + AZQB4wEXE00BAALjrAABFhlNARf/AHUAARYTTa8AAZQBFxVNAeMCTQHjrAABFglNBQAB4whNARf/AHYA + ARYTTa4AAZQBFxpNAeOsAAEWBk0JAAEXBU0BF/8AdwABFhNNrQABlAEXHE0B46wAARYFTQkAARcETQEX + /wB4AAEWE02tAAGUHU0BF/8A/wA3AAGUARcBAAEWE00CFwHjqwABlBtNARf/AP8ANwABlAEXAU0CFxZN + AeOrAAGUC00B9gEAAeMLTQEX/wD/ADcAAZQBFxtNAeOrAAEWCE0GAAHjCE0BF/8A/wA3AAGUHk0B46sA + ARYGTQgAARcGTQEX/wD/ADgAAZQeTQHjrAABFgVNCQABFwRNARf/AP8AOgABlAEXG00B4/8A/wD9AAGU + ARcKTQUXCk0B4/8A/wD/AAGUARcITQEXBQAB4whNAeP/AP8A/wACAAGUARcGTQEXAfYGAAEXBk0B4/8A + /wD/AAQAAZQGFwgAAeMFFwHj/wD/AP8A/wD/AP8A/wD/AJQAAfQEEQFt/wD/AP8AFQABQwFEBREBbf8A + /wD/ABIAAfQBQwFFBxEBbf8A/wD/ABAAARMKEQFt/wD/AEoAAfMCEQHqwQALEQHs/wD/AEgAAfMFEQFt + AfS+AAESChEB6/8A/wBIAAFDAUQBQwURAW2+AAHqARIIEQEVAZL/AP8ARwABEQFFAUQGEQFtAfS9AAH0 + AeoBEgQRAUMBRAHs/wCDAAT0wAALEQFtqgAB9BMAAfQB6gESAxEBRAH3/wCCAAHyAxEB6gH0vwAB6gsR + AeymAAP0AW0B9BQAAfQDbQGS/wCCAAHyBREB6gL0vgAB6goRAeykAAL0AesC6gHzAREB9P8AmgABEQJE + BREBbQL0vQACbQYRAkQB7KIAAvQB6wHqAQAC9AEVARQBEP8AmgABEQJEBxEBbQH0vQAB9AFtBRECRAH3 + nwAD9AHrAW0B8wL0ARQB6gFzAZkBFAHz1AAD8wH0wAABbQoRAW0B9KcAAfQD8xIAAfQB6wFtAxEBRAH3 + ngAB9AHzAewCbQHyAfQCFAHrARwDmQFzAQ/TAAHyAxEB6gHzAfS+AAH0CxEB7KUAAfQB8wPrAQ8UAAH0 + A+sB950AAfQB8wHsAesBAAH0AfMBEgETAXMBmAKZApgBmQGYAUPSAAH0AREBQwQRAeoB8wH0vQAB6wFt + CREB7KMAAvMB7AHrA/MBQwHzsgAB9ALzAe0B6wHxAvMC6gFzBJkBHAHsAXMBHAGZAW0B89EAAfEBRAFF + BhEBbQHzAfS9AAFtBhECRAHsoAAD8wHsAesB8gHzAhQBbQFyARCxAAH0Ae0C6wHxAfMB6gEUARUBcwaZ + ARIBbQHrARMBmAEcARDRAAHrAUMBRAgRAW0B9KgAAvMTAAHsAesEEQJEAe+eAALzAewC6wHyAfMCEwFz + AZgCmQEUsAAB9AHtAvQB8wFtAeoB7QEHARMBHAWZARwBFAIaARQBHAEIAe0B89AAAfQLEQHspgAC8wHs + AQ8B8hMAAfQB7AHrAhEBFQHvnQAC8wHtAesB8QLzARIB6gFzBZkBcgHzrwAB7wHwAfMC7QGTARoCvQET + AZkGCAETAhwB7AEIAQAB8wHr0QAB7AoRAW0B86IAAfMC8gLsAfIBEQEPFQAB9ALsAe+bAAHzAvIB7QHs + AfEB8wESARQBbQEcA5kBHAJzAZkBmAERsAAB6wEPAfMBAAHzARsB8gEbARMB9AYAAe8C7AEAAfMB8gHs + 0wAB7AoRAeygAAHzAfIB7QLsAfIB8wEUARMBFQHysQAB8wHyAe0C7AHxAfMBEgEUAXIBHASZAZgBbQIS + AXMBmQFKAfKvAAHvAewB8AXyARQB8AXyAwAC8gLs1QAC7AURAkQBEwHvngAB8wHyAe0B7AEAAvMBEwHq + AXMBmQFzAQ+wAAHzAfcB7AHwAfIB8wRtAZgFmQFzARIBBwEcARQBmQEcARCxAAHvDOwB8QLyAuzCAAPy + FAAC7AQRAUQBB5wAAfMC8gHtAewB8QHyAfMBEgFtAXMDmQGYARWwAAHrAbwB8gESARQB7AGTARoBkwES + ARwECAGZAXMB6gKTARQCCAEQvgAB7QLswQAC8gEAAe0B7AEPAfEUAAH0AuwBEQEUAe+bAAHzAfIBkgLs + AfAB8gESARMB6wEcApkBmAEcApkB6wHxrwAB7wEVAesB7QG8AxsB8AETAZkEAAIIARIBbQL3AQAB8gEP + /wCBAAHyAfEB7QHsAQAC8gEUARAWAAH0Ae0B75oAAfMB8QH3AewB9AHyAfEC6gFzAZgDmQGYAXMB6wFz + AZgBHAERsAAB7wG8BQAB8gEUAbwE8QIAAQgB9wEAAfIB8QHtAez/AH8AAfIB8QLtAfAB8QHyARIBbQFz + ARSxAAHzAfEB9wHtAfAB8QHyAesBFQFzBpkB6wHqAe0BEgFzAZkB6gHxsAAB7wG8BPEBFAHsBe0E8QEA + Au3/AH4AAfIB8QEAAfcB7QHwAfECEwHrARwCmQFzAfGwAALrAbwB8QFtARIB7AEHAesBcwaZARIBkgG9 + AewBbQGZAQcBD7EAAe8F7QYAAfcD7f8AfwAB8gHxAfcB7QEAAfIB8QESAeoBcwGYBJkBmAFDsAAB6wEH + AvcBBwEaAr0B7AFtBggBcwHrAe0BEwHvAQgBAAEP/wD/AD8AAfIB8AH3Ae0BvAHxAfIB6gFtAXMDmQGY + AnMBHAGZAW0B8K8AAQcBFQHzAgAB8wEbAfMBbQFDAfQFAAHwAe8BkgHtA/AB7f8A/wA8AAHyAfABAAEH + AZIBvAHwAeoBEQFtARwFmQHrAm0BSgGYARwBEbAAAQcBvAXwARQBDwG8AgAB8QLwAgAB8QHwA5L/AP8A + PQAB6wHsAfQB8gHxAm0B7QEUARwGmQEVAZMBGgETAXMBmQETAfCwAAEHCJICAAHvApIC8AH3AZL/AP8A + QAAB6wHvAfAC6wGTARoBvQESAXMBvAQbAZkBFAEcAZMBFAG8ARsBBwEPvgAB7wH3/wD/AEIAAesB7AH3 + AbwBGwPzARIBBwUAAfEBBwFtAe8B9wEAAfABvAH3/wD/AP8AAwABBwK8BQABEgEHBbwCAAG8AQAB8AG8 + Avf/AP8A/wAFAAG8AfcFvAHvBvcEvAL3/wD/AP8ACQABBwTvBwAE7/8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wDYAAHxAfABGwHyAfP/AP8A/wAUAAIZAbQBrgJ1AZMB8/8A/wD/ABIAAQkD2wG0AnoBdQGT + AfL/AP8A/wAQAAEJBLQB7AF6AXUDkwHz/wD/AP8ADwABtAHbAdUBtAHPAY0DkwF0AXoBGv8A/wD/AA8A + A9sBtAGuA40BdQF6AXQBkwHy/wD/AP8ADgAB2wHVAbQB7QKTAY0B7QKTAo4Btv8A/wD/AA4AAbUB9wEc + ApMB7QKTAo0CiAG2/wD/AP8ADgABkwF1AXoBdQHtAZMBdQGOAoIBiAGxAfP/AP8A/wAOAAEbAnoBkwHt + AXoBkwGNAY8BiAGCAbb/AP8A/wAQAAF0AXUB7QGTAXoBkwGCAY8BiAGwAfP/AP8A/wAQAAHxAZMBjQJ6 + AZMBiAGPAY4B8/8A/wD/ABIAAfIB8AOTAa8B8gHz/wD/AP8AFQAE8/8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wB9AAFNAfQsAAEbASwBdZUAAU0B9CwAARsBLAF1lQABTQH0 + LAABGwEsAXWVAAFNAfQsAAEbASwBdZIAAXUGLAH2JwABGwUsAZSQAAF1BiwB9icAARsFLAGUkAABdQYs + AfYnAAEbBSwBlJAAAXUGLAH2JwABGwUsAZSPAAF1CCwB9iQAAfMJLAGUjQABdQgsAfYkAAHzCSwBlI0A + AXUILAH2JAAB8wksAZSNAAF1CCwB9iQAAfMJLAGUjAABdQosJAABGwksAZSMAAF1CiwkAAEbCSwBlIwA + AXUKLCQAARsJLAGUjAABdQosJAABGwksAZSMAAF1CiwjAAH0CywBmosAAXUKLCMAAfQLLAGaiwABdQos + IwAB9AssAZqLAAF1CiwjAAH0CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0 + CywBmooAAXULLCMAAfQLLAGaigABdQssIwAB9AssAZqKAAF1CywjAAH0CywBmooAAXULLCMAAfQLLAGa + igABdQssIwAB9AssAZqKAAGUAU0KLCMAAfQLLAGaigABlAFNCiwjAAH0CywBmooAAZQBTQosIwAB9Ass + AZqKAAGUAU0KLCMAAfQLLAGaiwABdQosIwAB9AFNCSwBTQEaiwABdQosIwAB9AFNCSwBTQEaiwABdQos + IwAB9AFNCSwBTQEaiwABdQosIwAB9AFNCSwBTQEaiwABlAFNCCwBTSQAAfQBTQcsAU0BGowAAZQBTQgs + AU0kAAH0AU0HLAFNARqMAAGUAU0ILAFNJAAB9AFNBywBTQEajAABlAFNCCwBTSQAAfQBTQcsAU0BGo0A + AZQBTQYsAU0mAAH0AU0FLAFNAZqOAAGUAU0GLAFNJgAB9AFNBSwBTQGajgABlAFNBiwBTSYAAfQBTQUs + AU0Bmo4AAZQBTQYsAU0mAAH0AU0FLAFNAZqPAAGUBnUoAAH0BXUBmpAAAZQGdSgAAfQFdQGakAABlAZ1 + KAAB9AV1AZqQAAGUBnUoAAH0BXUBmv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP0AAfY39I4AAfY39I4A + AfY39I4AAfY39IwAAfYB9AFNNywBdYsAAfYB9AFNNywBdYsAAfYB9AFNNywBdYsAAfYB9AFNNywBdYkA + AfYB8wFNOiwBdYgAAfYB8wFNOiwBdYgAAfYB8wFNOiwBdYgAAfYB8wFNOiwBdYcAAfQBdT0sAZqGAAH0 + AXU9LAGahgAB9AF1PSwBmoYAAfQBdT0sAZqFAAH0AXU9LAFNARqFAAH0AXU9LAFNARqFAAH0AXU9LAFN + ARqFAAH0AXU9LAFNARqEAAH0AXU9LAFNARqFAAH0AXU9LAFNARqFAAH0AXU9LAFNARqFAAH0AXU9LAFN + ARqFAAF1Biw4dQEahgABdQYsOHUBGoYAAXUGLDh1ARqGAAF1Biw4dQEahQAB9AF1BSwBdb4AAfQBdQUs + AXW+AAH0AXUFLAF1vgAB9AF1BSwBdb4AAXUFLAF1vwABdQUsAXW/AAF1BSwBdb8AAXUFLAF1vgAB9AF1 + BSwB9L4AAfQBdQUsAfS+AAH0AXUFLAH0vgAB9AF1BSwB9L4AAXUFLAF1vwABdQUsAXW/AAF1BSwBdb8A + AXUFLAF1vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUs + AfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsAfS/AAF1BSwB9L8AAXUFLAH0vwABdQUsIxoBG5wAAXUFLCMa + ARucAAF1BSwjGgEbnAABdQUsIxoBG5sAAfMBdSgsAU0NGgHzjQAB8wF1KCwBTQ0aAfONAAHzAXUoLAFN + DRoB840AAfMBdSgsAU0NGgHzjQABdTcsAXUCGgHzigABdTcsAXUCGgHzigABdTcsAXUCGgHzigABdTcs + AXUCGgHzigABdTosAXUBGgHziAABdTosAXUBGgHziAABdTosAXUBGgHziAABdTosAXUBGgHziAABdTws + AXUBGgHzhgABdTwsAXUBGgHzhgABdTwsAXUBGgHzhgABdTwsAXUBGgHzhgABdT4sAXUB84UAAXU+LAF1 + AfOFAAF1PiwBdQHzhQABdT4sAXUB84UAAXU/LAF1AfOEAAF1PywBdQHzhAABdT8sAXUB84QAAXU/LAF1 + AfOEAAF1QCwBmoQAAXVALAGahAABdUAsAZqEAAF1QCwBmoQAAXVALAF1AfODAAF1QCwBdQHzgwABdUAs + AXUB84MAAXVALAF1AfOCAAEbAU1BLAGaggABGwFNQSwBmoIAARsBTUEsAZqCAAEbAU1BLAGaggABdUIs + AXUB84EAAXVCLAF1AfOBAAF1QiwBdQHzgQABdUIsAXUB84EAAXVDLAGagQABdUMsAZqBAAF1QywBmoEA + AXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMsAZqBAAF1QywBmoEAAXVDLAGagQABdUMs + AZqBAAF1QywBmoEAAXVDLAF1ARuAAAF1QywBdQEbgAABdUMsAXUBG4AAAXVDLAF1ARuAAAF1RCwBmoAA + AXVELAGagAABdUQsAZqAAAF1RCwBmn8AARoBTUQsAZp/AAEaAU1ELAGafwABGgFNRCwBmn8AARoBTUQs + AZp/AAGURSwBmn8AAZRFLAGafwABlEUsAZp/AAGURSwBmn8AAZRFLAF1ARt+AAGURSwBdQEbfgABlEUs + AXUBG34AAZRFLAF1ARt+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYs + AZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBmn4AAZRGLAGafgABlEYsAZp+AAGURiwBdQEb + fQABlEYsAXUBG30AAZRGLAF1ARt9AAGURiwBdQEbfQABlEcsAZp9AAGURywBmn0AAZRHLAGafQABlEcs + AZp8AAEaAU1HLAGafAABGgFNRywBmnwAARoBTUcsAZp8AAEaAU1HLAGafAABlEgsAZp8AAGUSCwBmnwA + AZRILAGafAABlEgsAZp8AAGUSCwBTQEaewABlEgsAU0BGnsAAZRILAFNARp7AAGUSCwBTQEaewABlEks + AZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAZp7AAGUSSwBmnsA + AZRJLAGaewABlEksAZp7AAGUSSwBmnsAAZRJLAGaewABlEksAU0BGnoAAZRJLAFNARp6AAGUSSwBTQEa + egABlEksAU0BGnoAAZRKLAGaegABlEosAZp6AAGUSiwBmnoAAZRKLAGaeQABGgFNSiwBmnkAARoBTUos + AZp5AAEaAU1KLAGaeQABGgFNSiwBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEss + AZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkA + AZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmnkAAZRLLAGaeQABlEss + AZp5AAGUSywBmnkAAZRLLAGaeQABlEssAZp5AAGUSywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABGgFN + SywBmngAARoBTUssAZp4AAGUSywBlAH2eAABlEssAZQB9ngAAZRLLAGUAfZ4AAGUSywBlAH2dwABGgFN + SywBmngAARoBTUssAZp4AAEaAU1LLAGaeAABGgFNSywBmngAAZRLLAGUAfZ4AAGUSywBlAH2eAABlEss + AZQB9ngAAZRLLAGUAfZ2AAEaAXUBTUosAZR4AAEaAXUBTUosAZR4AAEaAXUBTUosAZR4AAEaAXUBTUos + AZRuAAEaCXUBTUksAZRxAAEaCXUBTUksAZRxAAEaCXUBTUksAZRxAAEaCXUBTTQsA0wETQ4sAZRwAAEa + AU0PLAEatAABGgFNDywBGrQAARoBTQ8sARq0AAEaAU0PLAEatAABGhAsARu0AAEaECwBG7QAARoQLAEb + tAABGhAsARu0AAEaDywBGrUAARoPLAEatQABGg8sARq1AAEaDywBGgsAAZQTFpYAARoNLAEatwABGg0s + ARq3AAEaDSwBGrcAARoNLAEaDQABFhNNmAABmggsARq8AAGaCCwBGrwAAZoILAEavAABmggsARoQAAEW + E02ZAAj2vgAI9r4ACPa+AAj2EQABFhNN/wD/AGUAAfQBzwGNAe0B75wAARYTTf8A/wBAAAGUE+MQAAG0 + AtsBjQF1AZQBkwEHmgABFhNN/wD/AEAAARYTTQ8AAbQD2wGuA3oBkwEHmQABFhNN/wD/AEAAARYTTQ4A + As8BtALbAewCegGTAY0BkwEHmAABFhNN/wD/AEAAARYTTQ4AAdUC2wG0Ac8BjQF1AZMBjQF1AXoBGpgA + ARYTTf8A/wBAAAEWE00OAATbAa4DjQN6AZMBB5cAARYTTf8AeAABlBQXsgABFhNNDQABtALbAdUBzwKT + Aa4BjQF1AZMBjQGuAbWXAAEWE03/AHgAARYUTRIAAfQCrgG1nAABFhNNDQABrgHPAa4BjQF0AZMBjQF0 + AZMBrgGCAY8BiAG2lwABFhNN/wB4AAEWFE0QAAH0AbQB1QG0AZMBegGTAe+aAAEWE00OAAN6AXUBjQGT + AXUBjgKCAY8BiAG2lwABFhNN/wB4AAEWFE0PAAHPAbQC2wG0AZMCegF1Ae0BtZgAARYTTQ0AAfYBkwJ6 + AZMBjQF6AZMBjQGPAogBt5gAARYTTf8AeAABFhRNDwABzwG0AtsBtAGTAXoBdQHtAY0BB5gAARYTTQ4A + AY0BegF1AY0BdAF6AZMBiAGPAYgBggG2mAABFhNNsQABFhRNsQABFhRNDgABzwLbAbQCzwF1AXQBjQGT + AXoBkwHvlwABFhNNDgAB9AGNAXQBjQF6AXUBkwGIAY8BiAG2mQABFhNNsQABFhRNsQABFhRNDgABtAPb + AbQBrgKNAZMCegF1AQeXAAEWE00PAAH0Aa4BjQJ6AZMCiAG2lwABFgFNAfYBFhNNAQABTQEXrgABFhRN + sQABFhRNDgAD2wG0AY0BkwKNAnUBkwGNAe+XAAEWE00RAAH0Aa4CjQG1mAABlBpNARetAAEWFE0TAAH0 + AYwBtZsAARYUTQ4AAc8BtAHPAe0BdQGTAe0BkwGuAY0BiAGPAbeXAAEWE02tAAGUHE0BF6wAARYUTRAA + AfQBzwK0AY0BdQGTAY0BtZgAARYUTQ4AAZMBdAJ6AZMBjQF6AZMBjQGCAo8BtpcAARYTTawAAZQeTQHj + qwABFhRNDwAB9AHPA9sB7AN6AZMBtZcAARYUTQ4AAY0CegF1AY0BkwF1AY4CiAGCAYgBtpcAARYTTawA + AZQBFxxNARcB46sAARYUTQ8AAa4BtAPbAewCegF0AY0BrgG1lgABFhRNDgABrgF0AXoBkwHsAXoBdAGN + Ao8BiAGCAbWUAAEWAU0B9AEWE00BAAEXqwABlAEXGk0BFwHjrAABFhRNDgAB9AO0Ac8BtAGNAXoBkwGN + AZMBdQEHlgABFhRNDwABjQF0ApMBegF0AY0CjwGIAbWUAAEWGU0BF6sAAZQBFwpNBOMBFwlNARcB460A + ARYUTQ4AAc8E2wGuAY0BkwGNAXUCegGTAbWVAAEWFE0PAAH0Ao0BdAF6AZMBjQGPAYgBtpQAAZQbTQEX + qwABlAEXCE0B4wQAARYBFwhNAeOuAAEWFE0OAAHPA9sBtAGNAZMBrgGTAXoBdQGTAY0BtZUAARYUTREA + AfQBjQL3Ao0BtZQAAZQdTQEXqwABlAEXBk0B4wYAARYBFwZNAeOvAAEWFE0OAAHPArQBrgGTAXQB7AGT + A40CiAG2lQABFhRNrAABlB1NARcBFqsAAZQG4wH2BwABFgbjsAABFhRNDgABrgKTAXoBdQKTAXUBkwGM + AYgBjwGIAbaTAAEWAfMBFhRNAfYBF6oAAZQBFxtNARcBFv8AcwABFhRNDgABjQF1AnoBkwGNAXoBkwGN + AYgBggGIAY4BB5IAARYZTQEXAfapAAGUARcLTQTjARcJTQEXARb/AHQAARYUTQ8AAZMBegF1Ae0BkwF6 + AZMBiAGPAYgBggG2kgABlBtNARcB9qkAAZQBFwhNAeMBFgQAARYBFwdNARcBFv8AdQABFhRNDwABjQKT + AY0BegF1AY4BiAGPAYgBjQEHkQABlB1NAReqAAGUARcHTQcAARYBFwZNARb/AHYAARYUTRAAA40CdQGO + AogBjgG2kgABlB1NARcBFqoAAZQBFgEXBE0BFggAARcFTQEW/wB0AAH2ARYBGwEWFE0BAAEXDwABrwH3 + AZMBmQGTAq8BB5MAAZoBFxtNARcBFq0AAZQEFgH2CAAGFv8AdQABFhlNAReqAAGaARcLTQMWARcKTQEX + ARb/AP8ANwABFhtNAReqAAGaARcITQIWAwABlAEWARcHTQEXARb/AP8ANwABFh1NAReqAAGaARcHTQcA + AZQBFwZNARb/AP8ANwABvQEXHU0BFwGUqgABmgEXBU0BFggAARcFTQEW/wD/ADkAAb0B4xtNARcBlKwA + AZoFlAkABpT/AP8AOwABvQEXC00BFgKUARcKTQEXAZT/AP8A/gABvQEXCE0BFgGUAwAClAEXB00BFwGU + /wD/AP8AAQABvQHjB00HAAHjB00BlP8A/wD/AAMAAb0BFwVNARYHAAGUARcFTQGU/wD/AGAABfOfAAG9 + BZQJAAaU/wD/AGAAAfEEEQHqAfIB8/8A/wD/ABIAAfQBEQFDBREB6gHyAfP/AP8A/wAQAAH0AUMBRQFD + BhEBbQHz/wD/AEwAAfIB88AAAfQBEQFDCBEBbQHz/wD/AEkAAfIB8AERARIB8gHzvgAB9AsRAW0B8/8A + /wBHAAHwBREBEgHyAfO9AAHsCxEB7P8A/wBGAAH0ARECRAURAeoB870AAe0B7AcRAkMB7P8A/wBGAAH0 + ARECRAYRAeoB8QHzqAAB8RQAAe0B7AURAkQBB/8AgwAC8QHyvwAB9AsRAW0B86QAAvEBAAGSAfAVAAGS + AewDEQFEAez/AIIAAfEBvAIRARIB8r8AAewLEQHsogAB8QHwAfcB7QEAAfEBQxYAAfQEkgEH/wCBAAH0 + AREBQwMRARIB8AHyvgAB7QoRAeygAAHxAQAB7wGSAvAB8gESAW0B8P8AnAABvAJEBREB6gHwAfK9AAH3 + Ae0GEQJEAeydAAHxAfABAAHvAQAB8QHwARMB6gFzAZgBmQEV/wCbAAH0AREBQwFEBxEB6gHypgAD8BUA + AfcB7QQRAkQB7JsAAfEB8AL3AQAB8QHwAeoBbQFzBJkB6wHw1wAC8AHxwAABkgoRAeoB8qMAAfABAAHv + AvcBvBYAAe0EEQETAbyZAAHxAQABBwH3AbwB8AHxAW0B6wEcA5kCHAGZARwBQ9UAAfABBwIRARMB8AHx + vgAB9AsRAeyhAAHwAQAB7wEAAvAB8QEUFwAE7wG8lwAB8QG8AQABBwEAAfEB8AESAeoBcwEcBJkBcwLr + AXMBmQFtAbzTAAH0AUMBRAQRARIBvAHxvQAB7wGSCREB6gHynQAB8AG8AQAB7wEAAvABEgFtAnMBvLEA + AfEB7wH3AfQB8QHwAesB6gESARwFmQEcARMBHAHsARMBmQEcARDTAAH0AUMBRQFDBREBEgG8AfG9AAGS + BhEBQwFEARIBvJsAAfABAAEHAe8BAALwAW0B6wFzApkBmAEVsAAB8QHvAQcBvAHwAuwCkwESARwFmQFz + ARMBGgEHARUBmAEbAe/TAAH0AREBRAgRAeoB8aQAAbwYAAHvAZIFEQFEAeyaAAHwAQABBwEAAfABvAHw + AesBcwEcBZkB6wG8rwABvAEHAu8BvAHxAhoB8gESAQgF8QHwAeoB7AFtAe8BGwEAAbzTAAH0CxEB6gHx + owABBwIAArwWAAHvAZIDEQESAbyXAAHxAbwBAAG8AQAB8AG8Am0BcwGYA5kBcwHrAXMCHAERsAAB6wHv + AwAB9AHzAQABEgH0BgABvAEHAe8BAAK8Ae/UAAH3CxEB7KMAArwB8QHrARQYAAPvAfCWAAHxAQABvAHv + AQAC8AESAeoBcwWZAXMB6gFuAeoBcwGZAeqwAAG8Ae8GBwEVAfQDAAG8AQcDAAG8AQAC79YAAfcIEQFD + AREB7JwAAfAEAAK8AW0BcwEcAZkBcwEHsAAB8QHvAfQB8AG8AfAB7AHtAusBmAWZAW0B7AEaAe0BSgGZ + AbwBB7EAAbwG7wQAAQcB7wIHAQABB9oAAQcB9wYRAkQB7JwAAbwCAALwAewBcwGYA5kBmAEVsAAB6wH3 + AQcB7wHsAZMBGgG9ARwBbQG8BRsBcwFtARwB6wEHARsBAAEQvgABBwHv3gABBwH3BBEBRAHqAfCcAAK8 + AfACcwOZARwBcwGYAZkBbbAAAfABFAH3AQAB9APzAfEBvAYAAfEBBwG8AQcCAAIH/wCHAAG8AfAYAAEH + AfcBEQESAQcB8JYAAfAEAAG8AQcB6wFzARwEmQFzAW0B6wFtAZgBHAEHsAAB8AEHBQABvAYHBQABBwEA + AQf/AIUAArwB8QFzARwBvBkAAQcB8JYAAfAB9AHwAgAC8AHtARQBcwaZARIB7QGTARIBcwGZARKxAAHw + AQABvAIHAQABvAYHAQADBwEAAQf/AIUAAbwB8AJzA5kB67EAAfAB9gK8AfABHAGTARoBbQFzAZkB8QMb + AZkBFAGTARoB6gG8ARsBvAEHsgAB8AIHCQABvAIH/wCFAAG8AfABcwEcBZkBHAEHsAABvAH0AfABvAHx + AfMC9ALwARsEAAHzAbwB6wHxAbwDAAEH/wD/AEQAArwB8QIcA5kBcwJtAXMBmQFtsAAB8QHvAfQOAAHw + /wD/AEgAAfABvAHqAXMBmASZAZgBEgLsARIBmAEcsQAB8QEAAbwDAAG8Ae8JAAHv/wD/AEUAAvAB7wGT + ARMBHAGZAxsBmQEcARQCGgEVARwBG7MAAfEDAAHwAbwHAAHvAQABvP8A/wBFAAHyAfMC9AHwAfIBGwMA + AfMB8gHwAuwBvAHywQABvP8A/wBUAALw/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAvAAFCAU0BPgcA + AT4DAAEoAwABGAEDAgABpAEEAgABAQEAAQEFAAEQAdABARUAA///AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8ApgBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQAK/wHnBf8BjxL/AZ8E/wH+AT8R/wH+ + AX8E/wH4Ev8B+QX/AeMI/wEACv8BAAT/Af4BAxH/AfwBAwT/AfgBDxH/AfABDwT/AeABPxH/AcABPwT/ + AYAI/wEACf8B/gEAAX8D/wH4AQAR/wH4AQEE/wHgAQMR/wHgAQcE/wGAAQ8R/wGAAR8D/wH+AQABPwf/ + AQAJ/wH8AQABfwP/AfgBABH/AfABAQT/AeABAxH/AcABBwT/AYABDxH/AQABHwP/Af4BAAE/B/8BAAn/ + AfwBAAF/A/8B8AEAAX8Q/wHwAQEE/wHAAQER/wHAAQcE/wEAAQcR/wEAAR8D/wH8AQABHwf/AQAJ/wH4 + AQABfwP/AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/AQAJ/wH4 + AQABfwP/AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/AQAJ/wH4 + AQABfwP/AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/AQAJ/wH8 + AQABfwP/AfABAAF/EP8B8AEBBP8BwAEBEf8BwAEHBP8BAAEHEf8BAAEfA/8B/AEAAR8H/wEACf8B/AEA + AX8D/wH4AQAR/wHwAQEE/wHgAQMR/wHAAQcE/wGAAQ8R/wEAAR8D/wH+AQABPwf/AQAJ/wH+AQAE/wH8 + AQER/wH4AQME/wHwAQcR/wHgAQ8E/wHAAR8R/wGAAT8E/wEAAX8H/wEACv8BAQT/Af4BAxH/AfwBBwT/ + AfgBDxH/AfABHwT/AeABPxH/AcABfwT/AYAI/wEAY/8BAGP/AQBj/wEAY/8BAAr/AYAGAAF/EP8B/gYA + AQER/wH4BgABBxH/AeAGAAEfB/8BAAn/Af4HAAE/EP8B+AcAEf8B4AYAAQMR/wGABgABDwf/AQAJ/wH4 + BwABHxD/AeAHAAF/EP8BgAYAAQEQ/wH+BwABBwf/AQAJ/wHwBwABDxD/AcAHAAE/EP8IABD/AfwHAAED + B/8BAAn/AeAHAAEPEP8BgAcAAT8P/wH+CAAQ/wH4BwABAwf/AQAJ/wHABwABHxD/CAABfw//AfwHAAEB + EP8B8AcAAQcH/wEACf8BwAcAAT8Q/wgAEP8B/AcAAQMQ/wHwBwABDwf/AQAJ/wGAAX8W/wH+AQEX/wH4 + AQcX/wHgAR8O/wEACf8BgBf/Af4BAxf/AfgBDxf/AeABPw7/AQAJ/wEAF/8B/AEDF/8B8AEPF/8BwAE/ + Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8BARf/AfwBBxf/AfABHxf/AcABfw7/AQAJ/wEB + F/8B/AEHF/8B8AEfF/8BwAF/Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8FAAE/Ev8B/AUA + E/8B8AQAAQMT/wHABAABDwr/AQAI/wH+BwAR/wH4BgABAxH/AeAGAAEPEf8BgAYAAT8I/wEACP8B/gcA + AR8Q/wH4BwABfxD/AeAGAAEBEf8BgAYAAQcI/wEACP8B/gcAAQcQ/wH4BwABHxD/AeAHAAF/EP8BgAYA + AQEI/wEACP8B/gcAAQEQ/wH4BwABBxD/AeAHAAEfEP8BgAcAAX8H/wEACP8B/ggAEP8B+AcAAQMQ/wHg + BwABDxD/AYAHAAE/B/8BAAj/Af4IAAF/D/8B+AcAAQEQ/wHgBwABBxD/AYAHAAEfB/8BAAj/Af4IAAF/ + D/8B+AcAAQEQ/wHgBwABBxD/AYAHAAEfB/8BAAj/Af4IAAE/D/8B+AgAEP8B4AcAAQMQ/wGABwABDwf/ + AQAI/wH8CAABPw//AfAIABD/AcAHAAEDEP8IAAEPB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHABwABARD/ + CAABBwf/AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgAAQcH/wEACP8B/AgAAR8P/wHwCAABfw// + AcAHAAEBEP8IAAEHB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHABwABARD/CAABBwf/AQAI/wH8CAABDw// + AfAIAAE/D/8BwAgAEP8IAAEDB/8BAAj/AfwIAAEPD/8B8AgAAT8P/wHACAAQ/wgAAQMH/wEACP8B+AgA + AQ8P/wHgCAABPw//AYAIAA//Af4IAAEDB/8BAAj/AfgIAAEPD/8B4AgAAT8P/wGACAAP/wH+CAABAwf/ + AQAI/wH4CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABBw//AeAIAAEfD/8BgAgA + AX8O/wH+CAABAQf/AQAI/wH4CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABBw// + AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABAw//AeAIAAEPD/8BgAgAAT8O/wH+CQAH/wEA + CP8B+AgAAQMP/wHgCAABDw//AYAIAAE/Dv8B/gkAB/8BAAj/AfAIAAEDD/8BwAgAAQ8P/wkAAT8O/wH8 + CQAH/wEACP8B8AgAAQMP/wHACAABDw//CQABPw7/AfwJAAf/AQAI/wHwCAABAQ//AcAIAAEHD/8JAAEf + Dv8B/AkAAX8G/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/AfwJAAF/Bv8BAAj/AfAIAAEBD/8BwAgA + AQcP/wkAAR8O/wH8CQABfwb/AQAI/wHwCAABAQ//AcAIAAEHD/8JAAEfDv8B/AkAAX8G/wEACP8B8AkA + D/8BwAgAAQMP/wkAAQ8O/wH8CQABPwb/AQAI/wHwCQAP/wHACAABAw//CQABDw7/AfwJAAE/Bv8BAAj/ + AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkA + AT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkA + AQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8B4AkAD/8BgAgA + AQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHA + CQAP/wkAAQMO/wH8CQABDw7/AfAJAAE/Bv8BAAj/AcAJAA//CQABAw7/AfwJAAEPDv8B8AkAAT8G/wEA + CP8BgAgAAQEO/wH+CQABBw7/AfgJAAEfDv8B4AkAAX8G/wEACP8BgAgAAQEO/wH+CQABBw7/AfgJAAEf + Dv8B4AkAAX8G/wEAB/8B/gkAAQcO/wH4CQABHw7/AeAJAAF/Dv8BgAgAAQEH/wEABv8B+AoAAT8N/wHg + CgAO/wGACQABAw3/Af4KAAEPB/8BAAb/AfABAAEDFv8BwAEAAQ8W/wIAAT8V/wH8AgAQ/wEABv8B8AEA + AQMW/wHAAQABDxb/AgABPxX/AfwCABD/AQAG/wHwAQABBxb/AcABAAEfFv8CAAF/Ff8B/AEAAQEQ/wEA + Bv8B8AEAAR8W/wHAAQABfxb/AQABARb/AfwBAAEHEP8BAAb/AfwBABf/AfABAxf/AcABDxf/AQABPxD/ + AQAG/wH+AQEX/wH4AQcX/wHgAR8X/wGAAX8Q/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/ + AQBj/wEAY/8BAGP/AQBU/wGAAQABAwz/AQBU/wGAAQABAwz/AQBU/wGAAQABAwz/AQBU/wGAAQABAwL/ + AY8J/wEAVP8BgAEAAQMB/wH8AQEJ/wEAO/8B4AEAAQEW/wGAAQABAwH/AfgBAAn/AQA7/wHgAQABARb/ + AYABAAEDAf8B+AEAAX8I/wEAO/8B4AEAAQEC/wGAE/8BgAEAAQMB/wHwAQABfwj/AQA7/wHgAQABAQL/ + AQABfxL/AYABAAEDAf8B8AEAAT8I/wEAO/8B4AEAAQEB/wH+AQABPxL/AYABAAEDAf8B8AEAAT8I/wEA + Iv8B+AIAAX8V/wHgAQABAQH/AfwBAAEfEv8BgAEAAQMB/wHwAQABPwj/AQAi/wH4AgABfwH/AcABHxL/ + AeABAAEBAf8B/AEAAQ8S/wGAAQABAwH/AfABAAE/CP8BACL/AfgCAAF/Af8BgAEPEv8B4AEAAQEB/wH8 + AQABDxL/AYABAAEDAf8B8AEAAT8I/wEAIv8B+AIAAX8B/wGAAQcS/wHgAQABAQH/AfwBAAEPEv8BgAEA + AQMB/wH4AQABfwj/AQAO/wH8AR8S/wH4AgABfwH/AQABBxL/AeABAAEBAf8B/AEAAQ8S/wGAAQABAwH/ + AfgBAAF/CP8BAA7/AfABBxL/AfgCAAF/Af8BAAEDEv8B4AEAAQEB/wH8AQABDxL/AYABAAEDAf8B/AEA + Cf8BAAn/AfwCAAEfAf8B4AEDEv8B+AIAAX8B/wEAAQMS/wHgAQABAQH/AfwBAAEPEf8B/AIAAQIB/wH+ + AQEJ/wEACf8B/AIAAR8B/wHgAQES/wH4AgABfwH/AQABAxL/AeABAAEBAf8B/gEAAR8R/wH8AwABfwv/ + AQAJ/wH8AgABHwH/AcABABL/AfgCAAF/Af8BAAEDEv8B4AEAAQEC/wEAAT8R/wH4AwABPwv/AQAJ/wH8 + AgABHwH/AcABABL/AfgCAAF/Af8BAAEDEv8B4AEAAQEC/wGAAX8R/wHwAwABHwv/AQAJ/wH8AgABHwH/ + AcABABL/AfgCAAF/Af8BgAEHEv8B4AEAAQEC/wGAEv8B4AMAAQ8L/wEACf8B/AIAAR8B/wHAAQAS/wH4 + AgABfwH/AYABBxL/AYACAAE/FP8B8AMAAR8L/wEACf8B/AIAAR8B/wHAAQAS/wH4AgABfwH/AcABDxL/ + AwABHxT/AfgDAAE/C/8BAAn/AfwCAAEfAf8BwAEAEv8B+AIAAX8B/wHgAR8R/wH+AwABDxT/AfwBAAE4 + AQABfwv/AQAJ/wH8AgABHwH/AcABARL/AfgCAAF/Af8B8AF/Ef8B/AMAAQcU/wH+AQAB/gEADP8BAAn/ + AfwCAAEfAf8B4AEBEv8B+AIAAX8U/wH4AwABBxX/AQAB/gEBDP8BAAn/AfwCAAEfAf8B8AEDEv8B4AIA + AR8U/wH4AwABBxX/AYEB/wEDDP8BAAn/AfwCAAEfAf8B/AEPEv8BgAIAAQ8U/wH8AwABDyT/AQAJ/wH8 + AgABHxX/AwABBxT/Af4DAAEfJP8BAAn/AfwCAAEfFP8B/gMAAQMV/wEAAT8BAAE/JP8BAAn/AfwCAAEf + FP8B/gMAAQEV/wGAAX8BgAF/JP8BAAn/AfQCAAEHFP8B/gMAAQEV/wHAAX8BgCX/AQAJ/wHgAgABAxX/ + AwABAz3/AQAJ/wHAAgABARX/AYACAAEHPf8BAAn/AYADABX/AcABDwGAAQ89/wEACf8EABX/AeABHwHA + AR89/wEACf8EABX/AfABHwHgAT89/wEACf8BgAMAVv8BAAn/AcACAAEBVv8BAAn/AeABAwHgAQNW/wEA + Cf8B8AEHAfABB1b/AQAJ/wH4AQ8B8AEPVv8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQAK/wHnBf8BjxL/AZ8E/wH+ + AT8R/wH+AX8E/wH4Ev8B+QX/AeMI/wEACv8BAAT/Af4BAxH/AfwBAwT/AfgBDxH/AfABDwT/AeABPxH/ + AcABPwT/AYAI/wEACf8B/gEAAX8D/wH4AQAR/wH4AQEE/wHgAQMR/wHgAQcE/wGAAQ8R/wGAAR8D/wH+ + AQABPwf/AQAJ/wH8AQABfwP/AfgBABH/AfABAQT/AeABAxH/AcABBwT/AYABDxH/AQABHwP/Af4BAAE/ + B/8BAAn/AfwBAAF/A/8B8AEAAX8Q/wHwAQEE/wHAAQER/wHAAQcE/wEAAQcR/wEAAR8D/wH8AQABHwf/ + AQAJ/wH4AQABfwP/AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/ + AQAJ/wH4AQABfwP/AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/ + AQAJ/wH4AQABfwP/AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/ + AQAJ/wH8AQABfwP/AfABAAF/EP8B8AEBBP8BwAEBEf8BwAEHBP8BAAEHEf8BAAEfA/8B/AEAAR8H/wEA + Cf8B/AEAAX8D/wH4AQAR/wHwAQEE/wHgAQMR/wHAAQcE/wGAAQ8R/wEAAR8D/wH+AQABPwf/AQAJ/wH+ + AQAE/wH8AQER/wH4AQME/wHwAQcR/wHgAQ8E/wHAAR8R/wGAAT8E/wEAAX8H/wEACv8BAQT/Af4BAxH/ + AfwBBwT/AfgBDxH/AfABHwT/AeABPxH/AcABfwT/AYAI/wEAY/8BAGP/AQBj/wEAY/8BAAr/AYAGAAF/ + EP8B/gYAAQER/wH4BgABBxH/AeAGAAEfB/8BAAn/Af4HAAE/EP8B+AcAEf8B4AYAAQMR/wGABgABDwf/ + AQAJ/wH4BwABHxD/AeAHAAF/EP8BgAYAAQEQ/wH+BwABBwf/AQAJ/wHwBwABDxD/AcAHAAE/EP8IABD/ + AfwHAAEDB/8BAAn/AeAHAAEPEP8BgAcAAT8P/wH+CAAQ/wH4BwABAwf/AQAJ/wHABwABHxD/CAABfw// + AfwHAAEBEP8B8AcAAQcH/wEACf8BwAcAAT8Q/wgAEP8B/AcAAQMQ/wHwBwABDwf/AQAJ/wGAAX8W/wH+ + AQEX/wH4AQcX/wHgAR8O/wEACf8BgBf/Af4BAxf/AfgBDxf/AeABPw7/AQAJ/wEAF/8B/AEDF/8B8AEP + F/8BwAE/Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8BARf/AfwBBxf/AfABHxf/AcABfw7/ + AQAJ/wEBF/8B/AEHF/8B8AEfF/8BwAF/Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8FAAE/ + Ev8B/AUAE/8B8AQAAQMT/wHABAABDwr/AQAI/wH+BwAR/wH4BgABAxH/AeAGAAEPEf8BgAYAAT8I/wEA + CP8B/gcAAR8Q/wH4BwABfxD/AeAGAAEBEf8BgAYAAQcI/wEACP8B/gcAAQcQ/wH4BwABHxD/AeAHAAF/ + EP8BgAYAAQEI/wEACP8B/gcAAQEQ/wH4BwABBxD/AeAHAAEfEP8BgAcAAX8H/wEACP8B/ggAEP8B+AcA + AQMQ/wHgBwABDxD/AYAHAAE/B/8BAAj/Af4IAAF/D/8B+AcAAQEQ/wHgBwABBxD/AYAHAAEfB/8BAAj/ + Af4IAAF/D/8B+AcAAQEQ/wHgBwABBxD/AYAHAAEfB/8BAAj/Af4IAAE/D/8B+AgAEP8B4AcAAQMQ/wGA + BwABDwf/AQAI/wH8CAABPw//AfAIABD/AcAHAAEDEP8IAAEPB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHA + BwABARD/CAABBwf/AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgAAQcH/wEACP8B/AgAAR8P/wHw + CAABfw//AcAHAAEBEP8IAAEHB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHABwABARD/CAABBwf/AQAI/wH8 + CAABDw//AfAIAAE/D/8BwAgAEP8IAAEDB/8BAAj/AfwIAAEPD/8B8AgAAT8P/wHACAAQ/wgAAQMH/wEA + CP8B+AgAAQ8P/wHgCAABPw//AYAIAA//Af4IAAEDB/8BAAj/AfgIAAEPD/8B4AgAAT8P/wGACAAP/wH+ + CAABAwf/AQAI/wH4CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABBw//AeAIAAEf + D/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4 + CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABAw//AeAIAAEPD/8BgAgAAT8O/wH+ + CQAH/wEACP8B+AgAAQMP/wHgCAABDw//AYAIAAE/Dv8B/gkAB/8BAAj/AfAIAAEDD/8BwAgAAQ8P/wkA + AT8O/wH8CQAH/wEACP8B8AgAAQMP/wHACAABDw//CQABPw7/AfwJAAf/AQAI/wHwCAABAQ//AcAIAAEH + D/8JAAEfDv8B/AkAAX8G/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/AfwJAAF/Bv8BAAj/AfAIAAEB + D/8BwAgAAQcP/wkAAR8O/wH8CQABfwb/AQAI/wHwCAABAQ//AcAIAAEHD/8JAAEfDv8B/AkAAX8G/wEA + CP8B8AkAD/8BwAgAAQMP/wkAAQ8O/wH8CQABPwb/AQAI/wHwCQAP/wHACAABAw//CQABDw7/AfwJAAE/ + Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEP + Dv8B+AkAAT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAED + Dv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8B4AkA + D/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/ + AQAI/wHACQAP/wkAAQMO/wH8CQABDw7/AfAJAAE/Bv8BAAj/AcAJAA//CQABAw7/AfwJAAEPDv8B8AkA + AT8G/wEACP8BgAgAAQEO/wH+CQABBw7/AfgJAAEfDv8B4AkAAX8G/wEACP8BgAgAAQEO/wH+CQABBw7/ + AfgJAAEfDv8B4AkAAX8G/wEAB/8B/gkAAQcO/wH4CQABHw7/AeAJAAF/Dv8BgAgAAQEH/wEABv8B+AoA + AT8N/wHgCgAO/wGACQABAw3/Af4KAAEPB/8BAAb/AfABAAEDBP8B/AEfEP8BwAEAAQ8W/wIAAT8V/wH8 + AgAD/wHjDP8BAAb/AfABAAEDBP8B/AEPEP8BwAEAAQ8W/wIAAT8V/wH8AgAD/wGDDP8BAAb/AfABAAEH + BP8B+AEDEP8BwAEAAR8W/wIAAX8C/wH5Ev8B/AEAAQEC/wH8AQEM/wEABv8B8AEAAR8E/wH4AQAQ/wHA + AQABfxb/AQABAQP/AckS/wH8AQABBwL/AfABAQz/AQAG/wH8AQAF/wH4AQABfw//AfABAxf/AcABDwP/ + AUgT/wEAAT8C/wHAAQEM/wEABv8B/gEBBf8B+QEAAT8P/wH4AQcX/wHgAR8C/wH9AUAT/wGAAX8B/wH+ + AgAM/wEADf8B/AEAAT8s/wHnAQABfxX/AfgBBwEDDP8BAA7/ASABPxT/AfgBfxb/AZwBAAF/F/8Bzwz/ + AQAO/wHIAX8U/wHCAX8V/wH+AWABAAF/JP8BAA7/AeAV/wEYAT8V/wHxAYABAAE/JP8BACP/AfwBQAE/ + Ff8B5gIAAT8k/wEADP8BPxb/AeEBAAEfFf8B8AEBAYEB3yT/AQAL/wH4Ad8W/wGMAQABHxX/AucB9wG/ + JP8BAAv/AecBHxX/Af4BIAEAAQ8V/wHzAeQB/iX/AQAL/wGYAQ8V/wH4AYABAAEPFf8B+AEHAZsl/wEA + Cv8B/AEgAQ8V/wHyAgABDxf/Ae8l/wEACv8B8QGAAQcV/wHwAQEB8AHvPf8BAAr/AcQBAAEHFf8C+QH/ + AZ89/wEACf8B/gEQAQABBxX/AfwBYAEOAX89/wEACf8B/AHAAQABAxb/AQcB8T7/AQAJ/wH8AQABMAEb + Vv8BAAn/AfwBfAF+AXNW/wEACf8B/gE8AQcBz1b/AQAK/wGAAfIBP1b/AQAL/wH9V/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAFn/AQcJ/wEAWP8B/AEBCf8BAFj/AfgBAAn/AQBA/wHh + F/8B+AEAAX8I/wEAQP8BgAF/Ev8CAAEPAf8B8AEAAT8I/wEAQP8BAAE/Ev8CAAEPAf8B8AEAAT8I/wEA + P/8B/gEAAR8S/wIAAQ8B/wHwAQABPwj/AQAn/wHwAT8W/wH+AQABDxL/AgABDwH/AfABAAE/CP8BACf/ + AeABDxL/AcABAAEDAf8B/AEAAQ8S/wIAAQ8B/wHwAQABPwj/AQAn/wHAAQcS/wGAAQABAwH/AfwBAAEP + Ev8CAAEPAf8B8AEAAT8I/wEAD/8BPxf/AYABBxL/AYABAAEDAf8B/AEAAQ8S/wIAAQ8B/wH4AQABPwj/ + AQAO/wH4AQcX/wEAAQMS/wGAAQABAwH/AfwBAAEPEv8CAAEPAf8B+AEAAX8I/wEADv8B8AEDF/8BAAED + Ev8BgAEAAQMB/wH8AQABDxL/AgABDwH/AfwBAAn/AQAO/wHgAQES/wHgAQABAQL/AQABAxL/AYABAAED + Af8B/AEAAQ8S/wIAAQ8B/wH+AQEJ/wEADv8B4AEAEv8B4AEAAQEC/wEAAQMS/wGAAQABAwH/AfwBAAEf + Ev8CAAEPAv8Bhwn/AQAO/wHAAQAS/wHgAQABAQL/AQABAxL/AYABAAEDAf8B/gEAAR8S/wIAAQ8M/wEA + Dv8BwAEAEv8B4AEAAQEC/wEAAQMS/wGAAQABAwL/AQABPxL/AgABDwz/AQAO/wHAAQAS/wHgAQABAQL/ + AYABAxL/AYABAAEDAv8BwAF/Ev8CAAEPDP8BAAn/AfgCAAF/Af8BwAEAEv8B4AEAAQEC/wGAAQcS/wGA + AQABAxb/AgABDwz/AQAJ/wH4AgABfwH/AcABABL/AeABAAEBAv8BwAEHEv8BgAEAAQMV/wH9AgABCwz/ + AQAJ/wH4AgABfwH/AcABABL/AeABAAEBAv8B4AEfEv8BgAEAAQMV/wH4AgABAQz/AQAJ/wH4AgABfwH/ + AcABABL/AeABAAEBAv8B+AE/Ev8BgAEAAQMV/wHwAwAM/wEACf8B+AIAAX8B/wHgAQES/wHgAQABARb/ + AYABAAEDFf8B4AMAAX8L/wEACf8B+AIAAX8B/wHwAQMS/wHgAQABARb/AYABAAEDFf8BwAMAAT8L/wEA + Cf8B+AIAAX8B/wH4AQcS/wHgAQABARX/Af4BgAEAAQIV/wHAAwABPwv/AQAJ/wH4AgABfwL/AT8S/wHg + AQABARX/AfwDAAF/FP8B4AMAAX8L/wEACf8B+AIAAX8V/wHgAQABARX/AfgDAAE/FP8B8AMADP8BAAn/ + AfgCAAF/Ff8B4AEAAQEV/wHwAwABHxT/AfgBAAHwAQEM/wEACf8B+AIAAX8V/wHgAQABARX/AeADAAEP + FP8B/AEBAfgBAwz/AQAJ/wH4AgABfxX/AaABAAEBFf8B4AMAAQ8U/wH+AQMB/AEHDP8BAAn/AfgCAAF/ + Ff8DAAE/FP8B8AMAAR8V/wEHAfwBDwz/AQAJ/wH4AgABfxT/Af4DAAEfFP8B+AMAAT8k/wEACf8B+AIA + AX8U/wH8AwABDxT/AfwBAAE4AQABfyT/AQAJ/wH4AgABfxT/AfgDAAEHFP8B/gEAAf4BACX/AQAJ/wH4 + AgABfxT/AfgDAAEHFf8BAAH+AQEl/wEACf8BwAIAAQ8U/wH4AwABBxX/AYEB/wEDJf8BAAn/AYACAAEH + FP8B/AMAAQ89/wEACf8DAAEDFP8B/gEAAQwBAAEfPf8BAAj/Af4DAAEBFf8BAAE/AQABPz3/AQAI/wH+ + AwABARX/AYABfwGAAX89/wEACP8B/gMAAQEV/wHAAX8BgD7/AQAJ/wMAAQNW/wEACf8BgAEDAQABB1b/ + AQAJ/wHAAQ8BwAEPVv8BAAn/AeABHwHgAR9W/wEACf8B8AEfAeABP1b/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEACv8B5wX/AY8S/wGfBP8B/gE/Ef8B/gF/ + BP8B+BL/AfkF/wHjCP8BAAr/AQAE/wH+AQMR/wH8AQME/wH4AQ8R/wHwAQ8E/wHgAT8R/wHAAT8E/wGA + CP8BAAn/Af4BAAF/A/8B+AEAEf8B+AEBBP8B4AEDEf8B4AEHBP8BgAEPEf8BgAEfA/8B/gEAAT8H/wEA + Cf8B/AEAAX8D/wH4AQAR/wHwAQEE/wHgAQMR/wHAAQcE/wGAAQ8R/wEAAR8D/wH+AQABPwf/AQAJ/wH8 + AQABfwP/AfABAAF/EP8B8AEBBP8BwAEBEf8BwAEHBP8BAAEHEf8BAAEfA/8B/AEAAR8H/wEACf8B+AEA + AX8D/wHwAQABfxD/AeABAQT/AcABARH/AYABBwT/AQABBxD/Af4BAAEfA/8B/AEAAR8H/wEACf8B+AEA + AX8D/wHwAQABfxD/AeABAQT/AcABARH/AYABBwT/AQABBxD/Af4BAAEfA/8B/AEAAR8H/wEACf8B+AEA + AX8D/wHwAQABfxD/AeABAQT/AcABARH/AYABBwT/AQABBxD/Af4BAAEfA/8B/AEAAR8H/wEACf8B/AEA + AX8D/wHwAQABfxD/AfABAQT/AcABARH/AcABBwT/AQABBxH/AQABHwP/AfwBAAEfB/8BAAn/AfwBAAF/ + A/8B+AEAEf8B8AEBBP8B4AEDEf8BwAEHBP8BgAEPEf8BAAEfA/8B/gEAAT8H/wEACf8B/gEABP8B/AEB + Ef8B+AEDBP8B8AEHEf8B4AEPBP8BwAEfEf8BgAE/BP8BAAF/B/8BAAr/AQEE/wH+AQMR/wH8AQcE/wH4 + AQ8R/wHwAR8E/wHgAT8R/wHAAX8E/wGACP8BAGP/AQBj/wEAY/8BAGP/AQAK/wGABgABfxD/Af4GAAEB + Ef8B+AYAAQcR/wHgBgABHwf/AQAJ/wH+BwABPxD/AfgHABH/AeAGAAEDEf8BgAYAAQ8H/wEACf8B+AcA + AR8Q/wHgBwABfxD/AYAGAAEBEP8B/gcAAQcH/wEACf8B8AcAAQ8Q/wHABwABPxD/CAAQ/wH8BwABAwf/ + AQAJ/wHgBwABDxD/AYAHAAE/D/8B/ggAEP8B+AcAAQMH/wEACf8BwAcAAR8Q/wgAAX8P/wH8BwABARD/ + AfAHAAEHB/8BAAn/AcAHAAE/EP8IABD/AfwHAAEDEP8B8AcAAQ8H/wEACf8BgAF/Fv8B/gEBF/8B+AEH + F/8B4AEfDv8BAAn/AYAX/wH+AQMX/wH4AQ8X/wHgAT8O/wEACf8BABf/AfwBAxf/AfABDxf/AcABPw7/ + AQAJ/wEBF/8B/AEHF/8B8AEfF/8BwAF/Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8BARf/ + AfwBBxf/AfABHxf/AcABfw7/AQAJ/wEBF/8B/AEHF/8B8AEfF/8BwAF/Dv8BAAn/BQABPxL/AfwFABP/ + AfAEAAEDE/8BwAQAAQ8K/wEACP8B/gcAEf8B+AYAAQMR/wHgBgABDxH/AYAGAAE/CP8BAAj/Af4HAAEf + EP8B+AcAAX8Q/wHgBgABARH/AYAGAAEHCP8BAAj/Af4HAAEHEP8B+AcAAR8Q/wHgBwABfxD/AYAGAAEB + CP8BAAj/Af4HAAEBEP8B+AcAAQcQ/wHgBwABHxD/AYAHAAF/B/8BAAj/Af4IABD/AfgHAAEDEP8B4AcA + AQ8Q/wGABwABPwf/AQAI/wH+CAABfw//AfgHAAEBEP8B4AcAAQcQ/wGABwABHwf/AQAI/wH+CAABfw// + AfgHAAEBEP8B4AcAAQcQ/wGABwABHwf/AQAI/wH+CAABPw//AfgIABD/AeAHAAEDEP8BgAcAAQ8H/wEA + CP8B/AgAAT8P/wHwCAAQ/wHABwABAxD/CAABDwf/AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgA + AQcH/wEACP8B/AgAAR8P/wHwCAABfw//AcAHAAEBEP8IAAEHB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHA + BwABARD/CAABBwf/AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgAAQcH/wEACP8B/AgAAQ8P/wHw + CAABPw//AcAIABD/CAABAwf/AQAI/wH8CAABDw//AfAIAAE/D/8BwAgAEP8IAAEDB/8BAAj/AfgIAAEP + D/8B4AgAAT8P/wGACAAP/wH+CAABAwf/AQAI/wH4CAABDw//AeAIAAE/D/8BgAgAD/8B/ggAAQMH/wEA + CP8B+AgAAQcP/wHgCAABHw//AYAIAAF/Dv8B/ggAAQEH/wEACP8B+AgAAQcP/wHgCAABHw//AYAIAAF/ + Dv8B/ggAAQEH/wEACP8B+AgAAQcP/wHgCAABHw//AYAIAAF/Dv8B/ggAAQEH/wEACP8B+AgAAQcP/wHg + CAABHw//AYAIAAF/Dv8B/ggAAQEH/wEACP8B+AgAAQMP/wHgCAABDw//AYAIAAE/Dv8B/gkAB/8BAAj/ + AfgIAAEDD/8B4AgAAQ8P/wGACAABPw7/Af4JAAf/AQAI/wHwCAABAw//AcAIAAEPD/8JAAE/Dv8B/AkA + B/8BAAj/AfAIAAEDD/8BwAgAAQ8P/wkAAT8O/wH8CQAH/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/ + AfwJAAF/Bv8BAAj/AfAIAAEBD/8BwAgAAQcP/wkAAR8O/wH8CQABfwb/AQAI/wHwCAABAQ//AcAIAAEH + D/8JAAEfDv8B/AkAAX8G/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/AfwJAAF/Bv8BAAj/AfAJAA// + AcAIAAEDD/8JAAEPDv8B/AkAAT8G/wEACP8B8AkAD/8BwAgAAQMP/wkAAQ8O/wH8CQABPwb/AQAI/wHg + CQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/ + Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEP + Dv8B+AkAAT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAED + Dv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8BwAkA + D/8JAAEDDv8B/AkAAQ8O/wHwCQABPwb/AQAI/wHACQAP/wkAAQMO/wH8CQABDw7/AfAJAAE/Bv8BAAj/ + AYAIAAEBDv8B/gkAAQcO/wH4CQABHw7/AeAJAAF/Bv8BAAj/AYAIAAEBDv8B/gkAAQcO/wH4CQABHw7/ + AeAJAAF/Bv8BAAf/Af4JAAEHDv8B+AkAAR8O/wHgCQABfw7/AYAIAAEBB/8BAAb/AfgKAAE/Df8B4AoA + Dv8BgAkAAQMN/wH+CgABDwf/AQAG/wHwAQABAxb/AcABAAEPFv8CAAE/Ff8B/AIAEP8BAAb/AfABAAED + Fv8BwAEAAQ8W/wIAAT8V/wH8AgAQ/wEABv8B8AEAAQcW/wHAAQABHxb/AgABfxX/AfwBAAEBEP8BAAb/ + AfABAAEfFv8BwAEAAX8W/wEAAQEW/wH8AQABBxD/AQAG/wH8AQAX/wHwAQMX/wHAAQ8X/wEAAT8F/wHf + Cv8BAAb/Af4BARf/AfgBBxf/AeABHxf/AYABfwX/AQMK/wEAWP8BAAr/AQBX/wH+AQABfwn/AQBX/wH+ + AQABHwn/AQA//wHxF/8B/gEAAQ8J/wEAP/8BwAF/F/8BAAEPCf8BAD//AcABPxf/AQABDwn/AQA//wHA + AQ8X/wHAAQ8J/wEAP/8BwAEDF/8B8AEfCf8BACb/AfgBPxf/AcABAxf/AfwBPwn/AQAm/wH4AR8X/wHA + AQEi/wEAJv8B8AEHF/8B4AEBFf8BLwz/AQAm/wHwAQEX/wH4AQMU/wH8AccM/wEAJv8B8AEAF/8B/AED + FP8B4wEHDP8BAA3/Af4BDxf/AfABAAF/F/8BDxT/AYwBAwz/AQAN/wH8AQMX/wH4AQABfxT/AeMW/wH+ + ASABAwz/AQAN/wH8AQAX/wH8AQABfxT/ARsW/wHwAYABAQz/AQAN/wH8AQABPxb/Af4BAAF/E/8B/AHh + Fv8BxgEAAQEM/wEADf8B/AEAAR8X/wGAFP8B8QGBFv8BEAEAAQEM/wEADf8B/gEAAR8U/wH9Av8B4xT/ + AYQBABb/AgABAgz/AQAO/wEAAR8U/wHiFv8B/gEwAQAW/wEQAT8BDgz/AQAO/wEAAR8U/wGMFv8B+AHA + AQAW/wEfAT8B+Qz/AQAO/wHAAR8T/wH+ASABfxX/AcICAAF/Ff8BhAEAAc8M/wEAC/8B/gF/Af8B8AE/ + E/8B4AGAAT8V/wGIAgABfxX/AfAB/gE/DP8BAAv/AfABPxb/AYABAAE/Ff8BgAEHAQIBfyT/AQAL/wGA + AT8V/wH8AgABPxX/Ac8BwAHIAX8k/wEACv8B/gEAAR8V/wHgAgABHxX/AeABAAEhJf8BAAr/AfgBAAEf + Ff8B4AIAAR8V/wHwAR8BByX/AQAK/wHAAQABHxX/AeACAAFfF/8B3yX/AQAK/wIAAQ8V/wHiAQMB4QEf + Pf8BAAn/AfwCAAEPFf8B8AEAARgBPz3/AQAJ/wH4AgABBxX/AfgCAD7/AQAJ/wH4AgABBxb/AR8B5z7/ + AQAJ/wH4AQAB8AEnVv8BAAn/AvgBDAEPVv8BAAn/AfwCAAEfVv8BAAr/AQMB8Ff/AQAL/wH7V/8BAGP/ + AQBj/wEAY/8BAGP/AQBj/wEAWf8Bgwn/AQBY/wH+AQEJ/wEAWP8B/AEAAX8I/wEAWP8B+AEAAX8I/wEA + QP8BwAF/Fv8B+AEAAT8I/wEAQP8BAAE/Fv8B8AEAAT8I/wEAP/8B/gEAAR8W/wHwAQABPwj/AQAn/wH4 + AX8W/wH+AQABHxb/AfABAAE/CP8BACf/AeABHxb/AfwBAAEPFv8B8AEAAT8I/wEAJ/8BwAEPFv8B/AEA + AQ8W/wHwAQABPwj/AQAn/wGAAQcW/wH8AQABDxH/AfwCAAE/Af8B+AEAAT8I/wEADv8B/gEPF/8BgAED + Fv8B/AEAAQ8R/wH8AgABPwH/AfgBAAF/CP8BAA7/AfgBAxf/AQABAxb/AfwBAAEPEf8B/AIAAT8B/wH8 + AQABfwj/AQAO/wHwAQEX/wEAAQMW/wH8AQABDxH/AfwCAAE/Af8B/gEACf8BAA7/AeABARf/AQABAxb/ + AfwBAAEPEf8B/AIAAT8C/wEDCf8BAA7/AeABABf/AQABAxL/AgABDwH/Af4BAAEfEf8B/AIAAT8M/wEA + Dv8BwAEAF/8BAAEDEv8CAAEPAv8BAAE/Ef8B/AIAAT8M/wEADv8BwAEAF/8BgAEDEv8CAAEPAv8BgAF/ + Ef8B/AIAAT8M/wEADv8BwAEAF/8BgAEHEv8CAAEPAv8B4RL/AfwCAAE/DP8BAA7/AcABABf/AcABBxL/ + AgABDxX/AfwCAAE/DP8BAA7/AeABABf/AeABDxL/AgABDxX/AfwCAAE/DP8BAA7/AcABARf/AfABPxL/ + AgABDxX/AfwCAAE/DP8BAA7/AeABASv/AgABDxX/AfwCAAE/DP8BAA7/AfABAyv/AgABDxX/AfwCAAE/ + DP8BAA7/AfgBByv/AgABDxX/AfwCAAE/DP8BAA//AR8r/wIAAQ8V/wH8AgABPwz/AQA7/wIAAQ8V/wH0 + AgABJwz/AQA7/wIAAQ8V/wHgAgABAwz/AQA7/wIAAQ8V/wHAAgABAQz/AQA7/wIAAQ8V/wGAAwAM/wEA + O/8CAAEPFf8BgAMADP8BADv/AgABDxX/AYADAAz/AQA6/wH5AgABCRX/AcACAAEBDP8BADr/AfADABX/ + AeABAAGAAQMM/wEAOv8B4AMAFf8B8AEHAeABBwz/AQA6/wHgAwABfxT/AfgBDwHwAQ8M/wEAOv8B4AMA + AX8U/wH8AQ8B+AEfDP8BADr/AfADACX/AQA6/wH4AQAB8AEBJf8BADr/AfwBAwH8AQMl/wEAOv8B/gED + AfwBByX/AQA7/wEHAf4BDyX/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQAK/wHnBf8BjxL/AZ8E/wH+AT8R/wH+AX8E/wH4 + Ev8B+QX/AeMI/wEACv8BAAT/Af4BAxH/AfwBAwT/AfgBDxH/AfABDwT/AeABPxH/AcABPwT/AYAI/wEA + Cf8B/gEAAX8D/wH4AQAR/wH4AQEE/wHgAQMR/wHgAQcE/wGAAQ8R/wGAAR8D/wH+AQABPwf/AQAJ/wH8 + AQABfwP/AfgBABH/AfABAQT/AeABAxH/AcABBwT/AYABDxH/AQABHwP/Af4BAAE/B/8BAAn/AfwBAAF/ + A/8B8AEAAX8Q/wHwAQEE/wHAAQER/wHAAQcE/wEAAQcR/wEAAR8D/wH8AQABHwf/AQAJ/wH4AQABfwP/ + AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/AQAJ/wH4AQABfwP/ + AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/AQAJ/wH4AQABfwP/ + AfABAAF/EP8B4AEBBP8BwAEBEf8BgAEHBP8BAAEHEP8B/gEAAR8D/wH8AQABHwf/AQAJ/wH8AQABfwP/ + AfABAAF/EP8B8AEBBP8BwAEBEf8BwAEHBP8BAAEHEf8BAAEfA/8B/AEAAR8H/wEACf8B/AEAAX8D/wH4 + AQAR/wHwAQEE/wHgAQMR/wHAAQcE/wGAAQ8R/wEAAR8D/wH+AQABPwf/AQAJ/wH+AQAE/wH8AQER/wH4 + AQME/wHwAQcR/wHgAQ8E/wHAAR8R/wGAAT8E/wEAAX8H/wEACv8BAQT/Af4BAxH/AfwBBwT/AfgBDxH/ + AfABHwT/AeABPxH/AcABfwT/AYAI/wEAY/8BAGP/AQBj/wEAY/8BAAr/AYAGAAF/EP8B/gYAAQER/wH4 + BgABBxH/AeAGAAEfB/8BAAn/Af4HAAE/EP8B+AcAEf8B4AYAAQMR/wGABgABDwf/AQAJ/wH4BwABHxD/ + AeAHAAF/EP8BgAYAAQEQ/wH+BwABBwf/AQAJ/wHwBwABDxD/AcAHAAE/EP8IABD/AfwHAAEDB/8BAAn/ + AeAHAAEPEP8BgAcAAT8P/wH+CAAQ/wH4BwABAwf/AQAJ/wHABwABHxD/CAABfw//AfwHAAEBEP8B8AcA + AQcH/wEACf8BwAcAAT8Q/wgAEP8B/AcAAQMQ/wHwBwABDwf/AQAJ/wGAAX8W/wH+AQEX/wH4AQcX/wHg + AR8O/wEACf8BgBf/Af4BAxf/AfgBDxf/AeABPw7/AQAJ/wEAF/8B/AEDF/8B8AEPF/8BwAE/Dv8BAAn/ + AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8BARf/AfwBBxf/AfABHxf/AcABfw7/AQAJ/wEBF/8B/AEH + F/8B8AEfF/8BwAF/Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8FAAE/Ev8B/AUAE/8B8AQA + AQMT/wHABAABDwr/AQAI/wH+BwAR/wH4BgABAxH/AeAGAAEPEf8BgAYAAT8I/wEACP8B/gcAAR8Q/wH4 + BwABfxD/AeAGAAEBEf8BgAYAAQcI/wEACP8B/gcAAQcQ/wH4BwABHxD/AeAHAAF/EP8BgAYAAQEI/wEA + CP8B/gcAAQEQ/wH4BwABBxD/AeAHAAEfEP8BgAcAAX8H/wEACP8B/ggAEP8B+AcAAQMQ/wHgBwABDxD/ + AYAHAAE/B/8BAAj/Af4IAAF/D/8B+AcAAQEQ/wHgBwABBxD/AYAHAAEfB/8BAAj/Af4IAAF/D/8B+AcA + AQEQ/wHgBwABBxD/AYAHAAEfB/8BAAj/Af4IAAE/D/8B+AgAEP8B4AcAAQMQ/wGABwABDwf/AQAI/wH8 + CAABPw//AfAIABD/AcAHAAEDEP8IAAEPB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHABwABARD/CAABBwf/ + AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgAAQcH/wEACP8B/AgAAR8P/wHwCAABfw//AcAHAAEB + EP8IAAEHB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHABwABARD/CAABBwf/AQAI/wH8CAABDw//AfAIAAE/ + D/8BwAgAEP8IAAEDB/8BAAj/AfwIAAEPD/8B8AgAAT8P/wHACAAQ/wgAAQMH/wEACP8B+AgAAQ8P/wHg + CAABPw//AYAIAA//Af4IAAEDB/8BAAj/AfgIAAEPD/8B4AgAAT8P/wGACAAP/wH+CAABAwf/AQAI/wH4 + CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+ + CAABAQf/AQAI/wH4CAABBw//AeAIAAEfD/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABBw//AeAIAAEf + D/8BgAgAAX8O/wH+CAABAQf/AQAI/wH4CAABAw//AeAIAAEPD/8BgAgAAT8O/wH+CQAH/wEACP8B+AgA + AQMP/wHgCAABDw//AYAIAAE/Dv8B/gkAB/8BAAj/AfAIAAEDD/8BwAgAAQ8P/wkAAT8O/wH8CQAH/wEA + CP8B8AgAAQMP/wHACAABDw//CQABPw7/AfwJAAf/AQAI/wHwCAABAQ//AcAIAAEHD/8JAAEfDv8B/AkA + AX8G/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/AfwJAAF/Bv8BAAj/AfAIAAEBD/8BwAgAAQcP/wkA + AR8O/wH8CQABfwb/AQAI/wHwCAABAQ//AcAIAAEHD/8JAAEfDv8B/AkAAX8G/wEACP8B8AkAD/8BwAgA + AQMP/wkAAQ8O/wH8CQABPwb/AQAI/wHwCQAP/wHACAABAw//CQABDw7/AfwJAAE/Bv8BAAj/AeAJAA// + AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEA + CP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4 + CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+ + CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHACQAP/wkA + AQMO/wH8CQABDw7/AfAJAAE/Bv8BAAj/AcAJAA//CQABAw7/AfwJAAEPDv8B8AkAAT8G/wEACP8BgAgA + AQEO/wH+CQABBw7/AfgJAAEfDv8B4AkAAX8G/wEACP8BgAgAAQEO/wH+CQABBw7/AfgJAAEfDv8B4AkA + AX8G/wEAB/8B/gkAAQcO/wH4CQABHw7/AeAJAAF/Dv8BgAgAAQEH/wEABv8B+AoAAT8N/wHgCgAO/wGA + CQABAw3/Af4KAAEPB/8BAAb/AfABAAEDAf8CAAEPEv8BwAEAAQ8B/AIAAT8S/wIAAT8B+AIAEv8B/AIA + EP8BAAb/AfABAAEDAf8CAAEPEv8BwAEAAQ8B/AIAAT8S/wIAAT8B+AIAEv8B/AIAEP8BAAb/AfABAAEH + Af8CAAEPEv8BwAEAAR8B/AIAAT8S/wIAAX8B+AIAEv8B/AEAAQEQ/wEABv8B8AEAAR8B/wIAAQ8S/wHA + AQABfwH8AgABPxL/AQABAQH/AfgCABL/AfwBAAEHEP8BAAb/AfwBAAL/AgABDxL/AfABAwH/AfwCAAE/ + Ev8BwAEPAf8BwAIAAR8S/wEAAT8Q/wEABv8B/gEBAv8CAAEPEv8B+AEHAf8B/AIAAT8S/wHgAR8B/wMA + AQcS/wGAAX8Q/wEACv8CAAEPFf8B/AIAAT8U/wH+AwABAyT/AQAK/wIAAQ8V/wH8AgABPxX/AwABByT/ + AQAK/wIAAQ8V/wHwAgABJxX/AYACAAEPJP8BAAr/AgABDxX/AeACAAEDFf8BwAEPAYABHyT/AQAK/wIA + AQ8V/wHAAgABARX/AeABPwHgAT8k/wEACv8CAAEPFf8BgAMAFf8B8AE/AeABfyT/AQAK/wIAAQ8V/wGA + AwA9/wEACf8B+QIAAQEV/wHAAgABAT3/AQAJ/wHwAwAV/wHgAQABgAEDPf8BAAn/AeADAAF/FP8B8AEH + AeABBz3/AQAJ/wHAAwABPxT/AfgBDwHwAQ89/wEACf8BwAMAAT8U/wH8AQ8B+AEfPf8BAAn/AeADAAF/ + Vf8BAAn/AfADAFb/AQAJ/wH4AQAB+AEBVv8BAAn/AfwBAAH8AQNW/wEACf8B/gEDAfwBB1b/AQBj/wEA + WP8BgQr/AQBY/wGAAX8J/wEAWP8BAAEfCf8BAFj/AQABDwn/AQA//wHwGP8BgAEHCf8BAD//AeABHxf/ + AYABBwn/AQA//wHgAQ8X/wHAAQMJ/wEAP/8B4AEDF/8B4AEHCf8BACb/Af4BHxf/AeABARX/Ab8B/wH4 + AQcJ/wEAJv8B/AEPF/8B4AEAFP8B/AEfAf8B/gEPCf8BACb/AfgBAxf/AfABABT/AfABDwz/AQAm/wH4 + AQAX/wH4AQAU/wHCAQ8M/wEAJv8B+AEAAX8W/wH8AQAT/wH+AQABBwz/AQAO/wGHF/8B+AEAAT8U/wGH + Af8B/gEBE/8B+AEAAQcM/wEADv8BARf/AfgBAAE/E/8B/gEHAv8BgxP/AeEBAAEHDP8BAA3/Af4BAAF/ + Fv8B/AEAAT8T/wH4AQMW/wIAAQMM/wEADf8B/gEAAR8X/wEAAT8T/wHAAQMV/wH+AgABAwz/AQAN/wH+ + AQABDxT/AfMC/wGAAT8T/wEAAQMV/wH8AgABAQz/AQAN/wH+AQABDxT/AcEC/wHAAX8S/wH8AQABARX/ + AfwCAAEJDP8BAA7/AQABBxP/Af4BAQL/AfAT/wHgAQABARX/Af4BIAF+ASMM/wEADv8BgAEHE/8B+AEA + Fv8BgAIAFf8B/gEAAQMBhwz/AQAO/wHAAQcT/wHhAQAW/wMAFv8BgAEAAR8M/wEAC/8B+AL/AfABDxP/ + AgAW/wMAF/8B/AF/DP8BAAv/AcgBfwH/AfgBHxL/AfwCAAF/Ff8BAAEeAQQl/wEAC/8BCAF/Af8B/gE/ + Ev8B8AIAAX8V/wGfAQEBkCX/AQAK/wH8AQABfxX/AcACAAE/Ff8BwAEAARMl/wEACv8B5AEAAT8V/wHA + AgABPxX/AeABfgEfJf8BAAr/AYQBAAE/Ff8BwAIAAb89/wEACf8B/gIAAR8V/wHGAQcBwAE/Pf8BAAn/ + AfICAAEfFf8B4AEGATABfz3/AQAJ/wHwAgABDxX/AfABBgEDPv8BAAn/AfACAAEPF/8Bzz7/AQAJ/wHw + AQMB4AGPVv8BAAn/AfEB8AEaAR9W/wEACf8B+AIAAX9W/wEACf8B/gEPAeFX/wEAY/8BAGP/AQBj/wEA + Wf8Bgwn/AQBY/wH+AQEJ/wEAWP8B/AEACf8BAFj/AfgBAAF/CP8BAFj/AfgBAAF/CP8BAFj/AfgBAAE/ + CP8BAFj/AfgBAAE/CP8BAFj/AfgBAAE/CP8BAFj/AfgBAAE/CP8BAFj/AfgBAAF/CP8BAFj/AfwBAAF/ + CP8BAFj/AfwBAAn/AQBY/wH+AQEJ/wEAWf8Bhwn/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEACv8B5wX/AY8S/wGfBP8B/gE/Ef8B/gF/ + BP8B+BL/AfkF/wHjCP8BAAr/AQAE/wH+AQMR/wH8AQME/wH4AQ8R/wHwAQ8E/wHgAT8R/wHAAT8E/wGA + CP8BAAn/Af4BAAF/A/8B+AEAEf8B+AEBBP8B4AEDEf8B4AEHBP8BgAEPEf8BgAEfA/8B/gEAAT8H/wEA + Cf8B/AEAAX8D/wH4AQAR/wHwAQEE/wHgAQMR/wHAAQcE/wGAAQ8R/wEAAR8D/wH+AQABPwf/AQAJ/wH8 + AQABfwP/AfABAAF/EP8B8AEBBP8BwAEBEf8BwAEHBP8BAAEHEf8BAAEfA/8B/AEAAR8H/wEACf8B+AEA + AX8D/wHwAQABfxD/AeABAQT/AcABARH/AYABBwT/AQABBxD/Af4BAAEfA/8B/AEAAR8H/wEACf8B+AEA + AX8D/wHwAQABfxD/AeABAQT/AcABARH/AYABBwT/AQABBxD/Af4BAAEfA/8B/AEAAR8H/wEACf8B+AEA + AX8D/wHwAQABfxD/AeABAQT/AcABARH/AYABBwT/AQABBxD/Af4BAAEfA/8B/AEAAR8H/wEACf8B/AEA + AX8D/wHwAQABfxD/AfABAQT/AcABARH/AcABBwT/AQABBxH/AQABHwP/AfwBAAEfB/8BAAn/AfwBAAF/ + A/8B+AEAEf8B8AEBBP8B4AEDEf8BwAEHBP8BgAEPEf8BAAEfA/8B/gEAAT8H/wEACf8B/gEABP8B/AEB + Ef8B+AEDBP8B8AEHEf8B4AEPBP8BwAEfEf8BgAE/BP8BAAF/B/8BAAr/AQEE/wH+AQMR/wH8AQcE/wH4 + AQ8R/wHwAR8E/wHgAT8R/wHAAX8E/wGACP8BAGP/AQBj/wEAY/8BAGP/AQAK/wGABgABfxD/Af4GAAEB + Ef8B+AYAAQcR/wHgBgABHwf/AQAJ/wH+BwABPxD/AfgHABH/AeAGAAEDEf8BgAYAAQ8H/wEACf8B+AcA + AR8Q/wHgBwABfxD/AYAGAAEBEP8B/gcAAQcH/wEACf8B8AcAAQ8Q/wHABwABPxD/CAAQ/wH8BwABAwf/ + AQAJ/wHgBwABDxD/AYAHAAE/D/8B/ggAEP8B+AcAAQMH/wEACf8BwAcAAR8Q/wgAAX8P/wH8BwABARD/ + AfAHAAEHB/8BAAn/AcAHAAE/EP8IABD/AfwHAAEDEP8B8AcAAQ8H/wEACf8BgAF/Fv8B/gEBF/8B+AEH + F/8B4AEfDv8BAAn/AYAX/wH+AQMX/wH4AQ8X/wHgAT8O/wEACf8BABf/AfwBAxf/AfABDxf/AcABPw7/ + AQAJ/wEBF/8B/AEHF/8B8AEfF/8BwAF/Dv8BAAn/AQEX/wH8AQcX/wHwAR8X/wHAAX8O/wEACf8BARf/ + AfwBBxf/AfABHxf/AcABfw7/AQAJ/wEBF/8B/AEHF/8B8AEfF/8BwAF/Dv8BAAn/BQABPxL/AfwFABP/ + AfAEAAEDE/8BwAQAAQ8K/wEACP8B/gcAEf8B+AYAAQMR/wHgBgABDxH/AYAGAAE/CP8BAAj/Af4HAAEf + EP8B+AcAAX8Q/wHgBgABARH/AYAGAAEHCP8BAAj/Af4HAAEHEP8B+AcAAR8Q/wHgBwABfxD/AYAGAAEB + CP8BAAj/Af4HAAEBEP8B+AcAAQcQ/wHgBwABHxD/AYAHAAF/B/8BAAj/Af4IABD/AfgHAAEDEP8B4AcA + AQ8Q/wGABwABPwf/AQAI/wH+CAABfw//AfgHAAEBEP8B4AcAAQcQ/wGABwABHwf/AQAI/wH+CAABfw// + AfgHAAEBEP8B4AcAAQcQ/wGABwABHwf/AQAI/wH+CAABPw//AfgIABD/AeAHAAEDEP8BgAcAAQ8H/wEA + CP8B/AgAAT8P/wHwCAAQ/wHABwABAxD/CAABDwf/AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgA + AQcH/wEACP8B/AgAAR8P/wHwCAABfw//AcAHAAEBEP8IAAEHB/8BAAj/AfwIAAEfD/8B8AgAAX8P/wHA + BwABARD/CAABBwf/AQAI/wH8CAABHw//AfAIAAF/D/8BwAcAAQEQ/wgAAQcH/wEACP8B/AgAAQ8P/wHw + CAABPw//AcAIABD/CAABAwf/AQAI/wH8CAABDw//AfAIAAE/D/8BwAgAEP8IAAEDB/8BAAj/AfgIAAEP + D/8B4AgAAT8P/wGACAAP/wH+CAABAwf/AQAI/wH4CAABDw//AeAIAAE/D/8BgAgAD/8B/ggAAQMH/wEA + CP8B+AgAAQcP/wHgCAABHw//AYAIAAF/Dv8B/ggAAQEH/wEACP8B+AgAAQcP/wHgCAABHw//AYAIAAF/ + Dv8B/ggAAQEH/wEACP8B+AgAAQcP/wHgCAABHw//AYAIAAF/Dv8B/ggAAQEH/wEACP8B+AgAAQcP/wHg + CAABHw//AYAIAAF/Dv8B/ggAAQEH/wEACP8B+AgAAQMP/wHgCAABDw//AYAIAAE/Dv8B/gkAB/8BAAj/ + AfgIAAEDD/8B4AgAAQ8P/wGACAABPw7/Af4JAAf/AQAI/wHwCAABAw//AcAIAAEPD/8JAAE/Dv8B/AkA + B/8BAAj/AfAIAAEDD/8BwAgAAQ8P/wkAAT8O/wH8CQAH/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/ + AfwJAAF/Bv8BAAj/AfAIAAEBD/8BwAgAAQcP/wkAAR8O/wH8CQABfwb/AQAI/wHwCAABAQ//AcAIAAEH + D/8JAAEfDv8B/AkAAX8G/wEACP8B8AgAAQEP/wHACAABBw//CQABHw7/AfwJAAF/Bv8BAAj/AfAJAA// + AcAIAAEDD/8JAAEPDv8B/AkAAT8G/wEACP8B8AkAD/8BwAgAAQMP/wkAAQ8O/wH8CQABPwb/AQAI/wHg + CQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/ + Bv8BAAj/AeAJAA//AYAIAAEDDv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEP + Dv8B+AkAAT8G/wEACP8B4AkAD/8BgAgAAQMO/wH+CQABDw7/AfgJAAE/Bv8BAAj/AeAJAA//AYAIAAED + Dv8B/gkAAQ8O/wH4CQABPwb/AQAI/wHgCQAP/wGACAABAw7/Af4JAAEPDv8B+AkAAT8G/wEACP8BwAkA + D/8JAAEDDv8B/AkAAQ8O/wHwCQABPwb/AQAI/wHACQAP/wkAAQMO/wH8CQABDw7/AfAJAAE/Bv8BAAj/ + AYAIAAEBDv8B/gkAAQcO/wH4CQABHw7/AeAJAAF/Bv8BAAj/AYAIAAEBDv8B/gkAAQcO/wH4CQABHw7/ + AeAJAAF/Bv8BAAf/Af4JAAEHDv8B+AkAAR8O/wHgCQABfw7/AYAIAAEBB/8BAAb/AfgKAAE/Df8B4AoA + Dv8BgAkAAQMN/wH+CgABDwf/AQAG/wHwAQABAxb/AcABAAEPFv8CAAE/Ff8B/AIAEP8BAAb/AfABAAED + Fv8BwAEAAQ8W/wIAAT8V/wH8AgAQ/wEABv8B8AEAAQcW/wHAAQABHxb/AgABfxX/AfwBAAEBAf8BwAEA + AQMM/wEABv8B8AEAAR8W/wHAAQABfxb/AQABARb/AfwBAAEHAf8BwAEAAQMM/wEABv8B/AEAF/8B8AED + F/8BwAEPF/8BAAE/Af8BwAEAAQMM/wEABv8B/gEBF/8B+AEHF/8B4AEfF/8BgAF/Af8BwAEAAQMM/wEA + QP8BgxP/AcABAAEDDP8BADv/AfACAAL/AQAT/wHAAQABAwz/AQA7/wHwAgAB/wH+AQABfxL/AcABAAED + DP8BADv/AfACAAH/AfwBAAE/Ev8BwAEAAQMM/wEAO/8B8AIAAf8B/AEAAT8S/wHAAQABAwz/AQA7/wHw + AgAB/wH8AQABHxL/AcABAAEDDP8BACL/AfgCAAE/Ff8B8AIAAf8B+AEAAR8S/wHAAQABAwz/AQAi/wH4 + AgABPwH/AfAT/wHwAgAB/wH4AQABHxL/AcABAAEDDP8BACL/AfgCAAE/Af8BwAE/Ev8B8AIAAf8B/AEA + AR8S/wHAAQABAwz/AQAi/wH4AgABPwH/AYABDxL/AfACAAH/AfgBAAE/Ev8BwAEAAQMM/wEAIv8B+AIA + AT8B/wGAAQ8S/wHwAgAB/wH8AQABPxL/AcABAAEDDP8BAAn/Af4CAAEPFf8B+AIAAT8B/wEAAQcS/wHw + AgAB/wH8AQABfxL/AcABAAEDDP8BAAn/Af4CAAEPFf8B+AIAAT8B/wEAAQcS/wHwAgAB/wH+AQAS/wH+ + AgABAgF/C/8BAAn/Af4CAAEPFf8B+AIAAT8B/wEAAQcS/wHwAgAC/wGDEv8B/AMAAT8L/wEACf8B/gIA + AQ8B/wH+AT8S/wH4AgABPwH/AQABBxL/AfACABX/AfgDAAEfC/8BAAn/Af4CAAEPAf8B8AEHEv8B+AIA + AT8B/wEAAQcS/wHwAgAV/wHwAwABDwv/AQAJ/wH+AgABDwH/AeABAxL/AfgCAAE/Af8BAAEHEv8B8AIA + Ff8B8AMAAQ8L/wEACf8B/gIAAQ8B/wHgAQES/wH4AgABPwH/AQABBxL/AYACAAG/FP8B+AMAAR8L/wEA + Cf8B/gIAAQ8B/wHAAQES/wH4AgABPwH/AYABDxL/AwABHxT/AfwDAAE/C/8BAAn/Af4CAAEPAf8BwAEA + Ev8B+AIAAT8B/wGAAR8R/wH+AwABDxT/Af4BAAE8AQABfwv/AQAJ/wH+AgABDwH/AcABABL/AfgCAAE/ + Af8B4AE/Ef8B/AMAAQcV/wEAAX4BAAz/AQAJ/wH+AgABDwH/AcABABL/AfgCAAE/FP8B/AMAAQMV/wGA + AX8BAQz/AQAJ/wH+AgABDwH/AcABABL/AeACAAEPFP8B/AMAAQck/wEACf8B/gIAAQ8B/wHAAQAS/wHA + AgABAxT/Af4DAAEPJP8BAAn/Af4CAAEPAf8B4AEBEv8BgAIAAQEV/wEAAQ8BAAEfJP8BAAn/Af4CAAEP + Af8B4AEBEv8DAAEBFf8BgAE/AYABPyT/AQAJ/wH+AgABDwH/AfABAxL/BAAV/wHAAT8BwAF/JP8BAAn/ + AfACAAELAf8B+AEHEv8DAAEBFf8B8AE/AcAl/wEACf8B8AIAAQEV/wGAAgABAz3/AQAJ/wHgAwAV/wHA + AQMBgAEHPf8BAAn/AcADAAF/FP8B4AEPAeABDz3/AQAJ/wGAAwABPxT/AfABDwHwAR89/wEACf8BwAMA + AX8U/wH4AR8B8AE/Pf8BAAn/AeADAFb/AQAJ/wHwAQAB4AEBVv8BAAn/AfgBAwH4AQNW/wEACf8B/AED + AfgBB0v/AeAK/wEACf8B/gEHAfwBD0v/AcABPwn/AQBY/wGAAQ8J/wEAWP8BgAEHCf8BAD//Af4Bfxf/ + AYABAwn/AQA//wH4AR8X/wGAAQEJ/wEAP/8B8AEHF/8BwAEBCf8BAD//AeABAxf/AeABAQn/AQA//wHg + AQAV/wF/Af8B+AEBCf8BACf/AY8X/wHgAQABfxP/AfkBPwH/Af4BAwn/AQAm/wH+AQcX/wHwAQABfxP/ + AeEBPwL/AQMJ/wEAJv8B/AEBF/8B+AEAAX8T/wGgAR8M/wEAJv8B/AEAAX8W/wH8AQABfxL/AfwBoAEf + DP8BACb/AfgBAAE/FP8BHwL/AQABfxL/AfABgAEPDP8BAA7/AeMX/wH8AQABHxP/Af0BDwL/AcABfxL/ + AdABAAEPDP8BAA7/AYAX/wH8AQABHxP/AfUBDwL/AeAS/wH+AVABAAEHDP8BAA7/AQABPxb/Af4BAAEP + E/8BlAEHFf8B/AIAAQcM/wEADv8BAAEPF/8BgAEPEv8B/gGQAQcV/wH4AgABBwz/AQAO/wEAAQcU/wG/ + Av8BwAEfEv8B+gGAAQMV/wH4AgABFwz/AQAO/wEAAQMU/wGzAv8B8AEfEv8BygEAAQMV/wH8AeQB/AFH + DP8BAA7/AYABAxT/AYMC/wH8AT8S/wFIAQABAxX/AfwBAAHnAU8M/wEADv8BwAEDE/8B3gEBFf8B/gIA + AQEW/wEBAeEBfwz/AQAO/wHgAQMT/wHYAQEV/wH+AgABBRf/AfkN/wEADv8B+AEDE/8BwAEBFf8B/gEg + AX4BGSX/AQAL/wH5Av8B/gEHEv8B7wIAFv8BPgEDAesl/wEAC/8BwAP/AZ8S/wGMAgAW/wGiAQIBLyX/ + AQAL/wEAFv8BgAIAAX8V/wHjAf4BPyX/AQAK/wH8AQABfxX/AYABDwEHAX89/wEACv8B4AEAAX8V/wGP + Af8B3z7/AQAK/wGAAQABfxX/AdcBPwHvPv8BAAn/Af4CAAF/Ff8B9wE/Aa8+/wEACf8B/gEDAYAY/wG/ + Pv8BAAv/AfNX/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Y/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEAY/8BAGP/AQBj/wEA + Cw== + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/GroupBoxEX.Designer.cs b/JinYuan.ControlLib/GroupBoxEX.Designer.cs new file mode 100644 index 0000000..f3d8f9e --- /dev/null +++ b/JinYuan.ControlLib/GroupBoxEX.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class GroupBoxEX + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/GroupBoxEX.cs b/JinYuan.ControlLib/GroupBoxEX.cs new file mode 100644 index 0000000..a3c0550 --- /dev/null +++ b/JinYuan.ControlLib/GroupBoxEX.cs @@ -0,0 +1,40 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class GroupBoxEX : GroupBox + { + + private Color mBorderColor = Color.FromArgb(1, 146, 235); + + [Browsable(true), Description("边框颜色"), Category("自定义分组")] + public Color BorderColor + { + get { return mBorderColor; } + set { mBorderColor = value; } + } + + + public GroupBoxEX() + { + InitializeComponent(); + } + + // 重写 + protected override void OnPaint(PaintEventArgs e) + { + var vSize = e.Graphics.MeasureString(this.Text, this.Font); + + e.Graphics.Clear(this.BackColor); + e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), 10, 1); + Pen vPen = new Pen(this.mBorderColor); // 用属性颜色来画边框颜色 + e.Graphics.DrawLine(vPen, 1, vSize.Height / 2, 8, vSize.Height / 2); + e.Graphics.DrawLine(vPen, vSize.Width + 8, vSize.Height / 2, this.Width - 2, vSize.Height / 2); + e.Graphics.DrawLine(vPen, 1, vSize.Height / 2, 1, this.Height - 2); + e.Graphics.DrawLine(vPen, 1, this.Height - 2, this.Width - 2, this.Height - 2); + e.Graphics.DrawLine(vPen, this.Width - 2, vSize.Height / 2, this.Width - 2, this.Height - 2); + } + } +} diff --git a/JinYuan.ControlLib/JinYuan.ControlLib.csproj b/JinYuan.ControlLib/JinYuan.ControlLib.csproj new file mode 100644 index 0000000..d06ab76 --- /dev/null +++ b/JinYuan.ControlLib/JinYuan.ControlLib.csproj @@ -0,0 +1,705 @@ + + + + + Debug + AnyCPU + {1BB7ED33-D2CB-4CDD-AB39-F7F9AE948CA2} + Library + Properties + JinYuan.ControlLib + JinYuan.ControlLib + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + + + + ..\packages\AntdUI.1.8.4\lib\net48\AntdUI.dll + + + False + Lib\HML.dll + + + False + Lib\HML.ComplexityPropertys.dll + + + + + + + + + + + + + + + + + + + + + + + UserControl + + + ArrTotalQty.cs + + + Component + + + CheckBoxExt.cs + + + Component + + + CircleProgramBar.cs + + + UserControl + + + ControlBase.cs + + + Component + + + CustomComboBox.cs + + + Component + + + Component + + + CustomGroupBox.cs + + + Component + + + CustomRichTextBox.cs + + + + + + + + + + UserControl + + + UCDataGridView.cs + + + UserControl + + + UCDataGridViewRow.cs + + + UserControl + + + UCDataGridViewTreeRow.cs + + + UserControl + + + DialPlate.cs + + + Component + + + FlatComboBox.cs + + + Form + + + FrmBase.cs + + + Form + + + FrmTransparent.cs + + + Form + + + FrmWaiting.cs + + + Component + + + GroupBoxEX.cs + + + Component + + + ListViewEx.cs + + + + LogListBox.cs + + + UserControl + + + LongTitle.cs + + + UserControl + + + LongTitleStyle2.cs + + + + UserControl + + + StatusExt.cs + + + UserControl + + + TButton.cs + + + UserControl + + + TitleButton.cs + + + + SidebarNavigation.cs + + + UserControl + + + UCCheckBox.cs + + + + + UserControl + + + NaviButton2.cs + + + UserControl + + + NaviButton.cs + + + UserControl + + + NumKeyboard.cs + + + Component + + + PanelEnhanced.cs + + + Component + + + PanelExt.cs + + + + True + True + Resources.resx + + + Component + + + + UserControl + + + UserControl + + + UserControl + + + SimpleLed.cs + + + UserControl + + + TextSet2.cs + + + UserControl + + + TextSet.cs + + + UserControl + + + Title.cs + + + UserControl + + + FanShapedSchedule.cs + + + UserControl + + + ProcessEllipse.cs + + + UserControl + + + TitleTime.cs + + + UserControl + + + Toggle.cs + + + UserControl + + + TotalQty.cs + + + UserControl + + + CPK.cs + + + UserControl + + + UCBlower.cs + + + UserControl + + + UCControlBase.cs + + + UserControl + + + UCElectricityMeterH.cs + + + UserControl + + + UCElectricityMeterV.cs + + + UserControl + + + UCFengSu.cs + + + + Component + + + + + Component + + + + + + UserControl + + + UCLed.cs + + + UserControl + + + UCLedAvatar.cs + + + UserControl + + + ucPanel_400_200.cs + + + UserControl + + + ucPanel_900_450.cs + + + + + UserControl + + + UCRollText.cs + + + UserControl + + + UCSplitLine_H.cs + + + UserControl + + + UCSplitLine_V.cs + + + UserControl + + + UpDownLabel.cs + + + + Component + + + Component + + + Wave.cs + + + UserControl + + + WaveProcess.cs + + + UserControl + + + WithBgBox.cs + + + + + ArrTotalQty.cs + + + UCDataGridView.cs + + + UCDataGridViewRow.cs + + + UCDataGridViewTreeRow.cs + + + DialPlate.cs + + + FrmBase.cs + + + FrmTransparent.cs + + + FrmWaiting.cs + + + LongTitle.cs + + + LongTitleStyle2.cs + + + TButton.cs + + + TitleButton.cs + + + NaviButton2.cs + + + NaviButton.cs + + + NumKeyboard.cs + + + ProcessEllipse.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + UCVScrollbar.cs + + + SidebarNavigation.cs + + + SimpleLed.cs + + + TextSet2.cs + + + TextSet.cs + + + Title.cs + + + TitleTime.cs + + + Toggle.cs + + + TotalQty.cs + + + CPK.cs + + + UCBlower.cs + + + UCCheckBox.cs + + + UCElectricityMeterH.cs + + + UCElectricityMeterV.cs + + + UCFengSu.cs + + + ucPanel_400_200.cs + + + ucPanel_900_450.cs + + + UCSplitLine_H.cs + + + UCSplitLine_V.cs + + + UpDownLabel.cs + + + WaveProcess.cs + + + WithBgBox.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {4c0bcb84-5cd7-4846-8363-c4c10d46e391} + JinYuan.Models + + + + + + + + + + + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/ListViewEx.Designer.cs b/JinYuan.ControlLib/ListViewEx.Designer.cs new file mode 100644 index 0000000..69c392a --- /dev/null +++ b/JinYuan.ControlLib/ListViewEx.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class ListViewEx + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/ListViewEx.cs b/JinYuan.ControlLib/ListViewEx.cs new file mode 100644 index 0000000..bce6cbb --- /dev/null +++ b/JinYuan.ControlLib/ListViewEx.cs @@ -0,0 +1,75 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class ListViewEx : ListView + { + + StringFormat sf = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center };//字体水平位置居左,垂直居中 + + public ListViewEx() + { + InitializeComponent(); + this.OwnerDraw = true; + } + + public ListViewEx(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + + private Brush bgColor = Brushes.DodgerBlue; + [CategoryAttribute("自定义")] + [DescriptionAttribute("背景颜色")] + public Brush BgColor + { + set + { + bgColor = value; + } + get + { + return bgColor; + } + } + + private Brush fontColor = Brushes.White; + [CategoryAttribute("自定义")] + [DescriptionAttribute("字体颜色")] + public Brush FontColor + { + set + { + fontColor = value; + } + get + { + return fontColor; + } + } + + + protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e) + { + //e.DrawBackground(); + e.Graphics.FillRectangle(BgColor, e.Bounds); //设置背景颜色 + Font font = new Font("微软雅黑", 12, FontStyle.Bold); //设置字体大小 + e.Graphics.DrawString(e.Header.Text, font, FontColor, e.Bounds, sf); //设置字体颜色 + } + + protected override void OnDrawItem(DrawListViewItemEventArgs e) + { + e.DrawDefault = true; //采用系统默认方式绘制项 + } + + protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e) + { + e.DrawDefault = true; //采用系统默认方式绘制项 + } + } +} diff --git a/JinYuan.ControlLib/LogListBox.Designer.cs b/JinYuan.ControlLib/LogListBox.Designer.cs new file mode 100644 index 0000000..814dc44 --- /dev/null +++ b/JinYuan.ControlLib/LogListBox.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class LogListBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/LogListBox.cs b/JinYuan.ControlLib/LogListBox.cs new file mode 100644 index 0000000..624a6ec --- /dev/null +++ b/JinYuan.ControlLib/LogListBox.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + class LogItem + { + public String info; + public int index; + public Color color; + } + + public partial class LogListBox : ListBox + { + + private int m_nMaxLength = 1000; + [CategoryAttribute("自定义")] + [DescriptionAttribute("日志最大显示条数")] + public int MaxLength + { + set + { + m_nMaxLength = value; + } + get + { + return m_nMaxLength; + } + } + Dictionary m_dicItems = new Dictionary(); + + public LogListBox() + { + InitializeComponent(); + this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; + } + + public LogListBox(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + protected override void OnDrawItem(DrawItemEventArgs e) + { + e.DrawBackground(); + e.DrawFocusRectangle(); + // 确保listbox中有日志且该日志被记录在字典中 + if (e.Index >= 0 && m_dicItems.Keys.Contains(e.Index)) + { + e.Graphics.DrawString(m_dicItems[e.Index].info, Font, new SolidBrush(m_dicItems[e.Index].color), e.Bounds); + } + } + + protected override void OnMeasureItem(MeasureItemEventArgs e) + { + base.OnMeasureItem(e); + e.ItemHeight = 16; + } + public void AddLog(String log, Color color) + { + ModefyItems(); + LogItem item = new LogItem(); + String showLog = String.Format("[{0}] {1}", DateTime.Now.ToString("HH:mm:ss"), log); + item.info = showLog; + item.color = color; + + item.index = Items.Add(log); + if (!m_dicItems.Keys.Contains(item.index)) + m_dicItems.Add(item.index, item); + SelectedIndex = item.index; + } + + public void Clear() + { + Items.Clear(); + m_dicItems.Clear(); + } + + private void ModefyItems() + { + if (Items.Count >= m_nMaxLength) + { + Items.RemoveAt(0); + for (int n = 0; n < m_dicItems.Count - 1; n++) + { + if (m_dicItems.Keys.Contains(n) && m_dicItems.Keys.Contains(n + 1)) + { + m_dicItems[n].info = m_dicItems[n + 1].info; + m_dicItems[n].color = m_dicItems[n + 1].color; + } + } + + m_dicItems.Remove(m_dicItems.Count - 1); + } + } + } +} diff --git a/JinYuan.ControlLib/LongTitle.Designer.cs b/JinYuan.ControlLib/LongTitle.Designer.cs new file mode 100644 index 0000000..67a60cb --- /dev/null +++ b/JinYuan.ControlLib/LongTitle.Designer.cs @@ -0,0 +1,68 @@ +namespace JinYuan.ControlLib +{ + partial class LongTitle + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 16F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)))); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(35, 0); + this.lbl_Title.Margin = new System.Windows.Forms.Padding(50, 0, 0, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(205, 52); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "标题名称"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LongTitle + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.标题_03左; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "LongTitle"; + this.Size = new System.Drawing.Size(543, 52); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/LongTitle.cs b/JinYuan.ControlLib/LongTitle.cs new file mode 100644 index 0000000..413921e --- /dev/null +++ b/JinYuan.ControlLib/LongTitle.cs @@ -0,0 +1,67 @@ +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class LongTitle : UserControl + { + public LongTitle() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private bool isRight = true; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮是否为右边")] + public bool IsRight + { + get { return isRight; } + set + { + isRight = value; + UpdataImage(); + } + } + + + private string titleName = "标题名称"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示标题名称")] + + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + } + } + + /// + ///统一更新背景 + /// + private void UpdataImage() + { + if (this.isRight) + { + lbl_Title.Dock = DockStyle.Right; + this.BackgroundImage = Properties.Resources.标题_03右; + } + else + { + lbl_Title.Dock = DockStyle.Left; + this.BackgroundImage = Properties.Resources.标题_03左; + } + } + } +} diff --git a/JinYuan.ControlLib/LongTitle.resx b/JinYuan.ControlLib/LongTitle.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/LongTitle.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/LongTitleStyle2.Designer.cs b/JinYuan.ControlLib/LongTitleStyle2.Designer.cs new file mode 100644 index 0000000..8d6b6c4 --- /dev/null +++ b/JinYuan.ControlLib/LongTitleStyle2.Designer.cs @@ -0,0 +1,68 @@ +namespace JinYuan.ControlLib +{ + partial class LongTitleStyle2 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LongTitleStyle2)); + this.lbl_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(233, 41); + this.lbl_Title.TabIndex = 1; + this.lbl_Title.Text = "标题名称"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // LongTitleStyle2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Name = "LongTitleStyle2"; + this.Size = new System.Drawing.Size(233, 41); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/LongTitleStyle2.cs b/JinYuan.ControlLib/LongTitleStyle2.cs new file mode 100644 index 0000000..22f2ecf --- /dev/null +++ b/JinYuan.ControlLib/LongTitleStyle2.cs @@ -0,0 +1,38 @@ +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class LongTitleStyle2 : UserControl + { + public LongTitleStyle2() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + } + + + + private string titleName = "标题名称"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示标题名称")] + + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + } + } + } +} diff --git a/JinYuan.ControlLib/LongTitleStyle2.resx b/JinYuan.ControlLib/LongTitleStyle2.resx new file mode 100644 index 0000000..93d6c5e --- /dev/null +++ b/JinYuan.ControlLib/LongTitleStyle2.resx @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Models/CPKModel.cs b/JinYuan.ControlLib/Models/CPKModel.cs new file mode 100644 index 0000000..69ef269 --- /dev/null +++ b/JinYuan.ControlLib/Models/CPKModel.cs @@ -0,0 +1,134 @@ +namespace JinYuan.ControlLib.Models +{ + //子组大小:这个与计算内的CPK值又非常打的关系,即是分组的样本个数,数据的分组在此处需要说明的是,必须 + //是根据实际情况来填写,比如每次抽样为5个,那么子组大小为5个,我们不能随心所欲的任意填写这个值,否则 + //将没有实际意义。 + //上规格:用户录入的上规格值 + //目标值:用户输入的目标值,即期望达到的中心值 + //下规格:用户输入的下规格值 + + + public class CPKModel + { + /// + /// 总样本数 。参与分析的数据的个数 + /// + public int TotalNumber { get; set; } + /// + /// 图表类型 .说明进行分析的控制图的类型,此处为XR控制图 + /// + public string ChartType { get; set; } + /// + /// 平均值 所有样本数据的平均值 + /// + public double MeanVlaue { get; set; } + /// + /// 最大值 所有样本的最大值 + /// + public double MaxValue { get; set; } + /// + /// 最小值 + /// + public double MinValue { get; set; } + + /// + /// 正的3倍标准差线 + /// + public double Pos3Sigma { get; set; } + /// + /// 负的3倍标准差线 + /// + public double Neg3Sigma { get; set; } + /// + /// 组内标准差值 + /// + public double GroupSTDEV { get; set; } + /// + /// 整体标准差值 + /// + public double WholeSTDEV { get; set; } + + /// + /// 组内CPK值 工序能力指数,与规格值及上述标准差值相关联 + /// + public double GroupCPK { get; set; } + /// + /// 整体CPK值 工序能力指数,与规格值及上述标准差值相关联 + /// + public double WholeCPK { get; set; } + + /// + /// 组内CP值 Cp值是衡量过程满足产品品质标准的成都,也叫制程精密度,Cp值越大,表示过程变异越小,过程能力越差 + /// + public double GroupCP { get; set; } + /// + /// 整体CP值 Cp值是衡量过程满足产品品质标准的成都,也叫制程精密度,Cp值越大,表示过程变异越小,过程能力越差 + /// + public double WholeCP { get; set; } + + /// + /// 组内CPL值 相对应于下规格的工序能力值; + /// + public double GroupCPL { get; set; } + /// + /// 整体CPL值 相对应于下规格的工序能力值; + /// + public double WholeCPL { get; set; } + + /// + /// 组内CPU值 相对应于上规格的工序能力值; + /// + public double GroupCPU { get; set; } + /// + /// 整体CPU值 相对应于上规格的工序能力值; + /// + public double WholeCPU { get; set; } + + /// + /// 组内PPM + public double GroupPPM_LSL { get; set; } + /// + /// 整体PPM + public double WholePPM_LSL { get; set; } + + /// + /// 实际检测PPM + public double MeasuredPPM_LSL { get; set; } + + /// + /// 组内PPM + public double GroupPPM_USL { get; set; } + /// + /// 整体PPM + public double WholePPM_USL { get; set; } + /// + /// 实际检测PPM + public double MeasuredPPM_USL { get; set; } + /// + /// 组内PPM Total值,预测的总的不合格品数 + /// + public double GroupPPM_Total { get; set; } + /// + /// 整体PPM + public double WholePPM_Total { get; set; } + + /// + /// 实际检测PPM + public double MeasuredPPM_Total { get; set; } + + /// + /// 制程准确度,值越小越好 + /// + public double CA { get; set; } + + + } +} diff --git a/JinYuan.ControlLib/NaviButton.Designer.cs b/JinYuan.ControlLib/NaviButton.Designer.cs new file mode 100644 index 0000000..53a777c --- /dev/null +++ b/JinYuan.ControlLib/NaviButton.Designer.cs @@ -0,0 +1,66 @@ +namespace JinYuan.ControlLib +{ + partial class NaviButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 11F, System.Drawing.FontStyle.Bold); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(129, 43); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "导航按钮"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbl_Title.Click += new System.EventHandler(this.lbl_Title_Click); + // + // NaviButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.LeftUnSelected; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Name = "NaviButton"; + this.Size = new System.Drawing.Size(129, 43); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/NaviButton.cs b/JinYuan.ControlLib/NaviButton.cs new file mode 100644 index 0000000..9d3b8ef --- /dev/null +++ b/JinYuan.ControlLib/NaviButton.cs @@ -0,0 +1,90 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [DefaultEvent("Click")]//增加特性事件 + public partial class NaviButton : UserControl + { + public NaviButton() + { + InitializeComponent(); + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private bool isSelected = false; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮是否选中")] + public bool IsSelected + { + get { return isSelected; } + set + { + isSelected = value; + UpdataImage(); + } + } + + + private bool isLeft = true; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮是否为左边")] + public bool IsLeft + { + get { return isLeft; } + set + { + isLeft = value; + UpdataImage(); + } + } + + private string titleName = "导航按钮"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮文本内容")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + } + } + + + /// + ///统一更新背景 + /// + private void UpdataImage() + { + if (this.isLeft) + { + this.BackgroundImage = isSelected ? Properties.Resources.LeftSelected : Properties.Resources.LeftUnSelected; + } + else + { + this.BackgroundImage = isSelected ? Properties.Resources.RightSelected : Properties.Resources.RightUnSelected; + } + } + + [Browsable(true)]//是否可见 + [Category("自定义事件")] //类别 + [Description("设置或显示导航按钮文本内容")] + public new EventHandler Click; + + private void lbl_Title_Click(object sender, EventArgs e) + { + this.Click?.Invoke(this, e); + } + } +} diff --git a/JinYuan.ControlLib/NaviButton.resx b/JinYuan.ControlLib/NaviButton.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/NaviButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/NaviButton2.Designer.cs b/JinYuan.ControlLib/NaviButton2.Designer.cs new file mode 100644 index 0000000..2a261c7 --- /dev/null +++ b/JinYuan.ControlLib/NaviButton2.Designer.cs @@ -0,0 +1,65 @@ +namespace JinYuan.ControlLib +{ + partial class NaviButton2 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new AntdUI.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("Cambria", 10.5F); + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(129, 43); + this.lbl_Title.TabIndex = 1; + this.lbl_Title.Text = "Data Monitor"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // NaviButton2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.RightUnSelected2; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Name = "NaviButton2"; + this.Size = new System.Drawing.Size(129, 43); + this.ResumeLayout(false); + + } + + #endregion + + private AntdUI.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/NaviButton2.cs b/JinYuan.ControlLib/NaviButton2.cs new file mode 100644 index 0000000..69a565e --- /dev/null +++ b/JinYuan.ControlLib/NaviButton2.cs @@ -0,0 +1,315 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + + [DefaultEvent("Click")] // 增加特性事件 + public partial class NaviButton2 : UserControl + { + public NaviButton2() + { + InitializeComponent(); + + // 设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // 绑定 Resize 事件 + this.Resize += NaviButton2_Resize; + + // 绑定 Label 的点击事件 + this.lbl_Title.Click += lbl_Title_Click; + + + } + + private bool isSelected = false; + [Browsable(true)] // 是否可见 + [Category("自定义属性")] // 类别 + [Description("设置或显示导航按钮是否选中")] + public bool IsSelected + { + get { return isSelected; } + set + { + isSelected = value; + UpdataImage(); + this.Invalidate(); // 刷新控件 + } + } + + private bool isLeft = true; + [Browsable(true)] // 是否可见 + [Category("自定义属性")] // 类别 + [Description("设置或显示导航按钮是否为左边")] + public bool IsLeft + { + get { return isLeft; } + set + { + isLeft = value; + UpdataImage(); + this.Invalidate(); // 刷新控件 + } + } + + private string titleName = "导航按钮"; + [Browsable(true)] // 是否可见 + [Category("自定义属性")] // 类别 + [Description("设置或显示导航按钮文本内容")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + this.lbl_Title.AutoSize = false; // 禁用 AutoSize + this.lbl_Title.Size = new Size(this.Width - 10, this.Height - 10); // 设置 Label 的大小 + this.Invalidate(); // 刷新控件 + } + } + + + + private bool titleTextMultiLine = true; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或显示导航按钮文本是否支持多行显示")] + public bool TitleTextMultiLine + { + get { return titleTextMultiLine; } + set + { + titleTextMultiLine = value; + this.lbl_Title.AutoSize = false; // 禁用 AutoSize + this.lbl_Title.TextMultiLine = titleTextMultiLine; // 设置多行显示 + this.Invalidate(); // 刷新控件 + } + } + + private Color titleForeColor = Color.Black; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或显示导航按钮文本的字体颜色")] + public Color TitleForeColor + { + get { return titleForeColor; } + set + { + titleForeColor = value; + this.lbl_Title.ForeColor = titleForeColor; + this.Invalidate(); // 刷新控件 + } + } + + + private Font titleFont = new Font("Cambria", 10.5f, FontStyle.Bold); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或显示导航按钮文本的字体样式")] + public Font TitleFont + { + get { return titleFont; } + set + { + titleFont = value; + this.lbl_Title.Font = titleFont; + this.Invalidate(); // 刷新控件 + } + } + + /// + /// 统一更新背景 + /// + private void UpdataImage() + { + if (this.isLeft) + { + this.BackgroundImage = isSelected ? Properties.Resources.LeftSelected3 : Properties.Resources.LeftUnSelected3; + } + else + { + this.BackgroundImage = isSelected ? Properties.Resources.RightSelected3 : Properties.Resources.RightUnSelected3; + } + } + + [Browsable(true)] // 是否可见 + [Category("自定义事件")] // 类别 + [Description("设置或显示导航按钮文本内容")] + public new event EventHandler Click; + + private void lbl_Title_Click(object sender, EventArgs e) + { + // 触发 Click 事件 + this.Click?.Invoke(this, e); + } + + + + private void NaviButton2_Resize(object sender, EventArgs e) + { + // 调整 Label 的大小和位置 + this.lbl_Title.Size = new Size(this.Width - 10, this.Height - 10); + this.lbl_Title.Location = new Point(5, 5); // 根据需要调整位置 + this.Invalidate(); // 刷新控件 + } + } + + //[DefaultEvent("Click")] // 增加特性事件 + //public partial class NaviButton2 : UserControl + //{ + // public NaviButton2() + // { + // InitializeComponent(); + // // 设置控件样式,去除缓冲 + // this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + // this.SetStyle(ControlStyles.DoubleBuffer, true); + // this.SetStyle(ControlStyles.ResizeRedraw, true); + // this.SetStyle(ControlStyles.Selectable, true); + // this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // // 绑定 Resize 事件 + // this.Resize += NaviButton2_Resize; + // } + + // private bool isSelected = false; + // [Browsable(true)] // 是否可见 + // [Category("自定义属性")] // 类别 + // [Description("设置或显示导航按钮是否选中")] + // public bool IsSelected + // { + // get { return isSelected; } + // set + // { + // isSelected = value; + // UpdataImage(); + // } + // } + + // private bool isLeft = true; + // [Browsable(true)] // 是否可见 + // [Category("自定义属性")] // 类别 + // [Description("设置或显示导航按钮是否为左边")] + // public bool IsLeft + // { + // get { return isLeft; } + // set + // { + // isLeft = value; + // UpdataImage(); + // } + // } + + // private string titleName = "导航按钮"; + // [Browsable(true)] // 是否可见 + // [Category("自定义属性")] // 类别 + // [Description("设置或显示导航按钮文本内容")] + // public string TitleName + // { + // get { return titleName; } + // set + // { + // titleName = value; + // this.lbl_Title.Text = titleName; + // this.lbl_Title.AutoSize = false; // 禁用 AutoSize + // this.lbl_Title.Size = new Size(this.Width - 10, this.Height - 10); // 设置 Label 的大小 + // } + // } + + // private float titleFontSize = 12f; + // [Browsable(true)] + // [Category("自定义属性")] + // [Description("设置或显示导航按钮文本的字体大小")] + // public float TitleFontSize + // { + // get { return titleFontSize; } + // set + // { + // titleFontSize = value; + // this.lbl_Title.Font = new Font(this.lbl_Title.Font.FontFamily, titleFontSize, this.lbl_Title.Font.Style); + // } + // } + + // private bool textMultiLine = true; + // [Browsable(true)] + // [Category("自定义属性")] + // [Description("设置或显示导航按钮文本是否换行")] + // public bool TextMultiLine + // { + // get { return textMultiLine; } + // set + // { + // textMultiLine = value; + // this.lbl_Title.AutoSize = false; // 禁用 AutoSize + // this.lbl_Title.TextMultiLine = textMultiLine; + // } + // } + + // private Color titleForeColor = Color.Black; + // [Browsable(true)] + // [Category("自定义属性")] + // [Description("设置或显示导航按钮文本的字体颜色")] + // public Color TitleForeColor + // { + // get { return titleForeColor; } + // set + // { + // titleForeColor = value; + // this.lbl_Title.ForeColor = titleForeColor; + // } + // } + + // private FontStyle titleFontStyle = FontStyle.Regular; + // [Browsable(true)] + // [Category("自定义属性")] + // [Description("设置或显示导航按钮文本的字体样式")] + // public FontStyle TitleFontStyle + // { + // get { return titleFontStyle; } + // set + // { + // titleFontStyle = value; + // this.lbl_Title.Font = new Font(this.lbl_Title.Font.FontFamily, this.lbl_Title.Font.Size, titleFontStyle); + // } + // } + + // /// + // /// 统一更新背景 + // /// + // private void UpdataImage() + // { + // if (this.isLeft) + // { + // this.BackgroundImage = isSelected ? Properties.Resources.LeftSelected3 : Properties.Resources.LeftUnSelected3; + // } + // else + // { + // this.BackgroundImage = isSelected ? Properties.Resources.RightSelected3 : Properties.Resources.RightUnSelected3; + // } + // } + + // [Browsable(true)] // 是否可见 + // [Category("自定义事件")] // 类别 + // [Description("设置或显示导航按钮文本内容")] + // public new EventHandler Click; + + // private void lbl_Title_Click(object sender, EventArgs e) + // { + // this.Click?.Invoke(this, e); + // } + + // private void NaviButton2_Resize(object sender, EventArgs e) + // { + // // 调整 Label 的大小和位置 + // this.lbl_Title.Size = new Size(this.Width - 10, this.Height - 10); + // this.lbl_Title.Location = new Point(5, 5); // 根据需要调整位置 + // } + //} +} diff --git a/JinYuan.ControlLib/NaviButton2.resx b/JinYuan.ControlLib/NaviButton2.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/NaviButton2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/NumKeyboard.Designer.cs b/JinYuan.ControlLib/NumKeyboard.Designer.cs new file mode 100644 index 0000000..a595c57 --- /dev/null +++ b/JinYuan.ControlLib/NumKeyboard.Designer.cs @@ -0,0 +1,426 @@ +namespace JinYuan.ControlLib +{ + partial class NumKeyboard + { + /// + /// ±ØÐèµÄÉè¼ÆÆ÷±äÁ¿¡£ + /// + private System.ComponentModel.IContainer components = null; + + /// + /// ÇåÀíËùÓÐÕýÔÚʹÓõÄ×ÊԴ¡£ + /// + /// Èç¹ûӦÊͷÅÍйÜ×ÊԴ£¬Ϊ true£»·ñÔòΪ false¡£ + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region ×é¼þÉè¼ÆÆ÷Éú³ɵĴúÂë + + /// + /// Éè¼ÆÆ÷֧³ÖËùÐèµķ½·¨ - ²»ҪÐ޸Ä + /// ʹÓôúÂë±༭Æ÷Ð޸Ĵ˷½·¨µÄÄÚÈݡ£ + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.btn_Enter = new System.Windows.Forms.Button(); + this.button14 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); + this.btn_Esc = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.btn_Del = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.btn_Minus = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.lbl_Result = new System.Windows.Forms.Label(); + this.lbl_Max = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.lbl_Min = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Controls.Add(this.btn_Enter, 2, 5); + this.tableLayoutPanel1.Controls.Add(this.button14, 1, 5); + this.tableLayoutPanel1.Controls.Add(this.button13, 0, 5); + this.tableLayoutPanel1.Controls.Add(this.btn_Esc, 3, 4); + this.tableLayoutPanel1.Controls.Add(this.button11, 2, 4); + this.tableLayoutPanel1.Controls.Add(this.button10, 1, 4); + this.tableLayoutPanel1.Controls.Add(this.button9, 0, 4); + this.tableLayoutPanel1.Controls.Add(this.btn_Del, 3, 3); + this.tableLayoutPanel1.Controls.Add(this.button7, 2, 3); + this.tableLayoutPanel1.Controls.Add(this.button6, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.button5, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.btn_Minus, 3, 2); + this.tableLayoutPanel1.Controls.Add(this.button3, 2, 2); + this.tableLayoutPanel1.Controls.Add(this.button2, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.lbl_Result, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.lbl_Max, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.label3, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Min, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.button1, 0, 2); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 6; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(320, 276); + this.tableLayoutPanel1.TabIndex = 0; + // + // btn_Enter + // + this.tableLayoutPanel1.SetColumnSpan(this.btn_Enter, 2); + this.btn_Enter.Dock = System.Windows.Forms.DockStyle.Fill; + this.btn_Enter.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Enter.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_Enter.ForeColor = System.Drawing.Color.White; + this.btn_Enter.Location = new System.Drawing.Point(166, 236); + this.btn_Enter.Margin = new System.Windows.Forms.Padding(6); + this.btn_Enter.Name = "btn_Enter"; + this.btn_Enter.Size = new System.Drawing.Size(148, 34); + this.btn_Enter.TabIndex = 19; + this.btn_Enter.Text = "Enter"; + this.btn_Enter.UseVisualStyleBackColor = true; + this.btn_Enter.Click += new System.EventHandler(this.btn_Enter_Click); + // + // button14 + // + this.button14.Dock = System.Windows.Forms.DockStyle.Fill; + this.button14.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button14.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button14.ForeColor = System.Drawing.Color.White; + this.button14.Location = new System.Drawing.Point(86, 236); + this.button14.Margin = new System.Windows.Forms.Padding(6); + this.button14.Name = "button14"; + this.button14.Size = new System.Drawing.Size(68, 34); + this.button14.TabIndex = 18; + this.button14.Text = "0"; + this.button14.UseVisualStyleBackColor = true; + this.button14.Click += new System.EventHandler(this.btn_Common_Click); + // + // button13 + // + this.button13.Dock = System.Windows.Forms.DockStyle.Fill; + this.button13.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button13.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button13.ForeColor = System.Drawing.Color.White; + this.button13.Location = new System.Drawing.Point(6, 236); + this.button13.Margin = new System.Windows.Forms.Padding(6); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(68, 34); + this.button13.TabIndex = 17; + this.button13.Text = "."; + this.button13.UseVisualStyleBackColor = true; + this.button13.Click += new System.EventHandler(this.btn_Common_Click); + // + // btn_Esc + // + this.btn_Esc.Dock = System.Windows.Forms.DockStyle.Fill; + this.btn_Esc.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Esc.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_Esc.ForeColor = System.Drawing.Color.White; + this.btn_Esc.Location = new System.Drawing.Point(246, 190); + this.btn_Esc.Margin = new System.Windows.Forms.Padding(6); + this.btn_Esc.Name = "btn_Esc"; + this.btn_Esc.Size = new System.Drawing.Size(68, 34); + this.btn_Esc.TabIndex = 16; + this.btn_Esc.Text = "ESC"; + this.btn_Esc.UseVisualStyleBackColor = true; + this.btn_Esc.Click += new System.EventHandler(this.btn_Esc_Click); + // + // button11 + // + this.button11.Dock = System.Windows.Forms.DockStyle.Fill; + this.button11.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button11.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button11.ForeColor = System.Drawing.Color.White; + this.button11.Location = new System.Drawing.Point(166, 190); + this.button11.Margin = new System.Windows.Forms.Padding(6); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(68, 34); + this.button11.TabIndex = 15; + this.button11.Text = "3"; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.btn_Common_Click); + // + // button10 + // + this.button10.Dock = System.Windows.Forms.DockStyle.Fill; + this.button10.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button10.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button10.ForeColor = System.Drawing.Color.White; + this.button10.Location = new System.Drawing.Point(86, 190); + this.button10.Margin = new System.Windows.Forms.Padding(6); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(68, 34); + this.button10.TabIndex = 14; + this.button10.Text = "2"; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.btn_Common_Click); + // + // button9 + // + this.button9.Dock = System.Windows.Forms.DockStyle.Fill; + this.button9.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button9.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button9.ForeColor = System.Drawing.Color.White; + this.button9.Location = new System.Drawing.Point(6, 190); + this.button9.Margin = new System.Windows.Forms.Padding(6); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(68, 34); + this.button9.TabIndex = 13; + this.button9.Text = "1"; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.btn_Common_Click); + // + // btn_Del + // + this.btn_Del.Dock = System.Windows.Forms.DockStyle.Fill; + this.btn_Del.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Del.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_Del.ForeColor = System.Drawing.Color.White; + this.btn_Del.Location = new System.Drawing.Point(246, 144); + this.btn_Del.Margin = new System.Windows.Forms.Padding(6); + this.btn_Del.Name = "btn_Del"; + this.btn_Del.Size = new System.Drawing.Size(68, 34); + this.btn_Del.TabIndex = 12; + this.btn_Del.Text = "DEL"; + this.btn_Del.UseVisualStyleBackColor = true; + this.btn_Del.Click += new System.EventHandler(this.btn_Del_Click); + // + // button7 + // + this.button7.Dock = System.Windows.Forms.DockStyle.Fill; + this.button7.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button7.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button7.ForeColor = System.Drawing.Color.White; + this.button7.Location = new System.Drawing.Point(166, 144); + this.button7.Margin = new System.Windows.Forms.Padding(6); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(68, 34); + this.button7.TabIndex = 11; + this.button7.Text = "6"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.btn_Common_Click); + // + // button6 + // + this.button6.Dock = System.Windows.Forms.DockStyle.Fill; + this.button6.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button6.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button6.ForeColor = System.Drawing.Color.White; + this.button6.Location = new System.Drawing.Point(86, 144); + this.button6.Margin = new System.Windows.Forms.Padding(6); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(68, 34); + this.button6.TabIndex = 10; + this.button6.Text = "5"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.btn_Common_Click); + // + // button5 + // + this.button5.Dock = System.Windows.Forms.DockStyle.Fill; + this.button5.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button5.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button5.ForeColor = System.Drawing.Color.White; + this.button5.Location = new System.Drawing.Point(6, 144); + this.button5.Margin = new System.Windows.Forms.Padding(6); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(68, 34); + this.button5.TabIndex = 9; + this.button5.Text = "4"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.btn_Common_Click); + // + // btn_Minus + // + this.btn_Minus.Dock = System.Windows.Forms.DockStyle.Fill; + this.btn_Minus.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Minus.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_Minus.ForeColor = System.Drawing.Color.White; + this.btn_Minus.Location = new System.Drawing.Point(246, 98); + this.btn_Minus.Margin = new System.Windows.Forms.Padding(6); + this.btn_Minus.Name = "btn_Minus"; + this.btn_Minus.Size = new System.Drawing.Size(68, 34); + this.btn_Minus.TabIndex = 8; + this.btn_Minus.Text = "-"; + this.btn_Minus.UseVisualStyleBackColor = true; + this.btn_Minus.Click += new System.EventHandler(this.btn_Minus_Click); + // + // button3 + // + this.button3.Dock = System.Windows.Forms.DockStyle.Fill; + this.button3.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button3.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button3.ForeColor = System.Drawing.Color.White; + this.button3.Location = new System.Drawing.Point(166, 98); + this.button3.Margin = new System.Windows.Forms.Padding(6); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(68, 34); + this.button3.TabIndex = 7; + this.button3.Text = "9"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.btn_Common_Click); + // + // button2 + // + this.button2.Dock = System.Windows.Forms.DockStyle.Fill; + this.button2.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(64))))); + this.button2.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button2.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button2.ForeColor = System.Drawing.Color.White; + this.button2.Location = new System.Drawing.Point(86, 98); + this.button2.Margin = new System.Windows.Forms.Padding(6); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(68, 34); + this.button2.TabIndex = 6; + this.button2.Text = "8"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.btn_Common_Click); + // + // lbl_Result + // + this.lbl_Result.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.tableLayoutPanel1.SetColumnSpan(this.lbl_Result, 4); + this.lbl_Result.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Result.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.5F, System.Drawing.FontStyle.Bold); + this.lbl_Result.ForeColor = System.Drawing.Color.White; + this.lbl_Result.Location = new System.Drawing.Point(3, 46); + this.lbl_Result.Name = "lbl_Result"; + this.lbl_Result.Size = new System.Drawing.Size(314, 46); + this.lbl_Result.TabIndex = 4; + this.lbl_Result.Text = "0"; + this.lbl_Result.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.lbl_Result.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbl_Result_MouseDown); + this.lbl_Result.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbl_Result_MouseMove); + // + // lbl_Max + // + this.lbl_Max.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Max.Font = new System.Drawing.Font("΢ÈíÑźÚ", 11.5F, System.Drawing.FontStyle.Bold); + this.lbl_Max.ForeColor = System.Drawing.Color.White; + this.lbl_Max.Location = new System.Drawing.Point(243, 0); + this.lbl_Max.Name = "lbl_Max"; + this.lbl_Max.Size = new System.Drawing.Size(74, 46); + this.lbl_Max.TabIndex = 3; + this.lbl_Max.Text = "0"; + this.lbl_Max.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label3 + // + this.label3.Dock = System.Windows.Forms.DockStyle.Fill; + this.label3.Font = new System.Drawing.Font("΢ÈíÑźÚ", 11.5F, System.Drawing.FontStyle.Bold); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(163, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 46); + this.label3.TabIndex = 2; + this.label3.Text = "Max£º"; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lbl_Min + // + this.lbl_Min.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Min.Font = new System.Drawing.Font("΢ÈíÑźÚ", 11.5F, System.Drawing.FontStyle.Bold); + this.lbl_Min.ForeColor = System.Drawing.Color.White; + this.lbl_Min.Location = new System.Drawing.Point(83, 0); + this.lbl_Min.Name = "lbl_Min"; + this.lbl_Min.Size = new System.Drawing.Size(74, 46); + this.lbl_Min.TabIndex = 1; + this.lbl_Min.Text = "0"; + this.lbl_Min.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.Font = new System.Drawing.Font("΢ÈíÑźÚ", 11.5F, System.Drawing.FontStyle.Bold); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(3, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 46); + this.label1.TabIndex = 0; + this.label1.Text = "Min£º"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // button1 + // + this.button1.Dock = System.Windows.Forms.DockStyle.Fill; + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button1.Font = new System.Drawing.Font("΢ÈíÑźÚ", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.button1.ForeColor = System.Drawing.Color.White; + this.button1.Location = new System.Drawing.Point(6, 98); + this.button1.Margin = new System.Windows.Forms.Padding(6); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(68, 34); + this.button1.TabIndex = 5; + this.button1.Text = "7"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.btn_Common_Click); + // + // NumKeyboard + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("΢ÈíÑźÚ", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "NumKeyboard"; + this.Size = new System.Drawing.Size(320, 276); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button btn_Enter; + private System.Windows.Forms.Button button14; + private System.Windows.Forms.Button button13; + private System.Windows.Forms.Button btn_Esc; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button btn_Del; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button btn_Minus; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label lbl_Result; + private System.Windows.Forms.Label lbl_Max; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label lbl_Min; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button button1; + } +} diff --git a/JinYuan.ControlLib/NumKeyboard.cs b/JinYuan.ControlLib/NumKeyboard.cs new file mode 100644 index 0000000..d9dd2ad --- /dev/null +++ b/JinYuan.ControlLib/NumKeyboard.cs @@ -0,0 +1,207 @@ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class NumKeyboard : UserControl + { + public NumKeyboard() + { + InitializeComponent(); + } + + [Browsable(false)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("×îÖյĽá¹ûֵ")] + public string ResultValue + { + get { return this.lbl_Result.Text; } + } + + private string initialValue; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("³õʼֵ")] + public string InitialValue + { + get { return initialValue; } + set + { + initialValue = value; + this.lbl_Result.Text = value; + } + } + + private float minValue = 0.0f; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖõÄ×îСֵ")] + public float MinValue + { + get { return minValue; } + set + { + minValue = value; + this.lbl_Min.Text = value.ToString(); + } + } + + + private float maxValue = 0.0f; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖõÄ×î´óֵ")] + public float MaxValue + { + get { return maxValue; } + set + { + maxValue = value; + this.lbl_Max.Text = value.ToString(); + } + } + + [Browsable(false)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("¹ØÁª¿ؼþ")] + public Control RelateControl { get; set; } + + [Browsable(true)] + [Category("×Զ¨Òåʼþ")] + [Description("Enter°´ÏÂʼþ")] + public event EventHandler EnterClick; + + + [Browsable(true)] + [Category("×Զ¨Òåʼþ")] + [Description("ESC°´ÏÂʼþ")] + public event EventHandler ESCClick; + + private void btn_Enter_Click(object sender, EventArgs e) + { + string temp = this.lbl_Result.Text; + + if (float.TryParse(temp, out float value)) + { + if (value >= this.minValue && value <= this.maxValue) + { + EnterClick?.Invoke(this, e); + } + else + { + return; + } + } + else + { + return; + } + + } + + private void btn_Esc_Click(object sender, EventArgs e) + { + ESCClick?.Invoke(this, e); + } + + private void btn_Common_Click(object sender, EventArgs e) + { + if (sender is Button button) + { + if (button.Text == ".") + { + //´¦ÀíСÊýµã + if (this.lbl_Result.Text.Contains('.')) + { + return; + } + else + { + this.lbl_Result.Text += button.Text; + } + } + else + { + string temp = this.lbl_Result.Text + button.Text; + + if (float.TryParse(temp, out float value)) + { + if (value >= this.minValue && value <= this.maxValue) + { + this.lbl_Result.Text = temp; + } + else + { + return; + } + } + else + { + return; + } + } + } + } + + private void btn_Del_Click(object sender, EventArgs e) + { + if (this.lbl_Result.Text.Length == 0) return; + + this.lbl_Result.Text = this.lbl_Result.Text.Substring(0, this.lbl_Result.Text.Length - 1); + } + + private void btn_Minus_Click(object sender, EventArgs e) + { + string temp = this.lbl_Result.Text; + + if (temp.StartsWith("-")) + { + temp = temp.Remove(0, 1); + } + else + { + temp = temp.Insert(0, "-"); + } + + if (float.TryParse(temp, out float value)) + { + if (value >= this.minValue && value <= this.maxValue) + { + this.lbl_Result.Text = temp; + } + else + { + return; + } + } + else + { + return; + } + } + + + #region Îޱ߿òÍ϶¯ + + private Point mPoint; + private void lbl_Result_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void lbl_Result_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + + #endregion + + } +} diff --git a/JinYuan.ControlLib/NumKeyboard.resx b/JinYuan.ControlLib/NumKeyboard.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/NumKeyboard.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/PanelEnhanced.Designer.cs b/JinYuan.ControlLib/PanelEnhanced.Designer.cs new file mode 100644 index 0000000..481de60 --- /dev/null +++ b/JinYuan.ControlLib/PanelEnhanced.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class PanelEnhanced + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/PanelEnhanced.cs b/JinYuan.ControlLib/PanelEnhanced.cs new file mode 100644 index 0000000..0227741 --- /dev/null +++ b/JinYuan.ControlLib/PanelEnhanced.cs @@ -0,0 +1,55 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class PanelEnhanced : Panel + { + public PanelEnhanced() + { + InitializeComponent(); + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + //重载基类得背景擦除方法 + + //解决窗体刷新,放大和闪烁 + + return; + } + + protected override void OnPaint(PaintEventArgs e) + { + //使用双缓冲 + this.DoubleBuffered = true; + + if (this.BackgroundImage != null) + { + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + e.Graphics.DrawImage(this.BackgroundImage, new Rectangle + (0, 0, this.Width, this.Height), 0, 0, this.BackgroundImage.Width, this.BackgroundImage.Height, GraphicsUnit.Pixel); + } + base.OnPaint(e); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + } +} diff --git a/JinYuan.ControlLib/PanelExt.Designer.cs b/JinYuan.ControlLib/PanelExt.Designer.cs new file mode 100644 index 0000000..e1b645c --- /dev/null +++ b/JinYuan.ControlLib/PanelExt.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class PanelExt + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/PanelExt.cs b/JinYuan.ControlLib/PanelExt.cs new file mode 100644 index 0000000..9184dc6 --- /dev/null +++ b/JinYuan.ControlLib/PanelExt.cs @@ -0,0 +1,134 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class PanelExt : Panel + { + public PanelExt() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private int topGap; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示上边间隔距离")] + public int TopGap + { + get { return topGap; } + set + { + topGap = value; + this.Invalidate();//点击后立即生效 + } + } + + private int bottomGap; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示下边间隔距离")] + public int BottomGap + { + get { return bottomGap; } + set + { + bottomGap = value; + this.Invalidate();//点击后立即生效 + } + } + + private int leftGap; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示左边间隔距离")] + public int LeftGap + { + get { return leftGap; } + set + { + leftGap = value; + this.Invalidate();//点击后立即生效 + } + } + + private int rightGap; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示右边间隔距离")] + public int RightGap + { + get { return rightGap; } + set + { + rightGap = value; + this.Invalidate();//点击后立即生效 + } + } + + private int bordeWidth = 2; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示边框的宽度")] + public int BordeWidth + { + get { return bordeWidth; } + set + { + bordeWidth = value; + this.Invalidate();//点击后立即生效 + } + } + + private Color bordeColor = Color.FromArgb(35, 255, 253); + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示边框的颜色")] + public Color BordeColor + { + get { return bordeColor; } + set + { + bordeColor = value; + this.Invalidate();//点击后立即生效 + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + //准备画布 + Graphics graphics = e.Graphics; + //准备笔 + Pen pen = new Pen(bordeColor, bordeWidth); + //准备矩形参数 + float x = leftGap + bordeWidth * 0.5f; + float y = topGap + bordeWidth * 0.5f; + float width = this.Width - leftGap - rightGap - bordeWidth; + float height = this.Height - topGap - bottomGap - bordeWidth; + + //绘制矩形 + graphics.DrawRectangle(pen, x, y, width, height); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + } +} diff --git a/JinYuan.ControlLib/ProcessEllipse.Designer.cs b/JinYuan.ControlLib/ProcessEllipse.Designer.cs new file mode 100644 index 0000000..cecb354 --- /dev/null +++ b/JinYuan.ControlLib/ProcessEllipse.Designer.cs @@ -0,0 +1,45 @@ +namespace JinYuan.ControlLib +{ + partial class ProcessEllipse + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ProcessEllipse + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(28)))), ((int)(((byte)(68))))); + this.Name = "ProcessEllipse"; + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/ProcessEllipse.cs b/JinYuan.ControlLib/ProcessEllipse.cs new file mode 100644 index 0000000..042ce57 --- /dev/null +++ b/JinYuan.ControlLib/ProcessEllipse.cs @@ -0,0 +1,456 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class ProcessEllipse : UserControl + { + + public ProcessEllipse() + { + InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + ForeColor = Color.White; + Font = new Font("Arial Unicode MS", 20); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + [Description("值改变事件"), Category("自定义")] + public event EventHandler ValueChanged; + + private Color m_backEllipseColor = Color.FromArgb(22, 160, 133); + /// + /// 圆背景色 + /// + [Description("圆背景色"), Category("自定义")] + public Color BackEllipseColor + { + get { return m_backEllipseColor; } + set + { + m_backEllipseColor = value; + Refresh(); + } + } + + private Color m_coreEllipseColor = Color.FromArgb(180, 180, 180); + /// + /// 内圆颜色,ShowType=Ring 有效 + /// + [Description("内圆颜色,ShowType=Ring 有效"), Category("自定义")] + public Color CoreEllipseColor + { + get { return m_coreEllipseColor; } + set + { + m_coreEllipseColor = value; + Refresh(); + } + } + + private Color m_valueColor = Color.FromArgb(255, 77, 59); + + [Description("值圆颜色"), Category("自定义")] + public Color ValueColor + { + get { return m_valueColor; } + set + { + m_valueColor = value; + Refresh(); + } + } + + private bool m_isShowCoreEllipseBorder = true; + /// + /// 内圆是否显示边框,ShowType=Ring 有效 + /// + [Description("内圆是否显示边框,ShowType=Ring 有效"), Category("自定义")] + public bool IsShowCoreEllipseBorder + { + get { return m_isShowCoreEllipseBorder; } + set + { + m_isShowCoreEllipseBorder = value; + Refresh(); + } + } + + + private ShowType m_showType = ShowType.PPM; + /// + /// 值文字类型 + /// + [Description("显示类型"), Category("自定义")] + public ShowType ShowType + { + get { return m_showType; } + set + { + m_showType = value; + UpdataMaxValue(); + Refresh(); + } + } + + + private ValueType m_valueType = ValueType.Percent; + /// + /// 值文字类型 + /// + [Description("值文字类型,Percent-百分比;Absolute-数值"), Category("自定义")] + public ValueType ValueType + { + get { return m_valueType; } + set + { + + m_valueType = value; + Refresh(); + } + } + + + private ValueFloatOrInt m_valueFloatOrInt = ValueFloatOrInt.Int; + /// + /// 值文字类型 + /// + [Description("值类型"), Category("自定义")] + public ValueFloatOrInt ValueFloatOrInt + { + get { return m_valueFloatOrInt; } + set + { + m_valueFloatOrInt = value; + Refresh(); + } + } + + + private int m_valueWidth = 30; + /// + /// 外圆值宽度 + /// + [Description("外圆值宽度,ShowType=Ring 有效"), Category("自定义")] + public int ValueWidth + { + get { return m_valueWidth; } + set + { + if (value <= 0 || value > Math.Min(this.Width, this.Height)) + return; + m_valueWidth = value; + Refresh(); + } + } + + private int m_valueMargin = 5; + /// + /// 外圆值间距 + /// + [Description("外圆值间距"), Category("自定义")] + public int ValueMargin + { + get { return m_valueMargin; } + set + { + if (value < 0 || m_valueMargin >= m_valueWidth) + return; + m_valueMargin = value; + Refresh(); + } + } + + private int m_maxValue = 100; + /// + /// 最大值 + /// + [Description("最大值"), Category("自定义")] + public int MaxValue + { + get { return m_maxValue; } + set + { + + //if (value > m_intValue || value > m_floatValue || value < 0) + // return; + m_maxValue = value; + Refresh(); + } + } + + private int m_intValue = 0; + /// + /// 当前值 + /// + [Description("当前值整数,ValueFloatOrInt=Int 有效"), Category("自定义")] + public int IntValue + { + get { return m_intValue; } + set + { + if (m_maxValue < value || value < 0) + return; + m_intValue = value; + if (ValueChanged != null) + { + ValueChanged(this, null); + } + Refresh(); + } + } + + private float m_floatValue = 0.00f; + /// + /// 当前值 + /// + [Description("当前值浮点数,ValueFloatOrInt=Float 有效"), Category("自定义")] + public float FloatValue + { + get { return m_floatValue; } + set + { + if (m_maxValue < value || value < 0) + return; + m_floatValue = value; + if (ValueChanged != null) + { + ValueChanged(this, null); + } + Refresh(); + } + } + + + private Font m_font = new Font("Arial Unicode MS", 20); + [Description("文字字体"), Category("自定义")] + public override Font Font + { + get + { + return m_font; + } + set + { + m_font = value; + Refresh(); + } + } + + Color m_foreColor = Color.White; + [Description("文字颜色"), Category("自定义")] + public override Color ForeColor + { + get + { + return m_foreColor; + } + set + { + m_foreColor = value; + Refresh(); + } + } + + private ShowStyleType m_showStyleType = ShowStyleType.Ring; + + [Description("显示样式"), Category("自定义")] + public ShowStyleType ShowStyleType + { + get { return m_showStyleType; } + set + { + m_showStyleType = value; + Refresh(); + } + } + + + /// + /// 更新最大值 + /// + private void UpdataMaxValue() + { + switch (m_showType) + { + case ShowType.PPM: + this.m_maxValue = 100; + break; + case ShowType.稼动率: + this.m_maxValue = 100; + break; + } + + } + + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + var g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + + int intWidth = Math.Min(this.Size.Width, this.Size.Height); + //底圆 + g.FillEllipse(new SolidBrush(m_backEllipseColor), new Rectangle(new Point(0, 0), new Size(intWidth, intWidth))); + if (m_showStyleType == ShowStyleType.Ring) + { + //中心圆 + int intCore = intWidth - m_valueWidth * 2; + g.FillEllipse(new SolidBrush(m_coreEllipseColor), new Rectangle(new Point(m_valueWidth, m_valueWidth), new Size(intCore, intCore))); + //中心圆边框 + if (m_isShowCoreEllipseBorder) + { + g.DrawEllipse(new Pen(m_valueColor, 2), new Rectangle(new Point(m_valueWidth + 1, m_valueWidth + 1), new Size(intCore - 1, intCore - 1))); + } + if (m_valueFloatOrInt == ValueFloatOrInt.Int) + { + if (m_intValue >= 0 && m_maxValue > 0) + { + int fltPercent = (int)m_intValue / (int)m_maxValue; + if (fltPercent > 1) + { + fltPercent = 1; + } + + g.DrawArc(new Pen(m_valueColor, m_valueWidth - m_valueMargin * 2), new RectangleF(new Point(m_valueWidth / 2 + m_valueMargin / 4, m_valueWidth / 2 + m_valueMargin / 4), new SizeF(intWidth - m_valueWidth - m_valueMargin / 2 + (m_valueMargin == 0 ? 0 : 1), intWidth - m_valueWidth - m_valueMargin / 2 + (m_valueMargin == 0 ? 0 : 1))), -90, fltPercent * 360); + + string strValueText = m_valueType == ValueType.Percent ? fltPercent.ToString("0%") : m_intValue.ToString(); + System.Drawing.SizeF _txtSize = g.MeasureString(strValueText, this.Font); + g.DrawString(strValueText, this.Font, new SolidBrush(this.ForeColor), new PointF((intWidth - _txtSize.Width) / 2 + 1, (intWidth - _txtSize.Height) / 2 + 1)); + } + } + else + { + if (m_floatValue >= 0 && m_maxValue > 0) + { + float fltPercent = (float)m_floatValue / (float)m_maxValue; + if (fltPercent > 1f) + { + fltPercent = 1f; + } + + g.DrawArc(new Pen(m_valueColor, m_valueWidth - m_valueMargin * 2), new RectangleF(new Point(m_valueWidth / 2 + m_valueMargin / 4, m_valueWidth / 2 + m_valueMargin / 4), new SizeF(intWidth - m_valueWidth - m_valueMargin / 2 + (m_valueMargin == 0 ? 0 : 1), intWidth - m_valueWidth - m_valueMargin / 2 + (m_valueMargin == 0 ? 0 : 1))), -90, fltPercent * 360); + string strValueText = m_valueType == ValueType.Percent ? fltPercent.ToString("0%") : m_floatValue.ToString("f2"); + System.Drawing.SizeF _txtSize = g.MeasureString(strValueText, this.Font); + g.DrawString(strValueText, this.Font, new SolidBrush(this.ForeColor), new PointF((intWidth - _txtSize.Width) / 2 + 1, (intWidth - _txtSize.Height) / 2 + 1)); + } + } + + } + else + { + if (m_valueFloatOrInt == ValueFloatOrInt.Int) + { + if (m_intValue >= 0 && m_maxValue > 0) + { + int fltPercent = (int)m_intValue / (int)m_maxValue; + if (fltPercent > 1) + { + fltPercent = 1; + } + + g.FillPie(new SolidBrush(m_valueColor), new Rectangle(m_valueMargin, m_valueMargin, intWidth - m_valueMargin * 2, intWidth - m_valueMargin * 2), -90, fltPercent * 360); + + string strValueText = m_valueType == ValueType.Percent ? fltPercent.ToString("0%") : m_intValue.ToString(); + System.Drawing.SizeF _txtSize = g.MeasureString(strValueText, this.Font); + g.DrawString(strValueText, this.Font, new SolidBrush(this.ForeColor), new PointF((intWidth - _txtSize.Width) / 2 + 1, (intWidth - _txtSize.Height) / 2 + 1)); + } + } + else + { + if (m_floatValue >= 0 && m_maxValue > 0) + { + float fltPercent = (float)m_floatValue / (float)m_maxValue; + if (fltPercent > 1f) + { + fltPercent = 1f; + } + + g.FillPie(new SolidBrush(m_valueColor), new Rectangle(m_valueMargin, m_valueMargin, intWidth - m_valueMargin * 2, intWidth - m_valueMargin * 2), -90, fltPercent * 360); + string strValueText = m_valueType == ValueType.Percent ? fltPercent.ToString("0%") : m_floatValue.ToString("f2"); + System.Drawing.SizeF _txtSize = g.MeasureString(strValueText, this.Font); + g.DrawString(strValueText, this.Font, new SolidBrush(this.ForeColor), new PointF((intWidth - _txtSize.Width) / 2 + 1, (intWidth - _txtSize.Height) / 2 + 1)); + } + } + + } + + } + } + + public enum ShowType + { + /// + /// PPM + /// + PPM, + /// + /// 数值 + /// + 稼动率, + /// + /// + /// + 生产数 + } + + + public enum ValueType + { + /// + /// 百分比 + /// + Percent, + /// + /// 数值 + /// + Absolute + } + + public enum ValueFloatOrInt + { + /// + /// 整数 + /// + Int, + /// + /// 浮点数 + /// + Float + } + + public enum ShowStyleType + { + /// + /// 圆环 + /// + Ring, + /// + /// 扇形 + /// + Sector + } +} diff --git a/JinYuan.ControlLib/ProcessEllipse.resx b/JinYuan.ControlLib/ProcessEllipse.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/ProcessEllipse.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Properties/AssemblyInfo.cs b/JinYuan.ControlLib/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..870604b --- /dev/null +++ b/JinYuan.ControlLib/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.ControlLib")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.ControlLib")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("1bb7ed33-d2cb-4cdd-ab39-f7f9ae948ca2")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.ControlLib/Properties/Resources.Designer.cs b/JinYuan.ControlLib/Properties/Resources.Designer.cs new file mode 100644 index 0000000..9787750 --- /dev/null +++ b/JinYuan.ControlLib/Properties/Resources.Designer.cs @@ -0,0 +1,433 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace JinYuan.ControlLib.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("JinYuan.ControlLib.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap _2bg { + get { + object obj = ResourceManager.GetObject("2bg", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap _4 { + get { + object obj = ResourceManager.GetObject("4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap _6 { + get { + object obj = ResourceManager.GetObject("6", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap _61 { + get { + object obj = ResourceManager.GetObject("61", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap bg2 { + get { + object obj = ResourceManager.GetObject("bg2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap big_arrow { + get { + object obj = ResourceManager.GetObject("big_arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap big_arrow_l { + get { + object obj = ResourceManager.GetObject("big_arrow_l", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap big_box { + get { + object obj = ResourceManager.GetObject("big_box", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap big_box_l { + get { + object obj = ResourceManager.GetObject("big_box_l", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap big_box_s { + get { + object obj = ResourceManager.GetObject("big_box_s", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap big_box_super { + get { + object obj = ResourceManager.GetObject("big_box_super", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap caret_down { + get { + object obj = ResourceManager.GetObject("caret_down", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap caret_right { + get { + object obj = ResourceManager.GetObject("caret_right", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Green { + get { + object obj = ResourceManager.GetObject("Green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftSelected { + get { + object obj = ResourceManager.GetObject("LeftSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftSelected3 { + get { + object obj = ResourceManager.GetObject("LeftSelected3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftUnSelected { + get { + object obj = ResourceManager.GetObject("LeftUnSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftUnSelected2 { + get { + object obj = ResourceManager.GetObject("LeftUnSelected2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftUnSelected3 { + get { + object obj = ResourceManager.GetObject("LeftUnSelected3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap loading { + get { + object obj = ResourceManager.GetObject("loading", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Red { + get { + object obj = ResourceManager.GetObject("Red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightSelected { + get { + object obj = ResourceManager.GetObject("RightSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightSelected3 { + get { + object obj = ResourceManager.GetObject("RightSelected3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightUnSelected { + get { + object obj = ResourceManager.GetObject("RightUnSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightUnSelected2 { + get { + object obj = ResourceManager.GetObject("RightUnSelected2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightUnSelected3 { + get { + object obj = ResourceManager.GetObject("RightUnSelected3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Title { + get { + object obj = ResourceManager.GetObject("Title", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap TotalQty { + get { + object obj = ResourceManager.GetObject("TotalQty", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 开机时间 { + get { + object obj = ResourceManager.GetObject("开机时间", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 数字指标 { + get { + object obj = ResourceManager.GetObject("数字指标", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 星球地球科技蓝色转动动图压缩86_9 { + get { + object obj = ResourceManager.GetObject("星球地球科技蓝色转动动图压缩86.9", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 标题_03右 { + get { + object obj = ResourceManager.GetObject("标题_03右", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 标题_03左 { + get { + object obj = ResourceManager.GetObject("标题_03左", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 标题_04 { + get { + object obj = ResourceManager.GetObject("标题_04", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 组_178_拷贝 { + get { + object obj = ResourceManager.GetObject("组 178 拷贝", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 蓝色 { + get { + object obj = ResourceManager.GetObject("蓝色", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 运行时间 { + get { + object obj = ResourceManager.GetObject("运行时间", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/JinYuan.ControlLib/Properties/Resources.resx b/JinYuan.ControlLib/Properties/Resources.resx new file mode 100644 index 0000000..e8df2ca --- /dev/null +++ b/JinYuan.ControlLib/Properties/Resources.resx @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\2bg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\6.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\61.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bg2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\big_arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\big_arrow_l.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\big_box.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\big_box_l.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\big_box_s.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\big_box_super.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\caret-down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\caret-right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftSelected3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftUnSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftUnSelected2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftUnSelected3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\loading.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RightSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RightSelected3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RightUnSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\常规按钮.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RightUnSelected3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Title.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TotalQty.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\开机时间.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\数字指标.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\星球地球科技蓝色转动动图压缩86.9.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\标题_03右.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\标题_03.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\标题_04.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\组 178 拷贝.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\蓝色.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\运行时间.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Resources/2bg.png b/JinYuan.ControlLib/Resources/2bg.png new file mode 100644 index 0000000..56b8ae0 Binary files /dev/null and b/JinYuan.ControlLib/Resources/2bg.png differ diff --git a/JinYuan.ControlLib/Resources/4.png b/JinYuan.ControlLib/Resources/4.png new file mode 100644 index 0000000..5d6c438 Binary files /dev/null and b/JinYuan.ControlLib/Resources/4.png differ diff --git a/JinYuan.ControlLib/Resources/6.png b/JinYuan.ControlLib/Resources/6.png new file mode 100644 index 0000000..c9c4858 Binary files /dev/null and b/JinYuan.ControlLib/Resources/6.png differ diff --git a/JinYuan.ControlLib/Resources/61.png b/JinYuan.ControlLib/Resources/61.png new file mode 100644 index 0000000..c9c4858 Binary files /dev/null and b/JinYuan.ControlLib/Resources/61.png differ diff --git a/JinYuan.ControlLib/Resources/Green.png b/JinYuan.ControlLib/Resources/Green.png new file mode 100644 index 0000000..783d0fb Binary files /dev/null and b/JinYuan.ControlLib/Resources/Green.png differ diff --git a/JinYuan.ControlLib/Resources/LeftSelected.png b/JinYuan.ControlLib/Resources/LeftSelected.png new file mode 100644 index 0000000..09cfb6d Binary files /dev/null and b/JinYuan.ControlLib/Resources/LeftSelected.png differ diff --git a/JinYuan.ControlLib/Resources/LeftSelected3.png b/JinYuan.ControlLib/Resources/LeftSelected3.png new file mode 100644 index 0000000..561b10b Binary files /dev/null and b/JinYuan.ControlLib/Resources/LeftSelected3.png differ diff --git a/JinYuan.ControlLib/Resources/LeftUnSelected.png b/JinYuan.ControlLib/Resources/LeftUnSelected.png new file mode 100644 index 0000000..b024137 Binary files /dev/null and b/JinYuan.ControlLib/Resources/LeftUnSelected.png differ diff --git a/JinYuan.ControlLib/Resources/LeftUnSelected2.png b/JinYuan.ControlLib/Resources/LeftUnSelected2.png new file mode 100644 index 0000000..e08c43d Binary files /dev/null and b/JinYuan.ControlLib/Resources/LeftUnSelected2.png differ diff --git a/JinYuan.ControlLib/Resources/LeftUnSelected3.png b/JinYuan.ControlLib/Resources/LeftUnSelected3.png new file mode 100644 index 0000000..93d36e8 Binary files /dev/null and b/JinYuan.ControlLib/Resources/LeftUnSelected3.png differ diff --git a/JinYuan.ControlLib/Resources/Red.png b/JinYuan.ControlLib/Resources/Red.png new file mode 100644 index 0000000..6fc76cd Binary files /dev/null and b/JinYuan.ControlLib/Resources/Red.png differ diff --git a/JinYuan.ControlLib/Resources/RightSelected.png b/JinYuan.ControlLib/Resources/RightSelected.png new file mode 100644 index 0000000..819cf76 Binary files /dev/null and b/JinYuan.ControlLib/Resources/RightSelected.png differ diff --git a/JinYuan.ControlLib/Resources/RightSelected3.png b/JinYuan.ControlLib/Resources/RightSelected3.png new file mode 100644 index 0000000..5de3c7d Binary files /dev/null and b/JinYuan.ControlLib/Resources/RightSelected3.png differ diff --git a/JinYuan.ControlLib/Resources/RightUnSelected.png b/JinYuan.ControlLib/Resources/RightUnSelected.png new file mode 100644 index 0000000..9196206 Binary files /dev/null and b/JinYuan.ControlLib/Resources/RightUnSelected.png differ diff --git a/JinYuan.ControlLib/Resources/RightUnSelected3.png b/JinYuan.ControlLib/Resources/RightUnSelected3.png new file mode 100644 index 0000000..16e61bb Binary files /dev/null and b/JinYuan.ControlLib/Resources/RightUnSelected3.png differ diff --git a/JinYuan.ControlLib/Resources/Title.png b/JinYuan.ControlLib/Resources/Title.png new file mode 100644 index 0000000..38a87f7 Binary files /dev/null and b/JinYuan.ControlLib/Resources/Title.png differ diff --git a/JinYuan.ControlLib/Resources/TotalQty.png b/JinYuan.ControlLib/Resources/TotalQty.png new file mode 100644 index 0000000..45e6493 Binary files /dev/null and b/JinYuan.ControlLib/Resources/TotalQty.png differ diff --git a/JinYuan.ControlLib/Resources/bg2.png b/JinYuan.ControlLib/Resources/bg2.png new file mode 100644 index 0000000..4210157 Binary files /dev/null and b/JinYuan.ControlLib/Resources/bg2.png differ diff --git a/JinYuan.ControlLib/Resources/big_arrow.png b/JinYuan.ControlLib/Resources/big_arrow.png new file mode 100644 index 0000000..b97d348 Binary files /dev/null and b/JinYuan.ControlLib/Resources/big_arrow.png differ diff --git a/JinYuan.ControlLib/Resources/big_arrow_l.png b/JinYuan.ControlLib/Resources/big_arrow_l.png new file mode 100644 index 0000000..fab7f74 Binary files /dev/null and b/JinYuan.ControlLib/Resources/big_arrow_l.png differ diff --git a/JinYuan.ControlLib/Resources/big_box.png b/JinYuan.ControlLib/Resources/big_box.png new file mode 100644 index 0000000..c803f2d Binary files /dev/null and b/JinYuan.ControlLib/Resources/big_box.png differ diff --git a/JinYuan.ControlLib/Resources/big_box_l.png b/JinYuan.ControlLib/Resources/big_box_l.png new file mode 100644 index 0000000..a8c8097 Binary files /dev/null and b/JinYuan.ControlLib/Resources/big_box_l.png differ diff --git a/JinYuan.ControlLib/Resources/big_box_s.png b/JinYuan.ControlLib/Resources/big_box_s.png new file mode 100644 index 0000000..d9cb1ac Binary files /dev/null and b/JinYuan.ControlLib/Resources/big_box_s.png differ diff --git a/JinYuan.ControlLib/Resources/big_box_super.png b/JinYuan.ControlLib/Resources/big_box_super.png new file mode 100644 index 0000000..d9bcfa5 Binary files /dev/null and b/JinYuan.ControlLib/Resources/big_box_super.png differ diff --git a/JinYuan.ControlLib/Resources/caret-down.png b/JinYuan.ControlLib/Resources/caret-down.png new file mode 100644 index 0000000..d45d9ca Binary files /dev/null and b/JinYuan.ControlLib/Resources/caret-down.png differ diff --git a/JinYuan.ControlLib/Resources/caret-right.png b/JinYuan.ControlLib/Resources/caret-right.png new file mode 100644 index 0000000..90ff769 Binary files /dev/null and b/JinYuan.ControlLib/Resources/caret-right.png differ diff --git a/JinYuan.ControlLib/Resources/loading.gif b/JinYuan.ControlLib/Resources/loading.gif new file mode 100644 index 0000000..42c22fe Binary files /dev/null and b/JinYuan.ControlLib/Resources/loading.gif differ diff --git a/JinYuan.ControlLib/Resources/常规按钮.png b/JinYuan.ControlLib/Resources/常规按钮.png new file mode 100644 index 0000000..7304ff0 Binary files /dev/null and b/JinYuan.ControlLib/Resources/常规按钮.png differ diff --git a/JinYuan.ControlLib/Resources/开机时间.png b/JinYuan.ControlLib/Resources/开机时间.png new file mode 100644 index 0000000..6accedc Binary files /dev/null and b/JinYuan.ControlLib/Resources/开机时间.png differ diff --git a/JinYuan.ControlLib/Resources/数字指标.png b/JinYuan.ControlLib/Resources/数字指标.png new file mode 100644 index 0000000..7095056 Binary files /dev/null and b/JinYuan.ControlLib/Resources/数字指标.png differ diff --git a/JinYuan.ControlLib/Resources/星球地球科技蓝色转动动图压缩86.9.gif b/JinYuan.ControlLib/Resources/星球地球科技蓝色转动动图压缩86.9.gif new file mode 100644 index 0000000..f913149 Binary files /dev/null and b/JinYuan.ControlLib/Resources/星球地球科技蓝色转动动图压缩86.9.gif differ diff --git a/JinYuan.ControlLib/Resources/标题_03.png b/JinYuan.ControlLib/Resources/标题_03.png new file mode 100644 index 0000000..a3ec442 Binary files /dev/null and b/JinYuan.ControlLib/Resources/标题_03.png differ diff --git a/JinYuan.ControlLib/Resources/标题_03右.png b/JinYuan.ControlLib/Resources/标题_03右.png new file mode 100644 index 0000000..487bff7 Binary files /dev/null and b/JinYuan.ControlLib/Resources/标题_03右.png differ diff --git a/JinYuan.ControlLib/Resources/标题_04.png b/JinYuan.ControlLib/Resources/标题_04.png new file mode 100644 index 0000000..1da05f1 Binary files /dev/null and b/JinYuan.ControlLib/Resources/标题_04.png differ diff --git a/JinYuan.ControlLib/Resources/组 178 拷贝.png b/JinYuan.ControlLib/Resources/组 178 拷贝.png new file mode 100644 index 0000000..08ce660 Binary files /dev/null and b/JinYuan.ControlLib/Resources/组 178 拷贝.png differ diff --git a/JinYuan.ControlLib/Resources/蓝色.png b/JinYuan.ControlLib/Resources/蓝色.png new file mode 100644 index 0000000..17a67a4 Binary files /dev/null and b/JinYuan.ControlLib/Resources/蓝色.png differ diff --git a/JinYuan.ControlLib/Resources/运行时间.png b/JinYuan.ControlLib/Resources/运行时间.png new file mode 100644 index 0000000..630649a Binary files /dev/null and b/JinYuan.ControlLib/Resources/运行时间.png differ diff --git a/JinYuan.ControlLib/ScrollBar/ScrollbarComponent.cs b/JinYuan.ControlLib/ScrollBar/ScrollbarComponent.cs new file mode 100644 index 0000000..494b82e --- /dev/null +++ b/JinYuan.ControlLib/ScrollBar/ScrollbarComponent.cs @@ -0,0 +1,829 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.ScrollBar +{ + [ProvideProperty("UserCustomScrollbar", typeof(Control))] + public class ScrollbarComponent : Component, IExtenderProvider + { + public ScrollbarComponent() + { + + } + + public ScrollbarComponent(IContainer container) + { + container.Add(this); + } + + Dictionary m_controlCache = new Dictionary(); + public bool CanExtend(object extendee) + { + if (extendee is ScrollableControl) + { + ScrollableControl control = (ScrollableControl)extendee; + if (control.AutoScroll == true) + { + return true; + } + } + else if (extendee is TreeView) + { + TreeView control = (TreeView)extendee; + if (control.Scrollable) + { + return true; + } + } + else if (extendee is TextBox) + { + TextBox control = (TextBox)extendee; + if (control.Multiline && control.ScrollBars != ScrollBars.None) + { + return true; + } + } + else if (extendee is RichTextBox) + { + return true; + } + else if (extendee is ListBox) + { + return true; + } + //else if (extendee is ListView) + //{ + // return true; + //} + else if (extendee is DataGridView) + { + return true; + } + return false; + } + + [Browsable(true), Category("自定义属性"), Description("是否使用自定义滚动条"), DisplayName("UserCustomScrollbar"), Localizable(true)] + public bool GetUserCustomScrollbar(Control control) + { + if (m_controlCache.ContainsKey(control)) + return m_controlCache[control]; + return true; + } + + public void SetUserCustomScrollbar(Control control, bool blnUserCustomScrollbar) + { + m_controlCache[control] = blnUserCustomScrollbar; + if (!blnUserCustomScrollbar) + return; + + if (control is TreeView) + { + TreeView tv = (TreeView)control; + //tv.MouseWheel += tv_MouseWheel; + //tv.AfterSelect += tv_AfterSelect; + tv.AfterExpand += tv_AfterExpand; + tv.AfterCollapse += tv_AfterCollapse; + } + else if (control is TextBox) + { + TextBox txt = (TextBox)control; + //txt.MouseWheel += txt_MouseWheel; + txt.TextChanged += txt_TextChanged; + txt.KeyDown += txt_KeyDown; + } + else if (control is RichTextBox) + { + RichTextBox txt = (RichTextBox)control; + //txt.MouseWheel += txt_MouseWheel; + txt.TextChanged += txt_TextChanged; + txt.KeyDown += txt_KeyDown; + } + else if (control is ListBox) + { + ListBox lb = (ListBox)control; + lb.DataSourceChanged += Lb_DataSourceChanged; + lb.SelectedIndexChanged += Lb_SelectedIndexChanged; + } + //else if (control is ListView) + //{ + // ListView lv = (ListView)control; + + //} + else if (control is DataGridView) + { + DataGridView dgv = (DataGridView)control; + dgv.DataSourceChanged += dgv_DataSourceChanged; + dgv.RowsAdded += dgv_RowsAdded; + dgv.RowsRemoved += dgv_RowsRemoved; + dgv.Scroll += dgv_Scroll; + } + + control.VisibleChanged += control_VisibleChanged; + control.SizeChanged += control_SizeChanged; + control.LocationChanged += control_LocationChanged; + control.Disposed += control_Disposed; + control.MouseWheel += Control_MouseWheel; + control_SizeChanged(control, null); + } + + void dgv_Scroll(object sender, ScrollEventArgs e) + { + if (e.NewValue == e.OldValue) + return; + DataGridView dgv = (DataGridView)sender; + if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) + { + if (m_lstHCache.ContainsKey(dgv)) + { + m_lstHCache[dgv].Value = e.NewValue; + } + } + else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) + { + if (m_lstVCache.ContainsKey(dgv)) + { + m_lstVCache[dgv].Value = e.NewValue; + } + } + } + + void dgv_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) + { + Control control = sender as Control; + control_SizeChanged(control, null); + } + + void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) + { + Control control = sender as Control; + control_SizeChanged(control, null); + } + + void dgv_DataSourceChanged(object sender, EventArgs e) + { + Control control = sender as Control; + control_SizeChanged(control, null); + } + + private void Lb_SelectedIndexChanged(object sender, EventArgs e) + { + Control c = sender as Control; + SetVMaxNum(c); + } + + private void Lb_DataSourceChanged(object sender, EventArgs e) + { + Control c = sender as Control; + control_SizeChanged(c, null); + } + + private void Control_MouseWheel(object sender, MouseEventArgs e) + { + Control c = (Control)sender; + if (m_lstVCache.ContainsKey(c)) + { + if (e.Delta > 5) + { + ControlHelper.ScrollUp(c.Handle); + } + else if (e.Delta < -5) + { + ControlHelper.ScrollDown(c.Handle); + } + + SetVMaxNum(c); + } + else if (m_lstHCache.ContainsKey(c)) + { + if (e.Delta > 5) + { + ControlHelper.ScrollLeft(c.Handle); + } + else if (e.Delta < -5) + { + ControlHelper.ScrollRight(c.Handle); + } + + SetHMaxNum(c); + } + } + + void control_Disposed(object sender, EventArgs e) + { + Control control = (Control)sender; + if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null) + { + m_lstVCache[control].Parent.Controls.Remove(m_lstVCache[control]); + m_lstVCache.Remove(control); + } + } + + void control_LocationChanged(object sender, EventArgs e) + { + ResetScrollLocation(sender); + } + + void control_SizeChanged(object sender, EventArgs e) + { + if (ControlHelper.IsDesignMode()) + { + return; + } + else + { + var control = sender as Control; + + bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0; + bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0; + if (control is TextBox) + { + var txt = (TextBox)control; + if (txt.ScrollBars == ScrollBars.Both) + { + blnHasVScrollbar = true; + blnHasHScrollbar = true; + } + else if (txt.ScrollBars == ScrollBars.Vertical) + { + blnHasVScrollbar = true; + blnHasHScrollbar = false; + } + else if (txt.ScrollBars == ScrollBars.Horizontal) + { + blnHasVScrollbar = false; + blnHasHScrollbar = true; + } + else + { + blnHasVScrollbar = false; + blnHasHScrollbar = false; + } + } + else if (control is DataGridView) + { + var dgv = (DataGridView)control; + if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical) + { + int _height = dgv.RowTemplate.Height * dgv.Rows.Count; + if (dgv.ColumnHeadersVisible) + { + _height += dgv.ColumnHeadersHeight; + } + blnHasVScrollbar = _height > dgv.Height; + } + if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal) + { + int _width = 0; + foreach (DataGridViewColumn com in dgv.Columns) + { + _width += com.Width; + } + if (dgv.RowHeadersVisible) + { + _width += dgv.RowHeadersWidth; + } + blnHasHScrollbar = _width > dgv.Width; + } + } + else if (control is ListView) + { + if (!((ListView)control).Scrollable) + { + blnHasVScrollbar = false; + blnHasHScrollbar = false; + } + } + if (blnHasVScrollbar) + { + if (!m_lstVCache.ContainsKey(control)) + { + if (control.Parent != null) + { + UCVScrollbar barV = new UCVScrollbar(); + barV.SmallChange = 5; + barV.Width = SystemInformation.VerticalScrollBarWidth + 1; + barV.Scroll += barV_Scroll; + m_lstVCache[control] = barV; + if (blnHasHScrollbar) + { + barV.Height = control.Height - barV.Width; + } + else + { + barV.Height = control.Height; + } + SetVMaxNum(control); + barV.Location = new System.Drawing.Point(control.Right - barV.Width, control.Top); + control.Parent.Controls.Add(barV); + int intControlIndex = control.Parent.Controls.GetChildIndex(control); + control.Parent.Controls.SetChildIndex(barV, intControlIndex); + } + } + else + { + if (blnHasHScrollbar) + { + m_lstVCache[control].Height = control.Height - m_lstVCache[control].Width; + } + else + { + m_lstVCache[control].Height = control.Height; + } + SetVMaxNum(control); + } + } + else + { + if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null) + { + m_lstVCache[control].Visible = false; + } + } + + if (blnHasHScrollbar) + { + if (!m_lstHCache.ContainsKey(control)) + { + if (control.Parent != null) + { + UCHScrollbar barH = new UCHScrollbar(); + barH.Height = SystemInformation.HorizontalScrollBarHeight + 1; + barH.SmallChange = 5; + + barH.Scroll += barH_Scroll; + m_lstHCache[control] = barH; + if (blnHasHScrollbar) + { + barH.Width = control.Width - barH.Height; + } + else + { + barH.Width = control.Width; + } + SetHMaxNum(control); + barH.Location = new System.Drawing.Point(control.Left, control.Bottom - barH.Height); + control.Parent.Controls.Add(barH); + int intControlIndex = control.Parent.Controls.GetChildIndex(control); + control.Parent.Controls.SetChildIndex(barH, intControlIndex); + } + } + else + { + if (blnHasHScrollbar) + { + m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height; + } + else + { + m_lstHCache[control].Width = control.Width; + } + SetHMaxNum(control); + } + } + else + { + if (m_lstHCache.ContainsKey(control)) + { + if (m_lstHCache[control].Visible && m_lstHCache[control].Parent != null) + { + m_lstHCache[control].Visible = false; + } + } + } + } + ResetScrollLocation(sender); + } + + + private void SetVMaxNum(Control control) + { + if (!m_lstVCache.ContainsKey(control)) + return; + var intoV = ControlHelper.GetVScrollBarInfo(control.Handle); + UCVScrollbar barV = m_lstVCache[control]; + if (control is ScrollableControl) + { + barV.Maximum = intoV.ScrollMax; + barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; + barV.Value = intoV.nPos; + barV.BringToFront(); + // barV.Maximum = (control as ScrollableControl).VerticalScroll.Maximum; + // barV.Value = (control as ScrollableControl).VerticalScroll.Value; + } + else if (control is TreeView) + { + var tv = control as TreeView; + barV.Maximum = intoV.ScrollMax * tv.ItemHeight; + barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; + barV.Value = intoV.nPos * tv.ItemHeight; + barV.BringToFront(); + + //barV.Maximum = GetTreeNodeMaxY(control as TreeView) - control.Height; + //barV.Value = (control as TreeView).AutoScrollOffset.Y; + } + else if (control is TextBox) + { + TextBox txt = (TextBox)control; + barV.Maximum = intoV.ScrollMax * txt.PreferredHeight; + if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Vertical) + { + barV.Visible = true; + } + else + { + barV.Visible = false; + } + barV.Value = intoV.nPos * txt.PreferredHeight; + barV.BringToFront(); + } + else if (control is RichTextBox) + { + bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0; + barV.Maximum = intoV.ScrollMax; + barV.Visible = blnHasVScrollbar; + barV.Value = intoV.nPos; + barV.BringToFront(); + } + else if (control is ListBox) + { + var lb = control as ListBox; + if (intoV.ScrollMax <= 1) + { + var v = lb.ItemHeight * lb.Items.Count - lb.Height; + if (v > 0) + barV.Maximum = v; + else + barV.Maximum = intoV.ScrollMax * lb.ItemHeight; + } + else + { + barV.Maximum = intoV.ScrollMax * lb.ItemHeight; + } + barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; + barV.Value = intoV.nPos * lb.ItemHeight; + barV.BringToFront(); + } + else if (control is ListView) + { + barV.Maximum = intoV.ScrollMax; + barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; + barV.Value = intoV.nPos; + barV.BringToFront(); + } + else if (control is DataGridView) + { + bool blnHasVScrollbar = false; + var dgv = (DataGridView)control; + if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical) + { + int _height = dgv.RowTemplate.Height * dgv.Rows.Count; + if (dgv.ColumnHeadersVisible) + { + _height += dgv.ColumnHeadersHeight; + } + blnHasVScrollbar = _height > dgv.Height; + } + barV.Maximum = dgv.Rows.Count; + barV.Visible = blnHasVScrollbar; + barV.Value = dgv.FirstDisplayedScrollingRowIndex; ; + barV.BringToFront(); + } + } + private void SetHMaxNum(Control control) + { + if (!m_lstHCache.ContainsKey(control)) + return; + var intoH = ControlHelper.GetHScrollBarInfo(control.Handle); + UCHScrollbar barH = m_lstHCache[control]; + if (control is ScrollableControl) + { + barH.Maximum = intoH.ScrollMax; + barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0; + barH.Value = intoH.nPos; + barH.BringToFront(); + + //barH.Maximum = (control as ScrollableControl).HorizontalScroll.Maximum; + //barH.Value = (control as ScrollableControl).HorizontalScroll.Value; + } + else if (control is TreeView) + { + var tv = control as TreeView; + barH.Maximum = intoH.ScrollMax; + barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0; + barH.Value = intoH.nPos; + barH.BringToFront(); + //barH.Maximum = GetTreeNodeMaxX(control as TreeView); + //barH.Value = (control as TreeView).AutoScrollOffset.X; + } + else if (control is TextBox) + { + TextBox txt = (TextBox)control; + barH.Maximum = intoH.ScrollMax; + + if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Horizontal) + { + barH.Visible = true; + } + else + { + barH.Visible = false; + } + + barH.Value = intoH.nPos; + barH.BringToFront(); + } + else if (control is RichTextBox) + { + bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0; + + barH.Maximum = intoH.ScrollMax; + barH.Visible = blnHasHScrollbar; + barH.Value = intoH.nPos; + barH.BringToFront(); + } + else if (control is ListBox) + { + var lb = control as ListBox; + barH.Maximum = intoH.ScrollMax * lb.ItemHeight; + barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0; + barH.Value = intoH.nPos * lb.ItemHeight; + barH.BringToFront(); + } + else if (control is ListView) + { + barH.Maximum = intoH.ScrollMax; + barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0; + barH.Value = intoH.nPos; + barH.BringToFront(); + } + else if (control is DataGridView) + { + bool blnHasHScrollbar = false; + var dgv = (DataGridView)control; + int _width = 0; + if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal) + { + foreach (DataGridViewColumn com in dgv.Columns) + { + _width += com.Width; + } + if (dgv.RowHeadersVisible) + { + _width += dgv.RowHeadersWidth; + } + blnHasHScrollbar = _width > dgv.Width; + } + if (blnHasHScrollbar) + barH.Maximum = _width - dgv.Width; + barH.Visible = blnHasHScrollbar; + barH.Value = dgv.FirstDisplayedScrollingColumnHiddenWidth; + barH.BringToFront(); + } + } + /// + /// Resets the v scroll location. + /// + /// The sender. + private void ResetScrollLocation(object sender) + { + Control control = (Control)sender; + bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0; + bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0; + if (control is TextBox) + { + var txt = (TextBox)control; + if (txt.ScrollBars == ScrollBars.Both) + { + blnHasVScrollbar = true; + blnHasHScrollbar = true; + } + else if (txt.ScrollBars == ScrollBars.Vertical) + { + blnHasVScrollbar = true; + blnHasHScrollbar = false; + } + else if (txt.ScrollBars == ScrollBars.Horizontal) + { + blnHasVScrollbar = false; + blnHasHScrollbar = true; + } + else + { + blnHasVScrollbar = false; + blnHasHScrollbar = false; + } + } + else if (control is DataGridView) + { + var dgv = (DataGridView)control; + if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical) + { + int _height = dgv.RowTemplate.Height * dgv.Rows.Count; + if (dgv.ColumnHeadersVisible) + { + _height += dgv.ColumnHeadersHeight; + } + blnHasVScrollbar = _height > dgv.Height; + } + if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal) + { + int _width = 0; + foreach (DataGridViewColumn com in dgv.Columns) + { + _width += com.Width; + } + if (dgv.RowHeadersVisible) + { + _width += dgv.RowHeadersWidth; + } + blnHasHScrollbar = _width > dgv.Width; + } + } + else if (control is ListView) + { + if (!((ListView)control).Scrollable) + { + blnHasVScrollbar = false; + blnHasHScrollbar = false; + } + } + if (control.Visible) + { + if (m_lstVCache.ContainsKey(control)) + { + m_lstVCache[control].Location = new System.Drawing.Point(control.Right - m_lstVCache[control].Width, control.Top); + if (blnHasHScrollbar) + { + m_lstVCache[control].Height = control.Height - m_lstHCache[control].Height; + } + else + { + m_lstVCache[control].Height = control.Height; + } + SetVMaxNum(control); + } + + if (m_lstHCache.ContainsKey(control)) + { + m_lstHCache[control].Location = new System.Drawing.Point(control.Left, control.Bottom - m_lstHCache[control].Height); + //if (blnHasVScrollbar) + //{ + // m_lstHCache[control].Width = control.Width - m_lstVCache[control].Width; + //} + //else + //{ + m_lstHCache[control].Width = control.Width; + //} + SetHMaxNum(control); + } + } + } + + /// + /// Handles the VisibleChanged event of the control control. + /// + /// The source of the event. + /// The instance containing the event data. + void control_VisibleChanged(object sender, EventArgs e) + { + Control control = (Control)sender; + + if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null) + { + m_lstVCache[control].Visible = control.Visible; + } + + if (m_lstHCache.ContainsKey(control) && m_lstHCache[control].Parent != null) + { + m_lstHCache[control].Visible = control.Visible; + } + if (control.Visible) + { + control_SizeChanged(control, null); + } + } + + private const int HSCROLL = 0x100000; + private const int VSCROLL = 0x200000; + private const int STYLE = -16; + + private Dictionary m_lstVCache = new Dictionary(); + private Dictionary m_lstHCache = new Dictionary(); + + void barV_Scroll(object sender, EventArgs e) + { + UCVScrollbar bar = (UCVScrollbar)sender; + if (m_lstVCache.ContainsValue(bar)) + { + Control c = m_lstVCache.FirstOrDefault(p => p.Value == bar).Key; + + //ControlHelper.SetVScrollValue(c.Handle, bar.Value); + if (c is ScrollableControl) + { + (c as ScrollableControl).AutoScrollPosition = new Point((c as ScrollableControl).AutoScrollPosition.X, bar.Value); + } + else if (c is TreeView) + { + ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TreeView).ItemHeight)); + } + else if (c is TextBox) + { + ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TextBox).PreferredHeight)); + } + else if (c is RichTextBox) + { + ControlHelper.SetVScrollValue(c.Handle, bar.Value); + } + else if (c is ListBox) + { + ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as ListBox).ItemHeight)); + } + else if (c is ListView) + { + ControlHelper.SetVScrollValue(c.Handle, bar.Value); + } + else if (c is DataGridView) + { + var dgv = (DataGridView)c; + if (bar.Value > 0) + dgv.FirstDisplayedScrollingRowIndex = bar.Value - 1; + } + } + } + + void barH_Scroll(object sender, EventArgs e) + { + UCHScrollbar bar = (UCHScrollbar)sender; + if (m_lstHCache.ContainsValue(bar)) + { + Control c = m_lstHCache.FirstOrDefault(p => p.Value == bar).Key; + if (c is ScrollableControl) + { + (c as ScrollableControl).AutoScrollPosition = new Point(bar.Value, (c as ScrollableControl).AutoScrollPosition.Y); + } + else if (c is TreeView) + { + ControlHelper.SetHScrollValue(c.Handle, bar.Value); + //TreeView tv = (c as TreeView); + //SetTreeViewVScrollLocation(tv, tv.Nodes, bar.Value); + } + else if (c is TextBox) + { + ControlHelper.SetHScrollValue(c.Handle, bar.Value); + //TextBox txt = (c as TextBox); + //SetTextBoxVScrollLocation(txt, bar.Value); + } + else if (c is RichTextBox) + { + ControlHelper.SetHScrollValue(c.Handle, bar.Value); + } + else if (c is ListBox) + { + ControlHelper.SetHScrollValue(c.Handle, bar.Value); + } + else if (c is ListView) + { + ControlHelper.SetHScrollValue(c.Handle, bar.Value); + } + else if (c is DataGridView) + { + var dgv = (DataGridView)c; + dgv.HorizontalScrollingOffset = bar.Value; + } + } + } + + #region Treeview处理 English:Treeview\u5904\u7406 + void tv_AfterCollapse(object sender, TreeViewEventArgs e) + { + control_SizeChanged(sender as Control, null); + } + + void tv_AfterExpand(object sender, TreeViewEventArgs e) + { + control_SizeChanged(sender as Control, null); + } + + #endregion + + #region TextBox处理 English:TextBox Processing + + void txt_TextChanged(object sender, EventArgs e) + { + Control txt = sender as Control; + control_SizeChanged(txt, null); + } + + void txt_KeyDown(object sender, KeyEventArgs e) + { + Control txt = sender as Control; + control_SizeChanged(txt, null); + } + #endregion + } +} diff --git a/JinYuan.ControlLib/ScrollBar/ScrollbarControlDesigner.cs b/JinYuan.ControlLib/ScrollBar/ScrollbarControlDesigner.cs new file mode 100644 index 0000000..cb4e1af --- /dev/null +++ b/JinYuan.ControlLib/ScrollBar/ScrollbarControlDesigner.cs @@ -0,0 +1,39 @@ +using System.ComponentModel; +using System.Windows.Forms.Design; + +namespace JinYuan.ControlLib.ScrollBar +{ + /// + /// Class ScrollbarControlDesigner. + /// Implements the + /// + /// + internal class ScrollbarControlDesigner : System.Windows.Forms.Design.ControlDesigner + { + /// + /// 获取指示组件的移动功能的选择规则。 + /// + /// The selection rules. + public override SelectionRules SelectionRules + { + get + { + SelectionRules selectionRules = base.SelectionRules; + PropertyDescriptor propDescriptor = TypeDescriptor.GetProperties(this.Component)["AutoSize"]; + if (propDescriptor != null) + { + bool autoSize = (bool)propDescriptor.GetValue(this.Component); + if (autoSize) + { + selectionRules = SelectionRules.Visible | SelectionRules.Moveable | SelectionRules.BottomSizeable | SelectionRules.TopSizeable; + } + else + { + selectionRules = SelectionRules.Visible | SelectionRules.AllSizeable | SelectionRules.Moveable; + } + } + return selectionRules; + } + } + } +} diff --git a/JinYuan.ControlLib/ScrollBar/UCHScrollbar.cs b/JinYuan.ControlLib/ScrollBar/UCHScrollbar.cs new file mode 100644 index 0000000..0b37e4b --- /dev/null +++ b/JinYuan.ControlLib/ScrollBar/UCHScrollbar.cs @@ -0,0 +1,519 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.ScrollBar +{ + [Designer(typeof(ScrollbarControlDesigner))] + [DefaultEvent("Scroll")] + public class UCHScrollbar : UCControlBase + { + #region 属性 English:attribute + /// + /// The mo large change + /// + protected int moLargeChange = 10; + /// + /// The mo small change + /// + protected int moSmallChange = 1; + /// + /// The mo minimum + /// + protected int moMinimum = 0; + /// + /// The mo maximum + /// + protected int moMaximum = 100; + /// + /// The mo value + /// + protected int moValue = 0; + /// + /// The n click point + /// + private int nClickPoint; + /// + /// The mo thumb top + /// + protected int moThumbLeft = 0; + /// + /// The mo automatic size + /// + protected bool moAutoSize = false; + /// + /// The mo thumb down + /// + private bool moThumbMouseDown = false; + /// + /// The mo thumb dragging + /// + private bool moThumbMouseDragging = false; + /// + /// Occurs when [scroll]. + /// + public new event EventHandler Scroll = null; + /// + /// Occurs when [value changed]. + /// + public event EventHandler ValueChanged = null; + + /// + /// The BTN height + /// + private int btnWidth = 18; + /// + /// The m int thumb minimum height + /// + private int m_intThumbMinWidth = 15; + + /// + /// Gets or sets the height of the BTN. + /// + /// The height of the BTN. + public int BtnWidth + { + get { return btnWidth; } + set { btnWidth = value; } + } + /// + /// Gets or sets the large change. + /// + /// The large change. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("LargeChange")] + public int LargeChange + { + get { return moLargeChange; } + set + { + moLargeChange = value; + Invalidate(); + } + } + + /// + /// Gets or sets the small change. + /// + /// The small change. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("SmallChange")] + public int SmallChange + { + get { return moSmallChange; } + set + { + moSmallChange = value; + Invalidate(); + } + } + + /// + /// Gets or sets the minimum. + /// + /// The minimum. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Minimum")] + public int Minimum + { + get { return moMinimum; } + set + { + moMinimum = value; + Invalidate(); + } + } + + /// + /// Gets or sets the maximum. + /// + /// The maximum. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Maximum")] + public int Maximum + { + get { return moMaximum; } + set + { + moMaximum = value; + Invalidate(); + } + } + + /// + /// Gets or sets the value. + /// + /// The value. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Value")] + public int Value + { + get { return moValue; } + set + { + moValue = value; + if (moValue > moMaximum) + moValue = moMaximum; + int nTrackWidth = (this.Width - btnWidth * 2); + float fThumbWidth = nTrackWidth - Maximum; + //float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; + int nThumbWidth = (int)fThumbWidth; + + if (nThumbWidth > nTrackWidth) + { + nThumbWidth = nTrackWidth; + fThumbWidth = nTrackWidth; + } + if (nThumbWidth < m_intThumbMinWidth) + { + nThumbWidth = m_intThumbMinWidth; + fThumbWidth = m_intThumbMinWidth; + } + + //figure out value + int nPixelRange = nTrackWidth - nThumbWidth; + int nRealRange = (Maximum - Minimum) - LargeChange; + float fPerc = 0.0f; + if (nRealRange != 0) + { + fPerc = (float)moValue / (float)nRealRange; + + } + + float fLeft = fPerc * nPixelRange; + moThumbLeft = (int)fLeft; + + + Invalidate(); + } + } + + /// + /// Gets or sets a value indicating whether [automatic size]. + /// + /// true if [automatic size]; otherwise, false. + public override bool AutoSize + { + get + { + return base.AutoSize; + } + set + { + base.AutoSize = value; + if (base.AutoSize) + { + this.Width = 15; + } + } + } + + /// + /// The thumb color + /// + private Color thumbColor = Color.FromArgb(1, 146, 235); + + /// + /// Gets or sets the color of the thumb. + /// + /// The color of the thumb. + public Color ThumbColor + { + get { return thumbColor; } + set { thumbColor = value; } + } + #endregion + + public UCHScrollbar() + { + InitializeComponent(); + ConerRadius = 2; + FillColor = Color.FromArgb(6, 30, 78); + IsShowRect = false; + IsRadius = true; + + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + + + + } + + + #region 静止闪烁 + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x0014) // 禁掉清除背景消息 + return; + base.WndProc(ref m); + } + #endregion + + /// + /// Initializes the component. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + + this.MinimumSize = new System.Drawing.Size(0, 10); + this.Name = "UCHScrollbar"; + this.Size = new System.Drawing.Size(150, 18); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseMove); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseUp); + this.ResumeLayout(false); + + } + + #region 鼠标事件 English:Mouse event + /// + /// Handles the MouseDown event of the CustomScrollbar control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e) + { + if (Maximum <= 0) + { + return; + } + Point ptPoint = this.PointToClient(Cursor.Position); + int nTrackWidth = (this.Width - btnWidth * 2); + float fThumbWidth = nTrackWidth - Maximum; + //float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; + int nThumbWidth = (int)fThumbWidth; + + if (nThumbWidth > nTrackWidth) + { + nThumbWidth = nTrackWidth; + fThumbWidth = nTrackWidth; + } + if (nThumbWidth < m_intThumbMinWidth) + { + nThumbWidth = m_intThumbMinWidth; + fThumbWidth = m_intThumbMinWidth; + } + + int nLeft = moThumbLeft; + nLeft += btnWidth; + + + Rectangle thumbrect = new Rectangle(new Point(nLeft, 1), new Size(nThumbWidth, this.Height - 2)); + //滑块 + if (thumbrect.Contains(ptPoint)) + { + //hit the thumb + nClickPoint = (ptPoint.X - nLeft); + this.moThumbMouseDown = true; + } + else + { + //左按钮 + Rectangle leftarrowrect = new Rectangle(new Point(0, 1), new Size(btnWidth, this.Height)); + if (leftarrowrect.Contains(ptPoint)) + { + int nRealRange = (Maximum - Minimum) - LargeChange; + int nPixelRange = (nTrackWidth - nThumbWidth); + if (nRealRange > 0) + { + if (nPixelRange > 0) + { + if ((moThumbLeft - SmallChange) < 0) + moThumbLeft = 0; + else + moThumbLeft -= SmallChange; + + //figure out value + float fPerc = (float)moThumbLeft / (float)nPixelRange; + float fValue = fPerc * (Maximum - LargeChange); + + moValue = (int)fValue; + + if (ValueChanged != null) + ValueChanged(this, new EventArgs()); + + if (Scroll != null) + Scroll(this, new EventArgs()); + + Invalidate(); + } + } + } + else + { + Rectangle rightarrowrect = new Rectangle(new Point(btnWidth + nTrackWidth, 1), new Size(btnWidth, this.Height)); + if (rightarrowrect.Contains(ptPoint)) + { + int nRealRange = (Maximum - Minimum) - LargeChange; + int nPixelRange = (nTrackWidth - nThumbWidth); + if (nRealRange > 0) + { + if (nPixelRange > 0) + { + if ((moThumbLeft + SmallChange) > nPixelRange) + moThumbLeft = nPixelRange; + else + moThumbLeft += SmallChange; + + //figure out value + float fPerc = (float)moThumbLeft / (float)nPixelRange; + float fValue = fPerc * (Maximum - LargeChange); + + moValue = (int)fValue; + + if (ValueChanged != null) + ValueChanged(this, new EventArgs()); + + if (Scroll != null) + Scroll(this, new EventArgs()); + + Invalidate(); + } + } + } + } + } + } + + /// + /// Handles the MouseUp event of the CustomScrollbar control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e) + { + this.moThumbMouseDown = false; + this.moThumbMouseDragging = false; + Application.DoEvents(); + } + + /// + /// Moves the thumb. + /// + /// The y. + private void MoveThumb(int x) + { + int nRealRange = Maximum - Minimum; + int nTrackWidth = (this.Width - btnWidth * 2); + // float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; + float fThumbWidth = nTrackWidth - Maximum; + int nThumbWidth = (int)fThumbWidth; + + if (nThumbWidth > nTrackWidth) + { + nThumbWidth = nTrackWidth; + fThumbWidth = nTrackWidth; + } + if (nThumbWidth < m_intThumbMinWidth) + { + nThumbWidth = m_intThumbMinWidth; + fThumbWidth = m_intThumbMinWidth; + } + + int nSpot = nClickPoint; + + int nPixelRange = (nTrackWidth - nThumbWidth); + if (moThumbMouseDown && nRealRange > 0) + { + if (nPixelRange > 0) + { + int nNewThumbLeft = x - (btnWidth + nSpot); + + if (nNewThumbLeft < 0) + { + moThumbLeft = nNewThumbLeft = 0; + } + else if (nNewThumbLeft > nPixelRange) + { + moThumbLeft = nNewThumbLeft = nPixelRange; + } + else + { + moThumbLeft = x - (btnWidth + nSpot); + } + + + float fPerc = (float)moThumbLeft / (float)nPixelRange; + float fValue = fPerc * (Maximum - (nNewThumbLeft == nPixelRange ? 0 : LargeChange)); + //float fValue = fPerc * (Maximum - LargeChange); + if (Math.Abs(moValue - fValue) < 1) + { + return; + } + moValue = (int)fValue; + Invalidate(); + + try + { + Application.DoEvents(); + } + catch { } + } + } + } + + /// + /// Handles the MouseMove event of the CustomScrollbar control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e) + { + if (!moThumbMouseDown) + return; + + if (moThumbMouseDown == true) + { + this.moThumbMouseDragging = true; + } + + if (this.moThumbMouseDragging) + { + MoveThumb(e.X); + } + + if (ValueChanged != null) + ValueChanged(this, new EventArgs()); + + if (Scroll != null) + Scroll(this, new EventArgs()); + } + #endregion + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + e.Graphics.SetGDIHigh(); + if (Maximum > 0) + { + //draw thumb + int nTrackWidth = (this.Width - btnWidth * 2); + //float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; + float fThumbWidth = nTrackWidth - Maximum; + int nThumbWidth = (int)fThumbWidth; + + if (nThumbWidth > nTrackWidth) + { + nThumbWidth = nTrackWidth; + fThumbWidth = nTrackWidth; + } + if (nThumbWidth < m_intThumbMinWidth) + { + nThumbWidth = m_intThumbMinWidth; + fThumbWidth = m_intThumbMinWidth; + } + int nLeft = moThumbLeft; + nLeft += btnWidth; + if (nLeft + nThumbWidth > this.Width - btnWidth) + nLeft = this.Width - btnWidth - nThumbWidth; + e.Graphics.FillPath(new SolidBrush(thumbColor), new Rectangle(nLeft, 1, nThumbWidth, this.Height - 3).CreateRoundedRectanglePath(this.ConerRadius)); + } + ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(btnWidth - Math.Min(5, this.Height / 2), this.Height / 2), Math.Min(5, this.Height / 2), GraphDirection.Leftward); + ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(this.Width - (btnWidth - Math.Min(5, this.Height / 2)), this.Height / 2), Math.Min(5, this.Height / 2), GraphDirection.Rightward); + + } + } + +} diff --git a/JinYuan.ControlLib/ScrollBar/UCVScrollbar.cs b/JinYuan.ControlLib/ScrollBar/UCVScrollbar.cs new file mode 100644 index 0000000..f3950c4 --- /dev/null +++ b/JinYuan.ControlLib/ScrollBar/UCVScrollbar.cs @@ -0,0 +1,539 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 2019-09-19 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(»ÆÕý»Ô) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub£ºhttps://github.com/kwwwvagaa/NetWinformControl +// gitee£ºhttps://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.ScrollBar +{ + + /// + /// Class UCVScrollbar. + /// Implements the + /// + /// + [Designer(typeof(ScrollbarControlDesigner))] + [DefaultEvent("Scroll")] + public class UCVScrollbar : UCControlBase + { + /// + /// The mo large change + /// + protected int moLargeChange = 10; + /// + /// The mo small change + /// + protected int moSmallChange = 5; + /// + /// The mo minimum + /// + protected int moMinimum = 0; + /// + /// The mo maximum + /// + protected int moMaximum = 100; + /// + /// The mo value + /// + protected int moValue = 0; + /// + /// The n click point + /// + private int nClickPoint; + /// + /// The mo thumb top + /// + protected int moThumbTop = 0; + /// + /// The mo automatic size + /// + protected bool moAutoSize = false; + /// + /// The mo thumb down + /// + private bool moThumbMouseDown = false; + /// + /// The mo thumb dragging + /// + private bool moThumbMouseDragging = false; + /// + /// Occurs when [scroll]. + /// + public new event EventHandler Scroll = null; + /// + /// Occurs when [value changed]. + /// + public event EventHandler ValueChanged = null; + + /// + /// The BTN height + /// + private int btnHeight = 18; + /// + /// The m int thumb minimum height + /// + private int m_intThumbMinHeight = 30; + + /// + /// Gets or sets the height of the BTN. + /// + /// The height of the BTN. + public int BtnHeight + { + get { return btnHeight; } + set { btnHeight = value; } + } + /// + /// Gets or sets the large change. + /// + /// The large change. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("×Զ¨Òå"), Description("LargeChange")] + public int LargeChange + { + get { return moLargeChange; } + set + { + moLargeChange = value; + Invalidate(); + } + } + + /// + /// Gets or sets the small change. + /// + /// The small change. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("×Զ¨Òå"), Description("SmallChange")] + public int SmallChange + { + get { return moSmallChange; } + set + { + moSmallChange = value; + Invalidate(); + } + } + + /// + /// Gets or sets the minimum. + /// + /// The minimum. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("×Զ¨Òå"), Description("Minimum")] + public int Minimum + { + get { return moMinimum; } + set + { + moMinimum = value; + Invalidate(); + } + } + + /// + /// Gets or sets the maximum. + /// + /// The maximum. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("×Զ¨Òå"), Description("Maximum")] + public int Maximum + { + get { return moMaximum; } + set + { + moMaximum = value; + Invalidate(); + } + } + + /// + /// Gets or sets the value. + /// + /// The value. + [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("×Զ¨Òå"), Description("Value")] + public int Value + { + get { return moValue; } + set + { + moValue = value; + + int nTrackHeight = (this.Height - btnHeight * 2); + //float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight; + float fThumbHeight = nTrackHeight - Maximum; + int nThumbHeight = (int)fThumbHeight; + + if (nThumbHeight > nTrackHeight) + { + nThumbHeight = nTrackHeight; + fThumbHeight = nTrackHeight; + } + if (nThumbHeight < m_intThumbMinHeight) + { + nThumbHeight = m_intThumbMinHeight; + fThumbHeight = m_intThumbMinHeight; + } + + //figure out value + int nPixelRange = nTrackHeight - nThumbHeight; + int nRealRange = (Maximum - Minimum) - LargeChange; + float fPerc = 0.0f; + if (nRealRange != 0) + { + fPerc = (float)moValue / (float)nRealRange; + + } + + float fTop = fPerc * nPixelRange; + moThumbTop = (int)fTop; + + + Invalidate(); + } + } + + /// + /// Gets or sets a value indicating whether [automatic size]. + /// + /// true if [automatic size]; otherwise, false. + public override bool AutoSize + { + get + { + return base.AutoSize; + } + set + { + base.AutoSize = value; + if (base.AutoSize) + { + this.Width = 15; + } + } + } + + /// + /// The thumb color + /// + private Color thumbColor = Color.FromArgb(1, 146, 235); + + /// + /// Gets or sets the color of the thumb. + /// + /// The color of the thumb. + public Color ThumbColor + { + get { return thumbColor; } + set { thumbColor = value; } + } + + /// + /// Initializes a new instance of the class. + /// + public UCVScrollbar() + { + InitializeComponent(); + ConerRadius = 2; + FillColor = Color.FromArgb(6, 30, 78); + IsShowRect = false; + IsRadius = true; + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + } + + + #region ¾²ֹÉÁ˸ + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x0014) // ½ûµôÇå³ý±³¾°ÏûϢ + return; + base.WndProc(ref m); + } + #endregion + + /// + /// Initializes the component. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UCVScrollbar + // + this.MinimumSize = new System.Drawing.Size(10, 0); + this.Name = "UCVScrollbar"; + this.Size = new System.Drawing.Size(18, 150); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseMove); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseUp); + this.ResumeLayout(false); + + } + + + /// + /// Òý·¢ ʼþ¡£ + /// + /// °üº¬Ê¼þÊý¾ݵÄ ¡£ + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + e.Graphics.SetGDIHigh(); + if (Maximum > 0) + { + //draw thumb + int nTrackHeight = (this.Height - btnHeight * 2); + //float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight; + float fThumbHeight = nTrackHeight - Maximum; + int nThumbHeight = (int)fThumbHeight; + + if (nThumbHeight > nTrackHeight) + { + nThumbHeight = nTrackHeight; + fThumbHeight = nTrackHeight; + } + if (nThumbHeight < m_intThumbMinHeight) + { + nThumbHeight = m_intThumbMinHeight; + fThumbHeight = m_intThumbMinHeight; + } + int nTop = moThumbTop; + nTop += btnHeight; + if (nTop + nThumbHeight > this.Height - btnHeight) + nTop = this.Height - btnHeight - nThumbHeight; + e.Graphics.FillPath(new SolidBrush(thumbColor), new Rectangle(1, nTop, this.Width - 3, nThumbHeight).CreateRoundedRectanglePath(this.ConerRadius)); + } + ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(this.Width / 2, btnHeight - Math.Min(5, this.Width / 2)), Math.Min(5, this.Width / 2), GraphDirection.Upward); + ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(this.Width / 2, this.Height - (btnHeight - Math.Min(5, this.Width / 2))), Math.Min(5, this.Width / 2), GraphDirection.Downward); + + } + + /// + /// Handles the MouseDown event of the CustomScrollbar control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e) + { + if (Maximum <= 0) + return; + Point ptPoint = this.PointToClient(Cursor.Position); + int nTrackHeight = (this.Height - btnHeight * 2); + //float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight; + float fThumbHeight = nTrackHeight - Maximum; + int nThumbHeight = (int)fThumbHeight; + + if (nThumbHeight > nTrackHeight) + { + nThumbHeight = nTrackHeight; + fThumbHeight = nTrackHeight; + } + if (nThumbHeight < m_intThumbMinHeight) + { + nThumbHeight = m_intThumbMinHeight; + fThumbHeight = m_intThumbMinHeight; + } + + int nTop = moThumbTop; + nTop += btnHeight; + + + Rectangle thumbrect = new Rectangle(new Point(1, nTop), new Size(this.Width - 2, nThumbHeight)); + if (thumbrect.Contains(ptPoint)) + { + + //hit the thumb + nClickPoint = (ptPoint.Y - nTop); + //MessageBox.Show(Convert.ToString((ptPoint.Y - nTop))); + this.moThumbMouseDown = true; + } + else + { + Rectangle uparrowrect = new Rectangle(new Point(1, 0), new Size(this.Width, btnHeight)); + if (uparrowrect.Contains(ptPoint)) + { + + int nRealRange = (Maximum - Minimum) - LargeChange; + int nPixelRange = (nTrackHeight - nThumbHeight); + if (nRealRange > 0) + { + if (nPixelRange > 0) + { + if ((moThumbTop - SmallChange) < 0) + moThumbTop = 0; + else + moThumbTop -= SmallChange; + + //figure out value + float fPerc = (float)moThumbTop / (float)nPixelRange; + float fValue = fPerc * (Maximum - LargeChange); + + moValue = (int)fValue; + + if (ValueChanged != null) + ValueChanged(this, new EventArgs()); + + if (Scroll != null) + Scroll(this, new EventArgs()); + + Invalidate(); + } + } + } + else + { + Rectangle downarrowrect = new Rectangle(new Point(1, btnHeight + nTrackHeight), new Size(this.Width, btnHeight)); + if (downarrowrect.Contains(ptPoint)) + { + int nRealRange = (Maximum - Minimum) - LargeChange; + int nPixelRange = (nTrackHeight - nThumbHeight); + if (nRealRange > 0) + { + if (nPixelRange > 0) + { + if ((moThumbTop + SmallChange) > nPixelRange) + moThumbTop = nPixelRange; + else + moThumbTop += SmallChange; + + //figure out value + float fPerc = (float)moThumbTop / (float)nPixelRange; + float fValue = fPerc * (Maximum - LargeChange); + + moValue = (int)fValue; + + if (ValueChanged != null) + ValueChanged(this, new EventArgs()); + + if (Scroll != null) + Scroll(this, new EventArgs()); + + Invalidate(); + } + } + } + } + } + + } + + /// + /// Handles the MouseUp event of the CustomScrollbar control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e) + { + this.moThumbMouseDown = false; + this.moThumbMouseDragging = false; + } + + /// + /// Moves the thumb. + /// + /// The y. + private void MoveThumb(int y) + { + int nRealRange = Maximum - Minimum; + int nTrackHeight = (this.Height - btnHeight * 2); + //float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight; + float fThumbHeight = nTrackHeight - Maximum; + int nThumbHeight = (int)fThumbHeight; + + if (nThumbHeight > nTrackHeight) + { + nThumbHeight = nTrackHeight; + fThumbHeight = nTrackHeight; + } + if (nThumbHeight < m_intThumbMinHeight) + { + nThumbHeight = m_intThumbMinHeight; + fThumbHeight = m_intThumbMinHeight; + } + + int nSpot = nClickPoint; + + int nPixelRange = (nTrackHeight - nThumbHeight); + if (moThumbMouseDown && nRealRange > 0) + { + if (nPixelRange > 0) + { + int nNewThumbTop = y - (btnHeight + nSpot); + + if (nNewThumbTop < 0) + { + moThumbTop = nNewThumbTop = 0; + } + else if (nNewThumbTop > nPixelRange) + { + moThumbTop = nNewThumbTop = nPixelRange; + } + else + { + moThumbTop = y - (btnHeight + nSpot); + } + + + float fPerc = (float)moThumbTop / (float)nPixelRange; + float fValue = fPerc * (Maximum - (nNewThumbTop == nPixelRange ? 0 : LargeChange)); + if (Math.Abs(moValue - fValue) < 1) + { + return; + } + moValue = (int)fValue; + Invalidate(); + + try + { + Application.DoEvents(); + } + catch { } + } + } + } + + /// + /// Handles the MouseMove event of the CustomScrollbar control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e) + { + if (!moThumbMouseDown) + return; + + if (moThumbMouseDown == true) + { + this.moThumbMouseDragging = true; + } + + if (this.moThumbMouseDragging) + { + MoveThumb(e.Y); + } + + if (ValueChanged != null) + ValueChanged(this, new EventArgs()); + + if (Scroll != null) + Scroll(this, new EventArgs()); + } + + } +} \ No newline at end of file diff --git a/JinYuan.ControlLib/ScrollBar/UCVScrollbar.resx b/JinYuan.ControlLib/ScrollBar/UCVScrollbar.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/JinYuan.ControlLib/ScrollBar/UCVScrollbar.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/SidebarNavigation.Designer.cs b/JinYuan.ControlLib/SidebarNavigation.Designer.cs new file mode 100644 index 0000000..55fe051 --- /dev/null +++ b/JinYuan.ControlLib/SidebarNavigation.Designer.cs @@ -0,0 +1,48 @@ +namespace JinYuan.ControlLib +{ + partial class SidebarNavigation + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + + if (disposing&& (components != null)) + { + toolTip.Dispose(); + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // SidebarNavigation + // + this.Name = "SidebarNavigation"; + this.Size = new System.Drawing.Size(51, 823); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/SidebarNavigation.cs b/JinYuan.ControlLib/SidebarNavigation.cs new file mode 100644 index 0000000..bada6f2 --- /dev/null +++ b/JinYuan.ControlLib/SidebarNavigation.cs @@ -0,0 +1,1133 @@ +using AntdUI; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using System.Xml.Linq; + +namespace JinYuan.ControlLib +{ + + public enum NavigationItemType + { + Normal, // 普通项 + Settings, // 设置项 + UserManagement // 用户管理项 + } + + public enum Position + { + Top, + Bottom + } + + public class SidebarNavigationItem + { + public string Text { get; set; } + public string Tag { get; set; } + public string IconSvg { get; set; } + public Func CreatePageControl { get; set; } + public NavigationItemType ItemType { get; set; } = NavigationItemType.Normal; + public Position Position { get; set; } = Position.Top; + public bool IsSettings { get; set; } + } + + public partial class SidebarNavigation : UserControl + { + private List items = new List(); + private Dictionary buttonCache = new Dictionary(); + private Color lightBackgroundColor = Color.FromArgb(240, 240, 240); + private Color darkBackgroundColor = Color.FromArgb(33, 33, 33); + private Color lightSelectedColor = Color.FromArgb(0, 122, 204); + private Color darkSelectedColor = Color.FromArgb(0, 122, 204); + private AntdUI.Button selectedButton; + private bool isReordering = false; + private Font buttonFont = new Font("Microsoft YaHei UI", 10F); + private ToolTip toolTip = new ToolTip(); // 添加 ToolTip 控件 + + public Size IconSize { get; set; } = new Size(42, 42); + public event EventHandler ItemSelected; + + public class ButtonInfo + { + public SidebarNavigationItem Item { get; set; } + public AntdUI.Button Button { get; set; } + } + + private bool showText = false; + public bool ShowText + { + get => showText; + set + { + if (showText != value) + { + showText = value; + UpdateButtonsLayout(); + } + } + } + + public SidebarNavigation() + { + InitializeComponent(); + + SetStyle(ControlStyles.OptimizedDoubleBuffer | + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint, true); + + this.BackColor = AntdUI.Config.IsDark ? darkBackgroundColor : lightBackgroundColor; + this.Width = 50; + this.Padding = new Padding(0); + this.Margin = new Padding(0); + this.AutoScroll = false; + + // 配置 ToolTip + toolTip.AutoPopDelay = 5000; + toolTip.InitialDelay = 500; + toolTip.ReshowDelay = 500; + toolTip.ShowAlways = true; + } + + public void UpdateVisibility(Func visibilityPredicate) + { + this.SuspendLayout(); + try + { + // 保存当前选中按钮的Tag + string selectedTag = null; + if (selectedButton?.Tag is ButtonInfo selectedInfo) + { + selectedTag = selectedInfo.Item.Tag; + } + + // 缓存现有按钮的状态 + foreach (Control control in this.Controls) + { + if (control is AntdUI.Button button && button.Tag is ButtonInfo info) + { + buttonCache[info.Item.Tag] = info; + } + } + + // 清除现有控件 + this.Controls.Clear(); + + // 重新添加符合条件的按钮 + var topButtons = items.Where(i => i.Position == Position.Top && visibilityPredicate(i)) + .OrderBy(i => items.IndexOf(i)); + + var bottomButtons = items.Where(i => i.Position == Position.Bottom && visibilityPredicate(i)) + .OrderBy(i => items.IndexOf(i)); + + // 添加顶部按钮 + foreach (var item in topButtons.Reverse()) + { + CreateOrRestoreButton(item); + } + + // 添加底部按钮 + foreach (var item in bottomButtons) + { + CreateOrRestoreButton(item); + } + + // 恢复选中状态 + if (selectedTag != null) + { + foreach (Control control in this.Controls) + { + if (control is AntdUI.Button button && + button.Tag is ButtonInfo info && + info.Item.Tag == selectedTag) + { + SetSelectedButton(button); + break; + } + } + } + } + finally + { + this.ResumeLayout(); + } + } + + private void CreateOrRestoreButton(SidebarNavigationItem item) + { + if (buttonCache.TryGetValue(item.Tag, out ButtonInfo cachedInfo)) + { + AntdUI.Button btn = new AntdUI.Button + { + Text = showText ? item.Text : "", + TextMultiLine = true, + AutoEllipsis = true, + BackColor = cachedInfo.Button.BackColor, + ForeColor = AntdUI.Config.IsDark ? Color.White : Color.Black, + Width = this.Width, + Height = this.Width + 5, + Dock = item.Position == Position.Bottom ? DockStyle.Bottom : DockStyle.Top, + Font = buttonFont, + IconPosition = TAlignMini.Top, + Radius = 3, + BorderWidth = 1, + WaveSize = 1, + IconSvg = item.IconSvg, + IconRatio = 0.8f, + Margin = new Padding(0), + Padding = new Padding(0), + RespondRealAreas = true, + Type = cachedInfo.Button.Type, + Ghost = false + }; + + // 设置工具提示 + toolTip.SetToolTip(btn, item.Text); + + btn.Click += NavigationButton_Click; + + var buttonInfo = new ButtonInfo + { + Item = item, + Button = btn + }; + btn.Tag = buttonInfo; + + this.Controls.Add(btn); + } + else + { + CreateNavigationButton(item); + } + } + + private void CreateNavigationButton(SidebarNavigationItem item) + { + AntdUI.Button btn = new AntdUI.Button + { + Text = showText ? item.Text : "", + TextMultiLine = true, + AutoEllipsis = true, + BackColor = Color.Transparent, + ForeColor = AntdUI.Config.IsDark ? Color.White : Color.Black, + Width = this.Width, + Height = this.Width + 5, + Dock = item.Position == Position.Bottom ? DockStyle.Bottom : DockStyle.Top, + Font = buttonFont, + IconPosition = TAlignMini.Top, + Radius = 3, + BorderWidth = 1, + WaveSize = 1, + IconSvg = item.IconSvg, + IconRatio = 0.8f, + Margin = new Padding(0), + Padding = new Padding(0), + RespondRealAreas = true, + Type = TTypeMini.Primary, + Ghost = false + }; + + // 设置工具提示 + toolTip.SetToolTip(btn, item.Text); + + btn.Click += NavigationButton_Click; + + var buttonInfo = new ButtonInfo + { + Item = item, + Button = btn + }; + btn.Tag = buttonInfo; + + this.Controls.Add(btn); + + if (selectedButton != null && + selectedButton.Tag is ButtonInfo selectedInfo && + selectedInfo.Item.Tag == item.Tag) + { + SetSelectedButton(btn); + } + } + + private void UpdateButtonsLayout() + { + this.SuspendLayout(); + foreach (Control control in this.Controls) + { + if (control is AntdUI.Button button) + { + button.Height = this.Width; + if (button.Tag is ButtonInfo buttonInfo) + { + button.Text = showText ? buttonInfo.Item.Text : ""; + } + } + } + this.PerformLayout(); + this.ResumeLayout(); + } + + private void SetSelectedButton(AntdUI.Button button) + { + if (selectedButton != null) + { + selectedButton.BackColor = Color.Transparent; + selectedButton.Type = TTypeMini.Default; + selectedButton.Invalidate(); + } + selectedButton = button; + if (button != null) + { + button.BackColor = AntdUI.Config.IsDark ? darkSelectedColor : lightSelectedColor; + button.Type = TTypeMini.Primary; + button.Invalidate(); + } + } + + public void UpdateTheme(bool isDark) + { + this.SuspendLayout(); + this.BackColor = isDark ? darkBackgroundColor : lightBackgroundColor; + + foreach (Control control in this.Controls) + { + if (control is AntdUI.Button button) + { + if (button == selectedButton) + { + button.BackColor = isDark ? darkSelectedColor : lightSelectedColor; + button.Type = TTypeMini.Primary; + } + else + { + button.BackColor = Color.Transparent; + button.Type = TTypeMini.Default; + } + button.ForeColor = isDark ? Color.White : Color.Black; + } + } + + this.ResumeLayout(); + } + + public void AddItem(SidebarNavigationItem item) + { + this.SuspendLayout(); + items.Add(item); + CreateNavigationButton(item); + ReorderButtons(); + this.ResumeLayout(); + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + foreach (Control control in this.Controls) + { + if (control is AntdUI.Button button) + { + button.Width = this.Width; + button.Height = this.Width; + } + } + } + + private void ReorderButtons() + { + if (isReordering) return; + + try + { + isReordering = true; + this.SuspendLayout(); + + var visibleTopItems = items.Where(i => i.Position == Position.Top && + this.Controls.Cast() + .Any(c => c is AntdUI.Button b && + b.Tag is ButtonInfo bi && + bi.Item == i)) + .OrderBy(i => items.IndexOf(i)); + + var visibleBottomItems = items.Where(i => i.Position == Position.Bottom && + this.Controls.Cast() + .Any(c => c is AntdUI.Button b && + b.Tag is ButtonInfo bi && + bi.Item == i)) + .OrderBy(i => items.IndexOf(i)); + + this.Controls.Clear(); + + foreach (var item in visibleTopItems.Reverse()) + { + CreateOrRestoreButton(item); + } + + foreach (var item in visibleBottomItems) + { + CreateOrRestoreButton(item); + } + } + finally + { + this.ResumeLayout(); + isReordering = false; + } + } + + private string ResizeSvgIcon(string svgContent, Size targetSize) + { + try + { + XDocument doc = XDocument.Parse(svgContent); + XElement svg = doc.Root; + + if (svg.Attribute("width") != null && svg.Attribute("height") != null) + { + svg.SetAttributeValue("width", targetSize.Width); + svg.SetAttributeValue("height", targetSize.Height); + } + + if (svg.Attribute("viewBox") == null) + { + svg.SetAttributeValue("viewBox", $"0 0 {targetSize.Width} {targetSize.Height}"); + } + + return doc.ToString(); + } + catch (Exception) + { + return svgContent; + } + } + + private void NavigationButton_Click(object sender, EventArgs e) + { + if (sender is AntdUI.Button clickedButton && clickedButton.Tag is ButtonInfo info) + { + SetSelectedButton(clickedButton); + ItemSelected?.Invoke(this, info.Item); + } + } + + public void UpdateButtonText(string tag, string text) + { + foreach (Control control in this.Controls) + { + if (control is AntdUI.Button button && + button.Tag is ButtonInfo buttonInfo && + buttonInfo.Item.Tag == tag) + { + buttonInfo.Item.Text = text; + button.Text = showText ? text : ""; + toolTip.SetToolTip(button, text); // 更新工具提示 + break; + } + } + } + + public void ClearItems() + { + this.SuspendLayout(); + try + { + items.Clear(); + buttonCache.Clear(); // 清除按钮缓存 + this.Controls.Clear(); + selectedButton = null; + } + finally + { + this.ResumeLayout(); + } + this.Invalidate(); + } + + public IEnumerable GetItems() + { + return items; + } + + + } + //// 1. 首先定义导航项类型的枚举 + //public enum NavigationItemType + //{ + // Normal, // 普通项 + // Settings, // 设置项 + // UserManagement // 用户管理项 + //} + + //public enum Position + //{ + // Top, + // Bottom + //} + + //public class SidebarNavigationItem + //{ + // public string Text { get; set; } + // public string Tag { get; set; } + // public string IconSvg { get; set; } + // public Func CreatePageControl { get; set; } + // public NavigationItemType ItemType { get; set; } = NavigationItemType.Normal; // 默认为普通项 + // public Position Position { get; set; } = Position.Top; + + // public bool IsSettings { get; set; } // 保留原有属性以保持兼容性 + + //} + + //public partial class SidebarNavigation : UserControl + //{ + // private List items = new List(); + // private Color lightBackgroundColor = Color.FromArgb(240, 240, 240); + // private Color darkBackgroundColor = Color.FromArgb(33, 33, 33); + // private Color lightSelectedColor = Color.FromArgb(0, 122, 204); + // private Color darkSelectedColor = Color.FromArgb(0, 122, 204); + // private AntdUI.Button selectedButton; + // private bool isReordering = false; + // private Font buttonFont = new Font("Microsoft YaHei UI", 10F); + + // public Size IconSize { get; set; } = new Size(42,42); + + // public event EventHandler ItemSelected; + + // public class ButtonInfo + // { + // public SidebarNavigationItem Item { get; set; } + // public AntdUI.Button Button { get; set; } + // } + + // private bool showText = false; + // public bool ShowText + // { + // get => showText; + // set + // { + // if (showText != value) + // { + // showText = value; + // UpdateButtonsLayout(); + // } + // } + // } + + // public SidebarNavigation() + // { + // InitializeComponent(); + + // SetStyle(ControlStyles.OptimizedDoubleBuffer | + // ControlStyles.AllPaintingInWmPaint | + // ControlStyles.UserPaint, true); + + // this.BackColor = AntdUI.Config.IsDark ? darkBackgroundColor : lightBackgroundColor; + // this.Width = 50; + // this.Padding = new Padding(0);// 移除控件的内边距 + // this.Margin = new Padding(0);// 移除控件的外边距 + // this.AutoScroll = false;// 禁用自动滚动以避免出现滚动条 + // } + + // public void UpdateVisibility(Func visibilityPredicate) + // { + // this.SuspendLayout(); + // try + // { + // // 先从 Controls 集合中移除所有按钮 + // this.Controls.Clear(); + + // // 重新添加符合条件的按钮 + // var topButtons = items.Where(i => i.Position == Position.Top && visibilityPredicate(i)) + // .OrderBy(i => items.IndexOf(i)); + + // var bottomButtons = items.Where(i => i.Position == Position.Bottom && visibilityPredicate(i)) + // .OrderBy(i => items.IndexOf(i)); + + // // 添加顶部按钮 + // foreach (var item in topButtons.Reverse()) + // { + // CreateNavigationButton(item); + // } + + // // 添加底部按钮 + // foreach (var item in bottomButtons) + // { + // CreateNavigationButton(item); + // } + // } + // finally + // { + // this.ResumeLayout(); + // } + // } + + + // private void CreateNavigationButton(SidebarNavigationItem item) + // { + // AntdUI.Button btn = new AntdUI.Button + // { + // Text = showText ? item.Text : "", + // // 启用多行文本 + // TextMultiLine = true, + // // 允许文本超出时自动处理 + // AutoEllipsis = true, + // BackColor = Color.Transparent, + // ForeColor = AntdUI.Config.IsDark ? Color.White : Color.Black, + // Width = this.Width, + // Height = this.Width + 5, + // Dock = item.Position == Position.Bottom ? DockStyle.Bottom : DockStyle.Top, + // Font = buttonFont, + // IconPosition = TAlignMini.Top, + // Radius = 3, + // BorderWidth = 1, + // WaveSize = 1, + // IconSvg = item.IconSvg, + // // Increase icon ratio to make icons larger relative to button size + // IconRatio = 0.8f, + // Margin = new Padding(0), + // Padding = new Padding(0), + // RespondRealAreas = true, + // Type = TTypeMini.Primary, + // Ghost = false + // }; + + // btn.Click += NavigationButton_Click; + + // var buttonInfo = new ButtonInfo + // { + // Item = item, + // Button = btn + // }; + // btn.Tag = buttonInfo; + + // this.Controls.Add(btn); + + // // 如果是当前选中的按钮,恢复选中状态 + // if (selectedButton != null && + // selectedButton.Tag is ButtonInfo selectedInfo && + // selectedInfo.Item.Tag == item.Tag) + // { + // SetSelectedButton(btn); + // } + // } + + // private void UpdateButtonsLayout() + // { + // this.SuspendLayout(); + // foreach (Control control in this.Controls) + // { + // if (control is AntdUI.Button button) + // { + // button.Height = this.Width; + // if (button.Tag is ButtonInfo buttonInfo) + // { + // button.Text = showText ? buttonInfo.Item.Text : ""; + // } + // } + // } + // this.PerformLayout(); + // this.ResumeLayout(); + // } + + // private void SetSelectedButton(AntdUI.Button button) + // { + // if (selectedButton != null) + // { + // selectedButton.BackColor = Color.Transparent; + // selectedButton.Type = TTypeMini.Default; + // selectedButton.Invalidate(); + // } + // selectedButton = button; + // if (button != null) + // { + // button.BackColor = AntdUI.Config.IsDark ? darkSelectedColor : lightSelectedColor; + // button.Type = TTypeMini.Primary; + // button.Invalidate(); + // } + // } + + + + // public void UpdateTheme(bool isDark) + // { + // this.SuspendLayout(); + // this.BackColor = isDark ? darkBackgroundColor : lightBackgroundColor; + + // foreach (Control control in this.Controls) + // { + // if (control is AntdUI.Button button) + // { + // if (button == selectedButton) + // { + // button.BackColor = isDark ? darkSelectedColor : lightSelectedColor; + // button.Type = TTypeMini.Primary; + // } + // else + // { + // button.BackColor = Color.Transparent; + // button.Type = TTypeMini.Default; + // } + // button.ForeColor = isDark ? Color.White : Color.Black; + // } + // } + + // this.ResumeLayout(); + // } + + + + // public void AddItem(SidebarNavigationItem item) + // { + // this.SuspendLayout(); + // items.Add(item); + // CreateNavigationButton(item); + // ReorderButtons(); + // this.ResumeLayout(); + // } + + + // protected override void OnResize(EventArgs e) + // { + // base.OnResize(e); + // foreach (Control control in this.Controls) + // { + // if (control is AntdUI.Button button) + // { + // button.Width = this.Width; + // button.Height = this.Width; + // } + // } + // } + + // private void ReorderButtons() + // { + // if (isReordering) return; + + // try + // { + // isReordering = true; + // this.SuspendLayout(); + + // // 获取当前所有可见的按钮 + // var visibleTopItems = items.Where(i => i.Position == Position.Top && + // this.Controls.Cast() + // .Any(c => c is AntdUI.Button b && + // b.Tag is ButtonInfo bi && + // bi.Item == i)) + // .OrderBy(i => items.IndexOf(i)); + + // var visibleBottomItems = items.Where(i => i.Position == Position.Bottom && + // this.Controls.Cast() + // .Any(c => c is AntdUI.Button b && + // b.Tag is ButtonInfo bi && + // bi.Item == i)) + // .OrderBy(i => items.IndexOf(i)); + + // this.Controls.Clear(); + + // // 重新添加顶部按钮 + // foreach (var item in visibleTopItems.Reverse()) + // { + // CreateNavigationButton(item); + // } + + // // 重新添加底部按钮 + // foreach (var item in visibleBottomItems) + // { + // CreateNavigationButton(item); + // } + // } + // finally + // { + // this.ResumeLayout(); + // isReordering = false; + // } + // } + + // private string ResizeSvgIcon(string svgContent, Size targetSize) + // { + // try + // { + // XDocument doc = XDocument.Parse(svgContent); + // XElement svg = doc.Root; + + // if (svg.Attribute("width") != null && svg.Attribute("height") != null) + // { + // svg.SetAttributeValue("width", targetSize.Width); + // svg.SetAttributeValue("height", targetSize.Height); + // } + + // if (svg.Attribute("viewBox") == null) + // { + // svg.SetAttributeValue("viewBox", $"0 0 {targetSize.Width} {targetSize.Height}"); + // } + + // return doc.ToString(); + // } + // catch (Exception) + // { + // return svgContent; + // } + // } + + // private void NavigationButton_Click(object sender, EventArgs e) + // { + // if (sender is AntdUI.Button clickedButton && clickedButton.Tag is ButtonInfo info) + // { + // SetSelectedButton(clickedButton); + // ItemSelected?.Invoke(this, info.Item); + // } + // } + + // // 更新按钮文本的方法 + // public void UpdateButtonText(string tag, string text) + // { + // foreach (Control control in this.Controls) + // { + // if (control is AntdUI.Button button && + // button.Tag is ButtonInfo buttonInfo && + // buttonInfo.Item.Tag == tag) + // { + // buttonInfo.Item.Text = text; + // button.Text = showText ? text : ""; + // break; + // } + // } + // } + + + + + // public void ClearItems() + // { + // this.SuspendLayout(); + // try + // { + // items.Clear(); + // this.Controls.Clear(); + // selectedButton = null; + // } + // finally + // { + // this.ResumeLayout(); + // } + // this.Invalidate(); + // } + + // public IEnumerable GetItems() + // { + // return items; + // } + + + + //} +} + +#region 最早期的 +//public enum Position +//{ +// Top, +// Bottom +//} + +//public class SidebarNavigationItem +//{ +// public string Text { get; set; } +// public string Tag { get; set; } +// public string IconSvg { get; set; } +// public Func CreatePageControl { get; set; } +// public bool IsSettings { get; set; } +// public Position Position { get; set; } = Position.Top; +//} + +//public partial class SidebarNavigation : UserControl +//{ +// private List items = new List(); +// private Color lightBackgroundColor = Color.FromArgb(240, 240, 240); +// private Color darkBackgroundColor = Color.FromArgb(33, 33, 33); +// private Color lightSelectedColor = Color.FromArgb(0, 150, 136); +// private Color darkSelectedColor = Color.FromArgb(0, 200, 186); +// private int buttonHeight = 40; +// private AntdUI.Button selectedButton; +// private ToolTip toolTip; +// private bool isReordering = false; + +// public Size IconSize { get; set; } = new Size(200, 200); + +// public event EventHandler ItemSelected; + +// public SidebarNavigation() +// { +// InitializeComponent(); + +// SetStyle(ControlStyles.OptimizedDoubleBuffer | +// ControlStyles.AllPaintingInWmPaint | +// ControlStyles.UserPaint, true); + +// this.BackColor = AntdUI.Config.IsDark ? darkBackgroundColor : lightBackgroundColor; +// this.Width = 50; +// this.AutoScroll = true; + +// toolTip = new ToolTip +// { +// AutoPopDelay = 5000, +// InitialDelay = 500, +// ReshowDelay = 500, +// ShowAlways = true +// }; +// } + +// public void AddItem(SidebarNavigationItem item) +// { +// this.SuspendLayout(); +// items.Add(item); +// CreateNavigationButton(item); +// ReorderButtons(); +// this.ResumeLayout(); +// } + +// public void ClearItems() +// { +// this.SuspendLayout(); +// try +// { +// items.Clear(); +// for (int i = this.Controls.Count - 1; i >= 0; i--) +// { +// if (this.Controls[i] is AntdUI.Button button) +// { +// button.Click -= NavigationButton_Click; +// this.Controls.RemoveAt(i); +// button.Dispose(); +// } +// } +// selectedButton = null; +// ReorderButtons(); +// } +// finally +// { +// this.ResumeLayout(); +// } +// this.Invalidate(); +// } + +// private void CreateNavigationButton(SidebarNavigationItem item) +// { +// string resizedSvg = ResizeSvgIcon(item.IconSvg, IconSize); + +// AntdUI.Button btn = new AntdUI.Button +// { +// Text = "", +// Tag = item, +// Dock = item.Position == Position.Bottom ? DockStyle.Bottom : DockStyle.Top, +// Height = buttonHeight, +// IconSvg = resizedSvg, +// BackColor = this.BackColor, +// ForeColor = AntdUI.Config.IsDark ? Color.White : Color.Black, +// Radius = 0, +// BorderWidth = 0 +// }; +// btn.Click += NavigationButton_Click; + +// toolTip.SetToolTip(btn, item.Text); + +// this.Controls.Add(btn); +// } + +// private string ResizeSvgIcon(string svgContent, Size targetSize) +// { +// try +// { +// XDocument doc = XDocument.Parse(svgContent); +// XElement svg = doc.Root; + +// if (svg.Attribute("width") != null && svg.Attribute("height") != null) +// { +// svg.SetAttributeValue("width", targetSize.Width); +// svg.SetAttributeValue("height", targetSize.Height); +// } + +// if (svg.Attribute("viewBox") == null) +// { +// svg.SetAttributeValue("viewBox", $"0 0 {targetSize.Width} {targetSize.Height}"); +// } + +// return doc.ToString(); +// } +// catch (Exception) +// { +// return svgContent; +// } +// } + + +// /// +// /// 图标按钮排序 +// /// +// private void ReorderButtons() +// { +// if (isReordering) return; + +// try +// { +// isReordering = true; +// this.SuspendLayout(); + +// var buttonDict = this.Controls.OfType() +// .Where(b => b.Tag is SidebarNavigationItem) +// .ToDictionary(b => ((SidebarNavigationItem)b.Tag).Tag); + +// this.Controls.Clear(); + +// // 分别获取顶部和底部的项目 +// var topItems = items.Where(i => i.Position == Position.Top) +// .OrderBy(i => items.IndexOf(i)); +// var bottomItems = items.Where(i => i.Position == Position.Bottom) +// .OrderBy(i => items.IndexOf(i)); + +// // 添加顶部按钮(反序添加以保证正确顺序) +// foreach (var item in topItems.Reverse()) +// { +// if (buttonDict.TryGetValue(item.Tag, out var button)) +// { +// button.Dock = DockStyle.Top; +// this.Controls.Add(button); +// } +// } + +// // 添加底部按钮(正序添加以保证正确顺序) +// foreach (var item in bottomItems) +// { +// if (buttonDict.TryGetValue(item.Tag, out var button)) +// { +// button.Dock = DockStyle.Bottom; +// this.Controls.Add(button); +// } +// } +// } +// finally +// { +// this.ResumeLayout(); +// isReordering = false; +// } +// } + + +// public void UpdateIconSize(Size newSize) +// { +// this.IconSize = newSize; +// foreach (Control control in this.Controls) +// { +// if (control is AntdUI.Button button && button.Tag is SidebarNavigationItem item) +// { +// string resizedSvg = ResizeSvgIcon(item.IconSvg, newSize); +// button.IconSvg = resizedSvg; +// } +// } +// this.Invalidate(); +// } + +// private void NavigationButton_Click(object sender, EventArgs e) +// { +// if (sender is AntdUI.Button clickedButton && clickedButton.Tag is SidebarNavigationItem item) +// { +// SetSelectedButton(clickedButton); +// ItemSelected?.Invoke(this, item); +// } +// } + +// private void SetSelectedButton(AntdUI.Button button) +// { +// if (selectedButton != null) +// { +// selectedButton.BackColor = this.BackColor; +// } +// selectedButton = button; +// selectedButton.BackColor = AntdUI.Config.IsDark ? darkSelectedColor : lightSelectedColor; +// } + +// public void UpdateTheme(bool isDark) +// { +// this.SuspendLayout(); +// this.BackColor = isDark ? darkBackgroundColor : lightBackgroundColor; +// foreach (Control control in this.Controls) +// { +// if (control is AntdUI.Button button) +// { +// button.BackColor = this.BackColor; +// button.ForeColor = isDark ? Color.White : Color.Black; +// } +// } +// if (selectedButton != null) +// { +// selectedButton.BackColor = isDark ? darkSelectedColor : lightSelectedColor; +// } +// toolTip.BackColor = isDark ? Color.FromArgb(64, 64, 64) : Color.White; +// toolTip.ForeColor = isDark ? Color.White : Color.Black; +// this.ResumeLayout(); +// } + +// public void UpdateItemToolTip(AntdUI.Button button, string translatedText) +// { +// if (button.InvokeRequired) +// { +// button.Invoke(new Action(() => toolTip.SetToolTip(button, translatedText))); +// } +// else +// { +// toolTip.SetToolTip(button, translatedText); +// } +// } + +// protected override void OnControlAdded(ControlEventArgs e) +// { +// base.OnControlAdded(e); +// ReorderButtons(); +// } + +// protected override void OnResize(EventArgs e) +// { +// base.OnResize(e); +// this.SuspendLayout(); +// foreach (Control control in this.Controls) +// { +// if (control is AntdUI.Button button) +// { +// button.Width = this.Width; +// } +// } +// this.ResumeLayout(); +// } + +// public void SelectFirstItem() +// { +// if (this.Controls.Count > 0 && this.Controls[0] is AntdUI.Button firstButton) +// { +// SetSelectedButton(firstButton); +// if (firstButton.Tag is SidebarNavigationItem item) +// { +// ItemSelected?.Invoke(this, item); +// } +// } +// } + +// public IEnumerable GetItems() +// { +// return items; +// } + +// public void UpdateVisibility(Func visibilityPredicate) +// { +// this.SuspendLayout(); +// foreach (Control control in this.Controls) +// { +// if (control is AntdUI.Button button && button.Tag is SidebarNavigationItem item) +// { +// button.Visible = visibilityPredicate(item); +// } +// } +// this.ResumeLayout(); +// } +//} +#endregion + diff --git a/JinYuan.ControlLib/SidebarNavigation.resx b/JinYuan.ControlLib/SidebarNavigation.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/SidebarNavigation.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/SimpleLed.Designer.cs b/JinYuan.ControlLib/SimpleLed.Designer.cs new file mode 100644 index 0000000..e3a4464 --- /dev/null +++ b/JinYuan.ControlLib/SimpleLed.Designer.cs @@ -0,0 +1,50 @@ +namespace JinYuan.ControlLib +{ + partial class SimpleLed + { + /// + /// ±ØÐèµÄÉè¼ÆÆ÷±äÁ¿¡£ + /// + private System.ComponentModel.IContainer components = null; + + /// + /// ÇåÀíËùÓÐÕýÔÚʹÓõÄ×ÊԴ¡£ + /// + /// Èç¹ûӦÊͷÅÍйÜ×ÊԴ£¬Ϊ true£»·ñÔòΪ false¡£ + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region ×é¼þÉè¼ÆÆ÷Éú³ɵĴúÂë + + /// + /// Éè¼ÆÆ÷֧³ÖËùÐèµķ½·¨ - ²»ҪÐ޸Ä + /// ʹÓôúÂë±༭Æ÷Ð޸Ĵ˷½·¨µÄÄÚÈݡ£ + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // SimpleLed + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.Green; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("΢ÈíÑźÚ", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.Name = "SimpleLed"; + this.Size = new System.Drawing.Size(18, 17); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/SimpleLed.cs b/JinYuan.ControlLib/SimpleLed.cs new file mode 100644 index 0000000..166dc4d --- /dev/null +++ b/JinYuan.ControlLib/SimpleLed.cs @@ -0,0 +1,40 @@ +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class SimpleLed : UserControl + { + public SimpleLed() + { + InitializeComponent(); + + //ÉèÖÿؼþÑùʽ + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private bool state = true; + + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡָʾµƵÄ״̬")] + public bool State + { + get { return state; } + set + { + state = value; + this.BackgroundImage = state ? Properties.Resources.Green : Properties.Resources.Red; + } + } + + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡָʾµư󶨵ıäÁ¿Ãû³Æ")] + public string BindVarName { get; set; } + } +} diff --git a/JinYuan.ControlLib/SimpleLed.resx b/JinYuan.ControlLib/SimpleLed.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/SimpleLed.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/StatusExt.Designer.cs b/JinYuan.ControlLib/StatusExt.Designer.cs new file mode 100644 index 0000000..bf173af --- /dev/null +++ b/JinYuan.ControlLib/StatusExt.Designer.cs @@ -0,0 +1,40 @@ +namespace JinYuan.ControlLib +{ + partial class StatusExt + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + if (disposing) + { + _cachedPath?.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/StatusExt.cs b/JinYuan.ControlLib/StatusExt.cs new file mode 100644 index 0000000..8fbec66 --- /dev/null +++ b/JinYuan.ControlLib/StatusExt.cs @@ -0,0 +1,521 @@ +using Controls; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Threading.Tasks; +using System.Windows.Forms; + + + +namespace JinYuan.ControlLib +{ + #region 枚举定义 + public enum StatusEnum + { + Init, //初始化状态 - 空白,无填充 + GradeNG, // 等级查询OK状态 - 白底:黑色系渐变; 黑底:黄色系渐变? + PackNG, // 上传NG状态 - 红色系渐变 + Normal // 正常状态 - 绿色系渐变 + } + #endregion + + public partial class StatusExt : UserControl + { + // 公开属性,电芯条码用于绑定唯一标识 + public string ItemId { get; set; } + // 电芯位置 + public string RowId { get; set; } + + + #region 私有字段 + private StatusEnum _currentStatus = StatusEnum.Init; + private Color _borderColor = Color.DarkGray; + private int _borderWidth = 1; + private bool _showHighlight = false; + private const int padding = 2; // 外部留白 + private static readonly Color _backBlackColor = Color.FromArgb(11, 20, 36); + //private static readonly Color _backWhiteColor = Color.FromArgb(255, 255, 255); + //private Color _backColor = _backBlackColor; + #endregion + + #region 颜色配置 + private readonly Color _whiteEdge = Color.FromArgb(200, 200, 200); // 白色边缘 + private readonly Color _greenEdge = Color.FromArgb(50, 150, 50); // 绿色边缘 + private readonly Color _greenMid = Color.FromArgb(140, 180, 130); // 绿色过渡 + private readonly Color _grayEdge = Color.FromArgb(0, 0, 0); // 黑色边缘 + private readonly Color _grayMid = Color.FromArgb(135, 135, 135); // 灰色过渡 + private readonly Color _redEdge = Color.FromArgb(150, 60, 60); // 红色边缘 + private readonly Color _redMid = Color.FromArgb(170, 140, 130); // 红色过渡 + private readonly Color _center = Color.FromArgb(245, 245, 245); // 中心色(稍暗避免过曝) + private readonly Color _highlightStart = Color.FromArgb(120, Color.White); // 高光起始色 + private readonly Color _highlightEnd = Color.FromArgb(0, Color.White); // 高光结束色 + #endregion + + + private bool _isClicking = false; + private DateTime _lastClickTime; + + // 缓存渐变画刷,避免重复创建 + private GraphicsPath _cachedPath; + private Rectangle _lastDrawRect; + private bool _clickHandled = false; + + #region 构造函数 + public StatusExt() + { + this.Text = string.Empty; // 清空文本 + //SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true); + SetStyle(ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.ResizeRedraw | + ControlStyles.OptimizedDoubleBuffer | + //ControlStyles.Opaque | // 避免背景重绘干扰 + ControlStyles.SupportsTransparentBackColor, true); + this.DoubleBuffered = true; + this.Size = new Size(40, 40); // 确保正方形 + this.MinimumSize = new Size(20, 20); + this.MaximumSize = new Size(60, 60); // 设置最大尺寸 + this.BackColor = _backBlackColor; + } + + //private void InitializeBrushCache() + //{ + // _brushCache[StatusEnum.Init] = new SolidBrush(Color.Transparent); + // _brushCache[StatusEnum.Normal] = new LinearGradientBrush( + // new Rectangle(0, 0, 100, 100), + // Color.FromArgb(50, 150, 50), + // Color.FromArgb(140, 180, 130), + // 45f); + // _brushCache[StatusEnum.GradeNG] = new LinearGradientBrush( + // new Rectangle(0, 0, 100, 100), + // Color.FromArgb(0, 0, 0), + // Color.FromArgb(135, 135, 135), + // 45f); + // _brushCache[StatusEnum.PackNG] = new LinearGradientBrush( + // new Rectangle(0, 0, 100, 100), + // Color.FromArgb(150, 60, 60), + // Color.FromArgb(170, 140, 130), + // 45f); + //} + #endregion + + #region 处理外部数据的方法 + /// + /// 绑定数据,设置 UI 内容 + /// + public void BindData(string id, string rowId, string title, StatusEnum status) + { + this.ItemId = id; + this.RowId = rowId; + this.CurrentStatus = status; + } + + public void SetStatus(StatusEnum status) + { + if (_currentStatus != status) + { + _currentStatus = status; + Invalidate(); // 状态变化时重绘 + } + } + + #endregion + + #region 属性 + [Category("工业风"), Description("当前状态")] + public StatusEnum CurrentStatus + { + get => _currentStatus; + set + { + if (_currentStatus != value) + { + _currentStatus = value; + Invalidate(); // 只有变化时才重绘 + } + } + } + + [Category("工业风"), Description("边框宽度")] + public int BorderWidth + { + get => _borderWidth; + set + { + _borderWidth = value; + Invalidate(); + } + } + + [Category("工业风"), Description("边框颜色")] + public Color BorderColor + { + get { return _borderColor; } + set + { + _borderColor = value; + Invalidate(); + } + } + + [Category("工业风"), Description("是否显示高光效果")] + public bool ShowHighlight + { + get { return _showHighlight; } + set + { + _showHighlight = value; + Invalidate(); + } + } + #endregion + + #region 重写方法 + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + var g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; // 抗锯齿,圆形更平滑 + g.PixelOffsetMode = PixelOffsetMode.HighQuality; // 减少模糊 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + //g.SmoothingMode = SmoothingMode.HighSpeed; // 改用高速渲染 + //g.CompositingQuality = CompositingQuality.HighSpeed; + + + // === 关键:有效直径要扣除两边的边框宽度 === + int availableSize = Math.Min(Width, Height); + int drawDiameter = availableSize - _borderWidth - padding * 2; // 确保左右各留出 1~2 像素给边框 + if (drawDiameter <= 0) drawDiameter = 1; // 防止负数 + + // 居中定位 + int x = (Width - drawDiameter) / 2; + int y = (Height - drawDiameter) / 2; + var drawRect = new Rectangle(x, y, drawDiameter, drawDiameter); + + //// 绘制背景圆形 + //DrawBackgroundCircle(g, drawRect); + + //// 绘制边框 + //DrawBorder(g, drawRect); + + // 只在尺寸变化时重建路径 + if (_cachedPath == null || _lastDrawRect != drawRect) + { + _cachedPath?.Dispose(); + _cachedPath = new GraphicsPath(); + _cachedPath.AddEllipse(drawRect); + _lastDrawRect = drawRect; + } + + // 根据状态绘制渐变背景 + DrawStatusBackground(g, drawRect); + // 绘制高光效果 + if (_showHighlight && _currentStatus != StatusEnum.Init) + { + DrawHighlightEffect(g, drawRect); + } + + // 绘制边框 + DrawBorder(g, drawRect); + + //// 使用缓存画刷 + //if (_brushCache.TryGetValue(_currentStatus, out var brush)) + //{ + // g.FillPath(brush, _cachedPath); + //} + + //// 绘制边框 + //using (Pen borderPen = new Pen(GetBorderColor(), _borderWidth)) + //{ + // borderPen.Alignment = PenAlignment.Center; + // g.DrawEllipse(borderPen, drawRect); + //} + } + + // 确保控件保持正方形 + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + // 强制保持正方形 + int size = Math.Min(Width, Height); + this.Size = new Size(size, size); + Invalidate(); + } + + protected override void OnClick(EventArgs e) + { + // 防重复触发 + if (_isClicking || (DateTime.Now - _lastClickTime).TotalMilliseconds < 300) + { + return; + } + + _isClicking = true; + _lastClickTime = DateTime.Now; + + try + { + StatusExtClicked?.Invoke(this, new StatusItemClickEventArgs(this.ItemId, this.CurrentStatus, this.RowId, this.Name)); + base.OnClick(e); + } + finally + { + // 使用异步延迟重置,避免阻塞UI + Task.Delay(300).ContinueWith(_ => + { + if (!IsDisposed) + { + SafeInvoke(() => _isClicking = false); + } + }); + } + } + #endregion + + #region 私有绘制方法 + //private void DrawBackgroundCircle(Graphics g, Rectangle rect) + //{ + // var (edgeColor, midColor) = GetStatusColor(); + + // using (GraphicsPath path = CreateCirclePath(rect)) + // { + // using (PathGradientBrush brush = new PathGradientBrush(path)) + // { + // brush.CenterColor = _center; + // brush.SurroundColors = new Color[] { edgeColor }; + // brush.FocusScales = new PointF(0.1f, 0.1f); + // g.FillPath(brush, path); + // } + // } + //} + + //// 绘制高光效果 + //private void DrawHighlightEffect(Graphics g, Rectangle rect) + //{ + // // 高光区域(右上角的椭圆) + // int highlightSize = rect.Width / 3; + // Rectangle highlightRect = new Rectangle( + // rect.X + rect.Width / 6, + // rect.Y + rect.Height / 6, + // highlightSize, + // highlightSize + // ); + + // // 创建半透明高光渐变 + // using (LinearGradientBrush highlightBrush = new LinearGradientBrush( + // highlightRect, + // Color.FromArgb(120, Color.White), + // Color.FromArgb(0, Color.White), + // 45f)) + // { + // g.FillEllipse(highlightBrush, highlightRect); + // } + + // // 中心小圆高光(增强中心亮度) + // int centerHighlightSize = rect.Width / 5; + // Rectangle centerRect = new Rectangle( + // rect.X + (rect.Width - centerHighlightSize) / 2, + // rect.Y + (rect.Height - centerHighlightSize) / 2, + // centerHighlightSize, + // centerHighlightSize + // ); + + // using (SolidBrush centerBrush = new SolidBrush(Color.FromArgb(80, Color.White))) + // { + // g.FillEllipse(centerBrush, centerRect); + // } + //} + + //private void DrawBorder(Graphics g, Rectangle rect) + //{ + // var (edgeColor, _) = GetStatusColor(); + // using (Pen borderPen = new Pen(edgeColor, _borderWidth)) + // { + // borderPen.Alignment = PenAlignment.Center; // 明确居中 + // g.DrawEllipse(borderPen, rect); + // } + //} + + private void DrawStatusBackground(Graphics g, Rectangle rect) + { + var (edgeColor, midColor) = GetStatusColor(); + + // 绘制渐变背景 + using (PathGradientBrush brush = new PathGradientBrush(_cachedPath)) + { + brush.CenterColor = _center; + brush.SurroundColors = new Color[] { edgeColor }; + brush.FocusScales = new PointF(0.1f, 0.1f); + g.FillPath(brush, _cachedPath); + + // 添加中间渐变层增强效果 + if (_currentStatus != StatusEnum.Init) + { + using (SolidBrush midBrush = new SolidBrush(Color.FromArgb(50, midColor))) + { + int innerSize = rect.Width / 2; + Rectangle innerRect = new Rectangle( + rect.X + (rect.Width - innerSize) / 2, + rect.Y + (rect.Height - innerSize) / 2, + innerSize, + innerSize); + g.FillEllipse(midBrush, innerRect); + } + } + } + } + + private void DrawHighlightEffect(Graphics g, Rectangle rect) + { + // 主高光区域(右上角) + int highlightSize = rect.Width / 3; + Rectangle highlightRect = new Rectangle( + rect.X + rect.Width / 6, + rect.Y + rect.Height / 6, + highlightSize, + highlightSize); + + using (LinearGradientBrush highlightBrush = new LinearGradientBrush( + highlightRect, + _highlightStart, + _highlightEnd, + 45f)) + { + g.FillEllipse(highlightBrush, highlightRect); + } + + // 中心高光点 + int centerHighlightSize = rect.Width / 5; + Rectangle centerRect = new Rectangle( + rect.X + (rect.Width - centerHighlightSize) / 2, + rect.Y + (rect.Height - centerHighlightSize) / 2, + centerHighlightSize, + centerHighlightSize); + + using (SolidBrush centerBrush = new SolidBrush(Color.FromArgb(80, Color.White))) + { + g.FillEllipse(centerBrush, centerRect); + } + + // 边缘光泽效果 + using (Pen glowPen = new Pen(Color.FromArgb(30, Color.White), 1)) + { + g.DrawEllipse(glowPen, rect); + } + } + + private void DrawBorder(Graphics g, Rectangle rect) + { + var (edgeColor, _) = GetStatusColor(); + + // 外边框 + using (Pen outerPen = new Pen(Color.FromArgb(80, edgeColor), _borderWidth + 1)) + { + outerPen.Alignment = PenAlignment.Inset; + g.DrawEllipse(outerPen, rect); + } + + // 内边框 + using (Pen innerPen = new Pen(Color.FromArgb(150, edgeColor), _borderWidth)) + { + innerPen.Alignment = PenAlignment.Inset; + Rectangle innerRect = new Rectangle( + rect.X + 1, rect.Y + 1, + rect.Width - 2, rect.Height - 2); + g.DrawEllipse(innerPen, innerRect); + } + } + + private (Color, Color) GetStatusColor() + { + switch (_currentStatus) + { + case StatusEnum.PackNG: + return (_redEdge, _redMid); + case StatusEnum.GradeNG: + return (_grayEdge, _grayMid); + case StatusEnum.Normal: + return (_greenEdge, _greenMid); + default: // Init + return (_whiteEdge, Color.FromArgb(50, 50, 50)); + } + } + + private void SafeInvoke(Action action) + { + if (IsHandleCreated && !IsDisposed) + { + if (InvokeRequired) + { + try { Invoke(action); } catch { } + } + else + { + action(); + } + } + } + + //private Color GetBorderColor() + //{ + // var (edgeColor, midColor) = GetStatusColor(); + + // return edgeColor; + //} + + //private GraphicsPath CreateCirclePath(Rectangle rect) + //{ + // GraphicsPath path = new GraphicsPath(); + // path.AddEllipse(rect); + // return path; + //} + + + //private (Color, Color) GetStatusColor() + //{ + // switch (_currentStatus) + // { + // case StatusEnum.PackNG: + // return (_redEdge, _redMid); + // case StatusEnum.GradeNG: + // return (_grayEdge, _grayMid); + // case StatusEnum.Normal: + // return (_greenEdge, _greenMid); + // default: + // return (_whiteEdge, _whiteEdge); + // } + //} + + #endregion + + #region 事件 + public event EventHandler StatusExtClicked; + + // 自定义事件参数,用于传递点击的 ID 和状态 + public class StatusItemClickEventArgs : EventArgs + { + public string ItemId { get; } + + public string RowId { get; } + + public string Name { get; } + public StatusEnum Status { get; } + + public StatusItemClickEventArgs(string itemId, StatusEnum status, string rowId, string name) + { + ItemId = itemId; + Status = status; + RowId = rowId; + Name = Name; + } + } + #endregion + } + + +} + diff --git a/JinYuan.ControlLib/TButton.Designer.cs b/JinYuan.ControlLib/TButton.Designer.cs new file mode 100644 index 0000000..bf6696a --- /dev/null +++ b/JinYuan.ControlLib/TButton.Designer.cs @@ -0,0 +1,67 @@ +namespace JinYuan.ControlLib +{ + partial class TButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(118, 36); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "标题按钮"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbl_Title.Click += new System.EventHandler(this.lbl_Title_Click); + // + // TButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(28)))), ((int)(((byte)(68))))); + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.Title; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Name = "TButton"; + this.Size = new System.Drawing.Size(207, 41); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/TButton.cs b/JinYuan.ControlLib/TButton.cs new file mode 100644 index 0000000..6c4f860 --- /dev/null +++ b/JinYuan.ControlLib/TButton.cs @@ -0,0 +1,47 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class TButton : UserControl + { + public TButton() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private string titleName = "标题名称"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示标题名称")] + + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + } + } + + [Browsable(true)]//是否可见 + [Category("自定义事件")] //类别 + [Description("设置或显示按钮文本内容")] + public new EventHandler Click; + + private void lbl_Title_Click(object sender, EventArgs e) + { + this.Click?.Invoke(this, e); + } + + } +} diff --git a/JinYuan.ControlLib/TButton.resx b/JinYuan.ControlLib/TButton.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/TButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/TextSet.Designer.cs b/JinYuan.ControlLib/TextSet.Designer.cs new file mode 100644 index 0000000..859a443 --- /dev/null +++ b/JinYuan.ControlLib/TextSet.Designer.cs @@ -0,0 +1,108 @@ +namespace JinYuan.ControlLib +{ + partial class TextSet + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.MainTableLayoutControl = new System.Windows.Forms.TableLayoutPanel(); + this.lbl_Unit = new System.Windows.Forms.Label(); + this.lbl_Value = new System.Windows.Forms.Label(); + this.MainTableLayoutControl.SuspendLayout(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Location = new System.Drawing.Point(4, 5); + this.lbl_Title.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(94, 20); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "参数名称设置"; + // + // MainTableLayoutControl + // + this.MainTableLayoutControl.ColumnCount = 3; + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.MainTableLayoutControl.Controls.Add(this.lbl_Unit, 2, 0); + this.MainTableLayoutControl.Controls.Add(this.lbl_Value, 1, 0); + this.MainTableLayoutControl.Controls.Add(this.lbl_Title, 0, 0); + this.MainTableLayoutControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainTableLayoutControl.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.MainTableLayoutControl.Location = new System.Drawing.Point(0, 0); + this.MainTableLayoutControl.Margin = new System.Windows.Forms.Padding(1); + this.MainTableLayoutControl.Name = "MainTableLayoutControl"; + this.MainTableLayoutControl.RowCount = 1; + this.MainTableLayoutControl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.MainTableLayoutControl.Size = new System.Drawing.Size(204, 30); + this.MainTableLayoutControl.TabIndex = 1; + // + // lbl_Unit + // + this.lbl_Unit.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Unit.Location = new System.Drawing.Point(167, 5); + this.lbl_Unit.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Unit.Name = "lbl_Unit"; + this.lbl_Unit.Size = new System.Drawing.Size(33, 20); + this.lbl_Unit.TabIndex = 2; + this.lbl_Unit.Text = "℃"; + // + // lbl_Value + // + this.lbl_Value.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Value.Location = new System.Drawing.Point(106, 5); + this.lbl_Value.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Value.Name = "lbl_Value"; + this.lbl_Value.Size = new System.Drawing.Size(53, 20); + this.lbl_Value.TabIndex = 1; + this.lbl_Value.Text = "0.0"; + // + // TextSet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.MainTableLayoutControl); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "TextSet"; + this.Size = new System.Drawing.Size(204, 30); + this.MainTableLayoutControl.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + private System.Windows.Forms.TableLayoutPanel MainTableLayoutControl; + private System.Windows.Forms.Label lbl_Unit; + private System.Windows.Forms.Label lbl_Value; + } +} diff --git a/JinYuan.ControlLib/TextSet.cs b/JinYuan.ControlLib/TextSet.cs new file mode 100644 index 0000000..000fc2c --- /dev/null +++ b/JinYuan.ControlLib/TextSet.cs @@ -0,0 +1,112 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [DefaultEvent("ControlDoubleClick")] + public partial class TextSet : UserControl + { + public TextSet() + { + InitializeComponent(); + } + + + //private int titleScale = 50; + //[Browsable(true)] + //[Category("自定义属性")] + //[Description("设置或获取标题所占比例")] + //public int TitleScale + //{ + // get { return titleScale; } + // set + // { + // titleScale = value; + + // this.MainTableLayoutControl.ColumnStyles[0] = new ColumnStyle(SizeType.Percent, titleScale); + // } + //} + + + //private int valueScale = 30; + //[Browsable(true)] + //[Category("自定义属性")] + //[Description("设置或获取数据所占比例")] + //public int ValueScale + //{ + // get { return valueScale; } + // set + // { + // valueScale = value; + + // this.MainTableLayoutControl.ColumnStyles[1] = new ColumnStyle(SizeType.Percent, valueScale); + // } + //} + + private string titleName = "参数名称设置"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取参数名称")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + + this.lbl_Title.Text = titleName; + } + } + + + private string currentValue = "0.0"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取当前数值")] + public string CurrentValue + { + get { return currentValue; } + set + { + currentValue = value; + + this.lbl_Value.Text = currentValue; + } + } + + + private string unit = "℃"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取当前单位")] + public string Unit + { + get { return unit; } + set + { + unit = value; + + this.lbl_Unit.Text = unit; + } + } + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取绑定变量名称")] + public string BindVarName { get; set; } + + [Browsable(true)] + [Category("自定义事件")] + [Description("控件双击事件")] + public event EventHandler ControlDoubleClick; + + private void lbl_Value_DoubleClick(object sender, EventArgs e) + { + if (ControlDoubleClick != null) + { + ControlDoubleClick(this, e); + } + } + } +} diff --git a/JinYuan.ControlLib/TextSet.resx b/JinYuan.ControlLib/TextSet.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/TextSet.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/TextSet2.Designer.cs b/JinYuan.ControlLib/TextSet2.Designer.cs new file mode 100644 index 0000000..2580a7f --- /dev/null +++ b/JinYuan.ControlLib/TextSet2.Designer.cs @@ -0,0 +1,95 @@ +namespace JinYuan.ControlLib +{ + partial class TextSet2 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.MainTableLayoutControl = new System.Windows.Forms.TableLayoutPanel(); + this.lbl_Value = new System.Windows.Forms.Label(); + this.MainTableLayoutControl.SuspendLayout(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Location = new System.Drawing.Point(4, 5); + this.lbl_Title.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(107, 20); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "参数名称设置"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // MainTableLayoutControl + // + this.MainTableLayoutControl.ColumnCount = 2; + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.73298F)); + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 39.26702F)); + this.MainTableLayoutControl.Controls.Add(this.lbl_Value, 1, 0); + this.MainTableLayoutControl.Controls.Add(this.lbl_Title, 0, 0); + this.MainTableLayoutControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainTableLayoutControl.Location = new System.Drawing.Point(0, 0); + this.MainTableLayoutControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MainTableLayoutControl.Name = "MainTableLayoutControl"; + this.MainTableLayoutControl.RowCount = 1; + this.MainTableLayoutControl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.MainTableLayoutControl.Size = new System.Drawing.Size(191, 30); + this.MainTableLayoutControl.TabIndex = 1; + // + // lbl_Value + // + this.lbl_Value.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Value.Location = new System.Drawing.Point(119, 5); + this.lbl_Value.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.lbl_Value.Name = "lbl_Value"; + this.lbl_Value.Size = new System.Drawing.Size(68, 20); + this.lbl_Value.TabIndex = 1; + this.lbl_Value.Text = "0.0"; + this.lbl_Value.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // TextSet2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.MainTableLayoutControl); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "TextSet2"; + this.Size = new System.Drawing.Size(191, 30); + this.MainTableLayoutControl.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + private System.Windows.Forms.TableLayoutPanel MainTableLayoutControl; + private System.Windows.Forms.Label lbl_Value; + } +} diff --git a/JinYuan.ControlLib/TextSet2.cs b/JinYuan.ControlLib/TextSet2.cs new file mode 100644 index 0000000..dee5637 --- /dev/null +++ b/JinYuan.ControlLib/TextSet2.cs @@ -0,0 +1,99 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [DefaultEvent("ControlDoubleClick")] + public partial class TextSet2 : UserControl + { + public TextSet2() + { + InitializeComponent(); + } + + + //private int titleScale = 50; + //[Browsable(true)] + //[Category("自定义属性")] + //[Description("设置或获取标题所占比例")] + //public int TitleScale + //{ + // get { return titleScale; } + // set + // { + // titleScale = value; + + // this.MainTableLayoutControl.ColumnStyles[0] = new ColumnStyle(SizeType.Percent, titleScale); + // } + //} + + + //private int valueScale = 30; + //[Browsable(true)] + //[Category("自定义属性")] + //[Description("设置或获取数据所占比例")] + //public int ValueScale + //{ + // get { return valueScale; } + // set + // { + // valueScale = value; + + // this.MainTableLayoutControl.ColumnStyles[1] = new ColumnStyle(SizeType.Percent, valueScale); + // } + //} + + private string titleName = "参数名称设置"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取参数名称")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + + this.lbl_Title.Text = titleName; + } + } + + + private string currentValue = "0.0"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取当前数值")] + public string CurrentValue + { + get { return currentValue; } + set + { + currentValue = value; + + this.lbl_Value.Text = currentValue; + } + } + + + + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取绑定变量名称")] + public string BindVarName { get; set; } + + [Browsable(true)] + [Category("自定义事件")] + [Description("控件双击事件")] + public event EventHandler ControlDoubleClick; + + private void lbl_Value_DoubleClick(object sender, EventArgs e) + { + if (ControlDoubleClick != null) + { + ControlDoubleClick(this, e); + } + } + } +} diff --git a/JinYuan.ControlLib/TextSet2.resx b/JinYuan.ControlLib/TextSet2.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/TextSet2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Title.Designer.cs b/JinYuan.ControlLib/Title.Designer.cs new file mode 100644 index 0000000..58f20bd --- /dev/null +++ b/JinYuan.ControlLib/Title.Designer.cs @@ -0,0 +1,66 @@ +namespace JinYuan.ControlLib +{ + partial class Title + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(118, 36); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "标题名称"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // Title + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(28)))), ((int)(((byte)(68))))); + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.Title; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Name = "Title"; + this.Size = new System.Drawing.Size(118, 36); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/Title.cs b/JinYuan.ControlLib/Title.cs new file mode 100644 index 0000000..a4145c3 --- /dev/null +++ b/JinYuan.ControlLib/Title.cs @@ -0,0 +1,36 @@ +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class Title : UserControl + { + public Title() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private string titleName = "标题名称"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示标题名称")] + + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + } + } + + } +} diff --git a/JinYuan.ControlLib/Title.resx b/JinYuan.ControlLib/Title.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/Title.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/TitleButton.Designer.cs b/JinYuan.ControlLib/TitleButton.Designer.cs new file mode 100644 index 0000000..b01fa81 --- /dev/null +++ b/JinYuan.ControlLib/TitleButton.Designer.cs @@ -0,0 +1,66 @@ +namespace JinYuan.ControlLib +{ + partial class TitleButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.btn_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // btn_Title + // + this.btn_Title.BackColor = System.Drawing.Color.Transparent; + this.btn_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.btn_Title.Font = new System.Drawing.Font("微软雅黑", 11F, System.Drawing.FontStyle.Bold); + this.btn_Title.ForeColor = System.Drawing.Color.White; + this.btn_Title.Location = new System.Drawing.Point(0, 0); + this.btn_Title.Name = "btn_Title"; + this.btn_Title.Size = new System.Drawing.Size(129, 43); + this.btn_Title.TabIndex = 0; + this.btn_Title.Text = "菜单按钮"; + this.btn_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btn_Title.Click += new System.EventHandler(this.lbl_Title_Click); + // + // TitleButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.Title; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.btn_Title); + this.DoubleBuffered = true; + this.Name = "TitleButton"; + this.Size = new System.Drawing.Size(129, 43); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label btn_Title; + } +} diff --git a/JinYuan.ControlLib/TitleButton.cs b/JinYuan.ControlLib/TitleButton.cs new file mode 100644 index 0000000..dc70f82 --- /dev/null +++ b/JinYuan.ControlLib/TitleButton.cs @@ -0,0 +1,90 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [DefaultEvent("Click")]//增加特性事件 + public partial class TitleButton : UserControl + { + public TitleButton() + { + InitializeComponent(); + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private bool isSelected = false; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮是否选中")] + public bool IsSelected + { + get { return isSelected; } + set + { + isSelected = value; + UpdataImage(); + } + } + + + private bool isLeft = true; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮是否为左边")] + public bool IsLeft + { + get { return isLeft; } + set + { + isLeft = value; + UpdataImage(); + } + } + + private string titleName = "导航按钮"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示导航按钮文本内容")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.btn_Title.Text = titleName; + } + } + + + /// + ///统一更新背景 + /// + private void UpdataImage() + { + if (this.isLeft) + { + this.BackgroundImage = isSelected ? Properties.Resources.LeftSelected : Properties.Resources.LeftUnSelected; + } + else + { + this.BackgroundImage = isSelected ? Properties.Resources.RightSelected : Properties.Resources.RightUnSelected; + } + } + + [Browsable(true)]//是否可见 + [Category("自定义事件")] //类别 + [Description("设置或显示导航按钮文本内容")] + public new EventHandler Click; + + private void lbl_Title_Click(object sender, EventArgs e) + { + this.Click?.Invoke(this, e); + } + } +} diff --git a/JinYuan.ControlLib/TitleButton.resx b/JinYuan.ControlLib/TitleButton.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/TitleButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/TitleTime.Designer.cs b/JinYuan.ControlLib/TitleTime.Designer.cs new file mode 100644 index 0000000..18125f9 --- /dev/null +++ b/JinYuan.ControlLib/TitleTime.Designer.cs @@ -0,0 +1,98 @@ +namespace JinYuan.ControlLib +{ + partial class TitleTime + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lb_TitleName = new System.Windows.Forms.Label(); + this.lbl_Title = new System.Windows.Forms.Label(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // lb_TitleName + // + this.lb_TitleName.Dock = System.Windows.Forms.DockStyle.Fill; + this.lb_TitleName.ForeColor = System.Drawing.Color.White; + this.lb_TitleName.Location = new System.Drawing.Point(22, 0); + this.lb_TitleName.Name = "lb_TitleName"; + this.lb_TitleName.Size = new System.Drawing.Size(108, 30); + this.lb_TitleName.TabIndex = 0; + this.lb_TitleName.Text = "label1"; + this.lb_TitleName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lbl_Title + // + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(136, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(169, 30); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "label1"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 19F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 39.44637F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.55363F)); + this.tableLayoutPanel1.Controls.Add(this.lb_TitleName, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.lbl_Title, 2, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(308, 30); + this.tableLayoutPanel1.TabIndex = 1; + // + // TitleTime + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources._61; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.tableLayoutPanel1); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "TitleTime"; + this.Size = new System.Drawing.Size(308, 30); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Label lb_TitleName; + private System.Windows.Forms.Label lbl_Title; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} diff --git a/JinYuan.ControlLib/TitleTime.cs b/JinYuan.ControlLib/TitleTime.cs new file mode 100644 index 0000000..54aaab4 --- /dev/null +++ b/JinYuan.ControlLib/TitleTime.cs @@ -0,0 +1,246 @@ +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Text; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + //public partial class TitleTime : UserControl + //{ + // public TitleTime() + // { + // InitializeComponent(); + // //设置控件样式,去除缓冲 + // this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + // this.SetStyle(ControlStyles.DoubleBuffer, true); + // this.SetStyle(ControlStyles.ResizeRedraw, true); + // this.SetStyle(ControlStyles.Selectable, true); + // this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + // } + + // private string ttfFelePath = ""; + + // private string ttfPath = ""; + // [Browsable(true)]//是否可见 + // [Category("自定义属性")] //类别/Assts/Fonts/zaozigongfangjinzhuti.ttf + // [Description("设置字体路径")] + // public string TtfPath + // { + // get { return ttfPath; } + // set + // { + // ttfPath = value; + // if (ttfPath != "") + // { + // ttfFelePath = System.Windows.Forms.Application.StartupPath + $"{ttfPath}"; + // this.Invalidate(); + // } + + // } + // } + + // private string titleName = "标题名称"; + // [Browsable(true)]//是否可见 + // [Category("自定义属性")] //类别 + // [Description("设置或显示标题名称")] + // public string TitleName + // { + // get { return titleName; } + // set + // { + // titleName = value; + // if (ttfFelePath != "") + // { + // string fontPath = ttfFelePath; + // LoadFont(fontPath, 24); + // } + // this.lb_TitleName.Text = titleName; + // } + // } + + + // private Color titleNameForColor = Color.FromArgb(255, 77, 59); + // [Browsable(true)] + // [Category("自定义属性")] + // [Description("设置或获取标题名称字体颜色")] + // public Color TitleNameForColor + // { + // get { return titleNameForColor; } + // set + // { + // titleNameForColor = value; + // this.lb_TitleName.ForeColor = titleNameForColor; + // } + // } + + // private string title = "控件内容"; + // [Browsable(true)]//是否可见 + // [Category("自定义属性")] //类别 + // [Description("设置或显示内容")] + // public string Title + // { + // get { return title; } + // set + // { + // title = value; + // if (ttfFelePath != "") + // { + // string fontPath = ttfFelePath; + // LoadFont(fontPath, 24); + // } + // this.lbl_Title.Text = title; + // } + // } + + + + + // public void LoadFont(string path, float size) + // { + // //int fontId = AddFontResource(path); + // PrivateFontCollection fontCollection = new PrivateFontCollection(); + // fontCollection.AddFontFile(path); + // Font myFont = new Font(fontCollection.Families[0].Name, 9F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(134))); + // //Font font = new Font(fontCollection.Families[0], size); + // this.lbl_Title.Font = myFont; + // //RemoveFontResource(path); + // //return font; + // } + + // // 辅助方法 + // private class FontLoader + // { + // //[DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)] + // //public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)] string lpFileName); + + // //[DllImport("gdi32.dll", EntryPoint = "RemoveFontResourceW", SetLastError = true)] + // //public static extern int RemoveFontResource([In][MarshalAs(UnmanagedType.LPWStr)] string lpFileName); + + // public Font LoadFont(string path, float size) + // { + // //int fontId = AddFontResource(path); + // PrivateFontCollection fontCollection = new PrivateFontCollection(); + // fontCollection.AddFontFile(path); + // //Font myFont = new Font(font.Families[0].Name, 9F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(134))); + // Font font = new Font(fontCollection.Families[0], size); + // //RemoveFontResource(path); + // return font; + // } + // } + + + + //} + + + public partial class TitleTime : UserControl + { + public TitleTime() + { + InitializeComponent(); + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + private string ttfFelePath = ""; + + private string ttfPath = ""; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置字体路径")] + public string TtfPath + { + get { return ttfPath; } + set + { + ttfPath = value; + if (ttfPath != "") + { + ttfFelePath = System.Windows.Forms.Application.StartupPath + $"{ttfPath}"; + this.Invalidate(); + } + } + } + + private float titleFontSize = 24f; // 默认字体大小 + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取标题字体大小")] + public float TitleFontSize + { + get { return titleFontSize; } + set + { + titleFontSize = value; + if (ttfFelePath != "") + { + LoadFont(ttfFelePath, titleFontSize); + } + this.Invalidate(); // 强制重绘控件 + } + } + + private string titleName = "标题名称"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或显示标题名称")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + if (ttfFelePath != "") + { + LoadFont(ttfFelePath, TitleFontSize); + } + this.lb_TitleName.Text = titleName; + } + } + + private Color titleNameForColor = Color.FromArgb(255, 77, 59); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取标题名称字体颜色")] + public Color TitleNameForColor + { + get { return titleNameForColor; } + set + { + titleNameForColor = value; + this.lb_TitleName.ForeColor = titleNameForColor; + } + } + + private string title = "控件内容"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或显示内容")] + public string Title + { + get { return title; } + set + { + title = value; + if (ttfFelePath != "") + { + LoadFont(ttfFelePath, TitleFontSize); + } + this.lbl_Title.Text = title; + } + } + + public void LoadFont(string path, float size) + { + PrivateFontCollection fontCollection = new PrivateFontCollection(); + fontCollection.AddFontFile(path); + Font myFont = new Font(fontCollection.Families[0].Name, size, FontStyle.Regular, GraphicsUnit.Point, ((byte)(134))); + this.lbl_Title.Font = myFont; + this.lb_TitleName.Font = myFont; // 如果需要标题名称也使用相同的字体 + } + } +} diff --git a/JinYuan.ControlLib/TitleTime.resx b/JinYuan.ControlLib/TitleTime.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/TitleTime.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/Toggle.Designer.cs b/JinYuan.ControlLib/Toggle.Designer.cs new file mode 100644 index 0000000..1d47d30 --- /dev/null +++ b/JinYuan.ControlLib/Toggle.Designer.cs @@ -0,0 +1,45 @@ +namespace JinYuan.ControlLib +{ + partial class Toggle + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Toggle + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "Toggle"; + this.Size = new System.Drawing.Size(95, 42); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/Toggle.cs b/JinYuan.ControlLib/Toggle.cs new file mode 100644 index 0000000..484eef4 --- /dev/null +++ b/JinYuan.ControlLib/Toggle.cs @@ -0,0 +1,338 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public enum ControlType + { + /// + /// 椭圆 + /// + Ellipse, + /// + /// 矩形 + /// + Rectangle, + /// + /// 直线 + /// + Line + + } + + [DefaultEvent("CheckedChanged")] + public partial class Toggle : UserControl + { + public Toggle() + { + InitializeComponent(); + + //设置控件样式 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + this.MouseDown += Toggle_MouseDown; + } + + private void Toggle_MouseDown(object sender, MouseEventArgs e) + { + IsChecked = !IsChecked; + + CheckedChanged?.Invoke(this, e); + } + + private ControlType controlType = ControlType.Ellipse; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件的样式")] + public ControlType ControlType + { + get { return controlType; } + set + { + controlType = value; + + this.Invalidate(); + } + } + + + private Color trueColor = Color.FromArgb(73, 119, 232); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件选中的颜色")] + public Color TrueColor + { + get { return trueColor; } + set + { + trueColor = value; + + this.Invalidate(); + } + } + + + private Color falseColor = Color.FromArgb(180, 180, 180); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件未选中的颜色")] + public Color FalseColor + { + get { return falseColor; } + set + { + falseColor = value; + + this.Invalidate(); + } + } + + + private bool isChecked = false; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件是否选中")] + public bool IsChecked + { + get { return isChecked; } + set + { + isChecked = value; + this.Invalidate(); + } + } + + + + + private string trueText = string.Empty; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件选中的文本")] + public string TrueText + { + get { return trueText; } + set + { + trueText = value; + this.Invalidate(); + } + } + + private string falseText = string.Empty; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件未选中的文本")] + public string FalseText + { + get { return falseText; } + set + { + falseText = value; + this.Invalidate(); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics graphics = e.Graphics; + + graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + + + //获取填充颜色 + Color fillColor = isChecked ? trueColor : falseColor; + + //创建路径 + GraphicsPath path = new GraphicsPath(); + + //文本 + string text = isChecked ? trueText : falseText; + + //文件尺寸 + SizeF size = graphics.MeasureString(text, this.Font); + + //间隙 + int gap = 2; + + //小圆宽度 + int border = 2; + + switch (controlType) + { + case ControlType.Ellipse: + + float r = (this.Height - 2) * 0.5f; + + //添加直线 + path.AddLine(new Point(this.Height / 2, 1), new Point(this.Width - this.Height / 2, 1)); + //添加圆弧 + path.AddArc(new RectangleF(this.Width - 2 * r - 1, 1, 2 * r, 2 * r), -90, 180); + //添加直线 + path.AddLine(new PointF(this.Width - r - 1, this.Height - 1), new Point(this.Height / 2, this.Height - 1)); + //添加圆弧 + path.AddArc(new RectangleF(1, 1, 2 * r, 2 * r), 90, 180); + + graphics.FillPath(new SolidBrush(fillColor), path); + + //大圆半径 + float radius = (this.Height - 2 * (1 + gap)) * 0.5f; + + //如果选中如何绘制 + if (isChecked) + { + graphics.FillEllipse(Brushes.White, new RectangleF(this.Width - 2 * radius - gap - 1, gap + 1, 2 * radius, 2 * radius)); + + //如果文本为空,则画小圆,否则,写文字 + if (string.IsNullOrEmpty(text)) + { + graphics.DrawEllipse(new Pen(Color.White, border), new RectangleF(this.Height * 0.5f - radius * 0.5f, this.Height * 0.5f - radius * 0.5f, radius, radius)); + } + else + { + graphics.DrawString(text, this.Font, Brushes.White, new PointF(this.Height * 0.5f - size.Height * 0.5f, this.Height * 0.5f - size.Height * 0.5f)); + } + } + else + { + graphics.FillEllipse(Brushes.White, new RectangleF(gap + 1, gap + 1, 2 * radius, 2 * radius)); + + //如果文本为空,则画小圆,否则,写文字 + if (string.IsNullOrEmpty(text)) + { + graphics.DrawEllipse(new Pen(Color.White, border), new RectangleF(this.Width - (1.5f * radius + 1), this.Height * 0.5f - radius * 0.5f, radius, radius)); + } + else + { + graphics.DrawString(text, this.Font, Brushes.White, new PointF(this.Width - (this.Height * 0.5f - size.Height * 0.5f) - size.Width, this.Height * 0.5f - size.Height * 0.5f)); + } + } + break; + case ControlType.Rectangle: + + int intRadius = 3; + + //添加圆弧1 + path.AddArc(new RectangleF(1, 1, intRadius * 2, intRadius * 2), 180, 90); + //添加圆弧2 + path.AddArc(new RectangleF(this.Width - 2 * intRadius - 1, 1, intRadius * 2, intRadius * 2), 270, 90); + //添加圆弧3 + path.AddArc(new RectangleF(this.Width - 2 * intRadius - 1, this.Height - 2 * intRadius - 1, intRadius * 2, intRadius * 2), 0, 90); + //添加圆弧4 + path.AddArc(new RectangleF(1, this.Height - 2 * intRadius - 1, intRadius * 2, intRadius * 2), 90, 90); + + graphics.FillPath(new SolidBrush(fillColor), path); + + if (isChecked) + { + path = new GraphicsPath(); + + int inwidth = this.Height - 2 * (gap + 1); + + //添加圆弧1 + path.AddArc(new RectangleF(this.Width - inwidth - gap - 1, 1 + gap, intRadius * 2, intRadius * 2), 180, 90); + //添加圆弧2 + path.AddArc(new RectangleF(this.Width - 1 - gap - 2 * intRadius, 1 + gap, intRadius * 2, intRadius * 2), 270, 90); + //添加圆弧3 + path.AddArc(new RectangleF(this.Width - 1 - gap - 2 * intRadius, this.Height - 2 * intRadius - 1 - gap, intRadius * 2, intRadius * 2), 0, 90); + //添加圆弧4 + path.AddArc(new RectangleF(this.Width - inwidth - gap - 1, this.Height - 2 * intRadius - 1 - gap, intRadius * 2, intRadius * 2), 90, 90); + + graphics.FillPath(Brushes.White, path); + + radius = inwidth * 0.5f; + + //如果文本为空,则画小圆,否则,写文字 + if (string.IsNullOrEmpty(text)) + { + graphics.DrawEllipse(new Pen(Color.White, border), new RectangleF(this.Height * 0.5f - radius * 0.5f, this.Height * 0.5f - radius * 0.5f, radius, radius)); + } + else + { + graphics.DrawString(text, this.Font, Brushes.White, new PointF(this.Height * 0.5f - size.Height * 0.5f, this.Height * 0.5f - size.Height * 0.5f)); + } + } + else + { + path = new GraphicsPath(); + + int inwidth = this.Height - 2 * (gap + 1); + + //添加圆弧1 + path.AddArc(new RectangleF(1 + gap, 1 + gap, intRadius * 2, intRadius * 2), 180, 90); + //添加圆弧2 + path.AddArc(new RectangleF(inwidth + 1 + gap - 2 * intRadius, 1 + gap, intRadius * 2, intRadius * 2), 270, 90); + //添加圆弧3 + path.AddArc(new RectangleF(inwidth + 1 + gap - 2 * intRadius, this.Height - 2 * intRadius - 1 - gap, intRadius * 2, intRadius * 2), 0, 90); + //添加圆弧4 + path.AddArc(new RectangleF(1 + gap, this.Height - 2 * intRadius - 1 - gap, intRadius * 2, intRadius * 2), 90, 90); + + graphics.FillPath(Brushes.White, path); + + radius = inwidth * 0.5f; + + //如果文本为空,则画小圆,否则,写文字 + if (string.IsNullOrEmpty(text)) + { + graphics.DrawEllipse(new Pen(Color.White, border), new RectangleF(this.Width - (1.5f * radius + 1), this.Height * 0.5f - radius * 0.5f, radius, radius)); + } + else + { + graphics.DrawString(text, this.Font, Brushes.White, new PointF(this.Width - (this.Height * 0.5f - size.Height * 0.5f) - size.Width, this.Height * 0.5f - size.Height * 0.5f)); + } + } + + break; + case ControlType.Line: + + float bigRadius = (this.Height - 2) * 0.5f; + float smallRadius = bigRadius * 0.5f; + + path = new GraphicsPath(); + //添加直线1 + path.AddLine(new PointF(1 + bigRadius + smallRadius, 1 + smallRadius), new PointF(this.Width - (1 + bigRadius + smallRadius), 1 + smallRadius)); + //添加圆弧1 + path.AddArc(new RectangleF(this.Width - (1 + bigRadius + smallRadius * 2), 1 + smallRadius, smallRadius * 2, smallRadius * 2), -90, 180); + //添加直线2 + path.AddLine(new PointF(this.Width - (1 + bigRadius + smallRadius), 1 + smallRadius + bigRadius), new PointF(1 + bigRadius + smallRadius, 1 + smallRadius + bigRadius)); + //添加圆弧2 + path.AddArc(new RectangleF(1 + bigRadius, 1 + smallRadius, smallRadius * 2, smallRadius * 2), 90, 180); + + graphics.FillPath(new SolidBrush(fillColor), path); + + if (isChecked) + { + graphics.FillEllipse(new SolidBrush(fillColor), new RectangleF(this.Width - (1 + bigRadius * 2), 1, bigRadius * 2, bigRadius * 2)); + + graphics.FillEllipse(Brushes.White, new RectangleF(this.Width - (1 + bigRadius + smallRadius), 1 + smallRadius, smallRadius * 2, smallRadius * 2)); + } + else + { + graphics.FillEllipse(new SolidBrush(fillColor), new RectangleF(1, 1, bigRadius * 2, bigRadius * 2)); + + graphics.FillEllipse(Brushes.White, new RectangleF(1 + smallRadius, 1 + smallRadius, smallRadius * 2, smallRadius * 2)); + } + + break; + default: + break; + } + } + + [Browsable(true)] + [Category("自定义事件")] + [Description("选中发生变化触发")] + public event EventHandler CheckedChanged; + + } +} diff --git a/JinYuan.ControlLib/Toggle.resx b/JinYuan.ControlLib/Toggle.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/Toggle.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/TotalQty.Designer.cs b/JinYuan.ControlLib/TotalQty.Designer.cs new file mode 100644 index 0000000..5aa9ff3 --- /dev/null +++ b/JinYuan.ControlLib/TotalQty.Designer.cs @@ -0,0 +1,69 @@ +namespace JinYuan.ControlLib +{ + partial class TotalQty + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 20F, System.Drawing.FontStyle.Bold); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(41, 60); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "1"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // TotalQty + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.数字指标; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "TotalQty"; + this.Size = new System.Drawing.Size(41, 60); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/TotalQty.cs b/JinYuan.ControlLib/TotalQty.cs new file mode 100644 index 0000000..09dad7e --- /dev/null +++ b/JinYuan.ControlLib/TotalQty.cs @@ -0,0 +1,49 @@ +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class TotalQty : UserControl + { + public TotalQty() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + private string titleName = "1"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示数字值")] + + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + this.Invalidate(); + } + } + } +} diff --git a/JinYuan.ControlLib/TotalQty.resx b/JinYuan.ControlLib/TotalQty.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/TotalQty.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCBlower.Designer.cs b/JinYuan.ControlLib/UCBlower.Designer.cs new file mode 100644 index 0000000..c63f409 --- /dev/null +++ b/JinYuan.ControlLib/UCBlower.Designer.cs @@ -0,0 +1,46 @@ +namespace JinYuan.ControlLib +{ + partial class UCBlower + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UCBlower + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "UCBlower"; + this.Size = new System.Drawing.Size(67, 63); + this.VisibleChanged += new System.EventHandler(this.UCBlower_VisibleChanged); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCBlower.cs b/JinYuan.ControlLib/UCBlower.cs new file mode 100644 index 0000000..be3e98f --- /dev/null +++ b/JinYuan.ControlLib/UCBlower.cs @@ -0,0 +1,473 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class UCBlower : UserControl + { + /// + /// The entrance direction + /// + private BlowerEntranceDirection entranceDirection = BlowerEntranceDirection.None; + + /// + /// Gets or sets the entrance direction. + /// + /// The entrance direction. + [Description("入口方向"), Category("自定义")] + public BlowerEntranceDirection EntranceDirection + { + get { return entranceDirection; } + set + { + entranceDirection = value; + Refresh(); + } + } + + /// + /// The exit direction + /// + private BlowerExitDirection exitDirection = BlowerExitDirection.Right; + + /// + /// Gets or sets the exit direction. + /// + /// The exit direction. + [Description("出口方向"), Category("自定义")] + public BlowerExitDirection ExitDirection + { + get { return exitDirection; } + set + { + exitDirection = value; + Refresh(); + } + } + + /// + /// The blower color + /// + private Color blowerColor = Color.FromArgb(255, 77, 59); + + /// + /// Gets or sets the color of the blower. + /// + /// The color of the blower. + [Description("风机颜色"), Category("自定义")] + public Color BlowerColor + { + get { return blowerColor; } + set + { + blowerColor = value; + Refresh(); + } + } + + /// + /// The fan color + /// + private Color fanColor = Color.FromArgb(3, 169, 243); + + /// + /// Gets or sets the color of the fan. + /// + /// The color of the fan. + [Description("风叶颜色"), Category("自定义")] + public Color FanColor + { + get { return fanColor; } + set + { + fanColor = value; + Refresh(); + } + } + TurnAround turnAround = JinYuan.ControlLib.TurnAround.None; + [Description("风叶旋转方向,None表示不旋转"), Category("自定义")] + public TurnAround TurnAround + { + get { return turnAround; } + set + { + turnAround = value; + if (value == JinYuan.ControlLib.TurnAround.None) + { + updateTimer.Enabled = false; + jiaodu = 0; + Refresh(); + } + else + updateTimer.Enabled = true; + } + } + + + //[Description("风叶旋转速度,100-1000,值越小 速度越快"), Category("自定义")] + //public int TurnSpeed + //{ + // get { return turnSpeed; } + // set + // { + // if (value < 0 || value > 1000) + // { + // return; + // } + + // turnSpeed = value; + // } + //} + + private int turnSpeed = 100; + private int jiaodu = 0; + + + [Description("风叶旋转速度,100-1000,值越小 速度越快"), Category("自定义")] + public int TurnSpeed + { + get { return turnSpeed; } + set + { + if (value <= 0 || value > 1000) + return; + turnSpeed = value; + updateTimer.Interval = value; + + + } + } + + /// + /// 是否显示底座 + /// + private bool isDZ = false; + + /// + /// 是否显示底座 + /// + /// 是否显示底座 + [Description("是否显示底座"), Category("自定义")] + public bool IsDZ + { + get { return isDZ; } + set + { + isDZ = value; + Refresh(); + } + } + + private bool isExit; + [Description("是否退出"), Category("自定义")] + public bool IsExit + { + get { return isExit; } + set { isExit = value; } + } + + + /// + /// The m rect working + /// + Rectangle m_rectWorking; + //实时更新的定时器 + private System.Windows.Forms.Timer updateTimer; + /// + /// Initializes a new instance of the class. + /// + public UCBlower() + { + InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.SizeChanged += UCBlower_SizeChanged; + this.Size = new Size(120, 120); + + updateTimer = new System.Windows.Forms.Timer(); + updateTimer.Interval = 200; + updateTimer.Tick += timer1_Tick; + updateTimer.Start(); + + //Task.Run(() => + //{ + // Timer_Thread(); + //}); + + } + + /// + /// Handles the SizeChanged event of the UCBlower control. + /// + /// The source of the event. + /// The instance containing the event data. + void UCBlower_SizeChanged(object sender, EventArgs e) + { + int intMin = Math.Min(this.Width, this.Height); + m_rectWorking = new Rectangle((this.Width - (intMin / 2 * 2)) / 2, (this.Height - (intMin / 2 * 2)) / 2, (intMin / 2 * 2), (intMin / 2 * 2)); + } + + /// + /// 引发 事件。 + /// + /// 包含事件数据的 。 + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + var g = e.Graphics; + g.SetGDIHigh(); + GraphicsPath pathLineIn = new GraphicsPath(); + GraphicsPath pathLineOut = new GraphicsPath(); + int intLinePenWidth = 0; + + switch (exitDirection) + { + case BlowerExitDirection.Left: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5)); + intLinePenWidth = m_rectWorking.Height / 2 - 5; + pathLineOut.AddLine(new Point(-10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Top - 2), new Point(1, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerExitDirection.Right: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5)); + intLinePenWidth = m_rectWorking.Height / 2 - 5; + pathLineOut.AddLine(new Point(this.Width + 10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Top - 2), new Point(this.Width - 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerExitDirection.Up: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5), 0, m_rectWorking.Width / 2 - 5, this.Height / 2)); + intLinePenWidth = m_rectWorking.Width / 2 - 5; + pathLineOut.AddLine(new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Right + 2, 1), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) - 2, 1)); + break; + } + + switch (entranceDirection) + { + case BlowerEntranceDirection.Left: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5)); + pathLineIn.AddLine(new Point(-10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerEntranceDirection.Right: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5)); + pathLineIn.AddLine(new Point(this.Width + 10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2)); + break; + case BlowerEntranceDirection.Up: + g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Left, 0, m_rectWorking.Width / 2 - 5, this.Height / 2)); + pathLineIn.AddLine(new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2)); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left - 2, 1), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) + 2, 1)); + break; + } + + //渐变色 + int _intPenWidth = intLinePenWidth; + int intCount = _intPenWidth / 2 / 4; + for (int i = 0; i < intCount; i++) + { + int _penWidth = _intPenWidth / 2 - 4 * i; + if (_penWidth <= 0) + _penWidth = 1; + if (entranceDirection != BlowerEntranceDirection.None) + g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineIn); + g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineOut); + if (_penWidth == 1) + break; + } + + //底座 + if (isDZ) + { + GraphicsPath gpDZ = new GraphicsPath(); + gpDZ.AddLines(new Point[] + { + new Point( m_rectWorking.Left+m_rectWorking.Width/2,m_rectWorking.Top+m_rectWorking.Height/2), + new Point(m_rectWorking.Left+2,this.Height), + new Point(m_rectWorking.Right-2,this.Height) + }); + gpDZ.CloseAllFigures(); + g.FillPath(new SolidBrush(blowerColor), gpDZ); + g.FillPath(new SolidBrush(Color.FromArgb(50, Color.White)), gpDZ); + g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left, this.Height - 2), new Point(m_rectWorking.Right, this.Height - 2)); + } + + + //中心 + g.FillEllipse(new SolidBrush(blowerColor), m_rectWorking); + g.FillEllipse(new SolidBrush(Color.FromArgb(20, Color.White)), m_rectWorking); + + + //扇叶 + Rectangle _rect = new Rectangle(m_rectWorking.Left + (m_rectWorking.Width - (m_rectWorking.Width / 3 * 2)) / 2, m_rectWorking.Top + (m_rectWorking.Height - (m_rectWorking.Width / 3 * 2)) / 2, (m_rectWorking.Width / 3 * 2), (m_rectWorking.Width / 3 * 2)); + + int _splitCount = 8; + float fltSplitValue = 360F / (float)_splitCount; + for (int i = 0; i <= _splitCount; i++) + { + float fltAngle = (fltSplitValue * i - 180) % 360 + jiaodu; + float fltY1 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 2) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); + float fltX1 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 2) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); + float fltY2 = 0; + float fltX2 = 0; + + fltY2 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 4) * Math.Sin(Math.PI * (fltAngle / 180.00F)))); + fltX2 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 4) * Math.Cos(Math.PI * (fltAngle / 180.00F))))); + + g.DrawLine(new Pen(new SolidBrush(fanColor), 2), new PointF(fltX1, fltY1), new PointF(fltX2, fltY2)); + } + + g.FillEllipse(new SolidBrush(fanColor), new Rectangle(_rect.Left + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Top + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Width / 2 - 4, _rect.Width / 2 - 4)); + g.FillEllipse(new SolidBrush(Color.FromArgb(50, Color.White)), new Rectangle(_rect.Left - 5, _rect.Top - 5, _rect.Width + 10, _rect.Height + 10)); + } + + public delegate void ShowStateHandler(); + + private void timer1_Tick(object sender, EventArgs e) + { + + ShowStateHandler stateHandler = ShowButtonEven_Run; + IAsyncResult result1 = stateHandler.BeginInvoke(null, stateHandler); + + + } + + private void ShowButtonEven_Run() + { + + if (turnAround == JinYuan.ControlLib.TurnAround.Clockwise) + { + jiaodu += 15; + if (jiaodu == 45) + jiaodu = 0; + } + else if (turnAround == JinYuan.ControlLib.TurnAround.Counterclockwise) + { + jiaodu -= 15; + if (jiaodu == -45) + jiaodu = 0; + } + this.BeginInvoke((Action)delegate + { + Refresh(); + }); + } + + + bool IsStop = true; + + //private void Timer_Thread() + //{ + // while (true) + // { + + // if (IsStop) + // { + // continue; + // } + // if (isExit) + // { + // break; + // } + // if (turnAround == JinYuan.ControlLib.TurnAround.Clockwise) + // { + // jiaodu += 15; + // if (jiaodu == 45) + // jiaodu = 0; + // } + // else if (turnAround == JinYuan.ControlLib.TurnAround.Counterclockwise) + // { + // jiaodu -= 15; + // if (jiaodu == -45) + // jiaodu = 0; + // } + // this.Invoke((EventHandler)delegate + // { + // Refresh(); + // }); + // Thread.Sleep(turnSpeed); + // } + //} + + + + private void UCBlower_VisibleChanged(object sender, EventArgs e) + { + //IsStop = !this.Visible; + } + } + + /// + /// Enum BlowerEntranceDirection + /// + public enum BlowerEntranceDirection + { + /// + /// The none + /// + None, + /// + /// The left + /// + Left, + /// + /// The right + /// + Right, + /// + /// Up + /// + Up + } + + /// + /// Enum BlowerExitDirection + /// + public enum BlowerExitDirection + { + /// + /// The none + /// + None, + /// + /// The left + /// + Left, + /// + /// The right + /// + Right, + /// + /// Up + /// + Up + } + /// + /// 旋转方向 + /// + public enum TurnAround + { + /// + /// 不旋转 + /// + None, + /// + /// 顺时针 + /// + Clockwise, + /// + /// 逆时针 + /// + Counterclockwise + } + +} diff --git a/JinYuan.ControlLib/UCBlower.resx b/JinYuan.ControlLib/UCBlower.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/UCBlower.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCCheckBox.Designer.cs b/JinYuan.ControlLib/UCCheckBox.Designer.cs new file mode 100644 index 0000000..d24fd29 --- /dev/null +++ b/JinYuan.ControlLib/UCCheckBox.Designer.cs @@ -0,0 +1,105 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class UCCheckBox. + /// Implements the + /// + /// + partial class UCCheckBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.panel1.Dock = System.Windows.Forms.DockStyle.Left; + this.panel1.Location = new System.Drawing.Point(1, 1); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(18, 28); + this.panel1.TabIndex = 0; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); + this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CheckBox_MouseDown); + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(62)))), ((int)(((byte)(62)))), ((int)(((byte)(62))))); + this.label1.Location = new System.Drawing.Point(19, 1); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0); + this.label1.Size = new System.Drawing.Size(213, 28); + this.label1.TabIndex = 1; + this.label1.Text = "复选框"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CheckBox_MouseDown); + // + // UCCheckBox + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add(this.label1); + this.Controls.Add(this.panel1); + this.Name = "UCCheckBox"; + this.Padding = new System.Windows.Forms.Padding(1); + this.Size = new System.Drawing.Size(233, 30); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CheckBox_MouseDown); + this.ResumeLayout(false); + + } + + #endregion + + /// + /// The panel1 + /// + private System.Windows.Forms.Panel panel1; + /// + /// The label1 + /// + private System.Windows.Forms.Label label1; + } +} diff --git a/JinYuan.ControlLib/UCCheckBox.cs b/JinYuan.ControlLib/UCCheckBox.cs new file mode 100644 index 0000000..863d251 --- /dev/null +++ b/JinYuan.ControlLib/UCCheckBox.cs @@ -0,0 +1,225 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCCheckBox. + /// Implements the + /// + /// + [DefaultEvent("CheckedChangeEvent")] + public partial class UCCheckBox : UserControl + { + /// + /// 选中改变事件 + /// + [Description("选中改变事件"), Category("自定义")] + public event EventHandler CheckedChangeEvent; + /// + /// 字体 + /// + /// The font. + /// + /// + /// + /// + /// + /// + [Description("字体"), Category("自定义")] + public override Font Font + { + get + { + return base.Font; + } + set + { + base.Font = value; + label1.Font = value; + } + } + private Color _boxColor = Color.FromArgb(64, 158, 255); + [Description("颜色"), Category("自定义")] + public Color BoxColor + { + get { return _boxColor; } + set + { + _boxColor = value; + panel1.Refresh(); + } + } + /// + /// The fore color + /// + private Color _ForeColor = Color.FromArgb(62, 62, 62); + /// + /// 字体颜色 + /// + /// The color of the fore. + /// + /// + /// + [Description("字体颜色"), Category("自定义")] + public new Color ForeColor + { + get { return _ForeColor; } + set + { + base.ForeColor = value; + label1.ForeColor = value; + _ForeColor = value; + } + } + /// + /// The text + /// + private string _Text = "复选框"; + /// + /// 文本 + /// + /// The text value. + [Description("文本"), Category("自定义")] + public string TextValue + { + get { return _Text; } + set + { + label1.Text = value; + _Text = value; + } + } + /// + /// The checked + /// + private bool _checked = false; + /// + /// 是否选中 + /// + /// true if checked; otherwise, false. + [Description("是否选中"), Category("自定义")] + public bool Checked + { + get + { + return _checked; + } + set + { + if (_checked != value) + { + _checked = value; + Refresh(); + if (CheckedChangeEvent != null) + { + CheckedChangeEvent(this, null); + } + } + } + } + + /// + /// 获取或设置一个值,该值指示控件是否可以对用户交互作出响应。 + /// + /// true if enabled; otherwise, false. + /// + /// + /// + /// + /// + /// + public new bool Enabled + { + get + { + return base.Enabled; + } + set + { + base.Enabled = value; + Refresh(); + + } + } + /// + /// Initializes a new instance of the class. + /// + public UCCheckBox() + { + InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + } + + /// + /// Handles the MouseDown event of the CheckBox control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CheckBox_MouseDown(object sender, MouseEventArgs e) + { + Checked = !Checked; + } + + private void panel1_Paint(object sender, PaintEventArgs e) + { + e.Graphics.Clear(panel1.BackColor); + + Rectangle rect = new Rectangle(new Point(2, (this.panel1.Height - 14) / 2), new Size(14, 14)); + e.Graphics.SetGDIHigh(); + if (this.Enabled) + { + if (_checked) + { + e.Graphics.DrawRectangle(new Pen(_boxColor, 2), rect); + e.Graphics.FillRectangle(new SolidBrush(_boxColor), new Rectangle(rect.Left + 3, rect.Top + 3, 8, 8)); + } + else + { + e.Graphics.DrawRectangle(new Pen(_boxColor, 2), rect); + } + } + else + { + if (_checked) + { + e.Graphics.DrawRectangle(new Pen(Color.FromArgb(189, 189, 189), 2), rect); + e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(189, 189, 189)), new Rectangle(rect.Left + 3, rect.Top + 3, 8, 8)); + } + else + { + e.Graphics.DrawRectangle(new Pen(Color.FromArgb(189, 189, 189), 2), rect); + + } + } + } + + private void UCCheckBox_EnabledChanged(object sender, EventArgs e) + { + panel1.Refresh(); + } + } +} diff --git a/JinYuan.ControlLib/UCCheckBox.resx b/JinYuan.ControlLib/UCCheckBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/UCCheckBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCControlBase.Designer.cs b/JinYuan.ControlLib/UCControlBase.Designer.cs new file mode 100644 index 0000000..ff23ff7 --- /dev/null +++ b/JinYuan.ControlLib/UCControlBase.Designer.cs @@ -0,0 +1,37 @@ +namespace JinYuan.ControlLib +{ + partial class UCControlBase + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCControlBase.cs b/JinYuan.ControlLib/UCControlBase.cs new file mode 100644 index 0000000..4f27c09 --- /dev/null +++ b/JinYuan.ControlLib/UCControlBase.cs @@ -0,0 +1,265 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCControlBase. + /// Implements the + /// Implements the + /// + /// + /// + [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))] + public partial class UCControlBase : UserControl, IContainerControl + { + /// + /// The is radius + /// + private bool _isRadius = false; + + /// + /// The corner radius + /// + private int _cornerRadius = 24; + + + /// + /// The is show rect + /// + private bool _isShowRect = false; + + /// + /// The rect color + /// + private Color _rectColor = Color.FromArgb(220, 220, 220); + + /// + /// The rect width + /// + private int _rectWidth = 1; + + /// + /// The fill color + /// + private Color _fillColor = Color.Transparent; + /// + /// 是否圆角 + /// + /// true if this instance is radius; otherwise, false. + [Description("是否圆角"), Category("自定义")] + public virtual bool IsRadius + { + get + { + return this._isRadius; + } + set + { + this._isRadius = value; + Refresh(); + } + } + /// + /// 圆角角度 + /// + /// The coner radius. + [Description("圆角角度"), Category("自定义")] + public virtual int ConerRadius + { + get + { + return this._cornerRadius; + } + set + { + this._cornerRadius = Math.Max(value, 1); + Refresh(); + } + } + + /// + /// 是否显示边框 + /// + /// true if this instance is show rect; otherwise, false. + [Description("是否显示边框"), Category("自定义")] + public virtual bool IsShowRect + { + get + { + return this._isShowRect; + } + set + { + this._isShowRect = value; + Refresh(); + } + } + /// + /// 边框颜色 + /// + /// The color of the rect. + [Description("边框颜色"), Category("自定义")] + public virtual Color RectColor + { + get + { + return this._rectColor; + } + set + { + this._rectColor = value; + this.Refresh(); + } + } + /// + /// 边框宽度 + /// + /// The width of the rect. + [Description("边框宽度"), Category("自定义")] + public virtual int RectWidth + { + get + { + return this._rectWidth; + } + set + { + this._rectWidth = value; + Refresh(); + } + } + /// + /// 当使用边框时填充颜色,当值为背景色或透明色或空值则不填充 + /// + /// The color of the fill. + [Description("当使用边框时填充颜色,当值为背景色或透明色或空值则不填充"), Category("自定义")] + public virtual Color FillColor + { + get + { + return this._fillColor; + } + set + { + this._fillColor = value; + Refresh(); + } + } + + /// + /// Initializes a new instance of the class. + /// + public UCControlBase() + { + this.InitializeComponent(); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + } + + /// + /// 引发 事件。 + /// + /// 包含事件数据的 。 + protected override void OnPaint(PaintEventArgs e) + { + if (this.Visible) + { + if (this._isRadius) + { + this.SetWindowRegion(); + } + else + { + //关闭圆角后显示为原矩形 + GraphicsPath g = new GraphicsPath(); + g.AddRectangle(base.ClientRectangle); + g.CloseFigure(); + base.Region = new Region(g); + } + + GraphicsPath graphicsPath = new GraphicsPath(); + if (this._isShowRect || (_fillColor != Color.Empty && _fillColor != Color.Transparent && _fillColor != this.BackColor)) + { + Rectangle clientRectangle = base.ClientRectangle; + if (_isRadius) + { + graphicsPath.AddArc(0, 0, _cornerRadius, _cornerRadius, 180f, 90f); + graphicsPath.AddArc(clientRectangle.Width - _cornerRadius - 1, 0, _cornerRadius, _cornerRadius, 270f, 90f); + graphicsPath.AddArc(clientRectangle.Width - _cornerRadius - 1, clientRectangle.Height - _cornerRadius - 1, _cornerRadius, _cornerRadius, 0f, 90f); + graphicsPath.AddArc(0, clientRectangle.Height - _cornerRadius - 1, _cornerRadius, _cornerRadius, 90f, 90f); + graphicsPath.CloseFigure(); + } + else + { + graphicsPath.AddRectangle(clientRectangle); + } + } + e.Graphics.SetGDIHigh(); + if (_fillColor != Color.Empty && _fillColor != Color.Transparent && _fillColor != this.BackColor) + e.Graphics.FillPath(new SolidBrush(this._fillColor), graphicsPath); + if (this._isShowRect) + { + Color rectColor = this._rectColor; + Pen pen = new Pen(rectColor, (float)this._rectWidth); + e.Graphics.DrawPath(pen, graphicsPath); + } + } + base.OnPaint(e); + } + + /// + /// Sets the window region. + /// + private void SetWindowRegion() + { + GraphicsPath path = new GraphicsPath(); + Rectangle rect = new Rectangle(-1, -1, base.Width + 1, base.Height); + path = this.GetRoundedRectPath(rect, this._cornerRadius); + base.Region = new Region(path); + } + + /// + /// Gets the rounded rect path. + /// + /// The rect. + /// The radius. + /// GraphicsPath. + private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius) + { + Rectangle rect2 = new Rectangle(rect.Location, new Size(radius, radius)); + GraphicsPath graphicsPath = new GraphicsPath(); + graphicsPath.AddArc(rect2, 180f, 90f);//左上角 + rect2.X = rect.Right - radius; + graphicsPath.AddArc(rect2, 270f, 90f);//右上角 + rect2.Y = rect.Bottom - radius; + rect2.Width += 1; + rect2.Height += 1; + graphicsPath.AddArc(rect2, 360f, 90f);//右下角 + rect2.X = rect.Left; + graphicsPath.AddArc(rect2, 90f, 90f);//左下角 + graphicsPath.CloseFigure(); + return graphicsPath; + } + + /// + /// WNDs the proc. + /// + /// 要处理的 Windows 。 + protected override void WndProc(ref Message m) + { + if (m.Msg != 20) + { + base.WndProc(ref m); + } + } + } +} diff --git a/JinYuan.ControlLib/UCElectricityMeterH.Designer.cs b/JinYuan.ControlLib/UCElectricityMeterH.Designer.cs new file mode 100644 index 0000000..f5f837d --- /dev/null +++ b/JinYuan.ControlLib/UCElectricityMeterH.Designer.cs @@ -0,0 +1,340 @@ +namespace JinYuan.ControlLib +{ + partial class UCElectricityMeterH + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UCElectricityMeterV)); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.txtAccumulatedElectricity = new JinYuan.ControlLib.TextSet(); + this.txtPhaseVoltageA = new JinYuan.ControlLib.TextSet(); + this.txtPhaseVoltageB = new JinYuan.ControlLib.TextSet(); + this.txtPhaseVoltageC = new JinYuan.ControlLib.TextSet(); + this.txtPhaseCurrentA = new JinYuan.ControlLib.TextSet(); + this.txtPhaseCurrentB = new JinYuan.ControlLib.TextSet(); + this.txtPhaseCurrentC = new JinYuan.ControlLib.TextSet(); + this.txtPhasePowerA = new JinYuan.ControlLib.TextSet(); + this.txtPhasePowerB = new JinYuan.ControlLib.TextSet(); + this.txtPowerFactor = new JinYuan.ControlLib.TextSet2(); + this.txtPhasePowerC = new JinYuan.ControlLib.TextSet(); + this.txtCt = new JinYuan.ControlLib.TextSet2(); + this.txtPt = new JinYuan.ControlLib.TextSet2(); + this.txtActivePower = new JinYuan.ControlLib.TextSet2(); + this.UCtitleName = new JinYuan.ControlLib.LongTitleStyle2(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 49.50495F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.49505F)); + this.tableLayoutPanel1.Controls.Add(this.txtAccumulatedElectricity, 0, 7); + this.tableLayoutPanel1.Controls.Add(this.txtPhaseVoltageA, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.txtPhaseVoltageB, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.txtPhaseVoltageC, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.txtPhaseCurrentA, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.txtPhaseCurrentB, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.txtPhaseCurrentC, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.txtPhasePowerA, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.txtPhasePowerB, 0, 4); + this.tableLayoutPanel1.Controls.Add(this.txtPowerFactor, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.txtPhasePowerC, 0, 5); + this.tableLayoutPanel1.Controls.Add(this.txtCt, 1, 6); + this.tableLayoutPanel1.Controls.Add(this.txtPt, 1, 5); + this.tableLayoutPanel1.Controls.Add(this.txtActivePower, 1, 4); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 28); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 8; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(361, 303); + this.tableLayoutPanel1.TabIndex = 17; + // + // txtAccumulatedElectricity + // + this.txtAccumulatedElectricity.BindVarName = null; + this.tableLayoutPanel1.SetColumnSpan(this.txtAccumulatedElectricity, 2); + this.txtAccumulatedElectricity.CurrentValue = "0.0"; + this.txtAccumulatedElectricity.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtAccumulatedElectricity.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtAccumulatedElectricity.ForeColor = System.Drawing.Color.White; + this.txtAccumulatedElectricity.Location = new System.Drawing.Point(4, 271); + this.txtAccumulatedElectricity.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtAccumulatedElectricity.Name = "txtAccumulatedElectricity"; + this.txtAccumulatedElectricity.Size = new System.Drawing.Size(353, 28); + this.txtAccumulatedElectricity.TabIndex = 14; + this.txtAccumulatedElectricity.TitleName = "累计有功电能"; + this.txtAccumulatedElectricity.Unit = "kW·h"; + // + // txtPhaseVoltageA + // + this.txtPhaseVoltageA.BindVarName = null; + this.txtPhaseVoltageA.CurrentValue = "123.5"; + this.txtPhaseVoltageA.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseVoltageA.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhaseVoltageA.ForeColor = System.Drawing.Color.White; + this.txtPhaseVoltageA.Location = new System.Drawing.Point(1, 1); + this.txtPhaseVoltageA.Margin = new System.Windows.Forms.Padding(1); + this.txtPhaseVoltageA.Name = "txtPhaseVoltageA"; + this.txtPhaseVoltageA.Size = new System.Drawing.Size(176, 36); + this.txtPhaseVoltageA.TabIndex = 2; + this.txtPhaseVoltageA.TitleName = "A相电压"; + this.txtPhaseVoltageA.Unit = "V"; + // + // txtPhaseVoltageB + // + this.txtPhaseVoltageB.BindVarName = null; + this.txtPhaseVoltageB.CurrentValue = "0.0"; + this.txtPhaseVoltageB.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseVoltageB.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhaseVoltageB.ForeColor = System.Drawing.Color.White; + this.txtPhaseVoltageB.Location = new System.Drawing.Point(4, 43); + this.txtPhaseVoltageB.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhaseVoltageB.Name = "txtPhaseVoltageB"; + this.txtPhaseVoltageB.Size = new System.Drawing.Size(170, 28); + this.txtPhaseVoltageB.TabIndex = 3; + this.txtPhaseVoltageB.TitleName = "B相电压"; + this.txtPhaseVoltageB.Unit = "V"; + // + // txtPhaseVoltageC + // + this.txtPhaseVoltageC.BindVarName = null; + this.txtPhaseVoltageC.CurrentValue = "0.0"; + this.txtPhaseVoltageC.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseVoltageC.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhaseVoltageC.ForeColor = System.Drawing.Color.White; + this.txtPhaseVoltageC.Location = new System.Drawing.Point(4, 81); + this.txtPhaseVoltageC.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhaseVoltageC.Name = "txtPhaseVoltageC"; + this.txtPhaseVoltageC.Size = new System.Drawing.Size(170, 28); + this.txtPhaseVoltageC.TabIndex = 4; + this.txtPhaseVoltageC.TitleName = "C相电压"; + this.txtPhaseVoltageC.Unit = "V"; + // + // txtPhaseCurrentA + // + this.txtPhaseCurrentA.BindVarName = null; + this.txtPhaseCurrentA.CurrentValue = "0.0"; + this.txtPhaseCurrentA.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseCurrentA.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhaseCurrentA.ForeColor = System.Drawing.Color.White; + this.txtPhaseCurrentA.Location = new System.Drawing.Point(182, 5); + this.txtPhaseCurrentA.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhaseCurrentA.Name = "txtPhaseCurrentA"; + this.txtPhaseCurrentA.Size = new System.Drawing.Size(175, 28); + this.txtPhaseCurrentA.TabIndex = 5; + this.txtPhaseCurrentA.TitleName = "A相电流"; + this.txtPhaseCurrentA.Unit = "A"; + // + // txtPhaseCurrentB + // + this.txtPhaseCurrentB.BindVarName = null; + this.txtPhaseCurrentB.CurrentValue = "0.0"; + this.txtPhaseCurrentB.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseCurrentB.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhaseCurrentB.ForeColor = System.Drawing.Color.White; + this.txtPhaseCurrentB.Location = new System.Drawing.Point(182, 43); + this.txtPhaseCurrentB.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhaseCurrentB.Name = "txtPhaseCurrentB"; + this.txtPhaseCurrentB.Size = new System.Drawing.Size(175, 28); + this.txtPhaseCurrentB.TabIndex = 6; + this.txtPhaseCurrentB.TitleName = "B相电流"; + this.txtPhaseCurrentB.Unit = "A"; + // + // txtPhaseCurrentC + // + this.txtPhaseCurrentC.BindVarName = null; + this.txtPhaseCurrentC.CurrentValue = "0.0"; + this.txtPhaseCurrentC.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseCurrentC.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhaseCurrentC.ForeColor = System.Drawing.Color.White; + this.txtPhaseCurrentC.Location = new System.Drawing.Point(182, 81); + this.txtPhaseCurrentC.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhaseCurrentC.Name = "txtPhaseCurrentC"; + this.txtPhaseCurrentC.Size = new System.Drawing.Size(175, 28); + this.txtPhaseCurrentC.TabIndex = 7; + this.txtPhaseCurrentC.TitleName = "C相电流"; + this.txtPhaseCurrentC.Unit = "A"; + // + // txtPhasePowerA + // + this.txtPhasePowerA.BindVarName = null; + this.txtPhasePowerA.CurrentValue = "0.0"; + this.txtPhasePowerA.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhasePowerA.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhasePowerA.ForeColor = System.Drawing.Color.White; + this.txtPhasePowerA.Location = new System.Drawing.Point(4, 119); + this.txtPhasePowerA.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhasePowerA.Name = "txtPhasePowerA"; + this.txtPhasePowerA.Size = new System.Drawing.Size(170, 28); + this.txtPhasePowerA.TabIndex = 8; + this.txtPhasePowerA.TitleName = "A相功率"; + this.txtPhasePowerA.Unit = "W"; + // + // txtPhasePowerB + // + this.txtPhasePowerB.BindVarName = null; + this.txtPhasePowerB.CurrentValue = "0.0"; + this.txtPhasePowerB.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhasePowerB.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhasePowerB.ForeColor = System.Drawing.Color.White; + this.txtPhasePowerB.Location = new System.Drawing.Point(4, 157); + this.txtPhasePowerB.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhasePowerB.Name = "txtPhasePowerB"; + this.txtPhasePowerB.Size = new System.Drawing.Size(170, 28); + this.txtPhasePowerB.TabIndex = 9; + this.txtPhasePowerB.TitleName = "B相功率"; + this.txtPhasePowerB.Unit = "W"; + // + // txtPowerFactor + // + this.txtPowerFactor.BindVarName = null; + this.txtPowerFactor.CurrentValue = "0.0"; + this.txtPowerFactor.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPowerFactor.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPowerFactor.ForeColor = System.Drawing.Color.White; + this.txtPowerFactor.Location = new System.Drawing.Point(182, 119); + this.txtPowerFactor.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPowerFactor.Name = "txtPowerFactor"; + this.txtPowerFactor.Size = new System.Drawing.Size(175, 28); + this.txtPowerFactor.TabIndex = 19; + this.txtPowerFactor.TitleName = "总功率因素"; + // + // txtPhasePowerC + // + this.txtPhasePowerC.BindVarName = null; + this.txtPhasePowerC.CurrentValue = "0.0"; + this.txtPhasePowerC.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhasePowerC.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPhasePowerC.ForeColor = System.Drawing.Color.White; + this.txtPhasePowerC.Location = new System.Drawing.Point(4, 195); + this.txtPhasePowerC.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPhasePowerC.Name = "txtPhasePowerC"; + this.txtPhasePowerC.Size = new System.Drawing.Size(170, 28); + this.txtPhasePowerC.TabIndex = 10; + this.txtPhasePowerC.TitleName = "C相功率"; + this.txtPhasePowerC.Unit = "W"; + // + // txtCt + // + this.txtCt.BindVarName = null; + this.txtCt.CurrentValue = "0.0"; + this.txtCt.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtCt.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtCt.ForeColor = System.Drawing.Color.White; + this.txtCt.Location = new System.Drawing.Point(182, 233); + this.txtCt.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtCt.Name = "txtCt"; + this.txtCt.Size = new System.Drawing.Size(175, 28); + this.txtCt.TabIndex = 18; + this.txtCt.TitleName = "电流变比"; + // + // txtPt + // + this.txtPt.BindVarName = null; + this.txtPt.CurrentValue = "0.0"; + this.txtPt.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPt.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtPt.ForeColor = System.Drawing.Color.White; + this.txtPt.Location = new System.Drawing.Point(182, 195); + this.txtPt.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtPt.Name = "txtPt"; + this.txtPt.Size = new System.Drawing.Size(175, 28); + this.txtPt.TabIndex = 18; + this.txtPt.TitleName = "电压变比"; + // + // txtActivePower + // + this.txtActivePower.BindVarName = null; + this.txtActivePower.CurrentValue = "0.0"; + this.txtActivePower.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtActivePower.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.txtActivePower.ForeColor = System.Drawing.Color.White; + this.txtActivePower.Location = new System.Drawing.Point(182, 157); + this.txtActivePower.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtActivePower.Name = "txtActivePower"; + this.txtActivePower.Size = new System.Drawing.Size(175, 28); + this.txtActivePower.TabIndex = 20; + this.txtActivePower.TitleName = "总有功功率"; + // + // UCtitleName + // + this.UCtitleName.BackColor = System.Drawing.Color.Transparent; + this.UCtitleName.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("UCtitleName.BackgroundImage"))); + this.UCtitleName.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.UCtitleName.Dock = System.Windows.Forms.DockStyle.Top; + this.UCtitleName.Location = new System.Drawing.Point(0, 0); + this.UCtitleName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.UCtitleName.Name = "UCtitleName"; + this.UCtitleName.Size = new System.Drawing.Size(361, 28); + this.UCtitleName.TabIndex = 1; + this.UCtitleName.TitleName = "智能电表"; + // + // UCElectricityMeter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(31)))), ((int)(((byte)(39)))), ((int)(((byte)(104))))); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.UCtitleName); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "UCElectricityMeter"; + this.Size = new System.Drawing.Size(361, 331); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private LongTitleStyle2 UCtitleName; + private TextSet txtPhaseVoltageA; + private TextSet txtPhaseVoltageB; + private TextSet txtPhaseVoltageC; + private TextSet txtPhaseCurrentA; + private TextSet txtPhaseCurrentB; + private TextSet txtPhaseCurrentC; + private TextSet txtPhasePowerA; + private TextSet txtPhasePowerB; + private TextSet txtPhasePowerC; + private TextSet txtAccumulatedElectricity; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private TextSet2 txtActivePower; + private TextSet2 txtCt; + private TextSet2 txtPowerFactor; + private TextSet2 txtPt; + } +} diff --git a/JinYuan.ControlLib/UCElectricityMeterH.cs b/JinYuan.ControlLib/UCElectricityMeterH.cs new file mode 100644 index 0000000..e80d325 --- /dev/null +++ b/JinYuan.ControlLib/UCElectricityMeterH.cs @@ -0,0 +1,335 @@ +using JinYuan.Models; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class UCElectricityMeterH : UserControl + { + public UCElectricityMeterH() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + //#region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + //#endregion + + + + private string smartMeter = "智能电表"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相电压")] + public override string Text + { + get { return smartMeter; } + set + { + smartMeter = value; + this.UCtitleName.Text = smartMeter; + } + } + + + #region 相电压 + private string phaseVoltageA = "A相电压"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相电压")] + public string Text1 + { + get { return phaseVoltageA; } + set + { + phaseVoltageA = value; + this.txtPhaseVoltageA.TitleName = phaseVoltageA; + } + } + + + private string phaseVoltageB = "B相电压"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件B相电压")] + public string Text2 + { + get { return phaseVoltageB; } + set + { + phaseVoltageB = value; + this.txtPhaseVoltageB.Text = phaseVoltageB; + } + } + + + private string phaseVoltageC = "C相电压"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件C相电压")] + public string Text3 + { + get { return phaseVoltageC; } + set + { + phaseVoltageC = value; + this.txtPhaseVoltageC.Text = phaseVoltageC; + } + } + #endregion + + #region 相电流 + private string phaseCurrentA = "A相电流"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相电流")] + public string Text4 + { + get { return phaseCurrentA; } + set + { + phaseCurrentA = value; + this.txtPhaseCurrentA.Text = phaseCurrentA; + } + } + + private string phaseCurrentB = "B相电流"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件B相电流")] + public string Text5 + { + get { return phaseCurrentB; } + set + { + phaseCurrentB = value; + this.txtPhaseCurrentB.Text = phaseCurrentB; + } + } + + + + private string phaseCurrentC = "C相电流"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件C相电流")] + public string Text6 + { + get { return phaseCurrentC; } + set + { + phaseCurrentC = value; + this.txtPhaseCurrentC.Text = phaseCurrentC; + } + } + #endregion + + #region 相功率 + private string phasePowerA = "A相功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相功率")] + public string Text7 + { + get { return phasePowerA; } + set + { + phasePowerA = value; + this.txtPhasePowerA.Text = phasePowerA; + } + } + + private string phasePowerB = "B相功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件B相功率")] + public string Text8 + { + get { return phasePowerB; } + set + { + phasePowerB = value; + this.txtPhasePowerB.Text = phasePowerB; + } + } + + + + private string phasePowerC = "C相功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件C相功率")] + public string Text9 + { + get { return phasePowerC; } + set + { + phasePowerC = value; + this.txtPhasePowerC.Text = phasePowerC; + } + } + #endregion + + private string activePower = "总有功功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件总有功功率")] + public string Text10 + { + get { return activePower; } + set + { + activePower = value; + this.txtActivePower.TitleName = activePower; + + } + } + + private string powerFactor = "总功率因数"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件总功率因数")] + public string Text11 + { + get { return powerFactor; } + set + { + powerFactor = value; + this.txtPowerFactor.TitleName = powerFactor; + + } + } + + private string pt = "电压变比"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件电压变比")] + public string Text12 + { + get { return pt; } + set + { + pt = value; + this.txtPt.TitleName = pt; + + } + } + + private string ct = "电流变比"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件电流变比")] + public string Text13 + { + get { return ct; } + set + { + ct = value; + this.txtCt.TitleName = ct; + + } + } + + private string accumulatedElectricity = "累计电能"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件累计电能")] + public string Text14 + { + get { return accumulatedElectricity; } + set + { + accumulatedElectricity = value; + this.txtAccumulatedElectricity.TitleName = accumulatedElectricity; + + } + } + + + private JinYuan.Models.ElectricEnergy _electricEnergy = new JinYuan.Models.ElectricEnergy(); + [Browsable(false)] + [Category("自定义属性")] + [Description("设置或获取实体类值")] + public ElectricEnergy ElectricEnergy + { + get + { + return _electricEnergy; + } + set + { + if (value != null) + { + _electricEnergy = value; + SetElectricEnergy(_electricEnergy); + } + + } + } + + + + + private void SetElectricEnergy(ElectricEnergy m) + { + //累计电能 + this.txtAccumulatedElectricity.CurrentValue = m.AccumulatedElectricity.ToString(); + //A相电压 V + this.txtPhaseVoltageA.CurrentValue = m.PhaseVoltageA.ToString(); + //B相电压 + this.txtPhaseVoltageB.CurrentValue = m.PhaseVoltageB.ToString(); + //C相电压 + this.txtPhaseVoltageC.CurrentValue = m.PhaseVoltageC.ToString(); + // A相电流 + this.txtPhaseCurrentA.CurrentValue = m.PhaseCurrentA.ToString(); + // B相电流 + this.txtPhaseCurrentB.CurrentValue = m.PhaseCurrentB.ToString(); + // C相电流 + this.txtPhaseCurrentC.CurrentValue = m.PhaseCurrentC.ToString(); + // A相功率 + this.txtPhasePowerA.CurrentValue = m.PhasePowerA.ToString(); + // B相功率 + this.txtPhasePowerB.CurrentValue = m.PhasePowerB.ToString(); + // C相功率 + this.txtPhasePowerC.CurrentValue = m.PhasePowerC.ToString(); + // 总有功功率 + this.txtActivePower.CurrentValue = m.ActivePower.ToString(); + // 总功率因数 + this.txtPowerFactor.CurrentValue = m.PowerFactor.ToString(); + // 电压变比 + this.txtPt.CurrentValue = m.pt.ToString(); + // 电流变比 + this.txtCt.CurrentValue = m.ct.ToString(); + } + } +} diff --git a/JinYuan.ControlLib/UCElectricityMeterH.resx b/JinYuan.ControlLib/UCElectricityMeterH.resx new file mode 100644 index 0000000..337f422 --- /dev/null +++ b/JinYuan.ControlLib/UCElectricityMeterH.resx @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCElectricityMeterV.Designer.cs b/JinYuan.ControlLib/UCElectricityMeterV.Designer.cs new file mode 100644 index 0000000..59ec74a --- /dev/null +++ b/JinYuan.ControlLib/UCElectricityMeterV.Designer.cs @@ -0,0 +1,768 @@ +namespace JinYuan.ControlLib +{ + partial class UCElectricityMeterV + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UCElectricityMeterV)); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.lblAccumulatedElectricityUint = new System.Windows.Forms.Label(); + this.txtAccumulatedElectricity = new System.Windows.Forms.Label(); + this.lblActivePowerUint = new System.Windows.Forms.Label(); + this.lblActivePower = new System.Windows.Forms.Label(); + this.txtTotalPower = new System.Windows.Forms.Label(); + this.lblPowerFactor = new System.Windows.Forms.Label(); + this.txtPowerFactor = new System.Windows.Forms.Label(); + this.lblPhasePowerCUint = new System.Windows.Forms.Label(); + this.lblPhasePowerC = new System.Windows.Forms.Label(); + this.txtPhasePowerC = new System.Windows.Forms.Label(); + this.lblPhasePowerBUint = new System.Windows.Forms.Label(); + this.lblPhasePowerB = new System.Windows.Forms.Label(); + this.txtPhasePowerB = new System.Windows.Forms.Label(); + this.lblPhasePowerAUint = new System.Windows.Forms.Label(); + this.lblPhasePowerA = new System.Windows.Forms.Label(); + this.txtPhasePowerA = new System.Windows.Forms.Label(); + this.lblCt = new System.Windows.Forms.Label(); + this.txtCt = new System.Windows.Forms.Label(); + this.lblPhaseCurrentCUint = new System.Windows.Forms.Label(); + this.lblPhaseCurrentC = new System.Windows.Forms.Label(); + this.txtPhaseCurrentC = new System.Windows.Forms.Label(); + this.lblPhaseCurrentBUint = new System.Windows.Forms.Label(); + this.lblPhaseCurrentB = new System.Windows.Forms.Label(); + this.txtPhaseCurrentB = new System.Windows.Forms.Label(); + this.lblPhaseCurrentAUint = new System.Windows.Forms.Label(); + this.lblPhaseCurrentA = new System.Windows.Forms.Label(); + this.txtPhaseCurrentA = new System.Windows.Forms.Label(); + this.lblPt = new System.Windows.Forms.Label(); + this.txtPt = new System.Windows.Forms.Label(); + this.lblPhaseVoltageCUint = new System.Windows.Forms.Label(); + this.lblPhaseVoltageC = new System.Windows.Forms.Label(); + this.txtPhaseVoltageC = new System.Windows.Forms.Label(); + this.lblPhaseVoltageBUint = new System.Windows.Forms.Label(); + this.lblPhaseVoltageB = new System.Windows.Forms.Label(); + this.txtPhaseVoltageB = new System.Windows.Forms.Label(); + this.lblPhaseVoltageAUint = new System.Windows.Forms.Label(); + this.lblPhaseVoltageA = new System.Windows.Forms.Label(); + this.txtPhaseVoltageA = new System.Windows.Forms.Label(); + this.lblAccumulatedElectricity = new System.Windows.Forms.Label(); + this.UCtitleName = new JinYuan.ControlLib.LongTitleStyle2(); + this.tableLayoutPanel2.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 12; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 63F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 51F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 24F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 64F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 54F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 29F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 65F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 55F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 81F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 45F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel2.Controls.Add(this.lblAccumulatedElectricityUint, 10, 3); + this.tableLayoutPanel2.Controls.Add(this.txtAccumulatedElectricity, 5, 3); + this.tableLayoutPanel2.Controls.Add(this.lblActivePowerUint, 4, 3); + this.tableLayoutPanel2.Controls.Add(this.lblActivePower, 2, 3); + this.tableLayoutPanel2.Controls.Add(this.txtTotalPower, 0, 3); + this.tableLayoutPanel2.Controls.Add(this.lblPowerFactor, 10, 2); + this.tableLayoutPanel2.Controls.Add(this.txtPowerFactor, 9, 2); + this.tableLayoutPanel2.Controls.Add(this.lblPhasePowerCUint, 8, 2); + this.tableLayoutPanel2.Controls.Add(this.lblPhasePowerC, 7, 2); + this.tableLayoutPanel2.Controls.Add(this.txtPhasePowerC, 6, 2); + this.tableLayoutPanel2.Controls.Add(this.lblPhasePowerBUint, 5, 2); + this.tableLayoutPanel2.Controls.Add(this.lblPhasePowerB, 4, 2); + this.tableLayoutPanel2.Controls.Add(this.txtPhasePowerB, 3, 2); + this.tableLayoutPanel2.Controls.Add(this.lblPhasePowerAUint, 2, 2); + this.tableLayoutPanel2.Controls.Add(this.lblPhasePowerA, 1, 2); + this.tableLayoutPanel2.Controls.Add(this.txtPhasePowerA, 0, 2); + this.tableLayoutPanel2.Controls.Add(this.lblCt, 10, 1); + this.tableLayoutPanel2.Controls.Add(this.txtCt, 9, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseCurrentCUint, 8, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseCurrentC, 7, 1); + this.tableLayoutPanel2.Controls.Add(this.txtPhaseCurrentC, 6, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseCurrentBUint, 5, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseCurrentB, 4, 1); + this.tableLayoutPanel2.Controls.Add(this.txtPhaseCurrentB, 3, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseCurrentAUint, 2, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseCurrentA, 1, 1); + this.tableLayoutPanel2.Controls.Add(this.txtPhaseCurrentA, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.lblPt, 10, 0); + this.tableLayoutPanel2.Controls.Add(this.txtPt, 9, 0); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseVoltageCUint, 8, 0); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseVoltageC, 7, 0); + this.tableLayoutPanel2.Controls.Add(this.txtPhaseVoltageC, 6, 0); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseVoltageBUint, 5, 0); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseVoltageB, 4, 0); + this.tableLayoutPanel2.Controls.Add(this.txtPhaseVoltageB, 3, 0); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseVoltageAUint, 2, 0); + this.tableLayoutPanel2.Controls.Add(this.lblPhaseVoltageA, 1, 0); + this.tableLayoutPanel2.Controls.Add(this.txtPhaseVoltageA, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.lblAccumulatedElectricity, 8, 3); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 32); + this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 5; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(569, 95); + this.tableLayoutPanel2.TabIndex = 18; + // + // lblAccumulatedElectricityUint + // + this.lblAccumulatedElectricityUint.AutoSize = true; + this.lblAccumulatedElectricityUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblAccumulatedElectricityUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblAccumulatedElectricityUint.ForeColor = System.Drawing.Color.White; + this.lblAccumulatedElectricityUint.Location = new System.Drawing.Point(525, 69); + this.lblAccumulatedElectricityUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblAccumulatedElectricityUint.Name = "lblAccumulatedElectricityUint"; + this.lblAccumulatedElectricityUint.Size = new System.Drawing.Size(37, 25); + this.lblAccumulatedElectricityUint.TabIndex = 38; + this.lblAccumulatedElectricityUint.Text = "kW·h"; + this.lblAccumulatedElectricityUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtAccumulatedElectricity + // + this.txtAccumulatedElectricity.AutoSize = true; + this.tableLayoutPanel2.SetColumnSpan(this.txtAccumulatedElectricity, 3); + this.txtAccumulatedElectricity.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtAccumulatedElectricity.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtAccumulatedElectricity.ForeColor = System.Drawing.Color.White; + this.txtAccumulatedElectricity.Location = new System.Drawing.Point(260, 69); + this.txtAccumulatedElectricity.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtAccumulatedElectricity.Name = "txtAccumulatedElectricity"; + this.txtAccumulatedElectricity.Size = new System.Drawing.Size(141, 25); + this.txtAccumulatedElectricity.TabIndex = 36; + this.txtAccumulatedElectricity.Text = "累计电能"; + this.txtAccumulatedElectricity.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblActivePowerUint + // + this.lblActivePowerUint.AutoSize = true; + this.lblActivePowerUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblActivePowerUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblActivePowerUint.ForeColor = System.Drawing.Color.White; + this.lblActivePowerUint.Location = new System.Drawing.Point(206, 69); + this.lblActivePowerUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblActivePowerUint.Name = "lblActivePowerUint"; + this.lblActivePowerUint.Size = new System.Drawing.Size(46, 25); + this.lblActivePowerUint.TabIndex = 35; + this.lblActivePowerUint.Text = "W"; + this.lblActivePowerUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblActivePower + // + this.lblActivePower.AutoSize = true; + this.tableLayoutPanel2.SetColumnSpan(this.lblActivePower, 2); + this.lblActivePower.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblActivePower.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblActivePower.ForeColor = System.Drawing.Color.White; + this.lblActivePower.Location = new System.Drawing.Point(118, 69); + this.lblActivePower.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblActivePower.Name = "lblActivePower"; + this.lblActivePower.Size = new System.Drawing.Size(80, 25); + this.lblActivePower.TabIndex = 34; + this.lblActivePower.Text = "232.5"; + this.lblActivePower.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtTotalPower + // + this.txtTotalPower.AutoSize = true; + this.tableLayoutPanel2.SetColumnSpan(this.txtTotalPower, 2); + this.txtTotalPower.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtTotalPower.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtTotalPower.ForeColor = System.Drawing.Color.White; + this.txtTotalPower.Location = new System.Drawing.Point(4, 69); + this.txtTotalPower.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtTotalPower.Name = "txtTotalPower"; + this.txtTotalPower.Size = new System.Drawing.Size(106, 25); + this.txtTotalPower.TabIndex = 33; + this.txtTotalPower.Text = "总功率"; + this.txtTotalPower.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPowerFactor + // + this.lblPowerFactor.AutoSize = true; + this.lblPowerFactor.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPowerFactor.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPowerFactor.ForeColor = System.Drawing.Color.White; + this.lblPowerFactor.Location = new System.Drawing.Point(525, 44); + this.lblPowerFactor.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPowerFactor.Name = "lblPowerFactor"; + this.lblPowerFactor.Size = new System.Drawing.Size(37, 25); + this.lblPowerFactor.TabIndex = 32; + this.lblPowerFactor.Text = "1"; + this.lblPowerFactor.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPowerFactor + // + this.txtPowerFactor.AutoSize = true; + this.txtPowerFactor.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPowerFactor.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPowerFactor.ForeColor = System.Drawing.Color.White; + this.txtPowerFactor.Location = new System.Drawing.Point(444, 44); + this.txtPowerFactor.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPowerFactor.Name = "txtPowerFactor"; + this.txtPowerFactor.Size = new System.Drawing.Size(73, 25); + this.txtPowerFactor.TabIndex = 31; + this.txtPowerFactor.Text = "总功率因素"; + this.txtPowerFactor.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhasePowerCUint + // + this.lblPhasePowerCUint.AutoSize = true; + this.lblPhasePowerCUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhasePowerCUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhasePowerCUint.ForeColor = System.Drawing.Color.White; + this.lblPhasePowerCUint.Location = new System.Drawing.Point(409, 44); + this.lblPhasePowerCUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhasePowerCUint.Name = "lblPhasePowerCUint"; + this.lblPhasePowerCUint.Size = new System.Drawing.Size(27, 25); + this.lblPhasePowerCUint.TabIndex = 30; + this.lblPhasePowerCUint.Text = "W"; + this.lblPhasePowerCUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhasePowerC + // + this.lblPhasePowerC.AutoSize = true; + this.lblPhasePowerC.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhasePowerC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhasePowerC.ForeColor = System.Drawing.Color.White; + this.lblPhasePowerC.Location = new System.Drawing.Point(354, 44); + this.lblPhasePowerC.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhasePowerC.Name = "lblPhasePowerC"; + this.lblPhasePowerC.Size = new System.Drawing.Size(47, 25); + this.lblPhasePowerC.TabIndex = 29; + this.lblPhasePowerC.Text = "0"; + this.lblPhasePowerC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhasePowerC + // + this.txtPhasePowerC.AutoSize = true; + this.txtPhasePowerC.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhasePowerC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhasePowerC.ForeColor = System.Drawing.Color.White; + this.txtPhasePowerC.Location = new System.Drawing.Point(289, 44); + this.txtPhasePowerC.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhasePowerC.Name = "txtPhasePowerC"; + this.txtPhasePowerC.Size = new System.Drawing.Size(57, 25); + this.txtPhasePowerC.TabIndex = 28; + this.txtPhasePowerC.Text = "C相功率"; + this.txtPhasePowerC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhasePowerBUint + // + this.lblPhasePowerBUint.AutoSize = true; + this.lblPhasePowerBUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhasePowerBUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhasePowerBUint.ForeColor = System.Drawing.Color.White; + this.lblPhasePowerBUint.Location = new System.Drawing.Point(260, 44); + this.lblPhasePowerBUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhasePowerBUint.Name = "lblPhasePowerBUint"; + this.lblPhasePowerBUint.Size = new System.Drawing.Size(21, 25); + this.lblPhasePowerBUint.TabIndex = 27; + this.lblPhasePowerBUint.Text = "W"; + this.lblPhasePowerBUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhasePowerB + // + this.lblPhasePowerB.AutoSize = true; + this.lblPhasePowerB.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhasePowerB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhasePowerB.ForeColor = System.Drawing.Color.White; + this.lblPhasePowerB.Location = new System.Drawing.Point(206, 44); + this.lblPhasePowerB.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhasePowerB.Name = "lblPhasePowerB"; + this.lblPhasePowerB.Size = new System.Drawing.Size(46, 25); + this.lblPhasePowerB.TabIndex = 26; + this.lblPhasePowerB.Text = "232.5"; + this.lblPhasePowerB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhasePowerB + // + this.txtPhasePowerB.AutoSize = true; + this.txtPhasePowerB.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhasePowerB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhasePowerB.ForeColor = System.Drawing.Color.White; + this.txtPhasePowerB.Location = new System.Drawing.Point(142, 44); + this.txtPhasePowerB.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhasePowerB.Name = "txtPhasePowerB"; + this.txtPhasePowerB.Size = new System.Drawing.Size(56, 25); + this.txtPhasePowerB.TabIndex = 25; + this.txtPhasePowerB.Text = "B相功率"; + this.txtPhasePowerB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhasePowerAUint + // + this.lblPhasePowerAUint.AutoSize = true; + this.lblPhasePowerAUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhasePowerAUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhasePowerAUint.ForeColor = System.Drawing.Color.White; + this.lblPhasePowerAUint.Location = new System.Drawing.Point(118, 44); + this.lblPhasePowerAUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhasePowerAUint.Name = "lblPhasePowerAUint"; + this.lblPhasePowerAUint.Size = new System.Drawing.Size(16, 25); + this.lblPhasePowerAUint.TabIndex = 24; + this.lblPhasePowerAUint.Text = "W"; + this.lblPhasePowerAUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhasePowerA + // + this.lblPhasePowerA.AutoSize = true; + this.lblPhasePowerA.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhasePowerA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhasePowerA.ForeColor = System.Drawing.Color.White; + this.lblPhasePowerA.Location = new System.Drawing.Point(67, 44); + this.lblPhasePowerA.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhasePowerA.Name = "lblPhasePowerA"; + this.lblPhasePowerA.Size = new System.Drawing.Size(43, 25); + this.lblPhasePowerA.TabIndex = 23; + this.lblPhasePowerA.Text = "232.5"; + this.lblPhasePowerA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhasePowerA + // + this.txtPhasePowerA.AutoSize = true; + this.txtPhasePowerA.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhasePowerA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhasePowerA.ForeColor = System.Drawing.Color.White; + this.txtPhasePowerA.Location = new System.Drawing.Point(4, 44); + this.txtPhasePowerA.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhasePowerA.Name = "txtPhasePowerA"; + this.txtPhasePowerA.Size = new System.Drawing.Size(55, 25); + this.txtPhasePowerA.TabIndex = 22; + this.txtPhasePowerA.Text = "A相功率"; + this.txtPhasePowerA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblCt + // + this.lblCt.AutoSize = true; + this.lblCt.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblCt.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblCt.ForeColor = System.Drawing.Color.White; + this.lblCt.Location = new System.Drawing.Point(525, 24); + this.lblCt.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCt.Name = "lblCt"; + this.lblCt.Size = new System.Drawing.Size(37, 20); + this.lblCt.TabIndex = 21; + this.lblCt.Text = "1"; + this.lblCt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtCt + // + this.txtCt.AutoSize = true; + this.txtCt.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtCt.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtCt.ForeColor = System.Drawing.Color.White; + this.txtCt.Location = new System.Drawing.Point(444, 24); + this.txtCt.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtCt.Name = "txtCt"; + this.txtCt.Size = new System.Drawing.Size(73, 20); + this.txtCt.TabIndex = 20; + this.txtCt.Text = "电流变比"; + this.txtCt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseCurrentCUint + // + this.lblPhaseCurrentCUint.AutoSize = true; + this.lblPhaseCurrentCUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseCurrentCUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseCurrentCUint.ForeColor = System.Drawing.Color.White; + this.lblPhaseCurrentCUint.Location = new System.Drawing.Point(409, 24); + this.lblPhaseCurrentCUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseCurrentCUint.Name = "lblPhaseCurrentCUint"; + this.lblPhaseCurrentCUint.Size = new System.Drawing.Size(27, 20); + this.lblPhaseCurrentCUint.TabIndex = 19; + this.lblPhaseCurrentCUint.Text = "A"; + this.lblPhaseCurrentCUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseCurrentC + // + this.lblPhaseCurrentC.AutoSize = true; + this.lblPhaseCurrentC.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseCurrentC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseCurrentC.ForeColor = System.Drawing.Color.White; + this.lblPhaseCurrentC.Location = new System.Drawing.Point(354, 24); + this.lblPhaseCurrentC.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseCurrentC.Name = "lblPhaseCurrentC"; + this.lblPhaseCurrentC.Size = new System.Drawing.Size(47, 20); + this.lblPhaseCurrentC.TabIndex = 18; + this.lblPhaseCurrentC.Text = "232.5"; + this.lblPhaseCurrentC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhaseCurrentC + // + this.txtPhaseCurrentC.AutoSize = true; + this.txtPhaseCurrentC.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseCurrentC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseCurrentC.ForeColor = System.Drawing.Color.White; + this.txtPhaseCurrentC.Location = new System.Drawing.Point(289, 24); + this.txtPhaseCurrentC.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhaseCurrentC.Name = "txtPhaseCurrentC"; + this.txtPhaseCurrentC.Size = new System.Drawing.Size(57, 20); + this.txtPhaseCurrentC.TabIndex = 17; + this.txtPhaseCurrentC.Text = "C相电流"; + this.txtPhaseCurrentC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseCurrentBUint + // + this.lblPhaseCurrentBUint.AutoSize = true; + this.lblPhaseCurrentBUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseCurrentBUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseCurrentBUint.ForeColor = System.Drawing.Color.White; + this.lblPhaseCurrentBUint.Location = new System.Drawing.Point(260, 24); + this.lblPhaseCurrentBUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseCurrentBUint.Name = "lblPhaseCurrentBUint"; + this.lblPhaseCurrentBUint.Size = new System.Drawing.Size(21, 20); + this.lblPhaseCurrentBUint.TabIndex = 16; + this.lblPhaseCurrentBUint.Text = "A"; + this.lblPhaseCurrentBUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseCurrentB + // + this.lblPhaseCurrentB.AutoSize = true; + this.lblPhaseCurrentB.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseCurrentB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseCurrentB.ForeColor = System.Drawing.Color.White; + this.lblPhaseCurrentB.Location = new System.Drawing.Point(206, 24); + this.lblPhaseCurrentB.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseCurrentB.Name = "lblPhaseCurrentB"; + this.lblPhaseCurrentB.Size = new System.Drawing.Size(46, 20); + this.lblPhaseCurrentB.TabIndex = 15; + this.lblPhaseCurrentB.Text = "232.5"; + this.lblPhaseCurrentB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhaseCurrentB + // + this.txtPhaseCurrentB.AutoSize = true; + this.txtPhaseCurrentB.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseCurrentB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseCurrentB.ForeColor = System.Drawing.Color.White; + this.txtPhaseCurrentB.Location = new System.Drawing.Point(142, 24); + this.txtPhaseCurrentB.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhaseCurrentB.Name = "txtPhaseCurrentB"; + this.txtPhaseCurrentB.Size = new System.Drawing.Size(56, 20); + this.txtPhaseCurrentB.TabIndex = 14; + this.txtPhaseCurrentB.Text = "B相电流"; + this.txtPhaseCurrentB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseCurrentAUint + // + this.lblPhaseCurrentAUint.AutoSize = true; + this.lblPhaseCurrentAUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseCurrentAUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseCurrentAUint.ForeColor = System.Drawing.Color.White; + this.lblPhaseCurrentAUint.Location = new System.Drawing.Point(118, 24); + this.lblPhaseCurrentAUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseCurrentAUint.Name = "lblPhaseCurrentAUint"; + this.lblPhaseCurrentAUint.Size = new System.Drawing.Size(16, 20); + this.lblPhaseCurrentAUint.TabIndex = 13; + this.lblPhaseCurrentAUint.Text = "A"; + this.lblPhaseCurrentAUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseCurrentA + // + this.lblPhaseCurrentA.AutoSize = true; + this.lblPhaseCurrentA.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseCurrentA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseCurrentA.ForeColor = System.Drawing.Color.White; + this.lblPhaseCurrentA.Location = new System.Drawing.Point(67, 24); + this.lblPhaseCurrentA.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseCurrentA.Name = "lblPhaseCurrentA"; + this.lblPhaseCurrentA.Size = new System.Drawing.Size(43, 20); + this.lblPhaseCurrentA.TabIndex = 12; + this.lblPhaseCurrentA.Text = "232.5"; + this.lblPhaseCurrentA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhaseCurrentA + // + this.txtPhaseCurrentA.AutoSize = true; + this.txtPhaseCurrentA.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseCurrentA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseCurrentA.ForeColor = System.Drawing.Color.White; + this.txtPhaseCurrentA.Location = new System.Drawing.Point(4, 24); + this.txtPhaseCurrentA.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhaseCurrentA.Name = "txtPhaseCurrentA"; + this.txtPhaseCurrentA.Size = new System.Drawing.Size(55, 20); + this.txtPhaseCurrentA.TabIndex = 11; + this.txtPhaseCurrentA.Text = "A相电流"; + this.txtPhaseCurrentA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPt + // + this.lblPt.AutoSize = true; + this.lblPt.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPt.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPt.ForeColor = System.Drawing.Color.White; + this.lblPt.Location = new System.Drawing.Point(525, 0); + this.lblPt.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPt.Name = "lblPt"; + this.lblPt.Size = new System.Drawing.Size(37, 24); + this.lblPt.TabIndex = 10; + this.lblPt.Text = "1"; + this.lblPt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPt + // + this.txtPt.AutoSize = true; + this.txtPt.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPt.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPt.ForeColor = System.Drawing.Color.White; + this.txtPt.Location = new System.Drawing.Point(444, 0); + this.txtPt.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPt.Name = "txtPt"; + this.txtPt.Size = new System.Drawing.Size(73, 24); + this.txtPt.TabIndex = 9; + this.txtPt.Text = "电压变比"; + this.txtPt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseVoltageCUint + // + this.lblPhaseVoltageCUint.AutoSize = true; + this.lblPhaseVoltageCUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseVoltageCUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseVoltageCUint.ForeColor = System.Drawing.Color.White; + this.lblPhaseVoltageCUint.Location = new System.Drawing.Point(409, 0); + this.lblPhaseVoltageCUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseVoltageCUint.Name = "lblPhaseVoltageCUint"; + this.lblPhaseVoltageCUint.Size = new System.Drawing.Size(27, 24); + this.lblPhaseVoltageCUint.TabIndex = 8; + this.lblPhaseVoltageCUint.Text = "V"; + this.lblPhaseVoltageCUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseVoltageC + // + this.lblPhaseVoltageC.AutoSize = true; + this.lblPhaseVoltageC.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseVoltageC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseVoltageC.ForeColor = System.Drawing.Color.White; + this.lblPhaseVoltageC.Location = new System.Drawing.Point(354, 0); + this.lblPhaseVoltageC.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseVoltageC.Name = "lblPhaseVoltageC"; + this.lblPhaseVoltageC.Size = new System.Drawing.Size(47, 24); + this.lblPhaseVoltageC.TabIndex = 7; + this.lblPhaseVoltageC.Text = "232.5"; + this.lblPhaseVoltageC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhaseVoltageC + // + this.txtPhaseVoltageC.AutoSize = true; + this.txtPhaseVoltageC.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseVoltageC.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseVoltageC.ForeColor = System.Drawing.Color.White; + this.txtPhaseVoltageC.Location = new System.Drawing.Point(289, 0); + this.txtPhaseVoltageC.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhaseVoltageC.Name = "txtPhaseVoltageC"; + this.txtPhaseVoltageC.Size = new System.Drawing.Size(57, 24); + this.txtPhaseVoltageC.TabIndex = 6; + this.txtPhaseVoltageC.Text = "C相电压"; + this.txtPhaseVoltageC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseVoltageBUint + // + this.lblPhaseVoltageBUint.AutoSize = true; + this.lblPhaseVoltageBUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseVoltageBUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseVoltageBUint.ForeColor = System.Drawing.Color.White; + this.lblPhaseVoltageBUint.Location = new System.Drawing.Point(260, 0); + this.lblPhaseVoltageBUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseVoltageBUint.Name = "lblPhaseVoltageBUint"; + this.lblPhaseVoltageBUint.Size = new System.Drawing.Size(21, 24); + this.lblPhaseVoltageBUint.TabIndex = 5; + this.lblPhaseVoltageBUint.Text = "V"; + this.lblPhaseVoltageBUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseVoltageB + // + this.lblPhaseVoltageB.AutoSize = true; + this.lblPhaseVoltageB.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseVoltageB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseVoltageB.ForeColor = System.Drawing.Color.White; + this.lblPhaseVoltageB.Location = new System.Drawing.Point(206, 0); + this.lblPhaseVoltageB.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseVoltageB.Name = "lblPhaseVoltageB"; + this.lblPhaseVoltageB.Size = new System.Drawing.Size(46, 24); + this.lblPhaseVoltageB.TabIndex = 4; + this.lblPhaseVoltageB.Text = "232.5"; + this.lblPhaseVoltageB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhaseVoltageB + // + this.txtPhaseVoltageB.AutoSize = true; + this.txtPhaseVoltageB.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseVoltageB.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseVoltageB.ForeColor = System.Drawing.Color.White; + this.txtPhaseVoltageB.Location = new System.Drawing.Point(142, 0); + this.txtPhaseVoltageB.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhaseVoltageB.Name = "txtPhaseVoltageB"; + this.txtPhaseVoltageB.Size = new System.Drawing.Size(56, 24); + this.txtPhaseVoltageB.TabIndex = 3; + this.txtPhaseVoltageB.Text = "B相电压"; + this.txtPhaseVoltageB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseVoltageAUint + // + this.lblPhaseVoltageAUint.AutoSize = true; + this.lblPhaseVoltageAUint.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseVoltageAUint.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseVoltageAUint.ForeColor = System.Drawing.Color.White; + this.lblPhaseVoltageAUint.Location = new System.Drawing.Point(118, 0); + this.lblPhaseVoltageAUint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseVoltageAUint.Name = "lblPhaseVoltageAUint"; + this.lblPhaseVoltageAUint.Size = new System.Drawing.Size(16, 24); + this.lblPhaseVoltageAUint.TabIndex = 2; + this.lblPhaseVoltageAUint.Text = "V"; + this.lblPhaseVoltageAUint.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblPhaseVoltageA + // + this.lblPhaseVoltageA.AutoSize = true; + this.lblPhaseVoltageA.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblPhaseVoltageA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblPhaseVoltageA.ForeColor = System.Drawing.Color.White; + this.lblPhaseVoltageA.Location = new System.Drawing.Point(67, 0); + this.lblPhaseVoltageA.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPhaseVoltageA.Name = "lblPhaseVoltageA"; + this.lblPhaseVoltageA.Size = new System.Drawing.Size(43, 24); + this.lblPhaseVoltageA.TabIndex = 1; + this.lblPhaseVoltageA.Text = "232.5"; + this.lblPhaseVoltageA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // txtPhaseVoltageA + // + this.txtPhaseVoltageA.AutoSize = true; + this.txtPhaseVoltageA.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtPhaseVoltageA.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txtPhaseVoltageA.ForeColor = System.Drawing.Color.White; + this.txtPhaseVoltageA.Location = new System.Drawing.Point(4, 0); + this.txtPhaseVoltageA.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.txtPhaseVoltageA.Name = "txtPhaseVoltageA"; + this.txtPhaseVoltageA.Size = new System.Drawing.Size(55, 24); + this.txtPhaseVoltageA.TabIndex = 0; + this.txtPhaseVoltageA.Text = "A相电压"; + this.txtPhaseVoltageA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblAccumulatedElectricity + // + this.lblAccumulatedElectricity.AutoSize = true; + this.tableLayoutPanel2.SetColumnSpan(this.lblAccumulatedElectricity, 2); + this.lblAccumulatedElectricity.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblAccumulatedElectricity.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblAccumulatedElectricity.ForeColor = System.Drawing.Color.White; + this.lblAccumulatedElectricity.Location = new System.Drawing.Point(409, 69); + this.lblAccumulatedElectricity.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblAccumulatedElectricity.Name = "lblAccumulatedElectricity"; + this.lblAccumulatedElectricity.Size = new System.Drawing.Size(108, 25); + this.lblAccumulatedElectricity.TabIndex = 37; + this.lblAccumulatedElectricity.Text = "232.5"; + this.lblAccumulatedElectricity.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // UCtitleName + // + this.UCtitleName.BackColor = System.Drawing.Color.Transparent; + this.UCtitleName.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("UCtitleName.BackgroundImage"))); + this.UCtitleName.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.UCtitleName.Dock = System.Windows.Forms.DockStyle.Top; + this.UCtitleName.Location = new System.Drawing.Point(0, 0); + this.UCtitleName.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); + this.UCtitleName.Name = "UCtitleName"; + this.UCtitleName.Size = new System.Drawing.Size(569, 32); + this.UCtitleName.TabIndex = 1; + this.UCtitleName.TitleName = "智能电表"; + // + // UCElectricityMeterV + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(31)))), ((int)(((byte)(39)))), ((int)(((byte)(104))))); + this.Controls.Add(this.tableLayoutPanel2); + this.Controls.Add(this.UCtitleName); + this.Font = new System.Drawing.Font("微软雅黑", 7.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); + this.Name = "UCElectricityMeterV"; + this.Size = new System.Drawing.Size(569, 127); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private LongTitleStyle2 UCtitleName; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.Label lblPhaseVoltageBUint; + private System.Windows.Forms.Label lblPhaseVoltageB; + private System.Windows.Forms.Label txtPhaseVoltageB; + private System.Windows.Forms.Label lblPhaseVoltageAUint; + private System.Windows.Forms.Label lblPhaseVoltageA; + private System.Windows.Forms.Label txtPhaseVoltageA; + private System.Windows.Forms.Label txtPowerFactor; + private System.Windows.Forms.Label lblPhasePowerCUint; + private System.Windows.Forms.Label lblPhasePowerC; + private System.Windows.Forms.Label txtPhasePowerC; + private System.Windows.Forms.Label lblPhasePowerBUint; + private System.Windows.Forms.Label lblPhasePowerB; + private System.Windows.Forms.Label txtPhasePowerB; + private System.Windows.Forms.Label lblPhasePowerAUint; + private System.Windows.Forms.Label lblPhasePowerA; + private System.Windows.Forms.Label txtPhasePowerA; + private System.Windows.Forms.Label lblCt; + private System.Windows.Forms.Label txtCt; + private System.Windows.Forms.Label lblPhaseCurrentCUint; + private System.Windows.Forms.Label lblPhaseCurrentC; + private System.Windows.Forms.Label txtPhaseCurrentC; + private System.Windows.Forms.Label lblPhaseCurrentBUint; + private System.Windows.Forms.Label lblPhaseCurrentB; + private System.Windows.Forms.Label txtPhaseCurrentB; + private System.Windows.Forms.Label lblPhaseCurrentAUint; + private System.Windows.Forms.Label lblPhaseCurrentA; + private System.Windows.Forms.Label txtPhaseCurrentA; + private System.Windows.Forms.Label lblPt; + private System.Windows.Forms.Label txtPt; + private System.Windows.Forms.Label lblPhaseVoltageCUint; + private System.Windows.Forms.Label lblPhaseVoltageC; + private System.Windows.Forms.Label txtPhaseVoltageC; + private System.Windows.Forms.Label lblAccumulatedElectricityUint; + private System.Windows.Forms.Label txtAccumulatedElectricity; + private System.Windows.Forms.Label lblActivePowerUint; + private System.Windows.Forms.Label lblActivePower; + private System.Windows.Forms.Label txtTotalPower; + private System.Windows.Forms.Label lblPowerFactor; + private System.Windows.Forms.Label lblAccumulatedElectricity; + } +} diff --git a/JinYuan.ControlLib/UCElectricityMeterV.cs b/JinYuan.ControlLib/UCElectricityMeterV.cs new file mode 100644 index 0000000..951abe3 --- /dev/null +++ b/JinYuan.ControlLib/UCElectricityMeterV.cs @@ -0,0 +1,341 @@ +using JinYuan.Models; +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class UCElectricityMeterV : UserControl + { + public UCElectricityMeterV() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + //#region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + //#endregion + + + + private string smartMeter = "智能电表"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相电压")] + public override string Text + { + get { return smartMeter; } + set + { + smartMeter = value; + this.UCtitleName.TitleName = smartMeter; + } + } + + + #region 相电压 + private string phaseVoltageA = "A相电压"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相电压")] + public string Text1 + { + get { return phaseVoltageA; } + set + { + phaseVoltageA = value; + this.txtPhaseVoltageA.Text = phaseVoltageA; + } + } + + + private string phaseVoltageB = "B相电压"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件B相电压")] + public string Text2 + { + get { return phaseVoltageB; } + set + { + phaseVoltageB = value; + this.txtPhaseVoltageB.Text = phaseVoltageB; + } + } + + + private string phaseVoltageC = "C相电压"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件C相电压")] + public string Text3 + { + get { return phaseVoltageC; } + set + { + phaseVoltageC = value; + this.txtPhaseVoltageC.Text = phaseVoltageC; + } + } + #endregion + + #region 相电流 + private string phaseCurrentA = "A相电流"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相电流")] + public string Text4 + { + get { return phaseCurrentA; } + set + { + phaseCurrentA = value; + this.txtPhaseCurrentA.Text = phaseCurrentA; + } + } + + private string phaseCurrentB = "B相电流"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件B相电流")] + public string Text5 + { + get { return phaseCurrentB; } + set + { + phaseCurrentB = value; + this.txtPhaseCurrentB.Text = phaseCurrentB; + } + } + + + + private string phaseCurrentC = "C相电流"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件C相电流")] + public string Text6 + { + get { return phaseCurrentC; } + set + { + phaseCurrentC = value; + this.txtPhaseCurrentC.Text = phaseCurrentC; + } + } + #endregion + + #region 相功率 + private string phasePowerA = "A相功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件A相功率")] + public string Text7 + { + get { return phasePowerA; } + set + { + phasePowerA = value; + this.txtPhasePowerA.Text = phasePowerA; + } + } + + private string phasePowerB = "B相功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件B相功率")] + public string Text8 + { + get { return phasePowerB; } + set + { + phasePowerB = value; + this.txtPhasePowerB.Text = phasePowerB; + } + } + + + + private string phasePowerC = "C相功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件C相功率")] + public string Text9 + { + get { return phasePowerC; } + set + { + phasePowerC = value; + this.txtPhasePowerC.Text = phasePowerC; + } + } + #endregion + + private string activePower = "总有功功率"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件总有功功率")] + public string Text10 + { + get { return activePower; } + set + { + activePower = value; + this.txtTotalPower.Text = activePower; + + } + } + + private string powerFactor = "总功率因素"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件总功率因素")] + public string Text11 + { + get { return powerFactor; } + set + { + powerFactor = value; + this.txtPowerFactor.Text = powerFactor; + + } + } + + + + + private string pt = "电压变比"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件电压变比")] + public string Text12 + { + get { return pt; } + set + { + pt = value; + this.txtPt.Text = pt; + + } + } + + private string ct = "电流变比"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件电流变比")] + public string Text13 + { + get { return ct; } + set + { + ct = value; + this.txtCt.Text = ct; + + } + } + + + + private string accumulatedElectricity = "累计电能"; + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取控件累计电能")] + public string Text14 + { + get { return accumulatedElectricity; } + set + { + accumulatedElectricity = value; + this.txtAccumulatedElectricity.Text = accumulatedElectricity; + + } + } + + + + private JinYuan.Models.ElectricEnergy _electricEnergy = new JinYuan.Models.ElectricEnergy(); + [Browsable(false)] + [Category("自定义属性")] + [Description("设置或获取实体类值")] + public ElectricEnergy ElectricEnergy + { + get + { + return _electricEnergy; + } + set + { + if (value != null) + { + _electricEnergy = value; + SetElectricEnergy(_electricEnergy); + } + + } + } + + + + + private void SetElectricEnergy(ElectricEnergy m) + { + //累计电能 + this.lblAccumulatedElectricity.Text = m.AccumulatedElectricity.ToString(); + //A相电压 V + this.lblPhaseVoltageA.Text = m.PhaseVoltageA.ToString(); + //B相电压 + this.lblPhaseVoltageB.Text = m.PhaseVoltageB.ToString(); + //C相电压 + this.lblPhaseVoltageC.Text = m.PhaseVoltageC.ToString(); + // A相电流 + this.lblPhaseCurrentA.Text = m.PhaseCurrentA.ToString(); + // B相电流 + this.lblPhaseCurrentB.Text = m.PhaseCurrentB.ToString(); + // C相电流 + this.lblPhaseCurrentC.Text = m.PhaseCurrentC.ToString(); + // A相功率 + this.lblPhasePowerA.Text = m.PhasePowerA.ToString(); + // B相功率 + this.lblPhasePowerB.Text = m.PhasePowerB.ToString(); + // C相功率 + this.lblPhasePowerC.Text = m.PhasePowerC.ToString(); + // 总有功功率 + this.lblActivePower.Text = m.ActivePower.ToString(); + // 总功率因数 + this.lblPowerFactor.Text = m.PowerFactor.ToString(); + // 电压变比 + this.lblPt.Text = m.pt.ToString(); + // 电流变比 + this.lblCt.Text = m.ct.ToString(); + } + } +} diff --git a/JinYuan.ControlLib/UCElectricityMeterV.resx b/JinYuan.ControlLib/UCElectricityMeterV.resx new file mode 100644 index 0000000..032a807 --- /dev/null +++ b/JinYuan.ControlLib/UCElectricityMeterV.resx @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAkcAAAApCAYAAAA/Io30AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAA + SMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEo + qGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAG + eIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK + 7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gz + SZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25q + bc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9Cvjc + M4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4 + oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjK + uLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqx + OPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIW + iAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFV + SAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAy + rA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYg + hUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2 + aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7r + h2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/ + Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SE + dJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3J + aSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQt + lHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJ + y5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV + 9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1 + JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7 + m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hop + b2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsy + u21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj + 9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCc + cNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527P + YS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT + 4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOw + EaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6s + faznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP + 8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy + +rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVs + S1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7 + SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9Uxlfe + qXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/w + jowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9V + t1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO + 6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503r + m10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9 + qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h + ++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7 + Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsMAAALDAE/QCLIAAAUQElEQVR4Xu2dB7QmRZXH2TXn + UJJzztCAkkVQJJo44ooY19XFsAK6Ii4uu7qu7oq6IEUawgyMZEZGcnIERmCKyYHJOefYk2ew9vy+7973 + 7tR8783IwfcOu/d/zv9Vv/66vq6+3XXv/7tV3b3NNn8Bqlxb/k0nLLctabf92y6sWx6Sw+FwOBwOxytH + B+LkdYb8bwVLKU60jtZ7vWFZv7O6bP8GQ1u/VV0XRw6Hw+FwbCXK2NmCVgeU7EgDvJp1O2Nj2y6DaZiK + G4TJG6tcv0nIsoqVVgdpxQ3bvrnK9VuFLPMd1G8ldOw+td7bhSy/Rb7T7rs0anlIDofD4XA4CpSx03Br + NECrGG7rqg7Q+qV26Kiu3bdNrpQJkkbdLoNpoB4UIuVtVa7fYcj/rG9lIJZZjxHZ7l1Vrt8rfE+V63fK + ej4vRQ7LGBARxHahyvV2wm3lO1jP57rv0rjlITkcDofD4ShQxk4T/22SgnhN3CWWQzQAMdjGcFtXRZHG + curbJIcKLNUOZV3dN9uxf74DqubYRDd0GUwDaQQNwhCIGhUpENHy7hYiR43COgyBmNm+yvWuVa53k3In + EToYGUOpkdQg7JPP2A/b71Plel8p95D67J/vbyWwykNyOBwOh8NRoIUoKmO4xn7i7s5S8r+N/3a6DMvE + dGI7ggoNQLy3CQ4VV2yn9cp9U5/t2I+S/1VctcX98pj+ajCqkQbQGIQIBvluletDqlzvVeV6d1n3viKT + o9kmDgCj7ijbX1/l+oQq14dWuT5Q1lEfQ6nIUaXIPjEi+zi4ynW/KtdnVbk+tsr1UbJuTxFdiCjdd9cr + SYfD4XA4XqPoIFukCQpiLHF4vyrXB1W5PqnK9RMSv4ntxHib4CgTI2xDUoTtj6xyfY0ILNUNmgmy2SI7 + asT++Q6SIxdJvTKp0uXiiIOkAag1FTg9qlxfVeX60yKSMBiGUxWpDdaDYz0i5rAq14OrXD9T5fpCEUmI + HEQShkMIIYg0fYdRd5HPj6tynatcL6tyfYWIpJOlPgZDYLHvTQRSeUwOh8PhcDg2RSGMdCoMwoQYvL+I + muOrXP9E4jDxuKpyvbdJUOhcYjvqgzY4QOL/BRL/0QHoBr5bEyM6D0n3jeDie9EG7OPjojvQH4wkoRdU + WKFTui7ei6FoLA1FqdFIVCONU15W5fqDksVhqAtj0GAEkh4gChHjkPHBKMreVa7PEeFDfb6fk4FA4js4 + eFWap8nJUA6qcv31KtenV7k+WgTSDlJP03tdZyyHw+FwOF6jMMNZiBQVRsRkYjOi6Lwq1wOKOEzsJ0HC + dipydH4x8Zj4jSgifvcq4v8RIno0buuNWpoYIeHB5x+ocn1poTs0IaIZq24TR4gVRA8HygHZRsLfiOHI + 8KDodB4Q9VRUYaBTCuPA/lWuL6lyfYyoUz1gHYpjHeIJEWVPClxR5frqKtcflXYhztg3xmpkj8pjcjgc + DofDsSnMSBFZH0ZhSGqQDGGEh9Ea4m0ZgxnBQbwgYtAIOlFb9cLhMkpEnC9jP9/L95M9It7rZG0dpeI7 + GZ1CX5SaA0FGvEdfUI94323iCHWHWsMQZUOVqDvmEpEK04lTOqSm2Z/SQMqeVa5PlBQcB4zI0ZPD+Cbi + qzwxyheqXJ8tQop9097GBK/ymBwOh8PhcGwKyRrpSBGjNogTYvZzLWKu8lwROYwMIWjI+OhQHCNFt7SI + 9cqPiHjSmK93wbFv4v4PWmgMJXpCh/OI990mjmg0B84YIRmesqGWV1a5PlWUIOKIxqMgmRt0ZgsDWT5d + 5frzUgdjYWBSeswtYn15YiyXVrn+nmSedGjNxZHD4XA4HFuAGVLTZAg3Xuncoo54fpXrD4mYIZmBMELc + sF7nFnXEM0TkkDzR+coQ/aBzizoiU2nQI7SzW8WRGovG0KiyoZYcFAfXKnOEMUoDWWJMjIpxbeYI47O+ + PDGWnEROphrLM0cOh8PhcGwFRByRVCC5QJKBZANJhzLWWpK0IHlBEoNkBkkNkhusJ9lRxnhLkiUkTUie + 6GgTSRX0A0mWUltYkqRBj5C0ob3dKo5oPGksRE7ZUCVpMMSMPruIRmMs0makz0ijlQZSkn4jDYeBEUZ6 + +x/pOtJ2pO/KE6Mk7Uf6j/axbx2DdHHkcDgcDscWUGSOiPdMU2G6CtNWypirZLoL015s5khjPtNkmC5T + xnolMbtV5oh9Mz2nnIRtyfQevQmrWzNHercaE6CYCFU2lAlTTJxCnCBoOECdtY4SRPDoxK7SQEzUYsIW + 4gkFWU7q0tnqTPwqTwwTxJgophO7ODl6O3/Xzl53OBwOh+M1CjPniBuaEDnEe2504oYnbnxqNSFb7zZH + SOnzjiCZJ9aR4eGGq1YTsrlBixu1uGELfYHIQTewb27s4gYvxFerCdm0S/VCt4kjfc6RHjBqzTYSdaez + 1fVhjogifR8a2SPUHZ9zQNY43NqHesRAHCjbIYp01jrfheEQZNwyaE8KtxRiOG4xtI8BoK4+bbPrjOVw + OBwOx2sUEu/1GUcat4n3TKXhkTk8OodH6Ng4rNkf4rc+dwixYh8DoHeb8+geG/8ZKWJkiKSG3q2mmgHR + gzijPrGfRwZZ3UEyREVVt92thjhC6Ohzh1B0NI65RTyUCdFDI0mF6QHqU64RKSpyyB4xRohRmFvEw6AQ + RRhHHyCpT7mmPvvUJ3OyDx42xclgbhEPoUIUcVJQpzoUp/tue8+aw+FwOByOziExU7NHeju/JkSYG8Tc + IkZwGK3RidoIHzI8+jBHTYwgkNALaAM+pz4jPIwS6URt4r8OqaEv9DUi+tBpfYAkuoEECaNTOlFbn8zN + dt32nCP7fhTECkqNx3djMBqHeEGY6MFhWH2/CssqrKiHQuSx4ao0MZze/mffj2b3aV89wuPKdXxTn8qt + T+a0+24IIxdHDofD4XBsGcU71VQgaYICEUMWB5FDxgeRxOu8WEcc1rdb2Nd/aWIEgUX8RiQxlwiRxGvE + VODogxypp68d07droBuozz7YHpHEjVes0wdGd/1Dn42h/uIXwEmpE7w4ULZr9eI5fTKmvh9F69lHmKuK + xCD2hXcYtcOXzro4cjgcDodjy9jCS2cRIsRdhrrsC+AZSbKjPpqgKJMqxHvq2xfPI7rKxIjGf923xn/2 + z36UxH40Rfe8LqyFoTQTRIOgvkfFZousOFGRg5FUXGEInaytabRWwsYaSMWVTtRGUGn6brNskYsjh8Ph + cDi2HmXsNCNHNpNjExzQjhrpXN9SN6jIYTtEDd8BdX6xaoiyru5bXymCBlDa+N8YUuvSeG8aahtLQyyt + KCoFis0gqbjCgFAPSj/vqK4aSAUW1PqtBNkmdDgcDofD0TnK2FnEYWK1jgLZJAfLNkmhAqdVDCd2641a + Ws8mR8q6dt9bpQG6DC0a2hlLo5Z19eAt/5p1G3Q4HA6Hw9E5ytjZIhar0FGxouwsyWHr2vplcqWzumV9 + pdUBjboOh8PhcDgcrxpaCJNWtGJkM3GyBb5adUu2bedwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8Ph + cDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwO + h8PhcDgcDofD4XA4HA6Hw+FwOBwOx/9RhJicTqfT6XQ6ncLNVjidTqfT6XT+fyZ/Xi98Qyd8Ywu+SWiX + 4ZtNqXyL8K0F32b4duE7Cr4zxPQuw3dL+Z4Q03sN3yfcVsjy9iGmHaTU5R1DTDsJdxHuKtw9xLSH4Z4h + pr1DTPuEmPY1PDDEdECI6WDhoSGmQ0JMh4WYKuGRIab3C482PC7EdHyI6cQQ00khpg8JTwkxfVh4aojp + tBDTmSGms0JMHwsxfVz4iRDTp4Xnhpj+LsR0XojpcyGmL4SYvhRi+kqI6ashpn8IMX0txPT1ENM/hpi+ + LfxOiOnCENNFIabvhph+IPxhiOmyENOPhD8W/lT48xDTf4WYrggx/TLE9KsQ029CTFeHmGKI6doQ0/Uh + putCTDeFmG4OMfUKMfUMMd0mvDPEdFeI6d4QU58Q031S9g0x/T7E9ECI6WHhYyGmJ0NMT4WY/hBi+qPw + mRDTn0JMzwkHhJiS4YshpkEhpqEhpmHCESGml4SjQ0xjQkzjQkxjDSeEmCaFmCaHmKaEmKaFmGYIZwpn + hZhmh5jmCOeGmOYJFxguMlwcYloSYlpquEy4XLgixLQyxFRLqVwtXCVcY7jWcJ0p4fqCG4QbXwFfNiz/ + 13WW7Mduq+vs50ptm7azPAZ7jGoLljl+/d/aB2I3La091dZqe3seIOcIcs4WGs5vQc63Xgt6jUyXa2Sq + LHMtsUw5Ua4rXeZ64zocJWSZaxRyvQ4OMQ0RDpTrWq9zrv3+IaanpaQ/9DN95fEQ0xPSfx6UPvWQ9C/6 + 2e+Ed0tf1D5J/9T+qv23R4jpBiH9m75+lZD+/+sQ0y/EL/xniOlnUuI3/j3E9G/Gp+BfLhX+c4jpe+KD + /kn4LfFTFwjxX/gx/Nnfh5i+HGL6YojpfPF3+L3PiB/EH54TYvqk+MmzxXdClvGl+NSPin9Vf6v+94Mh + phOEx4qPPkZ8tvrxo0JMRwgPF3+P71f/TyzQ2LB/iGk/IfEDEksgcUVjzG5CjUEak3YWEq+IW0ri2HZF + nIPBUGMjJSRmatxUEldhGW+JwTYuQxuzNZZbaozXeG91gGWpIZSlzij1B1SdsiW+zpR22a7bKiKOykZ0 + JIpaCSEriEoh1EoQtRJDpSDSk2ZFkZ5cPdl68vViKIWRFUNWEOkFx7JejHpxqjDiwt3LXNCIIb3Iuei5 + +A8yHYKSTkJnQRTRcehEKoroYFBFkXZAhBEd9GQjiCCdl458hpQIIwTRp0yJM/isCCOcBM4CUaTCSEUR + VEeDKMIBIYrgxSGm74eYLhFnpQ7s8hDTv4pjw8H9hzg8nB+CCGGEU/wfI4oQQ0qc6I3iWHGyONtbQ0y3 + h5juEId8jxFF9xsHTvmI8FFx7jh7qKLoWSEB4oUWwkgDinK4UAMQomi8EUYsE6w0eCGIEEYENUqCnBVH + KopUGKk4olRRhBiypQZdpQ3IiCKoQVxLDfRWAFhhpOKoFEWWnYmjVkKpI7FTiqGS5fZlXbtshRAs22pF + kxVLViDpshVIVhyVQgmbQrW1FaWlUFIRa0WSiqGy1PMOrXCm5LrRa0hFkVL/5xrkmtRSr0+uVa5ZK44Q + +yqSVCBpf2CZkj7Cjwio4kj7E32LHxwIJPujBCKM6Jf0z94ikui7t0g/pj/zowdxRH+/RsorRRxZgcQP + KPwF5AcVfgRagQQRR5AfZ/gjfrCpSPpmiOkb4rfwYQgjRJIKpM8L8YEIJPwgVIGkPx7xl/hPBBK+9HTx + ryqQIL4XPwwRSPhlfrjio/HX+G314VYk8eMXn68iSak/mDVOEDM0fhBLVCQRY6AKJeIPtGJJRZL+mFeh + RKkxTmOeFUpWLLUSSaVYKkWSjc2lWCoTHKVAsiLJiqWSpUAqWWqRkqUoarVua9ihcNpm/ct/znDdxo74 + 8mZcW3DNhs25esPLedX69hKuXL+xrazXbWyUK9ZtyuUFl67dkJetbZZL1rRzEVy9vo0LVjU5f9X6PG9l + ezl35boGZ9fr8hwpZ65ocsaKtQ1OX742TzOcvHRNg5OWrskTl6zJ45esbnDs4iZHL1rV4Etw4ao8auGq + PGLByjYOm78yD5lXN/jinBV54Nw6D5izIg+Y3eTzs5bn/jObfHbm8vz0jGW53/Qmn5q2tMHHpyzJj01Z + kh+dsiQ/OGlxfmjS4vzAxMX59xMX574TF+X7JyzKfcYvyveOW5jvGrsw3zFmQb5zzIL829ELcu/R8/Nt + L83PvUbNz7eOmp9vGTkv3zxyXu4xfG6+YfjcfP3wufnaoXNyHDInXz1kTr5y8Oz860Gz8i8Hzsq/eHFW + /u80M/9swMz88zQz//SFGQ3+5PkZ+cfPT8+XPzc9/6j/tHxZ/2n5h89Oy5c+OzVf8szU/P2np+aL/zgl + X9xvSr6o3+QGv/nkpPztpyblbzw5KX/t8YkNfvWxCfnLj07IX3l0Qv7Cw+MbPP/h8flzD43L5wk/++C4 + /JkHxuZzHxibP9l3TP5U3zH5nL5jGstn9Rmdz+wzulGeft9L+bR7mzz1nlGN8sP3jGrw5LtH5ZPuGplP + unNkPuGOEfn4O0bk425v57HCo3oPz+/vPTwfeduwfMRtwxolrG4dlg+/dWg+rNfQfGivofmQnkPzwT3b + ywNvGZIP6jmkUe5/85C8H7xpcN7XcJ+bBue9b2znnj0GNbiH4e49BuVdbxjY4C7XD8y73dD8n2W4s+FO + 17Vzx+tebMkdrm1Sl7c33O6aJu2y5bbXpDZ2tL4jbu132fZYarvt/+WxQbUDy5TWPpbYTu1qbWttv9eN + zfNR0p4zzmPj3Ao513relQfItaDXBuSa4fqx1xTX2dG/HZ4/IGT5mNub5FrkOj3xznZy/XIdn3L3qLbr + +yNSnnFfk2f3Gd3Gj/1udP7E/c2+ov2HvgTpX8ovPjI+f+mR8Zv0RZbpnxc8OSl/66lJjb57Yb/JjeXv + /GFyY5n+TT+nz0P6/7+IL7j8T9Mb/gGqz8B/QPzJFQNn5V8NnNXwM/ibqwbPbvgeeN2wuQ3im24a0fRT + +Kueo5rEl90+ekEb8Xf4uvvGLWz4QHwhxC/iI/GVD09ekh+Z3O5DKZ+Y2vSt+Fl8rhIfrP4Y3/yC+Gn8 + dhL/PXheO/Hr+PiRC5rE/8NGPJDYMGbR6jxucTNuTJD4QSyBxJUpy9bkqcuapcYd4pDGJDirbsYrjV3E + MWKa5UKJfZTEQS0b8XHNhrxYaGOnxlSljbsah4nPSuK0pcZzJTFeWeqAUisoS03RZKk9mrQaRZe3lhte + ATf+uVn+L91+H9j2IH7hAAAAAElFTkSuQmCC + + + + True + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCFengSu.Designer.cs b/JinYuan.ControlLib/UCFengSu.Designer.cs new file mode 100644 index 0000000..b73a03a --- /dev/null +++ b/JinYuan.ControlLib/UCFengSu.Designer.cs @@ -0,0 +1,120 @@ +namespace JinYuan.ControlLib +{ + partial class UCFengSu + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.MainTableLayoutControl = new System.Windows.Forms.TableLayoutPanel(); + this.ucbFengSu = new JinYuan.ControlLib.UCBlower(); + this.lbl_Value = new System.Windows.Forms.Label(); + this.lbl_Title = new System.Windows.Forms.Label(); + this.MainTableLayoutControl.SuspendLayout(); + this.SuspendLayout(); + // + // MainTableLayoutControl + // + this.MainTableLayoutControl.ColumnCount = 3; + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 19.83594F)); + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 44.35146F)); + this.MainTableLayoutControl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35.98326F)); + this.MainTableLayoutControl.Controls.Add(this.ucbFengSu, 0, 0); + this.MainTableLayoutControl.Controls.Add(this.lbl_Value, 2, 0); + this.MainTableLayoutControl.Controls.Add(this.lbl_Title, 1, 0); + this.MainTableLayoutControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainTableLayoutControl.Location = new System.Drawing.Point(0, 0); + this.MainTableLayoutControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MainTableLayoutControl.Name = "MainTableLayoutControl"; + this.MainTableLayoutControl.RowCount = 1; + this.MainTableLayoutControl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.MainTableLayoutControl.Size = new System.Drawing.Size(239, 33); + this.MainTableLayoutControl.TabIndex = 0; + // + // ucbFengSu + // + this.ucbFengSu.BlowerColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(77)))), ((int)(((byte)(59))))); + this.ucbFengSu.Dock = System.Windows.Forms.DockStyle.Fill; + this.ucbFengSu.EntranceDirection = JinYuan.ControlLib.BlowerEntranceDirection.None; + this.ucbFengSu.ExitDirection = JinYuan.ControlLib.BlowerExitDirection.None; + this.ucbFengSu.FanColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(169)))), ((int)(((byte)(243))))); + this.ucbFengSu.IsDZ = true; + this.ucbFengSu.IsExit = false; + this.ucbFengSu.Location = new System.Drawing.Point(1, 1); + this.ucbFengSu.Margin = new System.Windows.Forms.Padding(1); + this.ucbFengSu.Name = "ucbFengSu"; + this.ucbFengSu.Size = new System.Drawing.Size(45, 31); + this.ucbFengSu.TabIndex = 0; + this.ucbFengSu.TurnAround = JinYuan.ControlLib.TurnAround.None; + this.ucbFengSu.TurnSpeed = 100; + // + // lbl_Value + // + this.lbl_Value.AutoSize = true; + this.lbl_Value.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Value.Location = new System.Drawing.Point(156, 0); + this.lbl_Value.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl_Value.Name = "lbl_Value"; + this.lbl_Value.Size = new System.Drawing.Size(79, 33); + this.lbl_Value.TabIndex = 1; + this.lbl_Value.Text = "0"; + this.lbl_Value.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lbl_Title + // + this.lbl_Title.AutoSize = true; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Location = new System.Drawing.Point(50, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(99, 33); + this.lbl_Title.TabIndex = 2; + this.lbl_Title.Text = "参数项名称"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // UCFengSu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Black; + this.Controls.Add(this.MainTableLayoutControl); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.ForeColor = System.Drawing.Color.White; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "UCFengSu"; + this.Size = new System.Drawing.Size(239, 33); + this.MainTableLayoutControl.ResumeLayout(false); + this.MainTableLayoutControl.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel MainTableLayoutControl; + private UCBlower ucbFengSu; + private System.Windows.Forms.Label lbl_Value; + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/UCFengSu.cs b/JinYuan.ControlLib/UCFengSu.cs new file mode 100644 index 0000000..d681906 --- /dev/null +++ b/JinYuan.ControlLib/UCFengSu.cs @@ -0,0 +1,147 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + + [DefaultEvent("ControlDoubleClick")] + public partial class UCFengSu : UserControl + { + public UCFengSu() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.Size = new System.Drawing.Size(232, 43); + } + + + //private int titleScale = 50; + //[Browsable(true)] + //[Category("自定义属性")] + //[Description("设置或获取标题所占比例")] + //public int TitleScale + //{ + // get { return titleScale; } + // set + // { + // titleScale = value; + + // this.MainTableLayoutControl.ColumnStyles[0] = new ColumnStyle(SizeType.Percent, titleScale); + // } + //} + + + //private int valueScale = 30; + //[Browsable(true)] + //[Category("自定义属性")] + //[Description("设置或获取数据所占比例")] + //public int ValueScale + //{ + // get { return valueScale; } + // set + // { + // valueScale = value; + + // this.MainTableLayoutControl.ColumnStyles[1] = new ColumnStyle(SizeType.Percent, valueScale); + // } + //} + + private string titleName = "参数名称设置"; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取参数名称")] + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + + this.lbl_Title.Text = titleName; + } + } + + private Color ucFengSuBG = Color.FromArgb(255, 77, 59); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取风扇控件背景颜色")] + public Color UcFengSuBG + { + get { return ucFengSuBG; } + set + { + ucFengSuBG = value; + this.ucbFengSu.BlowerColor = ucFengSuBG; + } + } + + private Color ucFengSuFan = Color.FromArgb(3, 169, 243); + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取风扇叶子颜色")] + public Color UcFengSuFan + { + get { return ucFengSuFan; } + set + { + ucFengSuFan = value; + this.ucbFengSu.FanColor = ucFengSuFan; + } + } + + + private float currentValue = 0.0f; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取当前数值")] + public float CurrentValue + { + get { return currentValue; } + set + { + currentValue = value; + + this.lbl_Value.Text = currentValue.ToString(); + this.ucbFengSu.TurnSpeed = 100; + if (value > 0.0f) + { + this.ucbFengSu.TurnAround = TurnAround.Clockwise; + this.ucbFengSu.TurnSpeed = (int)value; + } + else + { + this.ucbFengSu.TurnAround = TurnAround.None; + } + + } + } + + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取绑定变量名称")] + public string BindVarName { get; set; } + + + + [Browsable(true)] + [Category("自定义事件")] + [Description("控件双击事件")] + public event EventHandler ControlDoubleClick; + + private void lbl_Value_DoubleClick(object sender, EventArgs e) + { + if (ControlDoubleClick != null) + { + ControlDoubleClick(this, e); + } + } + } +} \ No newline at end of file diff --git a/JinYuan.ControlLib/UCFengSu.resx b/JinYuan.ControlLib/UCFengSu.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/UCFengSu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCHelper/ControlHelper.cs b/JinYuan.ControlLib/UCHelper/ControlHelper.cs new file mode 100644 index 0000000..7be583a --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/ControlHelper.cs @@ -0,0 +1,2464 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 控件工具类 + /// + public static class ControlHelper + { + #region Graphics + + /// + /// 获取指定窗口(包括非工作区)的Graphics + /// + /// 指定窗口的handle + /// 返回g + /// 返回hDC + public static void GetWindowGraphics(IntPtr handle, out Graphics g, out IntPtr hDC) + { + hDC = NativeMethods.GetWindowDC(handle); + g = Graphics.FromHdc(hDC); + } + + /// + /// 获取指定窗口(只包括工作区)的Graphics + /// + /// 指定窗口的handle + /// 返回g + /// 返回hDC + public static void GetWindowClientGraphics(IntPtr handle, out Graphics g, out IntPtr hDC) + { + hDC = NativeMethods.GetDC(handle); + g = Graphics.FromHdc(hDC); + } + + #endregion + + #region 圆角、边框 + + /// + /// 绘制Rectangle 1个像素边框(圆角边框半径为3个像素) + /// + /// 要绘制边框的控件 + /// 要绘制边框的控件画布 + /// 是否为圆角边框(圆角边框半径为3个像素) + /// 边框颜色 + /// 父控件背景色(圆角边框平滑过度颜色) + /// 控件背景色(圆角边框平滑过度颜色) + public static void DrawControlBorder(Control control, Graphics g, bool roundCorner, Color borderColor, Color borderOutOverColor, Color borderInOverColor) + { + Rectangle rect = control.ClientRectangle; + + SmoothingMode smoothingMode = g.SmoothingMode; + CompositingMode compositingMode = g.CompositingMode; + CompositingQuality compositingQuality = g.CompositingQuality; + InterpolationMode interpolationMode = g.InterpolationMode; + + g.SmoothingMode = SmoothingMode.None; + g.CompositingMode = CompositingMode.SourceCopy; + g.CompositingQuality = CompositingQuality.Default; + g.InterpolationMode = InterpolationMode.Default; + + if (roundCorner) + { + Pen border_pen = new Pen(borderColor); + + //边框 + g.DrawPolygon(border_pen, new Point[] { + new Point(rect.Left,rect.Top+1), + new Point(rect.Left+1,rect.Top+1), + new Point(rect.Left+1,rect.Top), + + new Point(rect.Right-1-1,rect.Top), + new Point(rect.Right-1-1,rect.Top+1), + new Point(rect.Right-1,rect.Top+1), + + new Point(rect.Right-1,rect.Bottom-1-1), + new Point(rect.Right-1-1,rect.Bottom-1-1), + new Point(rect.Right-1-1,rect.Bottom-1), + + new Point(rect.Left+1,rect.Bottom-1), + new Point(rect.Left+1,rect.Bottom-1-1), + new Point(rect.Left,rect.Bottom-1-1), + }); + + //边框圆角外平滑过度 + border_pen.Color = Color.FromArgb(borderColor.R + (borderOutOverColor.R - borderColor.R) / 4, borderColor.G + (borderOutOverColor.G - borderColor.G) / 4, borderColor.B + (borderOutOverColor.B - borderColor.B) / 4); + g.DrawLine(border_pen, new Point(rect.Left, rect.Top + 1), new Point(rect.Left + 1, rect.Top)); + g.DrawLine(border_pen, new Point(rect.Right - 2, rect.Top), new Point(rect.Right - 1, rect.Top + 1)); + g.DrawLine(border_pen, new Point(rect.Right - 1, rect.Bottom - 2), new Point(rect.Right - 2, rect.Bottom - 1)); + g.DrawLine(border_pen, new Point(rect.Left + 1, rect.Bottom - 1), new Point(rect.Left, rect.Bottom - 2)); + + //边框圆角内平滑过度 + SolidBrush sb = new SolidBrush(Color.FromArgb((borderColor.R + borderInOverColor.R) / 2, (borderColor.G + borderInOverColor.G) / 2, (borderColor.B + borderInOverColor.B) / 2)); + g.FillRectangle(sb, new Rectangle(rect.Left + 1, rect.Top + 1, 1, 1)); + g.FillRectangle(sb, new Rectangle(rect.Right - 2, rect.Top + 1, 1, 1)); + g.FillRectangle(sb, new Rectangle(rect.Right - 2, rect.Bottom - 2, 1, 1)); + g.FillRectangle(sb, new Rectangle(rect.Left + 1, rect.Bottom - 2, 1, 1)); + + sb.Dispose(); + border_pen.Dispose(); + } + else + { + Pen border_pen = new Pen(borderColor); + g.DrawRectangle(border_pen, new Rectangle(rect.X, rect.Y, rect.Width - 1, rect.Height - 1)); + border_pen.Dispose(); + } + + g.SmoothingMode = smoothingMode; + g.CompositingMode = compositingMode; + g.CompositingQuality = compositingQuality; + g.InterpolationMode = interpolationMode; + } + + /// + /// 计算Rectangle 1个像素圆角形状路径(圆角边框半径为3个像素) + /// + /// rect + /// + public static GraphicsPath AdjustRectangleShapePath(Rectangle rect) + { + GraphicsPath gp = new GraphicsPath(); + gp.AddPolygon(new Point[] { + + new Point(rect.Left,rect.Top+1), + new Point(rect.Left+1,rect.Top+1), + new Point(rect.Left+1,rect.Top), + + new Point(rect.Right-1,rect.Top), + new Point(rect.Right-1,rect.Top+1), + new Point(rect.Right,rect.Top+1), + + new Point(rect.Right,rect.Bottom-1), + new Point(rect.Right-1,rect.Bottom-1), + new Point(rect.Right-1,rect.Bottom), + + new Point(rect.Left+1,rect.Bottom), + new Point(rect.Left+1,rect.Bottom-1), + new Point(rect.Left,rect.Bottom-1), + + }); + + return gp; + } + + /// + /// 计算点到矩形的最大圆形最大半径 + /// + /// 矩形 + /// 点 + /// + public static int AdjustRectangleMaxRadiusForPoint(Rectangle rect, Point point) + { + int radius = 0; + + radius = Math.Max(radius, (int)Math.Ceiling(Math.Sqrt(Math.Pow(Math.Abs(point.X - rect.X), 2) + Math.Pow(Math.Abs(point.Y - rect.Y), 2)))); + radius = Math.Max(radius, (int)Math.Ceiling(Math.Sqrt(Math.Pow(Math.Abs(point.X - rect.Right), 2) + Math.Pow(Math.Abs(point.Y - rect.Y), 2)))); + radius = Math.Max(radius, (int)Math.Ceiling(Math.Sqrt(Math.Pow(Math.Abs(point.X - rect.Right), 2) + Math.Pow(Math.Abs(point.Y - rect.Bottom), 2)))); + radius = Math.Max(radius, (int)Math.Ceiling(Math.Sqrt(Math.Pow(Math.Abs(point.X - rect.X), 2) + Math.Pow(Math.Abs(point.Y - rect.Bottom), 2)))); + + return radius; + } + + /// + /// 转换成圆角 + /// + /// 要转换的rect + /// 圆角半径的大小 + /// + public static GraphicsPath AdjustCircularPath(Rectangle rect, int radius) + { + return AdjustCircularPath(rect, radius, radius, radius, radius); + } + + /// + /// 转换成圆角 + /// + /// 要转换的rect + /// 左上角 + /// 右上角 + /// 右下角 + /// 左下角 + /// + public static GraphicsPath AdjustCircularPath(Rectangle rect, int leftTopRadius, int rightTopRadius, int rightBottomRadius, int leftBottomRadius) + { + leftTopRadius = Math.Abs(leftTopRadius); + int leftTopDiameter = leftTopRadius * 2; + rightTopRadius = Math.Abs(rightTopRadius); + int rightTopDiameter = rightTopRadius * 2; + rightBottomRadius = Math.Abs(rightBottomRadius); + int rightBottomDiameter = rightBottomRadius * 2; + leftBottomRadius = Math.Abs(leftBottomRadius); + int leftBottomDiameter = leftBottomRadius * 2; + + PointF leftTop_x = new PointF(rect.Left, rect.Top); + PointF leftTop_y = new PointF(rect.Left, rect.Top); + if (leftTopRadius > 0) + { + leftTop_x = new PointF(rect.Left + leftTopRadius, rect.Top); + leftTop_y = new PointF(rect.Left, rect.Top + leftTopRadius); + } + + PointF rightTop_x = new PointF(rect.Right, rect.Top); + PointF rightTop_y = new PointF(rect.Right, rect.Top); + if (rightTopRadius > 0) + { + rightTop_x = new PointF(rect.Right - rightTopRadius, rect.Top); + rightTop_y = new PointF(rect.Right, rect.Top + rightTopRadius); + } + + PointF rightBottom_x = new PointF(rect.Right, rect.Bottom); + PointF rightBottom_y = new PointF(rect.Right, rect.Bottom); + if (rightBottomRadius > 0) + { + rightBottom_x = new PointF(rect.Right - rightBottomRadius, rect.Bottom); + rightBottom_y = new PointF(rect.Right, rect.Bottom - rightBottomRadius); + } + + PointF leftBottom_x = new PointF(rect.Left, rect.Bottom); + PointF leftBottom_y = new PointF(rect.Left, rect.Bottom); + if (leftBottomRadius > 0) + { + leftBottom_x = new PointF(rect.Left + leftBottomRadius, rect.Bottom); + leftBottom_y = new PointF(rect.Left, rect.Bottom - leftBottomRadius); + } + + GraphicsPath gp = new GraphicsPath(); + + if (leftTopRadius > 0) + { + RectangleF lefttop_rect = new RectangleF(rect.Left, rect.Top, leftTopDiameter, leftTopDiameter); + gp.AddArc(lefttop_rect, 180, 90); + } + gp.AddLine(leftTop_x, rightTop_x); + + if (rightTopRadius > 0) + { + RectangleF righttop_rect = new RectangleF(rect.Right - rightTopDiameter, rect.Top, rightTopDiameter, rightTopDiameter); + gp.AddArc(righttop_rect, 270, 90); + } + gp.AddLine(rightTop_y, rightBottom_y); + + if (rightBottomRadius > 0) + { + RectangleF rightbottom_rect = new RectangleF(rect.Right - rightBottomDiameter, rect.Bottom - rightBottomDiameter, rightBottomDiameter, rightBottomDiameter); + gp.AddArc(rightbottom_rect, 0, 90); + } + gp.AddLine(rightBottom_x, leftBottom_x); + + if (leftBottomRadius > 0) + { + RectangleF leftbottom_rect = new RectangleF(rect.Left, rect.Bottom - leftBottomDiameter, leftBottomDiameter, leftBottomDiameter); + gp.AddArc(leftbottom_rect, 90, 90); + } + gp.AddLine(leftBottom_y, leftTop_y); + + gp.CloseAllFigures(); + return gp; + } + + /// + /// 转换成圆角 + /// + /// 要转换的rect + /// 左上角 + /// 右上角 + /// 右下角 + /// 左下角 + /// + public static Region AdjustCircularRegion(Rectangle rect, int leftTopRadius, int rightTopRadius, int rightBottomRadius, int leftBottomRadius) + { + Region r = new Region(rect); + GraphicsPath gp = new GraphicsPath(); + + leftTopRadius = Math.Abs(leftTopRadius); + int leftTopDiameter = leftTopRadius * 2; + rightTopRadius = Math.Abs(rightTopRadius); + int rightTopDiameter = rightTopRadius * 2; + rightBottomRadius = Math.Abs(rightBottomRadius); + int rightBottomDiameter = rightBottomRadius * 2; + leftBottomRadius = Math.Abs(leftBottomRadius); + int leftBottomDiameter = leftBottomRadius * 2; + + if (leftTopRadius > 0) + { + Region lefttop_r = new Region(new Rectangle(rect.Left, rect.Top, leftTopRadius, leftTopRadius)); + gp.Reset(); + gp.AddPie(new Rectangle(rect.Left, rect.Top, leftTopDiameter, leftTopDiameter), 180, 90); + lefttop_r.Exclude(gp); + r.Exclude(lefttop_r); + lefttop_r.Dispose(); + } + + if (rightTopRadius > 0) + { + Region righttop_r = new Region(new Rectangle(rect.Right - rightTopRadius, rect.Top, rightTopRadius, rightTopRadius)); + gp.Reset(); + gp.AddPie(new Rectangle(rect.Right - rightTopDiameter, rect.Top, rightTopDiameter, rightTopDiameter), 270, 90); + righttop_r.Exclude(gp); + r.Exclude(righttop_r); + righttop_r.Dispose(); + } + + if (rightBottomRadius > 0) + { + Region rightbottom_r = new Region(new Rectangle(rect.Right - rightBottomRadius, rect.Bottom - rightBottomRadius, rightBottomRadius, rightBottomRadius)); + gp.Reset(); + gp.AddPie(new Rectangle(rect.Right - rightBottomDiameter, rect.Bottom - rightBottomDiameter, rightBottomDiameter, rightBottomDiameter), 0, 90); + rightbottom_r.Exclude(gp); + r.Exclude(rightbottom_r); + rightbottom_r.Dispose(); + } + + if (leftBottomRadius > 0) + { + Region leftbottom_r = new Region(new Rectangle(rect.Left, rect.Bottom - leftBottomRadius, leftBottomRadius, leftBottomRadius)); + gp.Reset(); + gp.AddPie(new Rectangle(rect.Left, rect.Bottom - leftBottomDiameter, leftBottomDiameter, leftBottomDiameter), 90, 90); + leftbottom_r.Exclude(gp); + r.Exclude(leftbottom_r); + leftbottom_r.Dispose(); + } + + gp.Dispose(); + return r; + } + + /// + /// 根据画笔大小计算出真是rectf + /// + /// 要转换的rectf + /// 画笔大小大小 + /// 画笔对齐方式 + /// + public static RectangleF TransformRectangleF(RectangleF rectf, float pen, PenAlignment alignment = PenAlignment.Center) + { + if (pen <= 0) + { + return rectf; + } + + RectangleF result = new RectangleF(); + if (alignment == PenAlignment.Center || alignment == PenAlignment.Left || alignment == PenAlignment.Right || alignment == PenAlignment.Outset) + { + result.Width = rectf.Width - pen; + result.Height = rectf.Height - pen; + result.X = rectf.X + ((int)pen) / 2; + result.Y = rectf.Y + ((int)pen) / 2; + } + else if (alignment == PenAlignment.Inset) + { + + if (pen > 0 && pen < 2) + { + result.Width = rectf.Width - 1; + result.Height = rectf.Height - 1; + } + else + { + result.Width = rectf.Width; + result.Height = rectf.Height; + } + + result.X = rectf.X; + result.Y = rectf.Y; + } + + return result; + } + + /// + /// 根据画笔大小计算出真是rectf + /// + /// 要转换的rect + /// 画笔大小大小 + /// 画笔对齐方式 + /// + public static Rectangle TransformRectangle(Rectangle rect, int pen, PenAlignment alignment = PenAlignment.Center) + { + if (pen <= 0) + { + return rect; + } + + Rectangle result = new Rectangle(); + if (alignment == PenAlignment.Center || alignment == PenAlignment.Left || alignment == PenAlignment.Right || alignment == PenAlignment.Outset) + { + result.Width = rect.Width - pen; + result.Height = rect.Height - pen; + result.X = rect.X + ((int)pen) / 2; + result.Y = rect.Y + ((int)pen) / 2; + } + else if (alignment == PenAlignment.Inset) + { + + if (pen > 0 && pen < 2) + { + result.Width = rect.Width - 1; + result.Height = rect.Height - 1; + } + else + { + result.Width = rect.Width; + result.Height = rect.Height; + } + + result.X = rect.X; + result.Y = rect.Y; + } + + return result; + } + + #endregion + + #region 字体 + + /// + /// 获取字体顶部空格 + /// + /// + public static int GetFontTopHiatus(Font font) + { + return Math.Max(1, font.Height * 2 / 10); + } + + /// + /// 获取字体真实高度 + /// + /// + public static int GetFontRealHeight(Font font) + { + return Math.Max(1, font.Height * 8 / 10); + } + + #endregion + + #region (Size、Point)角度 + + /// + /// 计算指定角度的坐标 + /// + /// 圆心坐标 + /// 圆半径 + /// 角度 + /// + public static PointF CalculatePointForAngle(PointF center, float radius, float angle) + { + if (radius == 0) + return center; + + float w = 0; + float h = 0; + if (angle <= 90) + { + w = radius * (float)Math.Cos(Math.PI / 180 * angle); + h = radius * (float)Math.Sin(Math.PI / 180 * angle); + } + else if (angle <= 180) + { + w = -radius * (float)Math.Sin(Math.PI / 180 * (angle - 90)); + h = radius * (float)Math.Cos(Math.PI / 180 * (angle - 90)); + + } + else if (angle <= 270) + { + w = -radius * (float)Math.Cos(Math.PI / 180 * (angle - 180)); + h = -radius * (float)Math.Sin(Math.PI / 180 * (angle - 180)); + } + else + { + w = radius * (float)Math.Sin(Math.PI / 180 * (angle - 270)); + h = -radius * (float)Math.Cos(Math.PI / 180 * (angle - 270)); + + } + return new PointF(center.X + w, center.Y + h); + } + + /// + /// 计算两个坐标的夹角 + /// + /// 坐标1 + /// 坐标2 + /// + public static double CalculateAngleForPoint(PointF point1, PointF point2) + { + double tmp = Math.Atan2((point2.Y - point1.Y), (point2.X - point1.X)) * 180 / Math.PI; + if (tmp < 0) + { + tmp = 180 + 180 - Math.Abs(tmp); + } + return tmp; + } + + /// + /// 获取Size旋转指定角度后新的Size + /// + /// 源Size + /// 指定角度 + /// 新的Size + public static SizeF ConvertToAngleSize(SizeF size, float angle) + { + PointF angle_point = ControlHelper.CalculatePointForAngle(new PointF(0, 0), size.Width / 2, (angle + 360) % 360); + PointF righttop_point = ControlHelper.CalculatePointForAngle(angle_point, size.Height / 2, (angle - 90 + 360) % 360); + PointF rightbottom_point = ControlHelper.CalculatePointForAngle(angle_point, size.Height / 2, (angle + 90 + 360) % 360); + + float w = Math.Max(Math.Abs(righttop_point.X), Math.Abs(rightbottom_point.X)) * 2; + float h = Math.Max(Math.Abs(righttop_point.Y), Math.Abs(rightbottom_point.Y)) * 2; + + return new SizeF(w, h); + } + + #endregion + + #region 画笔Rectangle转换 + + /// + /// 根据画笔大小转换rectf + /// + /// 要转换的rectf + /// 画笔大小大小 + /// + public static RectangleF TransformRectangleByPen(RectangleF rectf, float pen) + { + RectangleF result = new RectangleF(); + result.Width = rectf.Width - (pen < 1 ? 0 : pen); + result.Height = rectf.Height - (pen < 1 ? 0 : pen); + result.X = rectf.X + (float)(pen / 2); + result.Y = rectf.Y + (float)(pen / 2); + return result; + } + + #endregion + + #region 颜色 + + /// + /// 转换成灰色颜色值 + /// + /// 要转换的颜色 + /// + public static Color ConvertToDisableColor(Color color) + { + int tmp = (color.R + color.G + color.B) / 3; + return Color.FromArgb(color.A, tmp, tmp, tmp); + } + + /// + /// 根据控件Enabled状态转换成对应颜色值 + /// + /// 颜色所属的控件 + /// 要转换的颜色 + /// + public static Color ConvertToAutoColor(Control control, Color color) + { + if (control == null || control.Enabled) + { + return color; + } + return ConvertToDisableColor(color); + } + + /// + /// 根据状态转换成对应颜色值 + /// + /// 是否为禁用状态 + /// 要转换的颜色 + /// + public static Color ConvertToAutoColor(bool disable, Color color) + { + if (!disable) + { + return color; + } + return ConvertToDisableColor(color); + } + + /// + /// 转换成动画效果颜色值 + /// + /// 要转换的颜色 + /// + public static Color ConvertToAnimationColor(Color color) + { + if (color.GetBrightness() >= 0.5) + { + Color tmp = ControlPaint.Dark(color); + return Color.FromArgb(15, tmp.R, tmp.G, tmp.B); + } + else + { + Color tmp = ControlPaint.Light(color); + return Color.FromArgb(80, tmp.R, tmp.G, tmp.B); + } + } + + /// + /// 根据控件Enabled状态和背景色转换文本字体对应颜色值 + /// + /// 颜色所属的控件 + /// 背景色 + /// 前景色 + /// + public static Color ConvertToForeColorByBackColor(Control control, Color backColor, Color foreColor) + { + if (control == null || control.Enabled) + { + return foreColor; + } + + Color tmp = ConvertToAutoColor(control, backColor); + if (Math.Abs(tmp.GetBrightness() - foreColor.GetBrightness()) < 0.2) + { + return tmp.GetBrightness() >= 0.5 ? ControlPaint.Dark(backColor) : ControlPaint.Light(backColor); + } + else + { + return ConvertToDisableColor(foreColor); + } + + } + + /// + /// 根据状态和背景色转换文本字体对应颜色值 + /// + /// 是否为禁用状态 + /// 背景色 + /// 前景色 + /// + public static Color ConvertToForeColorByBackColor(bool disable, Color backColor, Color foreColor) + { + if (!disable) + { + return foreColor; + } + + Color tmp = ConvertToAutoColor(disable, backColor); + if (Math.Abs(tmp.GetBrightness() - foreColor.GetBrightness()) < 0.2) + { + return tmp.GetBrightness() >= 0.5 ? ControlPaint.Dark(backColor) : ControlPaint.Light(backColor); + } + else + { + return ConvertToDisableColor(foreColor); + } + + } + + /// + /// 根据指定颜色Brightness转换成有对比颜色 + /// + /// 指定颜色 + /// + public static Color ConvertToDarkOrLightColor(Color color) + { + return ((double)color.GetBrightness() >= 0.5) ? ControlPaint.Dark(color) : ControlPaint.Light(color); + } + + /// + /// 检查RGB值ed有效范围 + /// + /// + /// + public static int VerifyRGB(int rgb) + { + if (rgb < 0) + return 0; + if (rgb > 255) + return 255; + return rgb; + } + + #endregion + + #region 图片 + + private static ColorMatrix disabledImageColorMatrix; + /// + /// 用于创建禁用状态灰色图片(NET源码拷贝) + /// + private static ColorMatrix DisabledImageColorMatrix + { + get + { + if (disabledImageColorMatrix == null) + { + float[][] greyscale = new float[5][]; + greyscale[0] = new float[5] { 0.2125f, 0.2125f, 0.2125f, 0, 0 }; + greyscale[1] = new float[5] { 0.2577f, 0.2577f, 0.2577f, 0, 0 }; + greyscale[2] = new float[5] { 0.0361f, 0.0361f, 0.0361f, 0, 0 }; + greyscale[3] = new float[5] { 0, 0, 0, 1, 0 }; + greyscale[4] = new float[5] { 0.38f, 0.38f, 0.38f, 0, 1 }; + + float[][] transparency = new float[5][]; + transparency[0] = new float[5] { 1, 0, 0, 0, 0 }; + transparency[1] = new float[5] { 0, 1, 0, 0, 0 }; + transparency[2] = new float[5] { 0, 0, 1, 0, 0 }; + transparency[3] = new float[5] { 0, 0, 0, .7F, 0 }; + transparency[4] = new float[5] { 0, 0, 0, 0, 0 }; + + + int size = 5; + float[][] result = new float[size][]; + for (int row = 0; row < size; row++) + { + result[row] = new float[size]; + } + + float[] column = new float[size]; + for (int j = 0; j < size; j++) + { + for (int k = 0; k < size; k++) + { + column[k] = transparency[k][j]; + } + for (int i = 0; i < size; i++) + { + float[] row = greyscale[i]; + float s = 0; + for (int k = 0; k < size; k++) + { + s += row[k] * column[k]; + } + result[i][j] = s; + } + } + + disabledImageColorMatrix = new ColorMatrix(result); + + } + + return disabledImageColorMatrix; + } + } + + /// + /// 创建禁用状态灰色图片(NET源码拷贝) + /// + /// 要处理的图片 + /// + public static Image CreateDisabledImage(Image normalImage) + { + ImageAttributes imgAttrib = new ImageAttributes(); + imgAttrib.ClearColorKey(); + imgAttrib.SetColorMatrix(DisabledImageColorMatrix); + + Size size = normalImage.Size; + Bitmap disabledBitmap = new Bitmap(size.Width, size.Height); + Graphics graphics = Graphics.FromImage(disabledBitmap); + + graphics.DrawImage(normalImage, new Rectangle(0, 0, size.Width, size.Height), 0, 0, size.Width, size.Height, GraphicsUnit.Pixel, imgAttrib); + graphics.Dispose(); + + return disabledBitmap; + } + + /// + /// 缩放图片 + /// + /// 源图片 + /// 目标Size + /// + public static Image ScaleImage(Image sourceImage, Size targetSize) + { + if (sourceImage == null) + return null; + + Bitmap bmp = new Bitmap(targetSize.Width, targetSize.Height); + Graphics g = Graphics.FromImage(bmp); + g.DrawImage(sourceImage, new Rectangle(0, 0, targetSize.Width, targetSize.Height), 0, 0, sourceImage.Width, sourceImage.Height, GraphicsUnit.Pixel); + + g.Dispose(); + + return bmp; + } + + #endregion + + #region 小数位数截取 + + /// + /// 保留指定位数小数 + /// + /// 要处理数 + /// 要保留小数位数 + public static float ReserveDecimals(float value, int places) + { + return (float)ReserveDecimals(value, places); + } + + /// + /// 保留指定位数小数 + /// + /// 要处理数 + /// 要保留小数位数 + public static double ReserveDecimals(double value, int places) + { + return (double)ReserveDecimals(value, places); + } + + /// + /// 保留指定位数小数 + /// + /// 要处理数 + /// 要保留小数位数 + public static string ReserveDecimals(string value, int places) + { + if (places < 0) + return value; + + value = value.Trim(); + int index = value.IndexOf('.'); + + if (places == 0 && index > -1) + { + return value.Substring(0, index); + } + + if (index > -1) + { + value = value.Substring(0, Math.Min(index + places + 1, value.Length)); + value = value.PadRight(value.IndexOf('.') + places + 1, '0'); + } + else if (places > 0) + { + value = (value + ".").PadRight(value.Length + 1 + places, '0'); + } + + return value; + } + + #endregion + + + /// + /// 设置GDI高质量模式抗锯齿 + /// + /// + public static void SetGDIHigh(this Graphics g) + { + //消除锯齿 + g.SmoothingMode = SmoothingMode.AntiAlias; + //文字显示效果 + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + //插补模式 + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + //图片呈现质量 + g.CompositingQuality = CompositingQuality.HighQuality; + + + + } + + + + #region 设置控件Enabled,切不改变控件颜色 + /// + /// 功能描述:设置控件Enabled,切不改变控件颜色 + /// 作  者:HZH + /// 创建日期:2019-03-04 13:43:32 + /// 任务编号:POS + /// + /// c + /// enabled + public static void SetControlEnabled(this Control c, bool enabled) + { + if (!c.IsDisposed) + { + if (enabled) + { + ControlHelper.SetWindowLong(c.Handle, -16, -134217729 & ControlHelper.GetWindowLong(c.Handle, -16)); + } + else + { + ControlHelper.SetWindowLong(c.Handle, -16, 134217728 + ControlHelper.GetWindowLong(c.Handle, -16)); + } + } + } + + /// + /// 功能描述:设置控件Enabled,切不改变控件颜色 + /// 作  者:HZH + /// 创建日期:2019-03-04 13:43:32 + /// 任务编号:POS + /// + /// cs + /// enabled + public static void SetControlEnableds(Control[] cs, bool enabled) + { + for (int i = 0; i < cs.Length; i++) + { + Control c = cs[i]; + SetControlEnabled(c, enabled); + } + } + #endregion + /// + /// Sets the window long. + /// + /// The h WND. + /// Index of the n. + /// The wndproc. + /// System.Int32. + [DllImport("user32.dll ")] + public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int wndproc); + + /// + /// Gets the window long. + /// + /// The h WND. + /// Index of the n. + /// System.Int32. + [DllImport("user32.dll ")] + public static extern int GetWindowLong(IntPtr hWnd, int nIndex); + + /// + /// Gets the foreground window. + /// + /// IntPtr. + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + public static extern IntPtr GetForegroundWindow(); + + /// + /// Threads the base call back. + /// + /// The parent. + /// The object. + private static void ThreadBaseCallBack(Control parent, object obj) + { + if (obj is Exception) + { + if (parent != null) + { + ThreadInvokerControl(parent, delegate + { + Exception ex = obj as Exception; + }); + } + } + } + /// + /// 委托调用主线程控件 + /// + /// 主线程控件 + /// 修改控件方法 + public static void ThreadInvokerControl(Control parent, Action action) + { + if (parent != null) + { + if (parent.InvokeRequired) + { + parent.BeginInvoke(action); + } + else + { + action(); + SetForegroundWindow(parent.Handle); + } + } + } + /// + /// 使用一个线程执行一个操作 + /// + /// 父控件 + /// 执行内容 + /// 执行后回调 + /// 执行期间禁用控件列表 + /// 执行期间是否显示等待提示 + /// 执行期间等待提示内容,默认为“正在处理,请稍候...” + /// 延迟显示等待提示时间 + public static void ThreadRunExt( + Control parent, + Action func, + Action callback, + Control enableControl = null, + bool blnShowSplashScreen = true, + string strMsg = null, + int intSplashScreenDelayTime = 200) + { + ThreadRunExt(parent, func, callback, new Control[] { enableControl }, blnShowSplashScreen, strMsg, intSplashScreenDelayTime); + } + /// + /// 使用一个线程执行一个操作 + /// + /// 父控件 + /// 执行内容 + /// 执行后回调 + /// 执行期间禁用控件列表 + /// 执行期间是否显示等待提示 + /// 执行期间等待提示内容,默认为“正在处理,请稍候...” + /// 延迟显示等待提示时间 + public static void ThreadRunExt( + Control parent, + Action func, + Action callback, + Control[] enableControl = null, + bool blnShowSplashScreen = true, + string strMsg = null, + int intSplashScreenDelayTime = 200) + { + if (blnShowSplashScreen) + { + if (string.IsNullOrEmpty(strMsg)) + { + strMsg = "正在处理,请稍候..."; + } + if (parent != null) + { + ShowProcessPanel(parent, strMsg, intSplashScreenDelayTime); + } + } + if (enableControl != null) + { + List lstCs = new List(); + foreach (var c in enableControl) + { + if (c == null) + continue; + if (c is Form) + { + lstCs.AddRange(c.Controls.ToArray()); + } + else + { + lstCs.Add(c); + } + } + SetControlEnableds(lstCs.ToArray(), false); + } + ThreadPool.QueueUserWorkItem(delegate (object a) + { + try + { + func(); + if (callback != null) + { + callback(null); + } + } + catch (Exception obj) + { + if (callback != null) + { + callback(obj); + } + else + { + ThreadBaseCallBack(parent, obj); + } + } + finally + { + if (parent != null) + { + ThreadInvokerControl(parent, delegate + { + CloseProcessPanel(parent); + SetForegroundWindow(parent.Handle); + }); + } + if (enableControl != null) + { + if (parent != null) + { + ThreadInvokerControl(parent, delegate + { + List lstCs = new List(); + foreach (var c in enableControl) + { + if (c == null) + continue; + if (c is Form) + { + lstCs.AddRange(c.Controls.ToArray()); + } + else + { + lstCs.Add(c); + } + } + SetControlEnableds(lstCs.ToArray(), true); + }); + } + } + } + }); + } + + /// + /// Sets the foreground window. + /// + /// The h WND. + /// true if XXXX, false otherwise. + [DllImport("user32.dll")] + public static extern bool SetForegroundWindow(IntPtr hWnd); + /// + /// Shows the process panel. + /// + /// The parent. + /// The string message. + /// The int splash screen delay time. + public static void ShowProcessPanel(Control parent, string strMessage, int intSplashScreenDelayTime = 0) + { + if (parent.InvokeRequired) + { + parent.BeginInvoke(new MethodInvoker(delegate + { + ShowProcessPanel(parent, strMessage, intSplashScreenDelayTime); + })); + } + else + { + parent.VisibleChanged -= new EventHandler(parent_VisibleChanged); + parent.VisibleChanged += new EventHandler(parent_VisibleChanged); + parent.FindForm().FormClosing -= ControlHelper_FormClosing; + parent.FindForm().FormClosing += ControlHelper_FormClosing; + Control control = null; + lock (parent) + { + control = HaveProcessPanelControl(parent); + if (control == null) + { + control = CreateProgressPanel(); + parent.Controls.Add(control); + } + } + Forms.FrmWaiting frmWaitingEx = control.Tag as Forms.FrmWaiting; + frmWaitingEx.Msg = strMessage; + frmWaitingEx.ShowForm(intSplashScreenDelayTime); + } + } + + /// + /// Handles the FormClosing event of the ControlHelper control. + /// + /// The source of the event. + /// The instance containing the event data. + static void ControlHelper_FormClosing(object sender, FormClosingEventArgs e) + { + Control control = sender as Control; + control.FindForm().FormClosing -= ControlHelper_FormClosing; + CloseWaiting(control); + } + + /// + /// Handles the VisibleChanged event of the parent control. + /// + /// The source of the event. + /// The instance containing the event data. + private static void parent_VisibleChanged(object sender, EventArgs e) + { + Control control = sender as Control; + control.VisibleChanged -= new EventHandler(parent_VisibleChanged); + if (!control.Visible) + { + CloseWaiting(control); + } + } + + /// + /// Closes the waiting. + /// + /// The control. + private static void CloseWaiting(Control control) + { + Control[] array = control.Controls.Find("myprogressPanelext", false); + if (array.Length > 0) + { + Control control2 = array[0]; + if (control2.Tag != null && control2.Tag is Forms.FrmWaiting) + { + Forms.FrmWaiting frmWaitingEx = control2.Tag as Forms.FrmWaiting; + if (frmWaitingEx != null && !frmWaitingEx.IsDisposed && frmWaitingEx.Visible) + { + frmWaitingEx.Hide(); + } + } + } + } + + /// + /// Closes the process panel. + /// + /// The parent. + public static void CloseProcessPanel(Control parent) + { + if (parent.InvokeRequired) + { + parent.BeginInvoke(new MethodInvoker(delegate + { + CloseProcessPanel(parent); + })); + } + else if (parent != null) + { + Control control = HaveProcessPanelControl(parent); + if (control != null) + { + Form frm = control.Tag as Form; + if (frm != null && !frm.IsDisposed && frm.Visible) + { + if (frm.InvokeRequired) + { + frm.BeginInvoke(new MethodInvoker(delegate + { + frm.Hide(); + })); + } + else + { + frm.Hide(); + } + } + } + } + } + + /// + /// Haves the process panel control. + /// + /// The parent. + /// Control. + public static Control HaveProcessPanelControl(Control parent) + { + Control[] array = parent.Controls.Find("myprogressPanelext", false); + Control result; + if (array.Length > 0) + { + result = array[0]; + } + else + { + result = null; + } + return result; + } + + /// + /// Creates the progress panel. + /// + /// Control. + public static Control CreateProgressPanel() + { + return new Label + { + Name = "myprogressPanelext", + Visible = false, + Tag = new Forms.FrmWaiting + { + TopMost = true, + Opacity = 0.0 + } + }; + } + + /// + /// Converts to array. + /// + /// The controls. + /// Control[]. + public static Control[] ToArray(this System.Windows.Forms.Control.ControlCollection controls) + { + if (controls == null || controls.Count <= 0) + return new Control[0]; + List lst = new List(); + foreach (Control item in controls) + { + lst.Add(item); + } + return lst.ToArray(); + } + + + #region 根据控件宽度截取字符串 + /// + /// 功能描述:根据控件宽度截取字符串 + /// 作  者:HZH + /// 创建日期:2019-06-27 10:49:10 + /// 任务编号:POS + /// + /// 字符串 + /// 控件宽度 + /// Graphics + /// 字体 + /// 截取后的字符串 + public static string GetSubString( + string strSource, + float fltControlWidth, + System.Drawing.Graphics g, + System.Drawing.Font font) + { + try + { + fltControlWidth = fltControlWidth - 20; + strSource = strSource.Trim(); + while (true) + { + + System.Drawing.SizeF sizeF = g.MeasureString(strSource.Replace(" ", "A"), font); + if (sizeF.Width > fltControlWidth) + { + strSource = strSource.TrimEnd('…'); + if (strSource.Length <= 1) + return ""; + strSource = strSource.Substring(0, strSource.Length - 1).Trim() + "…"; + } + else + { + return strSource; + } + } + } + finally + { + g.Dispose(); + } + } + #endregion + + #region 获取字符串宽度 + /// + /// 功能描述:获取字符串宽度 + /// 作  者:HZH + /// 创建日期:2019-06-27 11:54:50 + /// 任务编号:POS + /// + /// strSource + /// g + /// font + /// 返回值 + public static int GetStringWidth( + string strSource, + System.Drawing.Graphics g, + System.Drawing.Font font) + { + string[] strs = strSource.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + float fltWidth = 0; + foreach (var item in strs) + { + System.Drawing.SizeF sizeF = g.MeasureString(strSource.Replace(" ", "A"), font); + if (sizeF.Width > fltWidth) + fltWidth = sizeF.Width; + } + + return (int)fltWidth; + } + #endregion + + #region 动画特效 + /// + /// Animates the window. + /// + /// The WHND. + /// The dwtime. + /// The dwflag. + /// true if XXXX, false otherwise. + [DllImport("user32.dll")] + public static extern bool AnimateWindow(IntPtr whnd, int dwtime, int dwflag); + //dwflag的取值如下 + /// + /// The aw hor positive + /// + public const Int32 AW_HOR_POSITIVE = 0x00000001; + //从左到右显示 + /// + /// The aw hor negative + /// + public const Int32 AW_HOR_NEGATIVE = 0x00000002; + //从右到左显示 + /// + /// The aw ver positive + /// + public const Int32 AW_VER_POSITIVE = 0x00000004; + //从上到下显示 + /// + /// The aw ver negative + /// + public const Int32 AW_VER_NEGATIVE = 0x00000008; + //从下到上显示 + /// + /// The aw center + /// + public const Int32 AW_CENTER = 0x00000010; + //若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;否则使窗口向外扩展,即展开窗口 + /// + /// The aw hide + /// + public const Int32 AW_HIDE = 0x00010000; + //隐藏窗口,缺省则显示窗口 + /// + /// The aw activate + /// + public const Int32 AW_ACTIVATE = 0x00020000; + //激活窗口。在使用了AW_HIDE标志后不能使用这个标志 + /// + /// The aw slide + /// + public const Int32 AW_SLIDE = 0x00040000; + //使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略 + /// + /// The aw blend + /// + public const Int32 AW_BLEND = 0x00080000; + //透明度从高到低 + #endregion + + #region 检查文本控件输入类型是否有效 + /// + /// 功能描述:检查文本控件输入类型是否有效 + /// 作  者:HZH + /// 创建日期:2019-02-28 10:23:34 + /// 任务编号:POS + /// + /// 值 + /// 控制类型 + /// 最大值 + /// 最小值 + /// 小数位长度 + /// 正则 + /// 返回值 + public static bool CheckInputType( + string strValue, + TextInputType inputType, + decimal decMaxValue = default(decimal), + decimal decMinValue = default(decimal), + int intLength = 2, + string strRegexPattern = null) + { + bool result; + switch (inputType) + { + case TextInputType.NotControl: + result = true; + return result; + case TextInputType.UnsignNumber: + if (string.IsNullOrEmpty(strValue)) + { + result = true; + return result; + } + else + { + if (strValue.IndexOf("-") >= 0) + { + result = false; + return result; + } + } + break; + case TextInputType.Number: + if (string.IsNullOrEmpty(strValue)) + { + result = true; + return result; + } + else + { + if (!Regex.IsMatch(strValue, "^-?\\d*(\\.?\\d*)?$")) + { + result = false; + return result; + } + } + break; + case TextInputType.Integer: + if (string.IsNullOrEmpty(strValue)) + { + result = true; + return result; + } + else + { + if (!Regex.IsMatch(strValue, "^-?\\d*$")) + { + result = false; + return result; + } + } + break; + case TextInputType.PositiveInteger: + if (string.IsNullOrEmpty(strValue)) + { + result = true; + return result; + } + else + { + if (!Regex.IsMatch(strValue, "^\\d+$")) + { + result = false; + return result; + } + } + break; + case TextInputType.Regex: + result = (string.IsNullOrEmpty(strRegexPattern) || Regex.IsMatch(strValue, strRegexPattern)); + return result; + } + if (strValue == "-") + { + return true; + } + decimal d; + if (!decimal.TryParse(strValue, out d)) + { + result = false; + } + else if (d < decMinValue || d > decMaxValue) + { + result = false; + } + else + { + if (inputType == TextInputType.Number || inputType == TextInputType.UnsignNumber || inputType == TextInputType.PositiveNumber) + { + if (strValue.IndexOf(".") >= 0) + { + string text = strValue.Substring(strValue.IndexOf(".")); + if (text.Length > intLength + 1) + { + result = false; + return result; + } + } + } + result = true; + } + return result; + } + #endregion + + #region 冻结控件 + /// + /// The m LST freeze control + /// + static Dictionary m_lstFreezeControl = new Dictionary(); + /// + /// 功能描述:停止更新控件 + /// 作  者:HZH + /// 创建日期:2019-07-13 11:11:32 + /// 任务编号:POS + /// + /// control + /// 是否停止更新 + public static void FreezeControl(Control control, bool blnToFreeze) + { + if (blnToFreeze && control.IsHandleCreated && control.Visible && !control.IsDisposed && (!m_lstFreezeControl.ContainsKey(control) || (m_lstFreezeControl.ContainsKey(control) && m_lstFreezeControl[control] == false))) + { + m_lstFreezeControl[control] = true; + control.Disposed += control_Disposed; + NativeMethods.SendMessage(control.Handle, 11, 0, 0); + } + else if (!blnToFreeze && !control.IsDisposed && m_lstFreezeControl.ContainsKey(control) && m_lstFreezeControl[control] == true) + { + m_lstFreezeControl.Remove(control); + NativeMethods.SendMessage(control.Handle, 11, 1, 0); + control.Invalidate(true); + } + } + + /// + /// Handles the Disposed event of the control control. + /// + /// The source of the event. + /// The instance containing the event data. + static void control_Disposed(object sender, EventArgs e) + { + try + { + if (m_lstFreezeControl.ContainsKey((Control)sender)) + m_lstFreezeControl.Remove((Control)sender); + } + catch { } + } + #endregion + + + /// + /// 根据矩形和圆得到一个圆角矩形Path + /// + /// The rect. + /// The corner radius. + /// GraphicsPath. + public static GraphicsPath CreateRoundedRectanglePath(this Rectangle rect, int cornerRadius) + { + GraphicsPath roundedRect = new GraphicsPath(); + roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90); + roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y); + roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90); + roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2); + roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90); + roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom); + roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90); + roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2); + roundedRect.CloseFigure(); + return roundedRect; + } + + /// + /// Creates the rounded rectangle path. + /// + /// The rect. + /// The corner radius. + /// GraphicsPath. + public static GraphicsPath CreateRoundedRectanglePath(this RectangleF rect, int cornerRadius) + { + GraphicsPath roundedRect = new GraphicsPath(); + roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90); + roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y); + roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90); + roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2); + roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90); + roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom); + roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90); + roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2); + roundedRect.CloseFigure(); + return roundedRect; + } + /// + /// Gets the colors. + /// + /// The colors. + public static Color[] Colors { get; private set; } + + static ControlHelper() + { + List list = new List(); + list.Add(Color.FromArgb(55, 162, 218)); + list.Add(Color.FromArgb(50, 197, 233)); + list.Add(Color.FromArgb(103, 224, 227)); + list.Add(Color.FromArgb(159, 230, 184)); + list.Add(Color.FromArgb(255, 219, 92)); + list.Add(Color.FromArgb(255, 159, 127)); + list.Add(Color.FromArgb(251, 114, 147)); + list.Add(Color.FromArgb(224, 98, 174)); + list.Add(Color.FromArgb(230, 144, 209)); + list.Add(Color.FromArgb(231, 188, 243)); + list.Add(Color.FromArgb(157, 150, 245)); + list.Add(Color.FromArgb(131, 120, 234)); + list.Add(Color.FromArgb(150, 191, 255)); + + list.Add(Color.FromArgb(243, 67, 54)); + list.Add(Color.FromArgb(156, 39, 176)); + list.Add(Color.FromArgb(103, 58, 183)); + list.Add(Color.FromArgb(63, 81, 181)); + list.Add(Color.FromArgb(33, 150, 243)); + list.Add(Color.FromArgb(0, 188, 211)); + list.Add(Color.FromArgb(3, 169, 244)); + list.Add(Color.FromArgb(0, 150, 136)); + list.Add(Color.FromArgb(139, 195, 74)); + list.Add(Color.FromArgb(76, 175, 80)); + list.Add(Color.FromArgb(204, 219, 57)); + list.Add(Color.FromArgb(233, 30, 99)); + list.Add(Color.FromArgb(254, 234, 59)); + list.Add(Color.FromArgb(254, 192, 7)); + list.Add(Color.FromArgb(254, 152, 0)); + list.Add(Color.FromArgb(255, 87, 34)); + list.Add(Color.FromArgb(121, 85, 72)); + list.Add(Color.FromArgb(158, 158, 158)); + list.Add(Color.FromArgb(96, 125, 139)); + list.Add(Color.FromArgb(252, 117, 85)); + list.Add(Color.FromArgb(172, 113, 191)); + list.Add(Color.FromArgb(115, 131, 253)); + list.Add(Color.FromArgb(78, 206, 255)); + list.Add(Color.FromArgb(121, 195, 82)); + list.Add(Color.FromArgb(255, 163, 28)); + list.Add(Color.FromArgb(255, 185, 15)); + list.Add(Color.FromArgb(255, 181, 197)); + list.Add(Color.FromArgb(255, 110, 180)); + list.Add(Color.FromArgb(255, 69, 0)); + list.Add(Color.FromArgb(255, 48, 48)); + list.Add(Color.FromArgb(154, 205, 50)); + list.Add(Color.FromArgb(155, 205, 155)); + list.Add(Color.FromArgb(154, 50, 205)); + list.Add(Color.FromArgb(131, 111, 255)); + list.Add(Color.FromArgb(124, 205, 124)); + list.Add(Color.FromArgb(0, 206, 209)); + list.Add(Color.FromArgb(0, 178, 238)); + list.Add(Color.FromArgb(56, 142, 142)); + + Type typeFromHandle = typeof(Color); + PropertyInfo[] properties = typeFromHandle.GetProperties(); + PropertyInfo[] array = properties; + for (int i = 0; i < array.Length; i++) + { + PropertyInfo propertyInfo = array[i]; + if (propertyInfo.PropertyType == typeof(Color) && (propertyInfo.Name.StartsWith("Dark") || propertyInfo.Name.StartsWith("Medium"))) + { + object value = propertyInfo.GetValue(null, null); + list.Add((Color)value); + } + } + Colors = list.ToArray(); + } + /// + /// Draws the string. + /// + /// The g. + /// The s. + /// The font. + /// The brush. + /// The point. + /// The format. + /// The angle. + public static void DrawString(Graphics g, string s, Font font, Brush brush, PointF point, StringFormat format, float angle) + { + Matrix transform = g.Transform; + Matrix transform2 = g.Transform; + transform2.RotateAt(angle, point); + g.Transform = transform2; + g.DrawString(s, font, brush, point, format); + g.Transform = transform; + } + + /// + /// Gets the rhombus from rectangle. + /// + /// The rect. + /// Point[]. + public static Point[] GetRhombusFromRectangle(Rectangle rect) + { + return new Point[5] + { + new Point(rect.X, rect.Y + rect.Height / 2), + new Point(rect.X + rect.Width / 2, rect.Y + rect.Height - 1), + new Point(rect.X + rect.Width - 1, rect.Y + rect.Height / 2), + new Point(rect.X + rect.Width / 2, rect.Y), + new Point(rect.X, rect.Y + rect.Height / 2) + }; + } + + /// + /// Computes the paint location y. + /// + /// The maximum. + /// The minimum. + /// The height. + /// The value. + /// System.Single. + public static float ComputePaintLocationY(int max, int min, int height, int value) + { + if ((float)(max - min) == 0f) + { + return height; + } + return (float)height - (float)(value - min) * 1f / (float)(max - min) * (float)height; + } + + /// + /// Computes the paint location y. + /// + /// The maximum. + /// The minimum. + /// The height. + /// The value. + /// System.Single. + public static float ComputePaintLocationY(float max, float min, float height, float value) + { + if (max - min == 0f) + { + return height; + } + return height - (value - min) / (max - min) * height; + } + + + /// + /// Paints the coordinate divide. + /// + /// The g. + /// The pen line. + /// The pen dash. + /// The font. + /// The brush. + /// The sf. + /// The degree. + /// The maximum. + /// The minimum. + /// The width. + /// The height. + /// The left. + /// The right. + /// Up. + /// Down. + public static void PaintCoordinateDivide(Graphics g, System.Drawing.Pen penLine, System.Drawing.Pen penDash, Font font, System.Drawing.Brush brush, StringFormat sf, int degree, int max, int min, int width, int height, int left = 60, int right = 8, int up = 8, int down = 8) + { + for (int i = 0; i <= degree; i++) + { + int value = (max - min) * i / degree + min; + int num = (int)ComputePaintLocationY(max, min, height - up - down, value) + up + 1; + g.DrawLine(penLine, left - 1, num, left - 4, num); + if (i != 0) + { + g.DrawLine(penDash, left, num, width - right, num); + } + g.DrawString(value.ToString(), font, brush, new Rectangle(-5, num - font.Height / 2, left, font.Height), sf); + } + } + + /// + /// Paints the triangle. + /// + /// The g. + /// The brush. + /// The point. + /// The size. + /// The direction. + public static void PaintTriangle(Graphics g, System.Drawing.Brush brush, Point point, int size, GraphDirection direction) + { + Point[] array = new Point[4]; + switch (direction) + { + case GraphDirection.Leftward: + array[0] = new Point(point.X, point.Y - size); + array[1] = new Point(point.X, point.Y + size); + array[2] = new Point(point.X - 2 * size, point.Y); + break; + case GraphDirection.Rightward: + array[0] = new Point(point.X, point.Y - size); + array[1] = new Point(point.X, point.Y + size); + array[2] = new Point(point.X + 2 * size, point.Y); + break; + case GraphDirection.Upward: + array[0] = new Point(point.X - size, point.Y); + array[1] = new Point(point.X + size, point.Y); + array[2] = new Point(point.X, point.Y - 2 * size); + break; + default: + array[0] = new Point(point.X - size, point.Y); + array[1] = new Point(point.X + size, point.Y); + array[2] = new Point(point.X, point.Y + 2 * size); + break; + } + array[3] = array[0]; + g.FillPolygon(brush, array); + } + + /// + /// Paints the triangle. + /// + /// The g. + /// The brush. + /// The point. + /// The size. + /// The direction. + public static void PaintTriangle(Graphics g, System.Drawing.Brush brush, PointF point, int size, GraphDirection direction) + { + PointF[] array = new PointF[4]; + switch (direction) + { + case GraphDirection.Leftward: + array[0] = new PointF(point.X, point.Y - (float)size); + array[1] = new PointF(point.X, point.Y + (float)size); + array[2] = new PointF(point.X - (float)(2 * size), point.Y); + break; + case GraphDirection.Rightward: + array[0] = new PointF(point.X, point.Y - (float)size); + array[1] = new PointF(point.X, point.Y + (float)size); + array[2] = new PointF(point.X + (float)(2 * size), point.Y); + break; + case GraphDirection.Upward: + array[0] = new PointF(point.X - (float)size, point.Y); + array[1] = new PointF(point.X + (float)size, point.Y); + array[2] = new PointF(point.X, point.Y - (float)(2 * size)); + break; + default: + array[0] = new PointF(point.X - (float)size, point.Y); + array[1] = new PointF(point.X + (float)size, point.Y); + array[2] = new PointF(point.X, point.Y + (float)(2 * size)); + break; + } + array[3] = array[0]; + g.FillPolygon(brush, array); + } + + /// + /// Adds the array data. + /// + /// + /// The array. + /// The data. + /// The maximum. + public static void AddArrayData(ref T[] array, T[] data, int max) + { + if (data == null || data.Length == 0) + { + return; + } + if (array.Length == max) + { + Array.Copy(array, data.Length, array, 0, array.Length - data.Length); + Array.Copy(data, 0, array, array.Length - data.Length, data.Length); + } + else if (array.Length + data.Length > max) + { + T[] array2 = new T[max]; + for (int i = 0; i < max - data.Length; i++) + { + array2[i] = array[i + (array.Length - max + data.Length)]; + } + for (int j = 0; j < data.Length; j++) + { + array2[array2.Length - data.Length + j] = data[j]; + } + array = array2; + } + else + { + T[] array3 = new T[array.Length + data.Length]; + for (int k = 0; k < array.Length; k++) + { + array3[k] = array[k]; + } + for (int l = 0; l < data.Length; l++) + { + array3[array3.Length - data.Length + l] = data[l]; + } + array = array3; + } + } + + /// + /// Converts the size. + /// + /// The size. + /// The angle. + /// SizeF. + public static SizeF ConvertSize(SizeF size, float angle) + { + System.Drawing.Drawing2D.Matrix matrix = new System.Drawing.Drawing2D.Matrix(); + matrix.Rotate(angle); + PointF[] array = new PointF[4]; + array[0].X = (0f - size.Width) / 2f; + array[0].Y = (0f - size.Height) / 2f; + array[1].X = (0f - size.Width) / 2f; + array[1].Y = size.Height / 2f; + array[2].X = size.Width / 2f; + array[2].Y = size.Height / 2f; + array[3].X = size.Width / 2f; + array[3].Y = (0f - size.Height) / 2f; + matrix.TransformPoints(array); + float num = float.MaxValue; + float num2 = float.MinValue; + float num3 = float.MaxValue; + float num4 = float.MinValue; + PointF[] array2 = array; + for (int i = 0; i < array2.Length; i++) + { + PointF pointF = array2[i]; + if (pointF.X < num) + { + num = pointF.X; + } + if (pointF.X > num2) + { + num2 = pointF.X; + } + if (pointF.Y < num3) + { + num3 = pointF.Y; + } + if (pointF.Y > num4) + { + num4 = pointF.Y; + } + } + return new SizeF(num2 - num, num4 - num3); + } + + + + /// + /// Gets the pow. + /// + /// The digit. + /// System.Int32. + private static int GetPow(int digit) + { + int num = 1; + for (int i = 0; i < digit; i++) + { + num *= 10; + } + return num; + } + + /// + /// Calculates the maximum section from. + /// + /// The values. + /// System.Int32. + public static double CalculateMaxSectionFrom(double[] values) + { + double num = values.Max(); + return CalculateMaxSection(num); + } + + public static double CalculateMaxSectionFrom(double[][] values) + { + double num = values.Max(p => p.Max()); + return CalculateMaxSection(num); + } + + private static double CalculateMaxSection(double num) + { + if (num <= 5) + { + return 5; + } + if (num <= 10) + { + return 10; + } + int digit = num.ToString().Length - 2; + int num2 = int.Parse(num.ToString().Substring(0, 2)); + if (num2 < 12) + { + return 12 * GetPow(digit); + } + if (num2 < 14) + { + return 14 * GetPow(digit); + } + if (num2 < 16) + { + return 16 * GetPow(digit); + } + if (num2 < 18) + { + return 18 * GetPow(digit); + } + if (num2 < 20) + { + return 20 * GetPow(digit); + } + if (num2 < 22) + { + return 22 * GetPow(digit); + } + if (num2 < 24) + { + return 24 * GetPow(digit); + } + if (num2 < 26) + { + return 26 * GetPow(digit); + } + if (num2 < 28) + { + return 28 * GetPow(digit); + } + if (num2 < 30) + { + return 30 * GetPow(digit); + } + if (num2 < 40) + { + return 40 * GetPow(digit); + } + if (num2 < 50) + { + return 50 * GetPow(digit); + } + if (num2 < 60) + { + return 60 * GetPow(digit); + } + if (num2 < 80) + { + return 80 * GetPow(digit); + } + return 100 * GetPow(digit); + } + + /// + /// Gets the color light. + /// + /// The color. + /// System.Drawing.Color. + public static System.Drawing.Color GetColorLight(System.Drawing.Color color) + { + return System.Drawing.Color.FromArgb(color.R + (255 - color.R) * 40 / 100, color.G + (255 - color.G) * 40 / 100, color.B + (255 - color.B) * 40 / 100); + } + + /// + /// Gets the color light five. + /// + /// The color. + /// System.Drawing.Color. + public static System.Drawing.Color GetColorLightFive(System.Drawing.Color color) + { + return System.Drawing.Color.FromArgb(color.R + (255 - color.R) * 50 / 100, color.G + (255 - color.G) * 50 / 100, color.B + (255 - color.B) * 50 / 100); + } + + /// + /// Gets the points from. + /// + /// The points. + /// Width of the soure. + /// Height of the source. + /// The width. + /// The height. + /// The dx. + /// The dy. + /// PointF[]. + public static PointF[] GetPointsFrom(string points, float soureWidth, float sourceHeight, float width, float height, float dx = 0f, float dy = 0f) + { + string[] array = points.Split(new char[1] + { + ' ' + }, StringSplitOptions.RemoveEmptyEntries); + PointF[] array2 = new PointF[array.Length]; + for (int i = 0; i < array.Length; i++) + { + int num = array[i].IndexOf(','); + float num2 = Convert.ToSingle(array[i].Substring(0, num)); + float num3 = Convert.ToSingle(array[i].Substring(num + 1)); + array2[i] = new PointF(width * (num2 + dx) / soureWidth, height * (num3 + dy) / sourceHeight); + } + return array2; + } + + public static bool IsDesignMode() + { + bool returnFlag = false; + + if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) + { + returnFlag = true; + } + else if (Process.GetCurrentProcess().ProcessName == "devenv") + { + returnFlag = true; + } + + return returnFlag; + } + + #region 滚动条 English:scroll bar + static uint SB_HORZ = 0x0; + static uint SB_VERT = 0x1; + static uint SB_CTL = 0x2; + static uint SB_BOTH = 0x3; + [DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollInfo")] + private static extern int GetScrollInfo(IntPtr hWnd, uint fnBar, ref SCROLLINFO psbi); + [DllImport("user32.dll")]//[return: MarshalAs(UnmanagedType.Bool)] + private static extern int SetScrollInfo(IntPtr handle, uint fnBar, ref SCROLLINFO si, bool fRedraw); + + [DllImport("user32.dll", EntryPoint = "PostMessage")] + private static extern bool PostMessage(IntPtr handle, int msg, uint wParam, uint lParam); + [DllImport("User32.dll", EntryPoint = "SendMessage")] + private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); + /// + /// ShowScrollBar + /// + /// hWnd + /// 0:horizontal,1:vertical,3:both + /// bShow + /// + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow); + /// + ///获取水平滚动条信息 + /// + /// The h WND. + /// Scrollbarinfo. + public static SCROLLINFO GetHScrollBarInfo(IntPtr hWnd) + { + SCROLLINFO info = new SCROLLINFO(); + info.cbSize = (int)Marshal.SizeOf(info); + info.fMask = (int)ScrollInfoMask.SIF_DISABLENOSCROLL | (int)ScrollInfoMask.SIF_ALL; + int intRef = GetScrollInfo(hWnd, SB_HORZ, ref info); + return info; + } + /// + /// 获取垂直滚动条信息 + /// + /// The h WND. + /// Scrollbarinfo. + public static SCROLLINFO GetVScrollBarInfo(IntPtr hWnd) + { + SCROLLINFO info = new SCROLLINFO(); + info.cbSize = (int)Marshal.SizeOf(info); + info.fMask = (int)ScrollInfoMask.SIF_DISABLENOSCROLL | (int)ScrollInfoMask.SIF_ALL; + int intRef = GetScrollInfo(hWnd, SB_VERT, ref info); + return info; + } + public struct SCROLLINFO + { + public int cbSize; + public int fMask; + public int nMin; + public int nMax; + public int nPage; + public int nPos; + public int nTrackPos; + public int ScrollMax { get { return nMax + 1 - nPage; } } + } + public enum ScrollInfoMask : uint + { + SIF_RANGE = 0x1, + SIF_PAGE = 0x2, + SIF_POS = 0x4, + SIF_DISABLENOSCROLL = 0x8, + SIF_TRACKPOS = 0x10, + SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS), + SB_THUMBTRACK = 5, + WM_HSCROLL = 0x0114, + WM_VSCROLL = 0x0115, + SB_LINEUP = 0, + SB_LINEDOWN = 1, + SB_LINELEFT = 0, + SB_LINERIGHT = 1, + } + + public static void SetVScrollValue(IntPtr handle, int value) + { + var info = GetVScrollBarInfo(handle); + info.nPos = value; + SetScrollInfo(handle, SB_VERT, ref info, true); + PostMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, MakeLong((short)ScrollInfoMask.SB_THUMBTRACK, highPart: (short)info.nPos), 0); + } + public static void SetHScrollValue(IntPtr handle, int value) + { + var info = GetHScrollBarInfo(handle); + info.nPos = value; + SetScrollInfo(handle, SB_HORZ, ref info, true); + PostMessage(handle, (int)ScrollInfoMask.WM_HSCROLL, MakeLong((short)ScrollInfoMask.SB_THUMBTRACK, highPart: (short)info.nPos), 0); + } + private static uint MakeLong(short lowPart, short highPart) + { + return (ushort)lowPart | (uint)(highPart << 16); + } + /// + /// 控件向上滚动一个单位 + /// + /// 控件句柄 + public static void ScrollUp(IntPtr handle) + { + SendMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, (int)ScrollInfoMask.SB_LINEUP, 0); + } + + /// + /// 控件向下滚动一个单位 + /// + /// 控件句柄 + public static void ScrollDown(IntPtr handle) + { + SendMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, (int)ScrollInfoMask.SB_LINEDOWN, 0); + } + /// + /// 控件向左滚动一个单位 + /// + /// 控件句柄 + public static void ScrollLeft(IntPtr handle) + { + SendMessage(handle, (int)ScrollInfoMask.WM_HSCROLL, (int)ScrollInfoMask.SB_LINELEFT, 0); + } + + /// + /// 控件向右滚动一个单位 + /// + /// 控件句柄 + public static void ScrollRight(IntPtr handle) + { + SendMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, (int)ScrollInfoMask.SB_LINERIGHT, 0); + } + #endregion + + + /// + /// 返回指定图片中的非透明区域; + /// + /// 位图 + /// + public static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap, Color? colorTransparent = null) + { + // Create GraphicsPath for our bitmap calculation + //创建 GraphicsPath + GraphicsPath graphicsPath = new GraphicsPath(); + // Use the top left pixel as our transparent color + //使用左上角的一点的颜色作为我们透明色 + + Color _colorTransparent = bitmap.GetPixel(0, 0); + if (colorTransparent != null && colorTransparent != Color.Transparent && colorTransparent != Color.Empty) + _colorTransparent = colorTransparent.Value; + // This is to store the column value where an opaque pixel is first found. + // This value will determine where we start scanning for trailing opaque pixels. + //第一个找到点的X + int colOpaquePixel = 0; + // Go through all rows (Y axis) + // 偏历所有行(Y方向) + for (int row = 0; row < bitmap.Height; row++) + { + // Reset value + //重设 + colOpaquePixel = 0; + // Go through all columns (X axis) + //偏历所有列(X方向) + for (int col = 0; col < bitmap.Width; col++) + { + // If this is an opaque pixel, mark it and search for anymore trailing behind + //如果是不需要透明处理的点则标记,然后继续偏历 + if (bitmap.GetPixel(col, row) != _colorTransparent) + { + // Opaque pixel found, mark current position + //记录当前 + colOpaquePixel = col; + // Create another variable to set the current pixel position + //建立新变量来记录当前点 + int colNext = col; + // Starting from current found opaque pixel, search for anymore opaque pixels + // trailing behind, until a transparent pixel is found or minimum width is reached + ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度 + for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++) + if (bitmap.GetPixel(colNext, row) == _colorTransparent) + break; + // Form a rectangle for line of opaque pixels found and add it to our graphics path + //将不透明点加到graphics path + graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1)); + // No need to scan the line of opaque pixels just found + col = colNext; + } + } + } + // Return calculated graphics path + return graphicsPath; + } + + /// + /// 颜色加深 + /// + /// + /// -1.0f <= correctionFactor <= 1.0f + /// + public static Color ChangeColor(this Color color, float correctionFactor) + { + float red = (float)color.R; + float green = (float)color.G; + float blue = (float)color.B; + + if (correctionFactor < 0) + { + correctionFactor = 1 + correctionFactor; + red *= correctionFactor; + green *= correctionFactor; + blue *= correctionFactor; + } + else + { + red = (255 - red) * correctionFactor + red; + green = (255 - green) * correctionFactor + green; + blue = (255 - blue) * correctionFactor + blue; + } + + if (red < 0) red = 0; + + if (red > 255) red = 255; + + if (green < 0) green = 0; + + if (green > 255) green = 255; + + if (blue < 0) blue = 0; + + if (blue > 255) blue = 255; + + + + return Color.FromArgb(color.A, (int)red, (int)green, (int)blue); + } + + + /// + /// 相对于屏幕显示的位置 + /// + /// 窗体需要显示的屏幕 + /// left + /// top + /// + public static Point GetScreenLocation(Screen screen, int left, int top) + { + return new Point(screen.Bounds.Left + left, screen.Bounds.Top + top); + } + } + + public enum GraphDirection + { + /// + /// The upward + /// + Upward = 1, + /// + /// The downward + /// + Downward, + /// + /// The leftward + /// + Leftward, + /// + /// The rightward + /// + Rightward + } + + /// + /// 功能描述:文本控件输入类型 + /// 作  者:HZH + /// 创建日期:2019-02-28 10:09:00 + /// + public enum TextInputType + { + /// + /// 不控制输入 + /// + [Description("不控制输入")] + NotControl = 1, + /// + /// 任意数字 + /// + [Description("任意数字")] + Number = 2, + /// + /// 非负数 + /// + [Description("非负数")] + UnsignNumber = 4, + /// + /// 正数 + /// + [Description("正数")] + PositiveNumber = 8, + /// + /// 整数 + /// + [Description("整数")] + Integer = 16, + /// + /// 非负整数 + /// + [Description("非负整数")] + PositiveInteger = 32, + /// + /// 正则验证 + /// + [Description("正则验证")] + Regex = 64 + } +} \ No newline at end of file diff --git a/JinYuan.ControlLib/UCHelper/DpiControl.cs b/JinYuan.ControlLib/UCHelper/DpiControl.cs new file mode 100644 index 0000000..de780c6 --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/DpiControl.cs @@ -0,0 +1,65 @@ +using System.ComponentModel; +using System.Drawing.Design; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 缩放控件基类 + /// + [Description("缩放控件基类")] + [ToolboxItem(true)] + public abstract class DpiControl : Control, IDpiControl + { + #region 新增属性 + + private float scaleDpi = 1.0f; + /// + /// 控件当前缩放Dpi + /// + [Description("控件当前缩放Dpi")] + [Browsable(false)] + [Localizable(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public virtual float ScaleDpi + { + get { return this.scaleDpi; } + set + { + if (value <= 0) + return; + + this.scaleDpi = value; + this.OnScaleDpiChangedInitialize(); + } + } + + #endregion + + public DpiControl() + { + + } + + #region 重写 + + protected override void CreateHandle() + { + base.CreateHandle(); + + this.ScaleDpi = DpiHelper.GetControlDpi(this); + } + + #endregion + + #region 要实现 + + /// + /// 控件DPI更改后重新初始化控件Rectangle信息 + /// + protected abstract void OnScaleDpiChangedInitialize(); + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCHelper/DpiHelper.cs b/JinYuan.ControlLib/UCHelper/DpiHelper.cs new file mode 100644 index 0000000..19a23fe --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/DpiHelper.cs @@ -0,0 +1,53 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 系统缩放比例 + /// + public class DpiHelper + { + #region 公开方法 + + /// + /// 获取控件对应的系统缩放比例 + /// + /// + /// + public static float GetControlDpi(Control control) + { + IntPtr hDC = IntPtr.Zero; + Graphics g = null; + ControlHelper.GetWindowClientGraphics(control.Handle, out g, out hDC); + + float dpi = g.DpiX / 96f; + + g.Dispose(); + NativeMethods.ReleaseDC(control.Handle, hDC); + + return dpi; + } + + /// + /// 获取控件对应的系统缩放比例 + /// + /// + /// + public static float GetControlDpi(IntPtr hWnd) + { + IntPtr hDC = IntPtr.Zero; + Graphics g = null; + ControlHelper.GetWindowClientGraphics(hWnd, out g, out hDC); + + float dpi = g.DpiX / 96f; + + g.Dispose(); + NativeMethods.ReleaseDC(hWnd, hDC); + + return dpi; + } + #endregion + } +} diff --git a/JinYuan.ControlLib/UCHelper/Ext.cs b/JinYuan.ControlLib/UCHelper/Ext.cs new file mode 100644 index 0000000..2dbceda --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/Ext.cs @@ -0,0 +1,474 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System; +using System.Reflection; +using System.Text; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// Class Ext. + /// + public static partial class Ext + { + /// + /// Clones the model. + /// + /// + /// The class object. + /// T. + public static T CloneModel(this T classObject) where T : class + { + T result; + if (classObject == null) + { + result = default(T); + } + else + { + object obj = Activator.CreateInstance(typeof(T)); + PropertyInfo[] properties = typeof(T).GetProperties(); + PropertyInfo[] array = properties; + for (int i = 0; i < array.Length; i++) + { + PropertyInfo propertyInfo = array[i]; + if (propertyInfo.CanWrite) + propertyInfo.SetValue(obj, propertyInfo.GetValue(classObject, null), null); + } + result = (obj as T); + } + return result; + } + /// + /// ASCII编码的数组转换为英文字符串 + /// + /// 字符串 + /// 结果 + public static string ToEnString(this byte[] s) + { + return ToEncodeString(s, Encoding.ASCII).Trim('\0').Trim(); + } + + /// + /// 数组按指定编码转换为字符串 + /// + /// 数组 + /// 编码 + /// 结果 + public static string ToEncodeString(this byte[] dealBytes, Encoding encode) + { + return encode.GetString(dealBytes); + } + #region 转换为base64字符串 + /// + /// 功能描述:转换为base64字符串 + /// 作  者:HZH + /// 创建日期:2019-03-29 10:12:38 + /// 任务编号:POS + /// + /// data + /// 返回值 + public static string ToBase64Str(this string data) + { + if (data.IsEmpty()) + return string.Empty; + byte[] buffer = Encoding.Default.GetBytes(data); + return Convert.ToBase64String(buffer); + } + #endregion + /// + /// 转换为坐标 + /// + /// The data. + /// System.Drawing.Point. + public static System.Drawing.Point ToPoint(this string data) + { + if (!System.Text.RegularExpressions.Regex.IsMatch(data, @"^\s*\d+(\.\d+)?\s*\,\s*\d+(\.\d+)?\s*$")) + { + return System.Drawing.Point.Empty; + } + else + { + string[] strs = data.Split(','); + return new System.Drawing.Point(strs[0].ToInt(), strs[1].ToInt()); + } + } + + #region 数值转换 + /// + /// 转换为整型 + /// + /// 数据 + /// System.Int32. + public static int ToInt(this object data) + { + if (data == null) + return 0; + if (data is bool) + { + return (bool)data ? 1 : 0; + } + int result; + var success = int.TryParse(data.ToString(), out result); + if (success) + return result; + try + { + return Convert.ToInt32(ToDouble(data, 0)); + } + catch (Exception) + { + return 0; + } + } + + /// + /// 转换为可空整型 + /// + /// 数据 + /// System.Nullable<System.Int32>. + public static int? ToIntOrNull(this object data) + { + if (data == null) + return null; + int result; + bool isValid = int.TryParse(data.ToString(), out result); + if (isValid) + return result; + return null; + } + + /// + /// 转换为双精度浮点数 + /// + /// 数据 + /// System.Double. + public static double ToDouble(this object data) + { + if (data == null) + return 0; + double result; + return double.TryParse(data.ToString(), out result) ? result : 0; + } + + /// + /// 转换为双精度浮点数,并按指定的小数位4舍5入 + /// + /// 数据 + /// 小数位数 + /// System.Double. + public static double ToDouble(this object data, int digits) + { + return Math.Round(ToDouble(data), digits, System.MidpointRounding.AwayFromZero); + } + + /// + /// 转换为可空双精度浮点数 + /// + /// 数据 + /// System.Nullable<System.Double>. + public static double? ToDoubleOrNull(this object data) + { + if (data == null) + return null; + double result; + bool isValid = double.TryParse(data.ToString(), out result); + if (isValid) + return result; + return null; + } + + /// + /// 转换为高精度浮点数 + /// + /// 数据 + /// System.Decimal. + public static decimal ToDecimal(this object data) + { + if (data == null) + return 0; + decimal result; + return decimal.TryParse(data.ToString(), out result) ? result : 0; + } + + /// + /// 转换为高精度浮点数,并按指定的小数位4舍5入 + /// + /// 数据 + /// 小数位数 + /// System.Decimal. + public static decimal ToDecimal(this object data, int digits) + { + return Math.Round(ToDecimal(data), digits, System.MidpointRounding.AwayFromZero); + } + + /// + /// 转换为可空高精度浮点数 + /// + /// 数据 + /// System.Nullable<System.Decimal>. + public static decimal? ToDecimalOrNull(this object data) + { + if (data == null) + return null; + decimal result; + bool isValid = decimal.TryParse(data.ToString(), out result); + if (isValid) + return result; + return null; + } + + /// + /// 转换为可空高精度浮点数,并按指定的小数位4舍5入 + /// + /// 数据 + /// 小数位数 + /// System.Nullable<System.Decimal>. + public static decimal? ToDecimalOrNull(this object data, int digits) + { + var result = ToDecimalOrNull(data); + if (result == null) + return null; + return Math.Round(result.Value, digits, System.MidpointRounding.AwayFromZero); + } + + #endregion + + #region 日期转换 + /// + /// 转换为日期 + /// + /// 数据 + /// DateTime. + public static DateTime ToDate(this object data) + { + try + { + if (data == null) + return DateTime.MinValue; + if (System.Text.RegularExpressions.Regex.IsMatch(data.ToStringExt(), @"^\d{8}$")) + { + string strValue = data.ToStringExt(); + return new DateTime(strValue.Substring(0, 4).ToInt(), strValue.Substring(4, 2).ToInt(), strValue.Substring(6, 2).ToInt()); + } + DateTime result; + return DateTime.TryParse(data.ToString(), out result) ? result : DateTime.MinValue; + } + catch + { + return DateTime.MinValue; + } + } + + /// + /// 转换为可空日期 + /// + /// 数据 + /// System.Nullable<DateTime>. + public static DateTime? ToDateOrNull(this object data) + { + try + { + if (data == null) + return null; + if (System.Text.RegularExpressions.Regex.IsMatch(data.ToStringExt(), @"^\d{8}$")) + { + string strValue = data.ToStringExt(); + return new DateTime(strValue.Substring(0, 4).ToInt(), strValue.Substring(4, 2).ToInt(), strValue.Substring(6, 2).ToInt()); + } + DateTime result; + bool isValid = DateTime.TryParse(data.ToString(), out result); + if (isValid) + return result; + return null; + } + catch + { + return null; + } + } + + #endregion + + #region 布尔转换 + /// + /// 转换为布尔值 + /// + /// 数据 + /// true if XXXX, false otherwise. + public static bool ToBool(this object data) + { + if (data == null) + return false; + bool? value = GetBool(data); + if (value != null) + return value.Value; + bool result; + return bool.TryParse(data.ToString(), out result) && result; + } + + /// + /// 获取布尔值 + /// + /// The data. + /// true if XXXX, false otherwise. + private static bool? GetBool(this object data) + { + switch (data.ToString().Trim().ToLower()) + { + case "0": + return false; + case "1": + return true; + case "是": + return true; + case "否": + return false; + case "yes": + return true; + case "no": + return false; + default: + return null; + } + } + + /// + /// 转换为可空布尔值 + /// + /// 数据 + /// true if XXXX, false otherwise. + public static bool? ToBoolOrNull(this object data) + { + if (data == null) + return null; + bool? value = GetBool(data); + if (value != null) + return value.Value; + bool result; + bool isValid = bool.TryParse(data.ToString(), out result); + if (isValid) + return result; + return null; + } + + #endregion + + #region 字符串转换 + /// + /// 字符串转换为byte[] + /// + /// The data. + /// System.Byte[]. + public static byte[] ToBytes(this string data) + { + return System.Text.Encoding.GetEncoding("GBK").GetBytes(data); + } + /// + /// Converts to bytesdefault. + /// + /// The data. + /// System.Byte[]. + public static byte[] ToBytesDefault(this string data) + { + return System.Text.Encoding.Default.GetBytes(data); + } + /// + /// 转换为字符串 + /// + /// 数据 + /// System.String. + public static string ToStringExt(this object data) + { + return data == null ? string.Empty : data.ToString(); + } + #endregion + + /// + /// 安全返回值 + /// + /// + /// 可空值 + /// T. + public static T SafeValue(this T? value) where T : struct + { + return value ?? default(T); + } + /// + /// 是否为空 + /// + /// 值 + /// true if the specified value is empty; otherwise, false. + public static bool IsEmpty(this string value) + { + return string.IsNullOrWhiteSpace(value); + } + /// + /// 是否为空 + /// + /// 值 + /// true if the specified value is empty; otherwise, false. + public static bool IsEmpty(this Guid? value) + { + if (value == null) + return true; + return IsEmpty(value.Value); + } + /// + /// 是否为空 + /// + /// 值 + /// true if the specified value is empty; otherwise, false. + public static bool IsEmpty(this Guid value) + { + if (value == Guid.Empty) + return true; + return false; + } + /// + /// 是否为空 + /// + /// 值 + /// true if the specified value is empty; otherwise, false. + public static bool IsEmpty(this object value) + { + if (value != null && !string.IsNullOrEmpty(value.ToString())) + { + return false; + } + else + { + return true; + } + } + + #region 是否数字 + /// + /// 功能描述:是否数字 + /// 作  者:HZH + /// 创建日期:2019-03-06 09:03:05 + /// 任务编号:POS + /// + /// value + /// 返回值 + public static bool IsNum(this string value) + { + return System.Text.RegularExpressions.Regex.IsMatch(value, @"^\d+(\.\d*)?$"); + } + #endregion + + } +} diff --git a/JinYuan.ControlLib/UCHelper/IDpiControl.cs b/JinYuan.ControlLib/UCHelper/IDpiControl.cs new file mode 100644 index 0000000..3984bd3 --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/IDpiControl.cs @@ -0,0 +1,13 @@ +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 缩放控件接口 + /// + public interface IDpiControl + { + /// + /// Dpi + /// + float ScaleDpi { get; set; } + } +} diff --git a/JinYuan.ControlLib/UCHelper/MainThreadAnimationControl.cs b/JinYuan.ControlLib/UCHelper/MainThreadAnimationControl.cs new file mode 100644 index 0000000..6138296 --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/MainThreadAnimationControl.cs @@ -0,0 +1,159 @@ +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Threading; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 主线程动画控件基类,不能时耗时操作,该定时器时UI线程计时器。耗时长对导致画面卡顿。 + /// + [ToolboxItem(false)] + [Description("动画控件基类")] + public abstract class MainThreadAnimationControl : DpiControl + { + #region 字段 + + /// + /// 动画控件集合锁 + /// + private static object animationcontrols_lock = new object(); + /// + /// 动画控件集合 + /// + private static List animationcontrols = new List(); + /// + /// 动画定时器锁 + /// + private static object timer_lock = new object(); + + /// + /// 定时器间隔 + /// + private static Thread thread = null; + /// + /// 线程间隔 + /// + private static int threadInterval = 100; + + + private static CancellationTokenSource cts = new CancellationTokenSource(); + /// + /// 停止线程 + /// + private static ManualResetEvent stopEvent = new ManualResetEvent(false); + + //private static Timer timer = null; + + #endregion + + public MainThreadAnimationControl() + { + if (thread == null) + { + lock (timer_lock) + { + thread = new Thread(() => ThreadFunction()); + thread.IsBackground = true; + thread.Start(); + } + } + } + + #region 虚方法 + + /// + /// 动画控件动画中要处理的内容(不能时耗时操作,该定时器为UI线程计时器。耗时长对导致画面卡顿) + /// + /// 动画定时器间隔时间 + protected virtual void Animationing(int interval) + { + + } + + #endregion + + #region 私有方法 + + /// + /// 定时器事件 + /// + /// + /// + internal static void ThreadFunction() + { + ArrayList indexArr = new ArrayList(); + while (true) + { + if (cts.Token.IsCancellationRequested) + { + return; + } + // stopEvent.WaitOne(); + + for (int i = 0; i < animationcontrols.Count; i++) + { + if (animationcontrols[i] != null) + { + animationcontrols[i].Animationing(threadInterval); + } + else + { + indexArr.Add(i); + } + } + + if (indexArr.Count > 0) + { + for (int i = 0; i < indexArr.Count; i++) + { + animationcontrols.RemoveAt((int)indexArr[i] - i); + } + } + if (animationcontrols.Count < 1) + { + stopEvent.Set(); + } + + Thread.Sleep(threadInterval); + } + } + + /// + /// 开始指定控件动画 + /// + /// + internal static void AnimationStart(MainThreadAnimationControl control) + { + if (control == null) + return; + + lock (animationcontrols_lock) + { + if (animationcontrols.IndexOf(control) < 0) + { + animationcontrols.Add(control); + } + } + stopEvent.Reset(); + } + + /// + /// 停止指定控件动画 + /// + /// + internal static void AnimationStop(MainThreadAnimationControl control) + { + if (control == null) + return; + + lock (animationcontrols_lock) + { + animationcontrols.Remove(control); + } + } + + #endregion + + } +} diff --git a/JinYuan.ControlLib/UCHelper/MouseHook.cs b/JinYuan.ControlLib/UCHelper/MouseHook.cs new file mode 100644 index 0000000..e6cf444 --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/MouseHook.cs @@ -0,0 +1,195 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 鼠标全局钩子 + /// + public static class MouseHook + { + /// + /// The wm mousemove + /// + private const int WM_MOUSEMOVE = 0x200; + /// + /// The wm lbuttondown + /// + private const int WM_LBUTTONDOWN = 0x201; + /// + /// The wm rbuttondown + /// + private const int WM_RBUTTONDOWN = 0x204; + /// + /// The wm mbuttondown + /// + private const int WM_MBUTTONDOWN = 0x207; + /// + /// The wm lbuttonup + /// + private const int WM_LBUTTONUP = 0x202; + /// + /// The wm rbuttonup + /// + private const int WM_RBUTTONUP = 0x205; + /// + /// The wm mbuttonup + /// + private const int WM_MBUTTONUP = 0x208; + /// + /// The wm lbuttondblclk + /// + private const int WM_LBUTTONDBLCLK = 0x203; + /// + /// The wm rbuttondblclk + /// + private const int WM_RBUTTONDBLCLK = 0x206; + /// + /// The wm mbuttondblclk + /// + private const int WM_MBUTTONDBLCLK = 0x209; + + /// + /// 点 + /// + [StructLayout(LayoutKind.Sequential)] + public class POINT + { + /// + /// The x + /// + public int x; + /// + /// The y + /// + public int y; + } + + /// + /// 钩子结构体 + /// + [StructLayout(LayoutKind.Sequential)] + public class MouseHookStruct + { + /// + /// The pt + /// + public POINT pt; + /// + /// The h WND + /// + public int hWnd; + /// + /// The w hit test code + /// + public int wHitTestCode; + /// + /// The dw extra information + /// + public int dwExtraInfo; + } + + + // 全局的鼠标事件 + /// + /// Occurs when [on mouse activity]. + /// + public static event MouseEventHandler OnMouseActivity; + + + /// + /// The h mouse hook + /// + private static int _hMouseHook = 0; // 鼠标钩子句柄 + /// + /// 启动全局钩子 + /// + /// SetWindowsHookEx failed. + /// SetWindowsHookEx failed. + public static void Start() + { + // 安装鼠标钩子 + if (_hMouseHook != 0) + { + Stop(); + } + // 生成一个HookProc的实例. + WindowsHook.HookMsgChanged += WindowsHook_HookMsgChanged; + _hMouseHook = WindowsHook.StartHook(HookType.WH_MOUSE_LL); + + //假设装置失败停止钩子 + if (_hMouseHook == 0) + { + Stop(); + } + } + + static void WindowsHook_HookMsgChanged(string strHookName, int nCode, IntPtr msg, IntPtr lParam) + { + // 假设正常执行而且用户要监听鼠标的消息 + if (nCode >= 0 && OnMouseActivity != null) + { + MouseButtons button = MouseButtons.None; + int clickCount = 0; + + switch ((int)msg) + { + case WM_LBUTTONDOWN: + button = MouseButtons.Left; + clickCount = 1; + break; + case WM_LBUTTONUP: + button = MouseButtons.Left; + clickCount = 1; + break; + case WM_LBUTTONDBLCLK: + button = MouseButtons.Left; + clickCount = 2; + break; + case WM_RBUTTONDOWN: + button = MouseButtons.Right; + clickCount = 1; + break; + case WM_RBUTTONUP: + button = MouseButtons.Right; + clickCount = 1; + break; + case WM_RBUTTONDBLCLK: + button = MouseButtons.Right; + clickCount = 2; + break; + } + if (button != MouseButtons.None && clickCount > 0) + { + // 从回调函数中得到鼠标的信息 + MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); + MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0); + OnMouseActivity(null, e); + } + } + } + + /// + /// 停止全局钩子 + /// + /// UnhookWindowsHookEx failed. + /// UnhookWindowsHookEx failed. + public static void Stop() + { + bool retMouse = true; + + if (_hMouseHook != 0) + { + retMouse = WindowsHook.StopHook(_hMouseHook); + _hMouseHook = 0; + } + + // 假设卸下钩子失败 + if (!(retMouse)) + throw new Exception("UnhookWindowsHookEx failed."); + } + + + } +} diff --git a/JinYuan.ControlLib/UCHelper/NativeMethods.cs b/JinYuan.ControlLib/UCHelper/NativeMethods.cs new file mode 100644 index 0000000..7a8848f --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/NativeMethods.cs @@ -0,0 +1,312 @@ +using System; +using System.Runtime.InteropServices; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// Win32 + /// + public static class NativeMethods + { + #region 消息 + + public const int WM_USER = 0x0400;//用户自定义消息 + public const int WM_USER_DROPDROWLISTPLUS_MOUSEENTER = NativeMethods.WM_USER + 10;// DropDrowListPlus MouseEnter消息 + public const int WM_USER_DROPDROWLISTPLUS_MOUSELEAVE = NativeMethods.WM_USER + 11;// DropDrowListPlus MouseLeave消息 + public const int WM_USER_DROPDROWLISTPLUS_MOUSEDOWN = NativeMethods.WM_USER + 12;// DropDrowListPlus MouseDown消息 + public const int WM_USER_DROPDROWLISTPLUS_MOUSEUP = NativeMethods.WM_USER + 13;// DropDrowListPlus MouseUp消息 + public const int WM_USER_DROPDROWLISTPLUS_MOUSEMOVE = NativeMethods.WM_USER + 14;// DropDrowListPlus MouseMove消息 + public const int WM_USER_DROPDROWLISTPLUS_CLOSED = NativeMethods.WM_USER + 15;// DropDrowListPlus 下拉面板Closed消息 + public const int WM_USER_DROPDROWLISTPLUS_MOUSEWHEEL = NativeMethods.WM_USER + 16;// DropDrowListPlus 下拉面板MouseWheel消息 + public const int WM_USER_DROPDROWLISTPLUS_PAINT = NativeMethods.WM_USER + 17;// DropDrowListPlus 下拉面板Paint消息 + + + public const int LOGPIXELSX = 88; + public const int LOGPIXELSY = 90; + + #endregion + + #region 结构 + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left; + public int top; + public int right; + public int bottom; + + public RECT(int left, int top, int right, int bottom) + { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + public RECT(System.Drawing.Rectangle r) + { + this.left = r.Left; + this.top = r.Top; + this.right = r.Right; + this.bottom = r.Bottom; + } + + public static RECT FromXYWH(int x, int y, int width, int height) + { + return new RECT(x, y, x + width, y + height); + } + + public System.Drawing.Size Size + { + get + { + return new System.Drawing.Size(this.right - this.left, this.bottom - this.top); + } + } + } + + [StructLayout(LayoutKind.Sequential)] + public class POINT + { + public int x; + public int y; + + public POINT() + { + } + + public POINT(int x, int y) + { + this.x = x; + this.y = y; + } + + } + + #endregion + + #region 扩展 + + [DllImport("User32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)] + public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex); + + [DllImport("User32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)] + public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex); + + public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex) + { + if (IntPtr.Size == 4) + { + return GetWindowLong32(hWnd, nIndex); + } + return GetWindowLongPtr64(hWnd, nIndex); + } + + [DllImport("User32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)] + public static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + + [DllImport("User32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)] + public static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + + public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong) + { + if (IntPtr.Size == 4) + { + return SetWindowLongPtr32(hWnd, nIndex, dwNewLong); + } + return SetWindowLongPtr64(hWnd, nIndex, dwNewLong); + } + + [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); + + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); + + [DllImport("User32.dll", EntryPoint = "SendMessage")] + public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); + + [DllImport("User32.dll", EntryPoint = "SendMessage")] + public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + + [DllImport("User32.dll", ExactSpelling = true, SetLastError = true)] + public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + + /// + /// 检索指定窗口的边界矩形的尺寸。 尺寸以相对于屏幕左上角的屏幕坐标提供。 + /// + /// 窗口的句柄 + /// 指向 RECT 结构的指针,用于接收窗口左上角和右下角的屏幕坐标 + /// + [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern bool GetWindowRect(IntPtr hWnd, [In, Out] ref RECT rect); + + /// + /// 激活指定窗口 + /// + /// 窗口的句柄 + /// + [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern IntPtr SetActiveWindow(IntPtr hWnd); + + [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + public static extern bool IsWindowVisible(IntPtr hWnd); + + + + /// + /// 获得的设备环境覆盖了整个窗口(包括非客户区) + /// + /// + /// + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + public static extern IntPtr GetWindowDC(IntPtr hwnd); + + /// + /// 用于获得hWnd参数所指定窗口的客户区域的一个设备环境 + /// + /// + /// + [DllImport("user32.dll")] + public static extern IntPtr GetDC(IntPtr ptr); + + [DllImport("User32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + public static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc); + + + + /// + /// DPI的缩放由程序自己处理 + /// + /// + [DllImport("user32.dll")] + public static extern bool SetProcessDPIAware(); + + [DllImport("user32.dll")] + public static extern IntPtr GetDesktopWindow(); + + [DllImport("gdi32.dll")] + public static extern int GetDeviceCaps(IntPtr hdc, int nIndex); + + + + public static int MAKELONG(int low, int high) + { + return (high << 16) | (low & 0xffff); + } + + public static IntPtr MAKELPARAM(int low, int high) + { + return (IntPtr)((high << 16) | (low & 0xffff)); + } + + /// + /// 高16位(无符号) + /// + /// + /// + public static int HIWORD(IntPtr n) + { + return HIWORD(unchecked((int)(long)n)); + } + /// + /// 高16位(无符号) + /// + /// + /// + public static int HIWORD(int n) + { + return (n >> 16) & 0xffff; + } + + /// + /// 低16位(无符号) + /// + /// + /// + public static int LOWORD(IntPtr n) + { + return LOWORD(unchecked((int)(long)n)); + } + /// + /// 低16位(无符号) + /// + /// + /// + public static int LOWORD(int n) + { + return n & 0xffff; + } + + /// + /// 高16位(有符号) + /// + /// + /// + public static int SignedHIWORD(IntPtr n) + { + return SignedHIWORD(unchecked((int)(long)n)); + } + /// + /// 高16位(有符号) + /// + /// + /// + public static int SignedHIWORD(int n) + { + return (int)(short)((n >> 16) & 0xffff); + } + + /// + /// 低16位(有符号) + /// + /// + /// + public static int SignedLOWORD(IntPtr n) + { + return SignedLOWORD(unchecked((int)(long)n)); + } + /// + /// 低16位(有符号) + /// + /// + /// + public static int SignedLOWORD(int n) + { + return (int)(short)(n & 0xFFFF); + } + + + + + /// + /// 结构转指针 + /// + /// 结构类型 + /// + /// + public static IntPtr StructToIntPtr(T info) + { + int size = Marshal.SizeOf(info); + IntPtr intPtr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(info, intPtr, true); + return intPtr; + } + + /// + /// 指针转结构 + /// + /// 结构类型 + /// + /// + public static T IntPtrToStruct(IntPtr info) + { + return (T)Marshal.PtrToStructure(info, typeof(T)); + } + + + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCHelper/PropertyOrderAttribute.cs b/JinYuan.ControlLib/UCHelper/PropertyOrderAttribute.cs new file mode 100644 index 0000000..98eb9b9 --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/PropertyOrderAttribute.cs @@ -0,0 +1,27 @@ +using System; + +namespace JinYuan.ControlLib.UCHelper +{ + // + // 摘要: + // 属性排序(升序) + [AttributeUsage(AttributeTargets.Property)] + public class PropertyOrderAttribute : Attribute + { + private float order; + + // + // 摘要: + // 序号 + public float Order => order; + + // + // 参数: + // order: + // 序号 + public PropertyOrderAttribute(float order) + { + this.order = order; + } + } +} diff --git a/JinYuan.ControlLib/UCHelper/PropertyOrderConverter.cs b/JinYuan.ControlLib/UCHelper/PropertyOrderConverter.cs new file mode 100644 index 0000000..5801608 --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/PropertyOrderConverter.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Globalization; + +namespace JinYuan.ControlLib.UCHelper +{ + // + // 摘要: + // 对属性进行排序 + public class PropertyOrderConverter : TypeConverter + { + // + // 摘要: + // 当该属性为展开属性选型时,属性编辑器删除该属性的描述 + // + // 参数: + // context: + // + // culture: + // + // value: + // + // destinationType: + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(string)) + { + return string.Empty; + } + + return base.ConvertTo(context, culture, value, destinationType); + } + + public override bool GetPropertiesSupported(ITypeDescriptorContext context) + { + return true; + } + + public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) + { + PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value, attributes); + ArrayList arrayList = new ArrayList(); + foreach (PropertyDescriptor item in properties) + { + Attribute attribute = item.Attributes[typeof(PropertyOrderAttribute)]; + arrayList.Add(new PropertyOrderPair(item.Name, (attribute == null) ? 0f : ((PropertyOrderAttribute)attribute).Order)); + } + + arrayList.Sort(); + ArrayList arrayList2 = new ArrayList(); + foreach (PropertyOrderPair item2 in arrayList) + { + arrayList2.Add(item2.CategoryName); + } + + return properties.Sort((string[])arrayList2.ToArray(typeof(string))); + } + } +} diff --git a/JinYuan.ControlLib/UCHelper/PropertyOrderPair.cs b/JinYuan.ControlLib/UCHelper/PropertyOrderPair.cs new file mode 100644 index 0000000..11f6bad --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/PropertyOrderPair.cs @@ -0,0 +1,49 @@ +using System; + +namespace JinYuan.ControlLib.UCHelper +{ + + // + // 摘要: + // 属性排序 序号比较器 + public class PropertyOrderPair : IComparable + { + private float order; + + private string categoryName; + + // + // 摘要: + // 类别名称 + public string CategoryName => categoryName; + + // + // 参数: + // categoryName: + // 类别名称 + // + // order: + // 序号 + public PropertyOrderPair(string categoryName, float order) + { + this.order = order; + this.categoryName = categoryName; + } + + public int CompareTo(object obj) + { + PropertyOrderPair propertyOrderPair = (PropertyOrderPair)obj; + if (propertyOrderPair.order == order) + { + return string.Compare(categoryName, propertyOrderPair.categoryName); + } + + if (propertyOrderPair.order > order) + { + return -1; + } + + return 1; + } + } +} diff --git a/JinYuan.ControlLib/UCHelper/WindowsHook.cs b/JinYuan.ControlLib/UCHelper/WindowsHook.cs new file mode 100644 index 0000000..349861f --- /dev/null +++ b/JinYuan.ControlLib/UCHelper/WindowsHook.cs @@ -0,0 +1,177 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +namespace JinYuan.ControlLib.UCHelper +{ + /// + /// 钩子类型 + /// + public enum HookType : int + { + /// + /// 安装一个钩子过程,该过程监视由于对话框,消息框,菜单或滚动条中的输入事件而生成的消息。 + /// 有关更多信息,请参阅MessageProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644987(v=vs.85))挂接过程。 + /// + WH_MSGFILTER = -1, + /// + /// 安装一个钩子过程,记录发布到系统消息队列的输入消息。 此挂钩对于录制宏非常有用。 + /// 有关更多信息,请参阅JournalRecordProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644983(v=vs.85))挂钩过程。 + /// + WH_JOURNALRECORD = 0, + /// + /// 安装一个挂钩过程,该过程发布先前由WH_JOURNALRECORD挂钩过程记录的消息。 + /// 有关更多信息,请参阅JournalPlaybackProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644982(v=vs.85))挂钩过程。 + /// + WH_JOURNALPLAYBACK = 1, + /// + /// 安装一个监视击键消息的钩子程序。 + /// 有关更多信息,请参阅KeyboardProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644984(v=vs.85))挂钩过程。 + /// + WH_KEYBOARD = 2, + /// + /// 安装一个钩子过程来监视发布到消息队列的消息。 + /// 有关更多信息,请参阅GetMsgProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644981(v=vs.85))挂接过程。 + /// + WH_GETMESSAGE = 3, + /// + /// 安装一个钩子过程,在系统将消息发送到目标窗口过程之前监视消息。 + /// 有关更多信息,请参阅CallWndProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644975(v=vs.85))挂接过程。 + /// + WH_CALLWNDPROC = 4, + /// + /// 安装一个钩子程序,接收对CBT应用程序有用的通知。 + /// 有关更多信息,请参阅CBTProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644977(v=vs.85))挂钩过程。 + /// + WH_CBT = 5, + /// + /// 安装一个钩子过程,该过程监视由于对话框,消息框,菜单或滚动条中的输入事件而生成的消息。 + /// 钩子过程监视与调用线程在同一桌面中的所有应用程序的这些消息。 + /// 有关更多信息,请参阅SysMsgProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644992(v=vs.85))挂接过程。 + /// + WH_SYSMSGFILTER = 6, + /// + /// 安装监视鼠标消息的钩子过程。 + /// 有关更多信息,请参阅MouseProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644988(v=vs.85))挂钩过程。 + /// + WH_MOUSE = 7, + /// + /// 安装一个用于调试其他钩子过程的钩子过程。 + /// 有关更多信息,请参阅DebugProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644978(v=vs.85))挂接过程。 + /// + WH_DEBUG = 9, + /// + /// 安装一个钩子过程,接收对shell应用程序有用的通知。 + /// 有关更多信息,请参阅ShellProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644991(v=vs.85))挂钩过程。 + /// + WH_SHELL = 10, + /// + /// 安装一个钩子过程,当应用程序的前台线程即将变为空闲时将调用该过程。 + /// 此挂钩对于在空闲时执行低优先级任务非常有用。 + /// 有关更多信息,请参阅ForegroundIdleProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644980(v=vs.85))挂钩过程。 + /// + WH_FOREGROUNDIDLE = 11, + /// + /// 安装一个钩子过程,该过程在目标窗口过程处理完消息后对其进行监视。 + /// 有关更多信息,请参阅CallWndRetProc(https://docs.microsoft.com/windows/desktop/api/winuser/nc-winuser-hookproc)挂接过程。 + /// + WH_CALLWNDPROCRET = 12, + /// + /// 安装一个监视低级键盘输入事件的钩子过程。 有关更多信息, + /// 请参阅LowLevelKeyboardProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644985(v=vs.85))挂接过程。 + /// + WH_KEYBOARD_LL = 13, + /// + /// 安装一个监视低级鼠标输入事件的钩子过程。 有关更多信息, + /// 请参阅LowLevelMouseProc(https://docs.microsoft.com/previous-versions/windows/desktop/legacy/ms644986(v=vs.85))挂接过程。 + /// + WH_MOUSE_LL = 14, + } + public class WindowsHook + { + public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); + // 装置钩子的函数 + [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, int hInstance, int threadId); + + // 卸下钩子的函数 + [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern bool UnhookWindowsHookEx(int idHook); + + // 下一个钩挂的函数 + [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); + [DllImport("User32.dll", CharSet = CharSet.Auto)] + public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + /// + /// Delegate HookMsgHandler + /// + /// 钩子名称 + /// 消息值 + public delegate void HookMsgHandler(string strHookName, int nCode, IntPtr msg, IntPtr lParam); + /// + /// 钩子消息事件 + /// + public static event HookMsgHandler HookMsgChanged; + /// + /// 启动一个钩子 + /// + /// 钩子类型 + /// 模块句柄,为空则为当前模块 + /// 进程句柄,默认为0则表示当前进程 + /// 钩子名称 + /// 钩子句柄(消耗钩子时需要使用) + /// SetWindowsHookEx failed. + public static int StartHook(HookType hookType, int wParam = 0, int pid = 0, string strHookName = "") + { + int _hHook = 0; + // 生成一个HookProc的实例. + var _hookProcedure = new HookProc((nCode, msg, lParam) => + { + + if (HookMsgChanged != null) + { + try + { + HookMsgChanged(strHookName, nCode, msg, lParam); + } + catch { } + } + + int inext = CallNextHookEx(_hHook, nCode, msg, lParam); + return inext; + }); + if (pid == 0) + pid = Thread.CurrentThread.ManagedThreadId; + _hHook = SetWindowsHookEx((int)hookType, _hookProcedure, wParam, pid); + + //假设装置失败停止钩子 + if (_hHook == 0) + { + StopHook(_hHook); + } + return _hHook; + } + + /// + /// 停止钩子 + /// + /// StartHook函数返回的钩子句柄 + /// true if 停止成功, false 否则. + public static bool StopHook(int _hHook) + { + bool ret = true; + + if (_hHook != 0) + { + ret = UnhookWindowsHookEx(_hHook); + } + + // 假设卸下钩子失败 + if (!ret) + return false; + return true; + } + } +} diff --git a/JinYuan.ControlLib/UCLed.Designer.cs b/JinYuan.ControlLib/UCLed.Designer.cs new file mode 100644 index 0000000..ee295d3 --- /dev/null +++ b/JinYuan.ControlLib/UCLed.Designer.cs @@ -0,0 +1,42 @@ +namespace Controls +{ + partial class UCLed + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (_blinkTimer != null) + { + _blinkTimer.Stop(); + _blinkTimer.Dispose(); + _blinkTimer = null; + } + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCLed.cs b/JinYuan.ControlLib/UCLed.cs new file mode 100644 index 0000000..b0375dd --- /dev/null +++ b/JinYuan.ControlLib/UCLed.cs @@ -0,0 +1,277 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Controls +{ + [ToolboxItem(true)] + [Description("一个用于显示通信状态的LED指示器控件")] + public partial class UCLed : UserControl + { + private Color _onColor = Color.Green; + private Color _offColor = Color.Red; + private Color _blinkColor = Color.Yellow; + private Color _textColor = Color.White; + private string _statusText = "NG"; + private bool _isOn = false; + private bool _isBlinking = false; + private bool _blinkState = false; + private int _blinkInterval = 500; // 默认闪烁间隔(毫秒) + private Timer _blinkTimer; + + private int _cornerRadius = 10; // 新增:控制圆角半径的字段 + + public UCLed() + { + InitializeComponent(); + SetStyle(ControlStyles.SupportsTransparentBackColor | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint, true); + this.BackColor = Color.Transparent; + } + + protected override void OnHandleCreated(EventArgs e) + { + base.OnHandleCreated(e); + InitializeTimer(); + } + + private void InitializeTimer() + { + if (_blinkTimer == null) + { + _blinkTimer = new Timer(); + _blinkTimer.Tick += BlinkTimer_Tick; + _blinkTimer.Interval = _blinkInterval; + } + } + + [Category("外观")] + [DefaultValue(typeof(Color), "Green")] + public Color OnColor + { + get => _onColor; + set + { + if (_onColor != value) + { + _onColor = value; + Invalidate(); + } + } + } + + [Category("外观")] + [DefaultValue(typeof(Color), "Red")] + public Color OffColor + { + get => _offColor; + set + { + if (_offColor != value) + { + _offColor = value; + Invalidate(); + } + } + } + + [Category("外观")] + [DefaultValue(typeof(Color), "Yellow")] + public Color BlinkColor + { + get => _blinkColor; + set + { + if (_blinkColor != value) + { + _blinkColor = value; + Invalidate(); + } + } + } + + [Category("外观")] + [DefaultValue(typeof(Color), "White")] + public Color TextColor + { + get => _textColor; + set + { + if (_textColor != value) + { + _textColor = value; + Invalidate(); + } + } + } + + [Category("外观")] + [DefaultValue(10)] + public int CornerRadius + { + get => _cornerRadius; + set + { + if (_cornerRadius != value) + { + _cornerRadius = value; + Invalidate(); + } + } + } + + + [Category("外观")] + [DefaultValue("NG")] + public string StatusText + { + get => _statusText; + set + { + if (_statusText != value) + { + _statusText = value; + Invalidate(); + } + } + } + + [Category("行为")] + [DefaultValue(false)] + public bool IsOn + { + get => _isOn; + set + { + if (_isOn != value) + { + _isOn = value; + if (!_isBlinking) + { + Invalidate(); + } + } + } + } + + [Category("行为")] + [DefaultValue(false)] + public bool IsBlinking + { + get => _isBlinking; + set + { + if (_isBlinking != value) + { + _isBlinking = value; + if (_isBlinking) + _blinkTimer?.Start(); + else + { + _blinkTimer?.Stop(); + _blinkState = false; + } + Invalidate(); + } + } + } + + [Category("行为")] + [DefaultValue(500)] + public int BlinkInterval + { + get => _blinkInterval; + set + { + if (_blinkInterval != value) + { + _blinkInterval = value; + if (_blinkTimer != null && !DesignMode) + { + _blinkTimer.Interval = _blinkInterval; + } + } + } + } + + + + + private void BlinkTimer_Tick(object sender, EventArgs e) + { + _blinkState = !_blinkState; + this.BeginInvoke(new Action(() => this.Invalidate())); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + Graphics g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; + + Color currentColor; + + if (_isBlinking) + { + currentColor = _blinkState ? _blinkColor : (_isOn ? _onColor : _offColor); + } + else + { + currentColor = _isOn ? _onColor : _offColor; + } + + using (GraphicsPath path = CreateRoundedRectangle(ClientRectangle, _cornerRadius)) + using (SolidBrush backBrush = new SolidBrush(currentColor)) + { + g.FillPath(backBrush, path); + } + + using (Brush textBrush = new SolidBrush(_textColor)) + { + StringFormat sf = new StringFormat(); + sf.Alignment = StringAlignment.Center; + sf.LineAlignment = StringAlignment.Center; + g.DrawString(_statusText, Font, textBrush, ClientRectangle, sf); + } + } + + private GraphicsPath CreateRoundedRectangle(Rectangle bounds, int radius) + { + int diameter = radius * 2; + Size size = new Size(diameter, diameter); + Rectangle arc = new Rectangle(bounds.Location, size); + GraphicsPath path = new GraphicsPath(); + + if (radius == 0) + { + path.AddRectangle(bounds); + return path; + } + + // 左上角 + path.AddArc(arc, 180, 90); + + // 右上角 + arc.X = bounds.Right - diameter; + path.AddArc(arc, 270, 90); + + // 右下角 + arc.Y = bounds.Bottom - diameter; + path.AddArc(arc, 0, 90); + + // 左下角 + arc.X = bounds.Left; + path.AddArc(arc, 90, 90); + + path.CloseFigure(); + return path; + } + + + } +} + diff --git a/JinYuan.ControlLib/UCLedAvatar.Designer.cs b/JinYuan.ControlLib/UCLedAvatar.Designer.cs new file mode 100644 index 0000000..6f3ca30 --- /dev/null +++ b/JinYuan.ControlLib/UCLedAvatar.Designer.cs @@ -0,0 +1,49 @@ +using System.Drawing; + +namespace Controls +{ + partial class UCLedAvatar + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (_blinkTimer != null) + { + _blinkTimer.Stop(); + _blinkTimer.Dispose(); + _blinkTimer = null; + } + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Size = new Size(32, 32); + this.ResumeLayout(false); + } + + + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCLedAvatar.cs b/JinYuan.ControlLib/UCLedAvatar.cs new file mode 100644 index 0000000..b3e0f27 --- /dev/null +++ b/JinYuan.ControlLib/UCLedAvatar.cs @@ -0,0 +1,149 @@ +using AntdUI; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Controls +{ + public enum LedStatus + { + Default, // 默认状态(灰色) + Running, // 运行状态(绿色) + Idle, // 闲置状态(橙色) + Alarm // 报警状态(红色) + } + + + [ToolboxItem(true)] + [Description("一个用于显示通信状态的LED指示器控件")] + public partial class UCLedAvatar : UserControl + { + private Avatar avatar; + private LedStatus _status = LedStatus.Default; + private bool _isBlinking = false; + private bool _blinkState = false; + private System.Windows.Forms.Timer _blinkTimer; + + // 定义状态对应的颜色 + private static readonly Dictionary StatusColors = new Dictionary + { + { LedStatus.Default, Color.FromArgb(128, 128, 128) }, // 灰色 + { LedStatus.Running, Color.FromArgb(16, 192, 101) }, // 绿色 #10c065 + { LedStatus.Idle, Color.FromArgb(255, 147, 0) }, // 橙色 #ff9300 + { LedStatus.Alarm, Color.FromArgb(241, 11, 18) } // 红色 #f10b12 + }; + + // SVG 模板 + private const string SVG_TEMPLATE = @" + + "; + + public UCLedAvatar() + { + InitializeComponent(); + InitializeAvatar(); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.BackColor = Color.Transparent; + } + + + private void InitializeAvatar() + { + avatar = new Avatar + { + Dock = DockStyle.Fill, + Round = false, + ImageSvg = string.Format(SVG_TEMPLATE, ColorTranslator.ToHtml(StatusColors[LedStatus.Default])) + }; + + this.Controls.Add(avatar); + InitializeTimer(); + } + + private void InitializeTimer() + { + _blinkTimer = new System.Windows.Forms.Timer(); + _blinkTimer.Tick += BlinkTimer_Tick; + _blinkTimer.Interval = 500; // 默认闪烁间隔 + } + + [Category("行为")] + [DefaultValue(LedStatus.Default)] + public LedStatus Status + { + get => _status; + set + { + if (_status != value) + { + _status = value; + UpdateLedState(); + } + } + } + + [Category("行为")] + [DefaultValue(false)] + public bool IsBlinking + { + get => _isBlinking; + set + { + if (_isBlinking != value) + { + _isBlinking = value; + if (_isBlinking) + { + _blinkTimer.Start(); + } + else + { + _blinkTimer.Stop(); + _blinkState = false; + UpdateLedState(); + } + } + } + } + + [Category("行为")] + [DefaultValue(500)] + public int BlinkInterval + { + get => _blinkTimer.Interval; + set + { + if (value > 0 && _blinkTimer.Interval != value) + { + _blinkTimer.Interval = value; + } + } + } + + private void BlinkTimer_Tick(object sender, EventArgs e) + { + _blinkState = !_blinkState; + UpdateLedState(); + } + + private void UpdateLedState() + { + Color currentColor; + if (_status == LedStatus.Alarm && _isBlinking) + { + // 报警状态下的闪烁在灰色和红色之间切换 + currentColor = _blinkState ? StatusColors[LedStatus.Alarm] : StatusColors[LedStatus.Default]; + } + else + { + // 非报警状态不闪烁 + currentColor = StatusColors[_status]; + } + + avatar.ImageSvg = string.Format(SVG_TEMPLATE, ColorTranslator.ToHtml(currentColor)); + } + + } +} diff --git a/JinYuan.ControlLib/UCRollText.Designer.cs b/JinYuan.ControlLib/UCRollText.Designer.cs new file mode 100644 index 0000000..1c7854d --- /dev/null +++ b/JinYuan.ControlLib/UCRollText.Designer.cs @@ -0,0 +1,39 @@ +namespace JinYuan.ControlLib +{ + partial class UCRollText + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + StopAnimation(); + _updateLock?.Dispose(); + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCRollText.cs b/JinYuan.ControlLib/UCRollText.cs new file mode 100644 index 0000000..0345a0e --- /dev/null +++ b/JinYuan.ControlLib/UCRollText.cs @@ -0,0 +1,291 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class UCRollText : UserControl + { + private Rectangle _rectText; + private int _moveDirection = 1; + private const int DEFAULT_MOVE_STEP = 2; // 减小步长,使滚动更平滑 + private const int DEFAULT_SLEEP_TIME = 20; // 减小刷新间隔,提高流畅度 + + private readonly SemaphoreSlim _updateLock = new SemaphoreSlim(1, 1); + private CancellationTokenSource _cts; + private volatile bool _isStop = true; + + #region Properties + + public override Font Font + { + get => base.Font; + set + { + base.Font = value; + UpdateTextRectangle(); + } + } + + public override string Text + { + get => base.Text; + set + { + base.Text = value; + UpdateTextRectangle(); + } + } + + private RollStyle _rollStyle = RollStyle.LeftToRight; + public RollStyle RollStyle + { + get => _rollStyle; + set + { + _rollStyle = value; + _moveDirection = value == RollStyle.RightToLeft ? -1 : 1; + ResetTextPosition(); + } + } + + private bool _isChangeReset; + [Description("文本改变是否重新从边缘运动"), Category("自定义")] + public bool IsChangeReset + { + get => _isChangeReset; + set => _isChangeReset = value; + } + + private bool _isExit; + [Description("是否退出"), Category("自定义")] + public bool IsExit + { + get => _isExit; + set + { + _isExit = value; + if (value) StopAnimation(); + } + } + + private int _moveSleepTime = DEFAULT_SLEEP_TIME; + [Description("每次滚动间隔时间,越小速度越快"), Category("自定义")] + public int MoveSleepTime + { + get => _moveSleepTime; + set => _moveSleepTime = value > 0 ? value : DEFAULT_SLEEP_TIME; + } + + #endregion + + public UCRollText() + { + InitializeControl(); + InitializeEvents(); + StartAnimation(); + } + + private void InitializeControl() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | + ControlStyles.DoubleBuffer | + ControlStyles.ResizeRedraw | + ControlStyles.Selectable | + ControlStyles.SupportsTransparentBackColor | + ControlStyles.UserPaint, true); + + DoubleBuffered = true; // 启用双缓冲,减少闪烁 + Size = new Size(450, 30); + Text = "滚动文字"; + ForeColor = Color.FromArgb(255, 77, 59); + } + + private void InitializeEvents() + { + Load += UCRollText_Load; + SizeChanged += UCRollText_SizeChanged; + VisibleChanged += (s, e) => + { + _isStop = !Visible; + if (Visible) StartAnimation(); + }; + } + + private void UCRollText_SizeChanged(object sender, EventArgs e) + { + if (_rectText != Rectangle.Empty) + { + _rectText.Y = (Height - _rectText.Height) / 2 + 1; + } + } + + private void UCRollText_Load(object sender, EventArgs e) + { + ResetTextPosition(); + } + + private async void StartAnimation() + { + if (!_isStop) return; + + _isStop = false; + _cts = new CancellationTokenSource(); + + try + { + await Task.Run(async () => + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + while (!_isStop && !_isExit) + { + try + { + var elapsed = stopwatch.ElapsedMilliseconds; + stopwatch.Restart(); + + await Task.Delay(MoveSleepTime, _cts.Token); + if (!IsHandleCreated || IsDisposed) continue; + + await UpdateTextPositionAsync(elapsed); + } + catch (OperationCanceledException) + { + break; + } + catch (Exception ex) + { + Debug.WriteLine($"Animation error: {ex.Message}"); + } + } + }, _cts.Token); + } + catch (OperationCanceledException) { } + } + + private void StopAnimation() + { + _isStop = true; + _cts?.Cancel(); + _cts?.Dispose(); + _cts = null; + } + + private async Task UpdateTextPositionAsync(long elapsedMilliseconds) + { + if (_rectText == Rectangle.Empty) return; + if (_rollStyle == RollStyle.BackAndForth && _rectText.Width >= Width) return; + + await _updateLock.WaitAsync(); + try + { + await Task.Run(() => + { + if (InvokeRequired) + { + BeginInvoke((MethodInvoker)(() => UpdateTextPosition(elapsedMilliseconds))); + } + else + { + UpdateTextPosition(elapsedMilliseconds); + } + }); + } + finally + { + _updateLock.Release(); + } + } + + private void UpdateTextPosition(long elapsedMilliseconds) + { + // 根据时间调整滚动步长,确保动画平滑 + int step = (int)(DEFAULT_MOVE_STEP * (elapsedMilliseconds / (double)MoveSleepTime)); + _rectText.X += step * _moveDirection; + + switch (_rollStyle) + { + case RollStyle.BackAndForth: + if (_rectText.X <= 0) + _moveDirection = 1; + else if (_rectText.Right >= Width) + _moveDirection = -1; + break; + + case RollStyle.LeftToRight: + if (_rectText.X > Width) + _rectText.X = -_rectText.Width - 1; + break; + + case RollStyle.RightToLeft: + if (_rectText.Right < 0) + _rectText.X = Width + _rectText.Width + 1; + break; + } + + Invalidate(); + } + + private void UpdateTextRectangle() + { + if (string.IsNullOrEmpty(Text)) return; + + using (var g = CreateGraphics()) + { + var size = g.MeasureString(Text, Font); + _rectText = new Rectangle( + _isChangeReset ? 0 : _rectText.X, + (Height - (int)size.Height) / 2 + 1, + (int)size.Width, + (int)size.Height + ); + } + } + + private void ResetTextPosition() + { + if (_rectText == Rectangle.Empty) return; + + switch (_rollStyle) + { + case RollStyle.LeftToRight: + _rectText.X = -_rectText.Width - 1; + break; + case RollStyle.RightToLeft: + _rectText.X = Width + _rectText.Width + 1; + break; + default: + _rectText.X = 0; + break; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (_rectText != Rectangle.Empty) + { + e.Graphics.SetGDIHigh(); + using (var brush = new SolidBrush(ForeColor)) + { + e.Graphics.DrawString(Text, Font, brush, _rectText.Location); + } + } + } + } + + public enum RollStyle + { + LeftToRight, + RightToLeft, + BackAndForth + } + +} diff --git a/JinYuan.ControlLib/UCSplitLine_H.Designer.cs b/JinYuan.ControlLib/UCSplitLine_H.Designer.cs new file mode 100644 index 0000000..9a51258 --- /dev/null +++ b/JinYuan.ControlLib/UCSplitLine_H.Designer.cs @@ -0,0 +1,65 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class UCSplitLine_H. + /// Implements the + /// + /// + partial class UCSplitLine_H + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UCSplitLine_H + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); + this.Name = "UCSplitLine_H"; + this.Size = new System.Drawing.Size(100, 1); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCSplitLine_H.cs b/JinYuan.ControlLib/UCSplitLine_H.cs new file mode 100644 index 0000000..b6f0b31 --- /dev/null +++ b/JinYuan.ControlLib/UCSplitLine_H.cs @@ -0,0 +1,36 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCSplitLine_H. + /// Implements the + /// + /// + public partial class UCSplitLine_H : UserControl + { + /// + /// Initializes a new instance of the class. + /// + public UCSplitLine_H() + { + InitializeComponent(); + this.TabStop = false; + } + } +} diff --git a/JinYuan.ControlLib/UCSplitLine_H.resx b/JinYuan.ControlLib/UCSplitLine_H.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/UCSplitLine_H.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UCSplitLine_V.Designer.cs b/JinYuan.ControlLib/UCSplitLine_V.Designer.cs new file mode 100644 index 0000000..ddad8f5 --- /dev/null +++ b/JinYuan.ControlLib/UCSplitLine_V.Designer.cs @@ -0,0 +1,65 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +namespace JinYuan.ControlLib +{ + /// + /// Class UCSplitLine_V. + /// Implements the + /// + /// + partial class UCSplitLine_V + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UCSplitLine_V + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); + this.Name = "UCSplitLine_V"; + this.Size = new System.Drawing.Size(1, 100); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/UCSplitLine_V.cs b/JinYuan.ControlLib/UCSplitLine_V.cs new file mode 100644 index 0000000..bdcb6b1 --- /dev/null +++ b/JinYuan.ControlLib/UCSplitLine_V.cs @@ -0,0 +1,36 @@ +// *********************************************************************** +// Assembly : JinYuan.ControlLib +// Created : 08-08-2019 +// +// *********************************************************************** +// +// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com +// +// +// Blog: https://www.cnblogs.com/bfyx +// GitHub:https://github.com/kwwwvagaa/NetWinformControl +// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git +// +// If you use this code, please keep this note. +// *********************************************************************** +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + /// + /// Class UCSplitLine_V. + /// Implements the + /// + /// + public partial class UCSplitLine_V : UserControl + { + /// + /// Initializes a new instance of the class. + /// + public UCSplitLine_V() + { + InitializeComponent(); + this.TabStop = false; + } + } +} diff --git a/JinYuan.ControlLib/UCSplitLine_V.resx b/JinYuan.ControlLib/UCSplitLine_V.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/UCSplitLine_V.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UpDownLabel.Designer.cs b/JinYuan.ControlLib/UpDownLabel.Designer.cs new file mode 100644 index 0000000..84d33cd --- /dev/null +++ b/JinYuan.ControlLib/UpDownLabel.Designer.cs @@ -0,0 +1,101 @@ +namespace JinYuan.ControlLib +{ + partial class UpDownLabel + { + /// + /// ±ØÐèµÄÉè¼ÆÆ÷±äÁ¿¡£ + /// + private System.ComponentModel.IContainer components = null; + + /// + /// ÇåÀíËùÓÐÕýÔÚʹÓõÄ×ÊԴ¡£ + /// + /// Èç¹ûӦÊͷÅÍйÜ×ÊԴ£¬Ϊ true£»·ñÔòΪ false¡£ + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region ×é¼þÉè¼ÆÆ÷Éú³ɵĴúÂë + + /// + /// Éè¼ÆÆ÷֧³ÖËùÐèµķ½·¨ - ²»ҪÐ޸Ä + /// ʹÓôúÂë±༭Æ÷Ð޸Ĵ˷½·¨µÄÄÚÈݡ£ + /// + private void InitializeComponent() + { + this.btn_Dec = new System.Windows.Forms.Button(); + this.btn_Add = new System.Windows.Forms.Button(); + this.lbl_Data = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // btn_Dec + // + this.btn_Dec.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(161)))), ((int)(((byte)(226))))); + this.btn_Dec.Dock = System.Windows.Forms.DockStyle.Left; + this.btn_Dec.FlatAppearance.BorderSize = 0; + this.btn_Dec.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Dec.Font = new System.Drawing.Font("΢ÈíÑźÚ", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_Dec.ForeColor = System.Drawing.Color.White; + this.btn_Dec.Location = new System.Drawing.Point(0, 0); + this.btn_Dec.Name = "btn_Dec"; + this.btn_Dec.Size = new System.Drawing.Size(37, 37); + this.btn_Dec.TabIndex = 0; + this.btn_Dec.Text = "-"; + this.btn_Dec.UseVisualStyleBackColor = false; + this.btn_Dec.Click += new System.EventHandler(this.btn_Dec_Click); + // + // btn_Add + // + this.btn_Add.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(161)))), ((int)(((byte)(226))))); + this.btn_Add.Dock = System.Windows.Forms.DockStyle.Right; + this.btn_Add.FlatAppearance.BorderSize = 0; + this.btn_Add.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Add.Font = new System.Drawing.Font("΢ÈíÑźÚ", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_Add.ForeColor = System.Drawing.Color.White; + this.btn_Add.Location = new System.Drawing.Point(89, 0); + this.btn_Add.Name = "btn_Add"; + this.btn_Add.Size = new System.Drawing.Size(37, 37); + this.btn_Add.TabIndex = 1; + this.btn_Add.Text = "+"; + this.btn_Add.UseVisualStyleBackColor = false; + this.btn_Add.Click += new System.EventHandler(this.btn_Add_Click); + // + // lbl_Data + // + this.lbl_Data.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Data.Location = new System.Drawing.Point(37, 0); + this.lbl_Data.Margin = new System.Windows.Forms.Padding(3); + this.lbl_Data.Name = "lbl_Data"; + this.lbl_Data.Size = new System.Drawing.Size(52, 37); + this.lbl_Data.TabIndex = 2; + this.lbl_Data.Text = "0"; + this.lbl_Data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // UpDownLabel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.Controls.Add(this.lbl_Data); + this.Controls.Add(this.btn_Add); + this.Controls.Add(this.btn_Dec); + this.Font = new System.Drawing.Font("΢ÈíÑźÚ", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "UpDownLabel"; + this.Size = new System.Drawing.Size(126, 37); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btn_Dec; + private System.Windows.Forms.Button btn_Add; + private System.Windows.Forms.Label lbl_Data; + } +} diff --git a/JinYuan.ControlLib/UpDownLabel.cs b/JinYuan.ControlLib/UpDownLabel.cs new file mode 100644 index 0000000..00eebd0 --- /dev/null +++ b/JinYuan.ControlLib/UpDownLabel.cs @@ -0,0 +1,157 @@ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [DefaultEvent("ValueChanged")] + public partial class UpDownLabel : UserControl + { + public UpDownLabel() + { + InitializeComponent(); + } + + private Color themeColor = Color.FromArgb(27, 161, 226); + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡÖ÷ÌâÑÕɫ")] + public Color ThemeColor + { + get { return themeColor; } + set + { + themeColor = value; + + this.btn_Add.BackColor = themeColor; + this.btn_Dec.BackColor = themeColor; + } + } + + + + private Color themeForeColor = Color.White; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡÖ÷Ìâǰ¾°ɫ")] + public Color ThemeForeColor + { + get { return themeForeColor; } + set + { + themeForeColor = value; + + this.btn_Add.ForeColor = themeForeColor; + this.btn_Dec.ForeColor = themeForeColor; + } + } + + + + private int textWidth = 52; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡÎı¾¿òµĿí¶È")] + public int TextWidth + { + get { return textWidth; } + set + { + textWidth = value; + + this.btn_Add.Width = (this.Width - this.textWidth) / 2; + this.btn_Dec.Width = (this.Width - this.textWidth) / 2; + } + } + + + private float maxValue = 1000.0f; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡ×î´óֵ")] + public float MaxValue + { + get { return maxValue; } + set + { + maxValue = value; + } + } + + + private float minValue = -1000.0f; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡ×îСֵ")] + public float MinValue + { + get { return minValue; } + set + { + minValue = value; + } + } + + private float stepValue = 1.0f; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡ²½½øֵ")] + public float StepValue + { + get { return stepValue; } + set + { + stepValue = value; + } + } + + + private float currentValue = 0.0f; + [Browsable(true)] + [Category("×Զ¨ÒåÊôÐÔ")] + [Description("ÉèÖûò»ñȡµ±ǰֵ")] + public float CurrentValue + { + get { return currentValue; } + set + { + if (value > maxValue) + { + return; + } + + if (value < minValue) + { + return; + } + + if (currentValue == value) + { + return; + } + + currentValue = value; + + ValueChanged?.Invoke(this, null); + + this.lbl_Data.Text = currentValue.ToString(); + } + } + + private void btn_Dec_Click(object sender, EventArgs e) + { + CurrentValue -= stepValue; + } + + private void btn_Add_Click(object sender, EventArgs e) + { + CurrentValue += stepValue; + } + [Browsable(true)] + [Category("×Զ¨Òåʼþ")] + [Description("µ±ǰÊýֵ·¢Éú±仯´¥·¢")] + public event EventHandler ValueChanged; + } +} diff --git a/JinYuan.ControlLib/UpDownLabel.resx b/JinYuan.ControlLib/UpDownLabel.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/UpDownLabel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/UserStateChangedEvent.cs b/JinYuan.ControlLib/UserStateChangedEvent.cs new file mode 100644 index 0000000..c2e49f6 --- /dev/null +++ b/JinYuan.ControlLib/UserStateChangedEvent.cs @@ -0,0 +1,24 @@ +using System; + +namespace JinYuan.ControlLib +{ + public delegate void UserStateChangedEventHandler( + object sender, + UserStateChangedEventArgs e); + + public class UserStateChangedEventArgs : EventArgs + { + private bool _active; + + public UserStateChangedEventArgs(bool active) + : base() + { + _active = active; + } + + public bool Active + { + get { return _active; } + } + } +} diff --git a/JinYuan.ControlLib/UserStateMonitor.cs b/JinYuan.ControlLib/UserStateMonitor.cs new file mode 100644 index 0000000..99bcca2 --- /dev/null +++ b/JinYuan.ControlLib/UserStateMonitor.cs @@ -0,0 +1,174 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Threading; + +namespace JinYuan.ControlLib +{ + /// + /// 监视鼠标键盘操作。 + /// + public class UserStateMonitor : Component + { + //通过 Interval 属性调节扫描键盘鼠标状态的间隔时间,通过 Timeout 属性(无键盘操作时间间隔)控制判断是否离开 + + /// + /// 离开时间,单位:秒 + /// + private int _timeout = 5000; + private int _lastActiveTick; + private Timer _timer; + private int _interval = 1000; + private bool _started; + private bool _active = true; + + private static readonly object EventUseStateChanged = new object(); + + public UserStateMonitor() + : base() + { + } + + public UserStateMonitor(IContainer container) + : base() + { + container.Add(this); + } + + public event UserStateChangedEventHandler UserStateChanged + { + add { base.Events.AddHandler(EventUseStateChanged, value); } + remove { base.Events.RemoveHandler(EventUseStateChanged, value); } + } + + /// + /// 默认值:30分钟 + /// + [DefaultValue(1800000)] + public int Timeout + { + get { return _timeout; } + set + { + _timeout = Math.Max(5000, value); + } + } + + [DefaultValue(1000)] + public int Interval + { + get { return _interval; } + set + { + _interval = Math.Max(500, value); + if (_started) + { + Timer.Change(0, _interval); + } + else + { + Timer.Change(System.Threading.Timeout.Infinite, _interval); + } + } + } + + private Timer Timer + { + get + { + if (_timer == null) + { + _timer = new Timer( + new TimerCallback(delegate (object obj) + { + LASTINPUTINFO lii = new LASTINPUTINFO(); + lii.size = 8; + + if (GetLastInputInfo(ref lii)) + { + _lastActiveTick = Math.Max(lii.lastTick, _lastActiveTick); + bool active = Environment.TickCount - _lastActiveTick < _timeout; + if (_active != active) + { + _active = active; + OnUserStateChanged(new UserStateChangedEventArgs(active)); + } + } + }), + null, + System.Threading.Timeout.Infinite, + _interval); + } + return _timer; + } + } + + public void Start() + { + if (!_started) + { + Timer.Change(_interval, _interval); + _started = true; + } + } + + /// + /// 开始监控 + /// + /// 监控时间间隔,单位:分钟 + public void Start(int timeOut) + { + if (!_started) + { + + _timeout = timeOut * 1000;//转换成秒 + + Timer.Change(_interval, _interval); + _started = true; + } + } + + public void Stop() + { + if (_started) + { + Timer.Change(System.Threading.Timeout.Infinite, _interval); + _started = false; + } + } + + [StructLayout(LayoutKind.Sequential)] + private struct LASTINPUTINFO + { + public int size; + public int lastTick; + } + + [DllImport("user32.dll")] + private static extern bool GetLastInputInfo(ref LASTINPUTINFO lii); + + protected virtual void OnUserStateChanged(UserStateChangedEventArgs e) + { + UserStateChangedEventHandler handler = + base.Events[EventUseStateChanged] as UserStateChangedEventHandler; + if (handler != null) + { + handler(this, e); + } + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + Stop(); + if (_timer != null) + { + _timer.Dispose(); + _timer = null; + } + } + } + } +} diff --git a/JinYuan.ControlLib/Wave.Designer.cs b/JinYuan.ControlLib/Wave.Designer.cs new file mode 100644 index 0000000..06bdcf1 --- /dev/null +++ b/JinYuan.ControlLib/Wave.Designer.cs @@ -0,0 +1,36 @@ +namespace JinYuan.ControlLib +{ + partial class Wave + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/JinYuan.ControlLib/Wave.cs b/JinYuan.ControlLib/Wave.cs new file mode 100644 index 0000000..d5f7a7a --- /dev/null +++ b/JinYuan.ControlLib/Wave.cs @@ -0,0 +1,294 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class Wave : Control + { + /// + /// Occurs when [on painted]. + /// + public event PaintEventHandler OnPainted; + + /// + /// The m wave color + /// + private Color m_waveColor = Color.FromArgb(255, 77, 59); + + /// + /// Gets or sets the color of the wave. + /// + /// The color of the wave. + [Description("波纹颜色"), Category("自定义")] + public Color WaveColor + { + get { return m_waveColor; } + set + { + m_waveColor = value; + this.Invalidate(); + } + } + + /// + /// The m wave width + /// + private int m_waveWidth = 200; + /// + /// 为方便计算,强制使用10的倍数 + /// + /// The width of the wave. + [Description("波纹宽度(为方便计算,强制使用10的倍数)"), Category("自定义")] + public int WaveWidth + { + get { return m_waveWidth; } + set + { + m_waveWidth = value; + m_waveWidth = m_waveWidth / 10 * 10; + intLeftX = value * -1; + this.Invalidate(); + } + } + + /// + /// The m wave height + /// + private int m_waveHeight = 30; + /// + /// 波高 + /// + /// The height of the wave. + [Description("波高"), Category("自定义")] + public int WaveHeight + { + get { return m_waveHeight; } + set + { + m_waveHeight = value; + this.Invalidate(); + } + } + + /// + /// The m wave sleep + /// + private int m_waveSleep = 50; + /// + /// 波运行速度(运行时间间隔,毫秒) + /// + /// The wave sleep. + [Description("波运行速度(运行时间间隔,毫秒)"), Category("自定义")] + public int WaveSleep + { + get { return m_waveSleep; } + set + { + if (value <= 0) + return; + m_waveSleep = value; + if (timer != null) + { + timer.Enabled = false; + timer.Interval = value; + timer.Enabled = true; + } + } + } + private int m_bubbleSpeed = 0; + /// + /// 气泡速度(0表示不启用) + /// + /// The wave sleep. + [Description("气泡速度(0表示不启用)"), Category("自定义")] + public int BubbleSpeed + { + get { return m_bubbleSpeed; } + set + { + m_bubbleSpeed = value; + this.Invalidate(); + } + } + + private int m_bubbleIntervalTime = 500; + /// + /// 气泡生成间隔时间(毫秒,不准确,根据波运行速度判断) + /// + /// The wave sleep. + [Description("气泡生成间隔时间(毫秒,不准确,根据波运行速度判断)"), Category("自定义")] + public int BubbleIntervalTime + { + get { return m_bubbleIntervalTime; } + set + { + m_bubbleIntervalTime = value; + this.Invalidate(); + } + } + /// + /// 上次生成气泡的时间 + /// + private int lastBubbleTime = 0; + /// + /// 气泡列表 + /// + private List m_lstBubble = new List(); + /// + /// The timer + /// + Timer timer = new Timer(); + /// + /// The int left x + /// + int intLeftX = -200; + /// + /// Initializes a new instance of the class. + /// + public Wave() + { + this.Size = new Size(600, 100); + ////设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + timer.Interval = m_waveSleep; + timer.Tick += timer_Tick; + this.VisibleChanged += UCWave_VisibleChanged; + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + /// + /// Handles the VisibleChanged event of the UCWave control. + /// + /// The source of the event. + /// The instance containing the event data. + void UCWave_VisibleChanged(object sender, EventArgs e) + { + timer.Enabled = this.Visible; + } + + /// + /// Handles the Tick event of the timer control. + /// + /// The source of the event. + /// The instance containing the event data. + void timer_Tick(object sender, EventArgs e) + { + intLeftX -= 10; + if (intLeftX == m_waveWidth * -2) + intLeftX = m_waveWidth * -1; + + if (m_bubbleSpeed > 0) + { + lastBubbleTime += m_waveSleep; + if (lastBubbleTime >= m_bubbleIntervalTime) + { + lastBubbleTime = 0; + var r = new Random(DateTime.Now.Millisecond); + var b_x = r.Next(0, this.Width); + var b = new Bubble(); + b.Key = Guid.NewGuid().ToString(); + b.BubblePoint = new Point(b_x, 0); + b.BubbleWidth = 5; + m_lstBubble.Add(b); + } + } + else + { + m_lstBubble.Clear(); + } + this.Invalidate(); + } + /// + /// Handles the event. + /// + /// The instance containing the event data. + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + var g = e.Graphics; + g.SetGDIHigh(); + List lst1 = new List(); + List lst2 = new List(); + int m_intX = intLeftX; + while (true) + { + lst1.Add(new Point(m_intX, 1)); + lst1.Add(new Point(m_intX + m_waveWidth / 2, m_waveHeight)); + + lst2.Add(new Point(m_intX + m_waveWidth / 2, 1)); + lst2.Add(new Point(m_intX + m_waveWidth / 2 + m_waveWidth / 2, m_waveHeight)); + m_intX += m_waveWidth; + if (m_intX > this.Width + m_waveWidth) + break; + } + + GraphicsPath path1 = new GraphicsPath(); + path1.AddCurve(lst1.ToArray(), 0.5F); + path1.AddLine(this.Width + 1, -1, this.Width + 1, this.Height); + path1.AddLine(this.Width + 1, this.Height, -1, this.Height); + path1.AddLine(-1, this.Height, -1, -1); + + GraphicsPath path2 = new GraphicsPath(); + path2.AddCurve(lst2.ToArray(), 0.5F); + path2.AddLine(this.Width + 1, -1, this.Width + 1, this.Height); + path2.AddLine(this.Width + 1, this.Height, -1, this.Height); + path2.AddLine(-1, this.Height, -1, -1); + + g.FillPath(new SolidBrush(Color.FromArgb(220, m_waveColor.R, m_waveColor.G, m_waveColor.B)), path1); + g.FillPath(new SolidBrush(Color.FromArgb(220, m_waveColor.R, m_waveColor.G, m_waveColor.B)), path2); + //气泡 + foreach (var item in m_lstBubble) + { + GraphicsPath gp = new GraphicsPath(); + Rectangle rec = new Rectangle(item.BubblePoint.X - item.BubbleWidth / 2, this.Height - (item.BubblePoint.Y - item.BubbleWidth / 2), item.BubbleWidth / 3 * 2, item.BubbleWidth / 3 * 2); + gp.AddEllipse(rec); + + Color[] surroundColor = new Color[] { Color.FromArgb(50, Color.White) }; + PathGradientBrush pb = new PathGradientBrush(gp); + pb.CenterColor = Color.FromArgb(150, Color.White); + pb.SurroundColors = surroundColor; + g.FillPath(pb, gp); + + item.BubblePoint = new Point(item.BubblePoint.X, item.BubblePoint.Y + m_bubbleSpeed); + item.BubbleWidth += 1; + } + + if (OnPainted != null) + { + OnPainted(this, e); + } + } + internal class Bubble + { + internal string Key { get; set; } + /// + /// 坐标 + /// + internal Point BubblePoint { get; set; } + /// + /// 宽度 + /// + internal int BubbleWidth { get; set; } + } + } +} diff --git a/JinYuan.ControlLib/WaveProcess.Designer.cs b/JinYuan.ControlLib/WaveProcess.Designer.cs new file mode 100644 index 0000000..9e9fdf0 --- /dev/null +++ b/JinYuan.ControlLib/WaveProcess.Designer.cs @@ -0,0 +1,65 @@ +namespace JinYuan.ControlLib +{ + partial class WaveProcess + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.wave1 = new JinYuan.ControlLib.Wave(); + this.SuspendLayout(); + // + // wave1 + // + this.wave1.BubbleIntervalTime = 500; + this.wave1.BubbleSpeed = 0; + this.wave1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.wave1.Location = new System.Drawing.Point(0, 84); + this.wave1.Name = "wave1"; + this.wave1.Size = new System.Drawing.Size(116, 22); + this.wave1.TabIndex = 0; + this.wave1.Text = "wave1"; + this.wave1.WaveColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.wave1.WaveHeight = 30; + this.wave1.WaveSleep = 50; + this.wave1.WaveWidth = 200; + // + // WaveProcess + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Gainsboro; + this.Controls.Add(this.wave1); + this.Name = "WaveProcess"; + this.Size = new System.Drawing.Size(116, 106); + this.ResumeLayout(false); + + } + + #endregion + + private Wave wave1; + } +} diff --git a/JinYuan.ControlLib/WaveProcess.cs b/JinYuan.ControlLib/WaveProcess.cs new file mode 100644 index 0000000..9177454 --- /dev/null +++ b/JinYuan.ControlLib/WaveProcess.cs @@ -0,0 +1,346 @@ +using JinYuan.ControlLib.UCHelper; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class WaveProcess : ControlBase + { + /// + /// The m is rectangle + /// + private bool m_isRectangle = false; + /// + /// Gets or sets a value indicating whether this instance is rectangle. + /// + /// true if this instance is rectangle; otherwise, false. + [Description("是否矩形"), Category("自定义")] + public bool IsRectangle + { + get { return m_isRectangle; } + set + { + m_isRectangle = value; + if (value) + { + base.ConerRadius = 10; + } + else + { + base.ConerRadius = Math.Min(this.Width, this.Height); + } + this.Invalidate(); + } + } + + #region 不再使用的父类属性 English:Parent class attributes that are no longer used + /// + /// 圆角角度 + /// + /// The coner radius. + [Browsable(false)] + public new int ConerRadius + { + get; + set; + } + /// + /// 是否圆角 + /// + /// true if this instance is radius; otherwise, false. + [Browsable(false)] + public new bool IsRadius + { + get; + set; + } + + /// + /// 当使用边框时填充颜色,当值为背景色或透明色或空值则不填充 + /// + /// The color of the fill. + [Browsable(false)] + public new Color FillColor + { + get; + set; + } + #endregion + + + /// + /// Occurs when [value changed]. + /// + [Description("值变更事件"), Category("自定义")] + public event EventHandler ValueChanged; + /// + /// The m value + /// + int m_value = 0; + /// + /// Gets or sets the value. + /// + /// The value. + [Description("当前属性"), Category("自定义")] + public int Value + { + set + { + if (value > m_maxValue) + m_value = m_maxValue; + else if (value < 0) + m_value = 0; + else + m_value = value; + if (ValueChanged != null) + ValueChanged(this, null); + wave1.Height = (int)((double)m_value / (double)m_maxValue * this.Height) + wave1.WaveHeight; + this.Invalidate(); + } + get + { + return m_value; + } + } + + /// + /// The m maximum value + /// + private int m_maxValue = 100; + + /// + /// Gets or sets the maximum value. + /// + /// The maximum value. + [Description("最大值"), Category("自定义")] + public int MaxValue + { + get { return m_maxValue; } + set + { + if (value < m_value) + m_maxValue = m_value; + else + m_maxValue = value; + this.Invalidate(); + } + } + + /// + /// 获取或设置控件显示的文字的字体。 + /// + public override Font Font + { + get + { + return base.Font; + } + set + { + base.Font = value; + this.Invalidate(); + } + } + + /// + /// 获取或设置控件的前景色。 + /// + + public override Color ForeColor + { + get + { + return base.ForeColor; + } + set + { + base.ForeColor = value; + this.Invalidate(); + } + } + + /// + /// Gets or sets the color of the value. + /// + + [Description("值颜色"), Category("自定义")] + public Color WaveColor + { + get { return this.wave1.WaveColor; } + set + { + this.wave1.WaveColor = value; + //this.Refresh(); + } + } + + /// + /// 边框宽度 + /// + + [Description("边框宽度"), Category("自定义")] + public override int RectWidth + { + get + { + return base.RectWidth; + } + set + { + if (value < 4) + base.RectWidth = 4; + else + base.RectWidth = value; + this.Invalidate(); + } + } + /// + /// 气泡速度(0表示不启用) + /// + + [Description("气泡速度(0表示不启用)"), Category("自定义")] + public int BubbleSpeed + { + get { return this.wave1.BubbleSpeed; } + set + { + this.wave1.BubbleSpeed = value; + //this.Invalidate(); + } + } + + /// + /// 气泡生成间隔时间(毫秒,不准确,根据波运行速度判断) + /// + + [Description("气泡生成间隔时间(毫秒,不准确,根据波运行速度判断)"), Category("自定义")] + public int BubbleIntervalTime + { + get { return this.wave1.BubbleIntervalTime; } + set + { + this.wave1.BubbleIntervalTime = value; + this.Invalidate(); + } + } + + + /// + /// Initializes a new instance of the class. + /// + public WaveProcess() + { + InitializeComponent(); + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + base.IsRadius = true; + base.IsShowRect = false; + RectWidth = 4; + RectColor = Color.White; + ForeColor = Color.White; + wave1.Height = (int)((double)m_value / (double)m_maxValue * this.Height) + wave1.WaveHeight; + this.SizeChanged += ProcessWave_SizeChanged; + this.wave1.OnPainted += wave1_Painted; + base.ConerRadius = Math.Min(this.Width, this.Height); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + + /// + /// Handles the Painted event of the wave1 control. + /// + /// The source of the event. + /// The instance containing the event data. + private void wave1_Painted(object sender, PaintEventArgs e) + { + e.Graphics.SetGDIHigh(); + if (IsShowRect) + { + if (m_isRectangle) + { + Color rectColor = RectColor; + Pen pen = new Pen(rectColor, (float)RectWidth); + Rectangle clientRectangle = new Rectangle(0, this.wave1.Height - this.Height, this.Width, this.Height); + GraphicsPath graphicsPath = new GraphicsPath(); + graphicsPath.AddArc(clientRectangle.X, clientRectangle.Y, 10, 10, 180f, 90f); + graphicsPath.AddArc(clientRectangle.Width - 10 - 1, clientRectangle.Y, 10, 10, 270f, 90f); + graphicsPath.AddArc(clientRectangle.Width - 10 - 1, clientRectangle.Bottom - 10 - 1, 10, 10, 0f, 90f); + graphicsPath.AddArc(clientRectangle.X, clientRectangle.Bottom - 10 - 1, 10, 10, 90f, 90f); + graphicsPath.CloseFigure(); + e.Graphics.DrawPath(pen, graphicsPath); + } + else + { + SolidBrush solidBrush = new SolidBrush(RectColor); + e.Graphics.DrawEllipse(new Pen(solidBrush, RectWidth), new Rectangle(0, this.wave1.Height - this.Height, this.Width, this.Height)); + } + } + + if (!m_isRectangle) + { + //这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡 + SolidBrush solidBrush1 = new SolidBrush(RectColor); + e.Graphics.DrawEllipse(new Pen(solidBrush1, 2), new Rectangle(-1, this.wave1.Height - this.Height - 1, this.Width + 2, this.Height + 2)); + } + string strValue = ((double)m_value / (double)m_maxValue).ToString("0.%"); + SizeF sizeF = e.Graphics.MeasureString(strValue, Font); + e.Graphics.DrawString(strValue, Font, new SolidBrush(ForeColor), new PointF((this.Width - sizeF.Width) / 2, (this.wave1.Height - this.Height) + (this.Height - sizeF.Height) / 2)); + } + + /// + /// Handles the SizeChanged event of the UCProcessWave control. + /// + /// The source of the event. + /// The instance containing the event data. + private void ProcessWave_SizeChanged(object sender, EventArgs e) + { + if (!m_isRectangle) + { + base.ConerRadius = Math.Min(this.Width, this.Height); + if (this.Width != this.Height) + { + this.Size = new Size(Math.Min(this.Width, this.Height), Math.Min(this.Width, this.Height)); + } + } + } + + /// + /// Handles the event. + /// + /// The instance containing the event data. + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + e.Graphics.SetGDIHigh(); + if (!m_isRectangle) + { + //这里曲线救国,因为设置了控件区域导致的毛边,通过画一个没有毛边的圆遮挡 + SolidBrush solidBrush = new SolidBrush(RectColor); + e.Graphics.DrawEllipse(new Pen(solidBrush, 2), new Rectangle(-1, -1, this.Width + 2, this.Height + 2)); + } + string strValue = ((double)m_value / (double)m_maxValue).ToString("0.%"); + SizeF sizeF = e.Graphics.MeasureString(strValue, Font); + e.Graphics.DrawString(strValue, Font, new SolidBrush(ForeColor), new PointF((this.Width - sizeF.Width) / 2, (this.Height - sizeF.Height) / 2 + 1)); + + } + } +} diff --git a/JinYuan.ControlLib/WaveProcess.resx b/JinYuan.ControlLib/WaveProcess.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/WaveProcess.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/WithBgBox.Designer.cs b/JinYuan.ControlLib/WithBgBox.Designer.cs new file mode 100644 index 0000000..c0b2ca1 --- /dev/null +++ b/JinYuan.ControlLib/WithBgBox.Designer.cs @@ -0,0 +1,82 @@ +namespace JinYuan.ControlLib +{ + partial class WithBgBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 16F, System.Drawing.FontStyle.Bold); + this.lbl_Title.ForeColor = System.Drawing.Color.Transparent; + this.lbl_Title.Location = new System.Drawing.Point(0, 0); + this.lbl_Title.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(827, 66); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = " 标题展示"; + this.lbl_Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.Transparent; + this.panel1.Controls.Add(this.lbl_Title); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(827, 66); + this.panel1.TabIndex = 1; + // + // WithBgBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(28)))), ((int)(((byte)(68))))); + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources._4; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.Controls.Add(this.panel1); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "WithBgBox"; + this.Size = new System.Drawing.Size(827, 433); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label lbl_Title; + } +} diff --git a/JinYuan.ControlLib/WithBgBox.cs b/JinYuan.ControlLib/WithBgBox.cs new file mode 100644 index 0000000..06f835e --- /dev/null +++ b/JinYuan.ControlLib/WithBgBox.cs @@ -0,0 +1,54 @@ +using System.ComponentModel; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + public partial class WithBgBox : UserControl + { + public WithBgBox() + { + InitializeComponent(); + + //设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + private string titleName = "标题名称"; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示标题名称")] + + public string TitleName + { + get { return titleName; } + set + { + titleName = value; + this.lbl_Title.Text = titleName; + } + } + + //private void WithBgBox_Resize(object sender, EventArgs e) + //{ + // lbl_Title.Left = (ClientSize.Width - lbl_Title.Width) / 2; + // lbl_Title.Top = (ClientSize.Height - lbl_Title.Height) / 2; + //} + } +} diff --git a/JinYuan.ControlLib/WithBgBox.resx b/JinYuan.ControlLib/WithBgBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/WithBgBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/app.config b/JinYuan.ControlLib/app.config new file mode 100644 index 0000000..6b39d48 --- /dev/null +++ b/JinYuan.ControlLib/app.config @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.ControlLib/packages.config b/JinYuan.ControlLib/packages.config new file mode 100644 index 0000000..3f63466 --- /dev/null +++ b/JinYuan.ControlLib/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/JinYuan.ControlLib/ucPanel_400_200.Designer.cs b/JinYuan.ControlLib/ucPanel_400_200.Designer.cs new file mode 100644 index 0000000..8b7df8b --- /dev/null +++ b/JinYuan.ControlLib/ucPanel_400_200.Designer.cs @@ -0,0 +1,82 @@ +namespace JinYuan.ControlLib +{ + partial class ucPanel_400_200 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbTitle = new System.Windows.Forms.Label(); + this.pbArrow = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pbArrow)).BeginInit(); + this.SuspendLayout(); + // + // lbTitle + // + this.lbTitle.AutoSize = true; + this.lbTitle.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbTitle.ForeColor = System.Drawing.Color.White; + this.lbTitle.Location = new System.Drawing.Point(25, 16); + this.lbTitle.Name = "lbTitle"; + this.lbTitle.Size = new System.Drawing.Size(65, 19); + this.lbTitle.TabIndex = 3; + this.lbTitle.Text = "信息标题"; + // + // pbArrow + // + this.pbArrow.Image = global::JinYuan.ControlLib.Properties.Resources.big_arrow_l; + this.pbArrow.Location = new System.Drawing.Point(98, 17); + this.pbArrow.Name = "pbArrow"; + this.pbArrow.Size = new System.Drawing.Size(21, 19); + this.pbArrow.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pbArrow.TabIndex = 2; + this.pbArrow.TabStop = false; + // + // ucPanel_400_200 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.big_box; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbTitle); + this.Controls.Add(this.pbArrow); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "ucPanel_400_200"; + this.Size = new System.Drawing.Size(400, 200); + ((System.ComponentModel.ISupportInitialize)(this.pbArrow)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbTitle; + private System.Windows.Forms.PictureBox pbArrow; + } +} diff --git a/JinYuan.ControlLib/ucPanel_400_200.cs b/JinYuan.ControlLib/ucPanel_400_200.cs new file mode 100644 index 0000000..6993a22 --- /dev/null +++ b/JinYuan.ControlLib/ucPanel_400_200.cs @@ -0,0 +1,33 @@ +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] + public partial class ucPanel_400_200 : UserControl + { + public ucPanel_400_200() + { + InitializeComponent(); + } + + [Category("自定义参数")] + [DefaultValue("标题文字")] + [Description("标题文字")] + [Browsable(true)] + public string Title + { + set + { + lbTitle.Text = value; + lbTitle.Invalidate(); + pbArrow.Left = lbTitle.Right + 3; + } + get + { + return lbTitle.Text; + } + } + } +} diff --git a/JinYuan.ControlLib/ucPanel_400_200.resx b/JinYuan.ControlLib/ucPanel_400_200.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/ucPanel_400_200.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.ControlLib/ucPanel_900_450.Designer.cs b/JinYuan.ControlLib/ucPanel_900_450.Designer.cs new file mode 100644 index 0000000..f19c0f7 --- /dev/null +++ b/JinYuan.ControlLib/ucPanel_900_450.Designer.cs @@ -0,0 +1,82 @@ +namespace JinYuan.ControlLib +{ + partial class ucPanel_900_450 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.lbTitle = new System.Windows.Forms.Label(); + this.pbArrow = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pbArrow)).BeginInit(); + this.SuspendLayout(); + // + // lbTitle + // + this.lbTitle.AutoSize = true; + this.lbTitle.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbTitle.ForeColor = System.Drawing.Color.White; + this.lbTitle.Location = new System.Drawing.Point(15, 12); + this.lbTitle.Name = "lbTitle"; + this.lbTitle.Size = new System.Drawing.Size(65, 19); + this.lbTitle.TabIndex = 3; + this.lbTitle.Text = "信息标题"; + // + // pbArrow + // + this.pbArrow.Image = global::JinYuan.ControlLib.Properties.Resources.big_arrow; + this.pbArrow.Location = new System.Drawing.Point(85, 13); + this.pbArrow.Name = "pbArrow"; + this.pbArrow.Size = new System.Drawing.Size(21, 19); + this.pbArrow.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pbArrow.TabIndex = 2; + this.pbArrow.TabStop = false; + // + // ucPanel_900_450 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.BackgroundImage = global::JinYuan.ControlLib.Properties.Resources.big_box_super; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.Controls.Add(this.lbTitle); + this.Controls.Add(this.pbArrow); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "ucPanel_900_450"; + this.Size = new System.Drawing.Size(400, 200); + ((System.ComponentModel.ISupportInitialize)(this.pbArrow)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbTitle; + private System.Windows.Forms.PictureBox pbArrow; + } +} diff --git a/JinYuan.ControlLib/ucPanel_900_450.cs b/JinYuan.ControlLib/ucPanel_900_450.cs new file mode 100644 index 0000000..f06a10b --- /dev/null +++ b/JinYuan.ControlLib/ucPanel_900_450.cs @@ -0,0 +1,51 @@ +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Windows.Forms; + +namespace JinYuan.ControlLib +{ + [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] + public partial class ucPanel_900_450 : UserControl + { + public ucPanel_900_450() + { + InitializeComponent(); + } + + [Category("自定义参数")] + [DefaultValue("标题文字")] + [Description("标题文字")] + [Browsable(true)] + public string Title + { + set + { + lbTitle.Text = value; + lbTitle.Invalidate(); + pbArrow.Left = lbTitle.Right + 3; + } + get + { + return lbTitle.Text; + } + } + + + + private bool titleVisible = true; + [Browsable(true)]//是否可见 + [Category("自定义属性")] //类别 + [Description("设置或显示上边箭头是否隐藏")] + public bool TitleVisible + { + get { return titleVisible; } + set + { + titleVisible = value; + pbArrow.Visible = titleVisible; + this.Invalidate();//点击后立即生效 + } + } + + } +} diff --git a/JinYuan.ControlLib/ucPanel_900_450.resx b/JinYuan.ControlLib/ucPanel_900_450.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/JinYuan.ControlLib/ucPanel_900_450.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JinYuan.DAL/Enums/Enums.cs b/JinYuan.DAL/Enums/Enums.cs new file mode 100644 index 0000000..daa4c71 --- /dev/null +++ b/JinYuan.DAL/Enums/Enums.cs @@ -0,0 +1,100 @@ +namespace JinYuan.DAL.Enums +{ + /// + /// 查询条件枚举 + /// + public enum QueryOperator + { + /// + /// 相等 + /// + Equal, + /// + /// 匹配 + /// + Like, + /// + /// 大于 + /// + GreaterThan, + /// + /// 大于或等于 + /// + GreaterThanOrEqual, + /// + /// 小于 + /// + LessThan, + /// + /// 小于或等于 + /// + LessThanOrEqual, + /// + /// 等于集合 + /// + In, + /// + /// 不等于集合 + /// + NotIn, + /// + /// 左边匹配 + /// + LikeLeft, + /// + /// 右边匹配 + /// + LikeRight, + /// + /// 不相等 + /// + NoEqual, + /// + /// 为空或空 + /// + IsNullOrEmpty, + /// + /// 不为空 + /// + IsNot, + /// + /// 不匹配 + /// + NoLike, + /// + /// 时间段 值用 "|" 隔开 + /// + DateRange + } + + + /// + /// 查询条件运算符 + /// + public enum QueryCharacter + { + /// + /// 且 + /// + And, + /// + /// 或 + /// + Or, + } + + /// + /// 排序枚举 + /// + public enum OrderSequence + { + /// + /// 正序 + /// + Asc, + /// + /// 倒序 + /// + Desc + } +} diff --git a/JinYuan.DAL/ISugarHepler.cs b/JinYuan.DAL/ISugarHepler.cs new file mode 100644 index 0000000..059694f --- /dev/null +++ b/JinYuan.DAL/ISugarHepler.cs @@ -0,0 +1,576 @@ +using JinYuan.DAL.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq.Expressions; +using System.Threading.Tasks; + +namespace JinYuan.DAL +{ + public interface ISugarHepler : IDisposable + { + /// + /// 初始化数据库连接 + /// + /// + void SetConnectionStr(string connectionStr, SqlSugar.DbType dbType); + + #region 数据库管理 + /// + /// 添加列 + /// + /// 表名 + /// 列信息 + /// + bool AddColumn(string tableName, DbColumnInfo column); + /// + /// 添加主键 + /// + /// 表名 + /// 列名 + /// + bool AddPrimaryKey(string tableName, string columnName); + /// + /// 备份数据库 + /// + /// 数据库名 + /// 文件名 + /// + bool BackupDataBase(string databaseName, string fullFileName); + /// + /// 备份表 + /// + /// 旧表名 + /// 行表名 + /// 行数 + /// + bool BackupTable(string oldTableName, string newTableName, int maxBackupDataRows = int.MaxValue); + /// + /// 创建表 + /// + /// 表名 + /// 列集合 + /// 是否创建主键 + /// + bool CreateTable(string tableName, List columns, bool isCreatePrimaryKey = true); + /// + /// 删除列 + /// + /// 表名 + /// 列名 + /// + bool DropColumn(string tableName, string columnName); + /// + /// 删除约束 + /// + /// 表名 + /// 约束名 + /// + bool DropConstraint(string tableName, string constraintName); + /// + /// 删除表 + /// + /// + /// + bool DropTable(string tableName); + /// + /// 获取列信息 + /// + /// 表名 + /// 是否缓存 + /// + List GetColumnInfosByTableName(string tableName, bool isCache = true); + /// + /// 获取自增列 + /// + /// 表名 + /// + List GetIsIdentities(string tableName); + /// + /// 获取主键 + /// + /// 表名 + /// + List GetPrimaries(string tableName); + /// + /// 获取表集合 + /// + /// 是否缓存 + /// + List GetTableInfoList(bool isCache = true); + /// + /// 获取视图集合 + /// + /// 是否缓存 + /// + List GetViewInfoList(bool isCache = true); + /// + /// 检测列是否存在 + /// + /// 表名 + /// 列名 + /// + bool IsAnyColumn(string tableName, string column); + /// + /// 检测约束 + /// + /// 约束名称 + /// + bool IsAnyConstraint(string constraintName); + /// + /// 检测是否有任何系统表权限 + /// + /// + bool IsAnySystemTablePermissions(); + /// + /// 检测表是否存在 + /// + /// 表名 + /// 是否缓存 + /// + bool IsAnyTable(string tableName, bool isCache = true); + /// + /// 检测列是否自增列 + /// + /// 表名 + /// 列名 + /// + bool IsIdentity(string tableName, string column); + /// + /// 检测列是否主键 + /// + /// 表名 + /// 列名 + /// + bool IsPrimaryKey(string tableName, string column); + /// + /// 重置列名 + /// + /// 表名 + /// 旧列名 + /// 新列名 + /// + bool RenameColumn(string tableName, string oldColumnName, string newColumnName); + /// + /// 重置表数据 + /// + /// 表名 + /// + bool TruncateTable(string tableName); + /// + /// 修改列信息 + /// + /// 表名 + /// 列信息 + /// + bool UpdateColumn(string tableName, DbColumnInfo column); + + /// + /// 获取数据库时间 + /// + /// 返回值 + DateTime GetDataBaseTime(); + #endregion + + #region 查询 + + + /// + /// 查询所有 + /// + /// + /// + List QueryAll() where T : class, new(); + /// + /// 查询-返回自定义数据 + /// + /// 泛型参数(集合成员的类型) + /// 返回值类型 + /// 返回值表达式 + /// 查询表达式 + /// 值 + TResult QuerySelect(Expression> expression, Expression> whereLambda = null) where T : class, new(); + + /// + /// 查询-返回自定义数据 + /// + /// 泛型参数(集合成员的类型) + /// 返回值类型 + /// 返回值表达式 + /// 查询表达式 + /// 值 + List QuerySelectList(Expression> expression, Expression> whereLambda = null) where T : class, new(); + + /// + /// 根据条件查询单条数据 + /// + /// 泛型参数(集合成员的类型) + /// 查询表达式 + /// + T Query(Expression> whereLambda = null) where T : class, new(); + + /// + /// 根据条件异步查询单条数据 + /// + /// + /// + /// + Task QueryAsync(Expression> whereLambda = null) where T : class, new(); + + /// + /// 根据条件查询排序数据 + /// + /// + /// + /// + /// + T Query(Expression> whereLambda = null, Expression> whereLambda2 = null, OrderByType byType = OrderByType.Desc) where T : class, new(); + /// + /// 根据条件查询集合 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 实体 + List QueryWhereList(Expression> whereLambda = null) where T : class, new(); + /// + /// 查询排序数据 + /// + /// + /// + /// + List QueryList(QueryDescriptor query = null) where T : class, new(); + /// + /// 查询前N条数据 + /// + /// + /// 排序列名 + /// 前N条数据 + /// 条件 + /// 升序/降序 + /// + List QueryList(string sort, int Take, Expression> whereLambda = null, OrderByType byType = OrderByType.Desc) where T : class, new(); + /// + /// 根据字段查询排列 + /// + /// + /// + /// + /// + /// + List QueryList(string sort, Expression> whereLambda = null, OrderByType byType = OrderByType.Asc) where T : class, new(); + /// + /// 查询集合 + /// + /// 泛型参数(集合成员的类型) + /// sql + /// 实体 + List QuerySqlList(string sql) where T : class, new(); + + /// + /// 分页查询 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 总行数 + /// 实体 + List QueryPageList(QueryDescriptor query, out int totalCount) where T : class, new(); + + /// + /// 通过多值查询数据集 + /// + /// 泛型参数(集合成员的类型) + /// 字段名 + /// 数据集合 + /// + List In(string inFieldName, List inValues) where T : class, new(); + + /// + /// 通过多值(主键)查询数据集 + /// + /// 泛型参数(集合成员的类型) + /// 主键数据集合 + /// + List In(List values) where T : class, new(); + + /// + /// 条件查询DataTable + /// + /// 泛型参数(集合成员的类型) + /// 查询表达式 + /// 实体 + DataTable QueryDataTable(Expression> whereLambda = null) where T : class, new(); + + /// + /// 查询DataTable + /// + /// sql + /// 实体 + DataTable QueryDataTable(string sql); + /// + /// 查询单个值 + /// + /// sql + /// 单个值 + object QuerySqlScalar(string sql); + + /// + /// 分页查询 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 总行数 + /// DataTable + DataTable QueryDataTablePageList(QueryDescriptor query, out int totalCount) where T : class, new(); + + #endregion + + #region 新增 + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 操作影响的行数 + int Add(T entity) where T : class, new(); + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 泛型集合 + /// 操作影响的行数 + int Add(List entitys) where T : class, new(); + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 字典集合(Key:列名 Value:值) + /// 操作影响的行数 + int Add(Dictionary keyValues) where T : class, new(); + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 返回实体 + T AddReturnEntity(T entity) where T : class, new(); + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 返回自增列 + int AddReturnIdentity(T entity) where T : class, new(); + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 返回bool + bool AddReturnBool(T entity) where T : class, new(); + Task AddReturnBoolAsync(T entity) where T : class, new(); + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 泛型集合 + /// 返回bool + bool AddReturnBool(List entitys) where T : class, new(); + /// + /// 异步增加 + /// + /// + /// + /// + Task AddReturnBoolAsync(List entitys) where T : class, new(); + #endregion + + #region 修改 + /// + /// 修改(主键是更新条件) + /// + /// 泛型参数(集合成员的类型) + /// 实体对象(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + int Update(T entity, List lstIgnoreColumns = null, bool isLock = true) where T : class, new(); + + /// + /// 修改(主键是更新条件) + /// + /// 泛型参数(集合成员的类型) + /// 实体对象集合(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + int Update(List entitys, List lstIgnoreColumns = null, bool isLock = true) where T : class, new(); + + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 条件 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + int Update(T entity, Expression> where, List lstIgnoreColumns = null, + bool isLock = true) where T : class, new(); + + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + int Update(Expression> update, Expression> where = null, bool isLock = true) where T : class, new(); + /// + /// 修改+1 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + int Update(Expression> update, Expression> where = null, bool isLock = true) where T : class, new(); + /// + /// 修改单条数据 + /// + /// + /// + /// + /// + int UpdateSingle(T entity, Expression> where = null, Expression> where2 = null, bool isLock = true) where T : class, new(); + /// + /// 异步修改 + /// + /// + /// + /// + /// + /// + /// + Task UpdateSingleAsync(T entity, Expression> where = null, Expression> where2 = null, bool isLock = true) where T : class, new(); + + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 字典集合(Key:列名 Value:值) + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + int Update(Dictionary keyValues, Expression> where = null, bool isLock = true) + where T : class, new(); + + /// + /// 批量修改需要更新的列 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 更新指定列 + /// 条件(为空则以主键更新,反之需要把wherecolumns中的列加到UpdateColumns中) + /// 是否加锁 + /// 操作影响的行数 + int UpdateColumns(List entitys, Expression> updateColumns, + Expression> wherecolumns = null, bool isLock = true) where T : class, new(); + + /// + /// 修改 通过RowVer及主键Code 更新 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + int UpdateRowVer(T entity, List lstIgnoreColumns = null, bool isLock = true) where T : class, new(); + + /// + /// 修改 通过RowVer及主键Code 更新 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 更新条件 + /// 是否加锁 + /// 操作影响的行数 + int UpdateRowVer(Expression> update, Dictionary where, bool isLock = true) where T : class, new(); + #endregion + + + #region 删除 + + /// + /// 删除 通过主键数据 + /// + /// 泛型参数(集合成员的类型) + /// 主键值 + /// 是否加锁 + /// 操作影响的行数 + int DeleteByPrimary(List primaryKeyValues, bool isLock = true) where T : class, new(); + + /// + /// 根据实体类删除 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 是否加锁 + /// 操作影响的行数 + int Delete(T entity, bool isLock = true) where T : class, new(); + + /// + /// 初始化表 + /// + /// + void Delete() where T : class, new(); + + /// + /// 根据实体类集合删除 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 (必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 是否加锁 + /// 操作影响的行数 + int Delete(List entity, bool isLock = true) where T : class, new(); + + /// + /// 删除 + /// + /// 泛型参数(集合成员的类型) + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + int Delete(Expression> where, bool isLock = true) where T : class, new(); + /// + /// 异步删除 + /// + /// + /// + /// + /// + Task DeleteAsync(Expression> where, bool isLock = true) where T : class, new(); + /// + /// 通过多值(主键)删除数据集 + /// + /// 泛型参数(集合成员的类型) + /// 数据集合 + /// + int DeleteIn(List inValues) where T : class, new(); + + #endregion + + /// + /// 是否存在 + /// + /// 泛型参数(集合成员的类型 + /// 查询表达式 + /// + bool IsExist(Expression> whereLambda) where T : class, new(); + } +} diff --git a/JinYuan.DAL/JinYuan.DAL.csproj b/JinYuan.DAL/JinYuan.DAL.csproj new file mode 100644 index 0000000..98bd66c --- /dev/null +++ b/JinYuan.DAL/JinYuan.DAL.csproj @@ -0,0 +1,137 @@ + + + + + Debug + AnyCPU + {114AA012-29C9-418C-A2D6-3173C5341F51} + Library + Properties + JinYuan.DAL + JinYuan.DAL + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Portable.BouncyCastle.1.9.0\lib\net40\BouncyCastle.Crypto.dll + + + ..\packages\BouncyCastle.Cryptography.2.3.1\lib\net461\BouncyCastle.Cryptography.dll + + + ..\packages\Google.Protobuf.3.26.1\lib\net45\Google.Protobuf.dll + + + ..\packages\K4os.Compression.LZ4.1.3.8\lib\net462\K4os.Compression.LZ4.dll + + + ..\packages\K4os.Compression.LZ4.Streams.1.3.8\lib\net462\K4os.Compression.LZ4.Streams.dll + + + ..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\MySql.Data.9.1.0\lib\net48\MySql.Data.dll + + + ..\packages\SqlSugar.5.1.4.175\lib\SqlSugar.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + ..\packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll + + + + + ..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.IO.Pipelines.7.0.0\lib\net462\System.IO.Pipelines.dll + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + ..\packages\System.Security.AccessControl.6.0.0\lib\net461\System.Security.AccessControl.dll + + + ..\packages\System.Security.Permissions.7.0.0\lib\net462\System.Security.Permissions.dll + + + ..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll + + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + ..\packages\ZstdSharp.Port.0.8.0\lib\net462\ZstdSharp.dll + + + + + + + + + + + + + + + + + + + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360} + JinYuan.Helper + + + + \ No newline at end of file diff --git a/JinYuan.DAL/Models/OrderSortEntity.cs b/JinYuan.DAL/Models/OrderSortEntity.cs new file mode 100644 index 0000000..591ea62 --- /dev/null +++ b/JinYuan.DAL/Models/OrderSortEntity.cs @@ -0,0 +1,19 @@ +using JinYuan.DAL.Enums; + +namespace JinYuan.DAL.Models +{ + /// + /// 排序实体 + /// + public class OrderSortEntity + { + /// + /// 排序字段 + /// + public string Sort { get; set; } + /// + /// 排序类型 + /// + public OrderSequence Order { get; set; } + } +} diff --git a/JinYuan.DAL/Models/QueryCondition.cs b/JinYuan.DAL/Models/QueryCondition.cs new file mode 100644 index 0000000..d5b1716 --- /dev/null +++ b/JinYuan.DAL/Models/QueryCondition.cs @@ -0,0 +1,24 @@ +using JinYuan.DAL.Enums; + +namespace JinYuan.DAL.Models +{ + public class QueryCondition + { + /// + /// 字段名称 + /// + public string Key { get; set; } + /// + /// 查询操作 + /// + public QueryOperator Operator { get; set; } + /// + /// 值 + /// + public object Value { get; set; } + /// + /// 运算符 + /// + public QueryCharacter Character { get; set; } + } +} diff --git a/JinYuan.DAL/Models/QueryDescriptor.cs b/JinYuan.DAL/Models/QueryDescriptor.cs new file mode 100644 index 0000000..b8f04ee --- /dev/null +++ b/JinYuan.DAL/Models/QueryDescriptor.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace JinYuan.DAL.Models +{ + /// + /// 查询集合 + /// + public class QueryDescriptor + { + /// + /// 行数 + /// + public int PageSize { get; set; } + /// + /// 页码 + /// + public int PageIndex { get; set; } + /// + /// 排序 + /// + public List OrderBys { get; set; } + /// + /// 条件 + /// + public List Conditions { get; set; } + } +} diff --git a/JinYuan.DAL/Properties/AssemblyInfo.cs b/JinYuan.DAL/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9741fe1 --- /dev/null +++ b/JinYuan.DAL/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.DAL")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.DAL")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("114aa012-29c9-418c-a2d6-3173c5341f51")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.DAL/SQLSugarHelper.cs b/JinYuan.DAL/SQLSugarHelper.cs new file mode 100644 index 0000000..b601a4b --- /dev/null +++ b/JinYuan.DAL/SQLSugarHelper.cs @@ -0,0 +1,83 @@ + +using JinYuan.Helper; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace JinYuan.DAL +{ + public class SQLSugarHelper + { + /// + /// 数据库连接字符串 + /// + public static string connString = string.Empty; + + /// + /// 数据库类型 + /// + public static SqlSugar.DbType dbType = SqlSugar.DbType.SqlServer; + + public static SqlSugarScope SqlSugarClient + { + get + { + //如果配置了 SlaveConnectionConfigs那就是主从模式,所有的写入删除更新都走主库,查询走从库, + var db = new SqlSugarScope(new ConnectionConfig() + { + ConnectionString = connString, + DbType = dbType, //数据库类型 + IsAutoCloseConnection = true, //默认false,自动释放和关闭数据库连接,设置为true无需使用using或者close操作 + InitKeyType = InitKeyType.Attribute //默认SystemTable,该属性是不是主键,是不是标识列等等信息 + + }); + db.Ado.CommandTimeOut = 3000;//设置执行语法超时时间 + db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完事件 + { + LogHelper.Instance.WriteLog($"执行时间:{db.Ado.SqlExecutionTime.TotalMilliseconds}毫秒 \r\nSQL如下:{sql} \r\n参数:{GetParams(pars)} ", "SQL执行"); + }; + db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前事件 + { + if (db.TempItems == null) db.TempItems = new Dictionary(); + }; + db.Aop.OnError = (exp) =>//执行SQL 错误事件 + { + LogHelper.Instance.WriteError($"SQL错误:{exp.Message}\r\nSQL如下:{exp.Sql}", "SQL执行"); + throw new Exception(exp.Message); + }; + db.Aop.OnDiffLogEvent = (it) => //可以方便拿到 数据库操作前和操作后的数据变化。 + { + var editBeforeData = it.BeforeData; //变化前数据 + var editAfterData = it.AfterData; //变化后数据 + var sql = it.Sql; //SQL + var parameter = it.Parameters; //参数 + var data = it.BusinessData; //业务数据 + var time = it.Time ?? new TimeSpan(); //时间 + var diffType = it.DiffType; //枚举值 insert 、update 和 delete 用来作业务区分 + + //你可以在这里面写日志方法 + var log = $"时间:{time.TotalMilliseconds}\r\n"; + log += $"类型:{diffType.ToString()}\r\n"; + log += $"SQL:{sql}\r\n"; + log += $"参数:{GetParams(parameter)}\r\n"; + log += $"业务数据:{JsonHelper.EntityToJson(data)}\r\n"; + log += $"变化前数据:{JsonHelper.EntityToJson(editBeforeData)}\r\n"; + log += $"变化后数据:{JsonHelper.EntityToJson(editAfterData)}\r\n"; + //SqlLogHelper.WriteLog(log, "数据变化前后"); + }; + return db; + } + } + + /// + /// 获取参数信息 + /// + /// + /// + private static string GetParams(SugarParameter[] pars) + { + return pars.Aggregate("", (current, p) => current + $"{p.ParameterName}:{p.Value}, "); + } + } +} diff --git a/JinYuan.DAL/SQLSugarService.cs b/JinYuan.DAL/SQLSugarService.cs new file mode 100644 index 0000000..9572094 --- /dev/null +++ b/JinYuan.DAL/SQLSugarService.cs @@ -0,0 +1,1739 @@ +using JinYuan.DAL.Enums; +using JinYuan.DAL.Models; +using JinYuan.Helper; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; + +namespace JinYuan.DAL +{ + + public class SQLSugarService : ISugarHepler + { + public void SetConnectionStr(string connectionStr, SqlSugar.DbType dbType) + { + SQLSugarHelper.connString = connectionStr; + SQLSugarHelper.dbType = dbType; + SqlSugarDb = SQLSugarHelper.SqlSugarClient; + + } + + /// + /// 数据库连接对象 + /// + public SqlSugarScope SqlSugarDb { get; set; } + + + + #region 数据库管理 + /// + /// 添加列 + /// + /// 表名 + /// 列信息 + /// 值 + public bool AddColumn(string tableName, DbColumnInfo column) + { + return SqlSugarDb.DbMaintenance.AddColumn(tableName, column); + } + /// + /// 添加主键 + /// + /// 表名 + /// 列名 + /// 值 + public bool AddPrimaryKey(string tableName, string columnName) + { + return SqlSugarDb.DbMaintenance.AddPrimaryKey(tableName, columnName); + } + /// + /// 备份数据库 + /// + /// 数据库名 + /// 文件名 + /// 值 + public bool BackupDataBase(string databaseName, string fullFileName) + { + return SqlSugarDb.DbMaintenance.BackupDataBase(databaseName, fullFileName); + } + /// + /// 备份表 + /// + /// 旧表名 + /// 行表名 + /// 行数 + /// 值 + public bool BackupTable(string oldTableName, string newTableName, int maxBackupDataRows = int.MaxValue) + { + return SqlSugarDb.DbMaintenance.BackupTable(oldTableName, newTableName, maxBackupDataRows); + } + /// + /// 创建表 + /// + /// 表名 + /// 列集合 + /// 是否创建主键 + /// 值 + public bool CreateTable(string tableName, List columns, bool isCreatePrimaryKey = true) + { + return SqlSugarDb.DbMaintenance.CreateTable(tableName, columns, isCreatePrimaryKey); + } + /// + /// 删除列 + /// + /// 表名 + /// 列名 + /// 值 + public bool DropColumn(string tableName, string columnName) + { + return SqlSugarDb.DbMaintenance.DropColumn(tableName, columnName); + } + /// + /// 删除约束 + /// + /// 表名 + /// 约束名 + /// 值 + public bool DropConstraint(string tableName, string constraintName) + { + return SqlSugarDb.DbMaintenance.DropConstraint(tableName, constraintName); + } + /// + /// 删除表 + /// + /// + /// 值 + public bool DropTable(string tableName) + { + return SqlSugarDb.DbMaintenance.DropTable(tableName); + } + /// + /// 获取列信息 + /// + /// 表名 + /// 是否缓存 + /// 值 + public List GetColumnInfosByTableName(string tableName, bool isCache = true) + { + return SqlSugarDb.DbMaintenance.GetColumnInfosByTableName(tableName, isCache); + } + /// + /// 获取自增列 + /// + /// 表名 + /// 值 + public List GetIsIdentities(string tableName) + { + return SqlSugarDb.DbMaintenance.GetIsIdentities(tableName); + } + /// + /// 获取主键 + /// + /// 表名 + /// 值 + public List GetPrimaries(string tableName) + { + return SqlSugarDb.DbMaintenance.GetPrimaries(tableName); + } + /// + /// 获取表集合 + /// + /// 是否缓存 + /// 值 + public List GetTableInfoList(bool isCache = true) + { + return SqlSugarDb.DbMaintenance.GetTableInfoList(isCache); + } + /// + /// 获取视图集合 + /// + /// 是否缓存 + /// 值 + public List GetViewInfoList(bool isCache = true) + { + return SqlSugarDb.DbMaintenance.GetViewInfoList(isCache); + } + /// + /// 检测列是否存在 + /// + /// 表名 + /// 列名 + /// 值 + public bool IsAnyColumn(string tableName, string column) + { + return SqlSugarDb.DbMaintenance.IsAnyColumn(tableName, column); + } + /// + /// 检测约束 + /// + /// 约束名称 + /// 值 + public bool IsAnyConstraint(string constraintName) + { + return SqlSugarDb.DbMaintenance.IsAnyConstraint(constraintName); + } + /// + /// 检测是否有任何系统表权限 + /// + /// 值 + public bool IsAnySystemTablePermissions() + { + return SqlSugarDb.DbMaintenance.IsAnySystemTablePermissions(); + } + /// + /// 检测表是否存在 + /// + /// 表名 + /// 是否缓存 + /// 值 + public bool IsAnyTable(string tableName, bool isCache = true) + { + return SqlSugarDb.DbMaintenance.IsAnyTable(tableName, isCache); + } + /// + /// 检测列是否自增列 + /// + /// 表名 + /// 列名 + /// 值 + public bool IsIdentity(string tableName, string column) + { + return SqlSugarDb.DbMaintenance.IsIdentity(tableName, column); + } + /// + /// 检测列是否主键 + /// + /// 表名 + /// 列名 + /// 值 + public bool IsPrimaryKey(string tableName, string column) + { + return SqlSugarDb.DbMaintenance.IsPrimaryKey(tableName, column); + } + /// + /// 重置列名 + /// + /// 表名 + /// 旧列名 + /// 新列名 + /// 值 + public bool RenameColumn(string tableName, string oldColumnName, string newColumnName) + { + return SqlSugarDb.DbMaintenance.RenameColumn(tableName, oldColumnName, newColumnName); + } + /// + /// 重置表数据 + /// + /// 表名 + /// 值 + public bool TruncateTable(string tableName) + { + return SqlSugarDb.DbMaintenance.TruncateTable(tableName); + } + /// + /// 修改列信息 + /// + /// 表名 + /// 列信息 + /// 值 + public bool UpdateColumn(string tableName, DbColumnInfo column) + { + return SqlSugarDb.DbMaintenance.UpdateColumn(tableName, column); + } + + /// + /// 获取数据库时间 + /// + /// 返回值 + public DateTime GetDataBaseTime() + { + return SqlSugarDb.GetDate(); + } + #endregion + + #region 查询 + + /// + /// 查询所有 + /// + /// + /// + /// + public List QueryAll() where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.UpdLock); + return up.ToList(); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + /// + /// 查询-返回自定义数据 + /// + /// 泛型参数(集合成员的类型) + /// 返回值类型 + /// 返回值表达式 + /// 查询表达式 + /// 值 + public TResult QuerySelect(Expression> expression, Expression> whereLambda = null) where T : class, new() + { + try + { + var datas = SqlSugarDb.Queryable().With(SqlWith.NoLock).Where(whereLambda).Select(expression).First(); + return datas; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + /// + /// 查询-返回自定义数据 + /// + /// 泛型参数(集合成员的类型) + /// 返回值类型 + /// 返回值表达式 + /// 查询表达式 + /// 值 + public List QuerySelectList(Expression> expression, Expression> whereLambda = null) where T : class, new() + { + try + { + var datas = SqlSugarDb.Queryable().With(SqlWith.NoLock).Where(whereLambda).Select(expression).ToList(); + return datas; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + + } + /// + /// 查询单条数据 + /// + /// 泛型参数(集合成员的类型) + /// 查询表达式 + /// 值 + public T Query(Expression> whereLambda = null) where T : class, new() + { + + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (whereLambda != null) + { + up = up.Where(whereLambda); + } + return up.First(); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + + } + + /// + /// 异步查询单条数据 + /// + /// 泛型参数(集合成员的类型) + /// 查询表达式 + /// + /// + public Task QueryAsync(Expression> whereLambda = null) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (whereLambda != null) + { + up = up.Where(whereLambda); + } + return up.FirstAsync(); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + + } + + /// + /// 根据条件查询排序数据 + /// + /// + /// + /// + /// + public T Query(Expression> whereLambda2 = null, Expression> whereLambda = null, OrderByType byType = OrderByType.Desc) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + + if (whereLambda2 != null) + { + up = up.Where(whereLambda2); + } + if (whereLambda != null) + { + up = up.OrderBy(whereLambda, byType); + } + return up.First(); + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + public T Query(QueryDescriptor query = null) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (query != null) + { + if (query.Conditions != null) + { + var conds = ParseCondition(query.Conditions); + up = up.Where(conds); + } + + if (query.OrderBys != null) + { + var orderBys = ParseOrderBy(query.OrderBys); + up = up.OrderBy(orderBys); + } + } + return up.First(); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + /// + /// 查询集合 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 实体 + public List QueryWhereList(Expression> whereLambda = null) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.UpdLock); + if (whereLambda != null) + { + up = up.Where(whereLambda); + } + return up.ToList(); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError($"查询集合异常:{ex}", "SysErrorLog"); + return null; + //throw new Exception(ex.Message); + } + + } + + /// + /// 查询集合 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 实体 + public List QueryList(QueryDescriptor query = null) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (query != null) + { + if (query.Conditions != null) + { + var conds = ParseCondition(query.Conditions); + up = up.Where(conds); + } + + if (query.OrderBys != null) + { + var orderBys = ParseOrderBy(query.OrderBys); + up = up.OrderBy(orderBys); + } + } + return up.ToList(); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + /// + /// 查询前N条数据 + /// + /// + /// + /// + /// + /// + /// + public List QueryList(string sort, int Take, Expression> whereLambda = null, OrderByType byType = OrderByType.Desc) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (whereLambda != null) + { + up = up.Where(whereLambda); + } + if (sort != "") + { + var orderBys = ParseOrderBy(sort, byType); + up = up.OrderBy(orderBys).Take(Take); + } + return up.ToList(); + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 根据字段查询排列 + /// + /// + /// + /// + /// + /// + public List QueryList(string sort = "", Expression> whereLambda = null, OrderByType byType = OrderByType.Desc) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (whereLambda != null) + { + up = up.Where(whereLambda); + } + if (sort != "") + { + var orderBys = ParseOrderBy(sort, byType); + up = up.OrderBy(orderBys); + } + return up.ToList(); + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + } + + + /// + /// 排序转换 + /// + /// + /// + /// + private string ParseOrderBy(string sort, OrderByType order) + { + var conds = ""; + + switch (order) + { + case OrderByType.Asc: + conds += $"{sort} asc,"; + break; + case OrderByType.Desc: + conds += $"{sort} desc,"; + break; + default: + throw new ArgumentOutOfRangeException(); + } + return conds.TrimEnd(','); + } + + + /// + /// 查询集合 + /// + /// 泛型参数(集合成员的类型) + /// sql + /// 实体 + public List QuerySqlList(string sql) where T : class, new() + { + try + { + return SqlSugarDb.SqlQueryable(sql).ToList(); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + /// + /// 分页查询 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 总行数 + /// 实体 + public List QueryPageList(QueryDescriptor query, out int totalCount) where T : class, new() + { + if (query == null) + { + throw new ArgumentNullException(nameof(query)); + } + var listDatas = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (query.Conditions != null) + { + var conds = ParseCondition(query.Conditions); + listDatas = listDatas.Where(conds); + } + + if (query.OrderBys != null) + { + var orderBys = ParseOrderBy(query.OrderBys); + listDatas = listDatas.OrderBy(orderBys); + } + + totalCount = 0; + if (query.PageSize == 0) + { + var datas = listDatas.ToList(); + totalCount = datas.Count; + return datas; + } + else + { + var datas = listDatas.ToPageList(query.PageIndex, query.PageSize, ref totalCount); + return datas; + } + + } + /// + /// 查询集合-多值 + /// + /// 泛型参数(集合成员的类型) + /// 字段名 + /// 数据集合 + /// 值 + public List In(string inFieldName, List inValues) where T : class, new() + { + try + { + return SqlSugarDb.Queryable().With(SqlWith.NoLock).In(inFieldName, inValues).ToList(); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + + /// + /// 查询集合-通过多值(主键) + /// + /// 泛型参数(集合成员的类型) + /// 主键数据集合 + /// 值 + public List In(List values) where T : class, new() + { + return SqlSugarDb.Queryable().With(SqlWith.NoLock).In(values).ToList(); + } + + /// + /// 查询集合 + /// + /// 泛型参数(集合成员的类型) + /// 查询表达式 + /// 实体 + public DataTable QueryDataTable(Expression> whereLambda = null) where T : class, new() + { + try + { + ISugarQueryable up = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (whereLambda != null) + { + up = up.Where(whereLambda); + } + return up.ToDataTable(); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + /// + /// 查询集合 + /// + /// sql + /// 实体 + public DataTable QueryDataTable(string sql) + { + try + { + return SqlSugarDb.Ado.GetDataTable(sql); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + + + + /// + /// 查询单个值 + /// + /// sql + /// 单个值 + public object QuerySqlScalar(string sql) + { + try + { + return SqlSugarDb.Ado.GetScalar(sql); + } + catch (Exception ex) { throw new Exception(ex.Message); } + + } + /// + /// 分页查询 + /// + /// 泛型参数(集合成员的类型) + /// 过滤条件 + /// 总行数 + /// DataTable + public DataTable QueryDataTablePageList(QueryDescriptor query, out int totalCount) where T : class, new() + { + if (query == null) + { + throw new ArgumentNullException(nameof(query)); + } + var listDatas = SqlSugarDb.Queryable().With(SqlWith.NoLock); + if (query.Conditions != null) + { + var conds = ParseCondition(query.Conditions); + listDatas = listDatas.Where(conds); + } + + if (query.OrderBys != null) + { + var orderBys = ParseOrderBy(query.OrderBys); + listDatas = listDatas.OrderBy(orderBys); + } + + totalCount = 0; + var datas = listDatas.ToDataTablePage(query.PageIndex, query.PageSize, ref totalCount); + return datas; + } + #endregion + + #region 新增 + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 操作影响的行数 + public int Add(T entity) where T : class, new() + { + try + { + var result = SqlSugarDb.Insertable(entity).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + } + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 泛型集合 + /// 操作影响的行数 + public int Add(List entitys) where T : class, new() + { + try + { + if (entitys.Count == 0) return 1; + var result = SqlSugarDb.Insertable(entitys).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + } + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 字典集合(Key:列名 Value:值) + /// 操作影响的行数 + public int Add(Dictionary keyValues) where T : class, new() + { + try + { + var result = SqlSugarDb.Insertable(keyValues).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + } + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 返回实体 + public T AddReturnEntity(T entity) where T : class, new() + { + try + { + var result = SqlSugarDb.Insertable(entity).ExecuteReturnEntity(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 返回自增列 + public int AddReturnIdentity(T entity) where T : class, new() + { + try + { + var result = SqlSugarDb.Insertable(entity).ExecuteReturnIdentity(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 返回bool + public bool AddReturnBool(T entity) where T : class, new() + { + try + { + var result = SqlSugarDb.Insertable(entity).With(SqlWith.UpdLock).ExecuteCommand() > 0; + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + public async Task AddReturnBoolAsync(T entity) where T : class, new() + { + try + { + var result = await SqlSugarDb.Insertable(entity).With(SqlWith.UpdLock).ExecuteCommandAsync() > 0; + return result; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + + } + + /// + /// 新增 + /// + /// 泛型参数(集合成员的类型) + /// 泛型集合 + /// 返回bool + public bool AddReturnBool(List entitys) where T : class, new() + { + try + { + if (entitys.Count == 0) return true; + var result = SqlSugarDb.Insertable(entitys).ExecuteCommand() > 0; + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + public async Task AddReturnBoolAsync(List entitys) where T : class, new() + { + try + { + var result = await SqlSugarDb.Insertable(entitys).With(SqlWith.UpdLock).ExecuteCommandAsync() > 0; + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + #endregion + + #region 修改 + + /// + /// 修改(主键是更新条件) + /// + /// 泛型参数(集合成员的类型) + /// 实体对象(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + /// + public int Update(T entity, List lstIgnoreColumns = null, bool isLock = true) where T : class, new() + { + try + { + IUpdateable up = SqlSugarDb.Updateable(entity); + if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0) + { + up = up.IgnoreColumns(false); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + /// + /// 修改(主键是更新条件) + /// + /// 泛型参数(集合成员的类型) + /// 实体对象集合(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + public int Update(List entitys, List lstIgnoreColumns = null, bool isLock = true) where T : class, new() + { + try + { + if (entitys.Count == 0) return 1; + IUpdateable up = SqlSugarDb.Updateable(entitys); + if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0) + { + up = up.IgnoreColumns(lstIgnoreColumns.Contains(lstIgnoreColumns.First())); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 条件 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + public int Update(T entity, Expression> where, List lstIgnoreColumns = null, bool isLock = true) where T : class, new() + { + try + { + IUpdateable up = SqlSugarDb.Updateable(entity); + if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0) + { + up = up.IgnoreColumns(lstIgnoreColumns.Contains(lstIgnoreColumns.First())); + } + up = up.Where(where); + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + public int Update(Expression> update, Expression> where = null, bool isLock = true) where T : class, new() + { + try + { + IUpdateable up = SqlSugarDb.Updateable().UpdateColumns(update); + if (where != null) + { + up = up.Where(where); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 修改加1 + /// + /// + /// + /// + /// + /// + public int Update(Expression> update, Expression> where = null, bool isLock = true) where T : class, new() + { + try + { + IUpdateable up = SqlSugarDb.Updateable().SetColumns(update); + if (where != null) + { + up = up.Where(where); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + /// + /// 修改单条数据 + /// + /// + /// 实体类 + /// 指定更新行 + /// 更新表达式 + /// 是否加锁 + /// + /// + public int UpdateSingle(T entity, Expression> IgnoreColumns = null, Expression> where = null, bool isLock = true) where T : class, new() + { + try + { + + IUpdateable up = SqlSugarDb.Updateable(entity); + if (IgnoreColumns != null) + { + up.UpdateColumns(IgnoreColumns); + } + if (where != null) + { + up.Where(where); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + + //SqlSugarDb.Updateable(new T () + //{ + // Id = entity.Id, + // EmailArr = "test@test.com", + // EmailContent = "测试邮件,请忽略111" + //}).UpdateColumns(it => new { it.EmailArr, it.EmailContent }).ExecuteCommandAsync(); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + + } + + /// + /// 异步更新 + /// + /// + /// + /// + /// + /// + /// + /// + public Task UpdateSingleAsync(T entity, Expression> IgnoreColumns = null, Expression> where = null, bool isLock = true) where T : class, new() + { + try + { + + IUpdateable up = SqlSugarDb.Updateable(entity); + if (IgnoreColumns != null) + { + up.UpdateColumns(IgnoreColumns); + } + if (where != null) + { + up.Where(where); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommandAsync(); + return result; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + + } + + + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 字典集合(Key:列名 Value:值) + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + public int Update(Dictionary keyValues, Expression> where = null, bool isLock = true) where T : class, new() + { + try + { + IUpdateable up = SqlSugarDb.Updateable(keyValues); + if (where != null) + { + up = up.Where(where); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + + /// + /// 批量修改需要更新的列 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 更新指定列 + /// 条件(为空则以主键更新,反之需要把wherecolumns中的列加到UpdateColumns中) + /// 是否加锁 + /// 操作影响的行数 + public int UpdateColumns(List entitys, Expression> updateColumns, Expression> wherecolumns = null, bool isLock = true) where T : class, new() + { + try + { + if (entitys.Count == 0) return 1; + IUpdateable up = SqlSugarDb.Updateable(entitys).UpdateColumns(updateColumns); + if (wherecolumns != null) + { + up = up.WhereColumns(wherecolumns); + } + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + /// + /// 修改 通过RowVer及主键Code 更新 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 不更新的列 + /// 是否加锁 + /// 操作影响的行数 + public int UpdateRowVer(T entity, List lstIgnoreColumns = null, bool isLock = true) where T : class, new() + { + try + { + Type ts = entity.GetType(); + var rowVerProperty = ts.GetProperty("RowVer"); + if (rowVerProperty == null) + { + throw new Exception("Column RowVer Not Exist"); + } + if (rowVerProperty.GetValue(entity, null) == null) + { + throw new Exception("RowVer Value Is Null"); + } + var codeProperty = ts.GetProperty("Code"); + if (codeProperty == null) + { + throw new Exception("Column Code Not Exist"); + } + if (codeProperty.GetValue(entity, null) == null) + { + throw new Exception("Code Value Is Null"); + } + var rowVerValue = int.Parse(rowVerProperty.GetValue(entity, null).ToString()); + var codeValue = codeProperty.GetValue(entity, null).ToString(); + var sqlWhere = $" RowVer={rowVerValue} AND Code='{codeValue}'"; + rowVerProperty.SetValue(entity, rowVerValue + 1, null); + IUpdateable up = SqlSugarDb.Updateable(entity); + if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0) + { + up = up.IgnoreColumns(lstIgnoreColumns.Contains(lstIgnoreColumns.First())); + } + up = up.Where(sqlWhere); + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + + + //表达式写2列更新2列,其他不会更新 + /// + /// 修改 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 + /// 更新条件 + /// 是否加锁 + /// 操作影响的行数 + public int UpdateRowVer(Expression> update, Dictionary where, bool isLock = true) where T : class, new() + { + try + { + if (!where.ContainsKey("RowVer")) + { + throw new Exception("Column RowVer Not Exist"); + } + if (where["RowVer"] == null) + { + throw new Exception("RowVer Value Is Null"); + } + if (update.Body.ToString().IndexOf("RowVer", StringComparison.Ordinal) == -1) + { + throw new Exception("Column RowVer Update Is Null"); + } + var sqlWhere = ""; + foreach (var item in where) + { + sqlWhere += string.IsNullOrWhiteSpace(sqlWhere) ? $" {item.Key}='{item.Value}'" : $" and {item.Key}='{item.Value}'"; + } + IUpdateable up = SqlSugarDb.Updateable().UpdateColumns(update).Where(sqlWhere); + if (isLock) + { + up = up.With(SqlWith.UpdLock); + } + var result = up.ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + #endregion + + #region 删除 + /// + /// 初始化表 + /// + /// + /// + public void Delete() where T : class, new() + { + try + { + SqlSugarDb.DbMaintenance.TruncateTable(); + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + /// + /// 删除 + /// + /// 泛型参数(集合成员的类型) + /// 主键值 + /// 是否加锁 + /// 操作影响的行数 + public int DeleteByPrimary(List primaryKeyValues, bool isLock = true) where T : class, new() + { + try + { + var result = isLock ? + SqlSugarDb.Deleteable().In(primaryKeyValues).With(SqlWith.RowLock).ExecuteCommand() + : SqlSugarDb.Deleteable().In(primaryKeyValues).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + /// + /// 删除 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 (必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 是否加锁 + /// 操作影响的行数 + public int Delete(T entity, bool isLock = true) where T : class, new() + { + try + { + var result = isLock ? + SqlSugarDb.Deleteable(entity).With(SqlWith.RowLock).ExecuteCommand() + : SqlSugarDb.Deleteable(entity).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + /// + /// 删除 + /// + /// 泛型参数(集合成员的类型) + /// 实体对象 (必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 + /// 是否加锁 + /// 操作影响的行数 + public int Delete(List entity, bool isLock = true) where T : class, new() + { + try + { + var result = isLock ? + SqlSugarDb.Deleteable(entity).With(SqlWith.RowLock).ExecuteCommand() + : SqlSugarDb.Deleteable(entity).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + /// + /// 删除 + /// + /// 泛型参数(集合成员的类型) + /// 条件 + /// 是否加锁 + /// 操作影响的行数 + public int Delete(Expression> where, bool isLock = true) where T : class, new() + { + try + { + var result = isLock ? + SqlSugarDb.Deleteable().Where(where).With(SqlWith.RowLock).ExecuteCommand() + : SqlSugarDb.Deleteable().Where(where).ExecuteCommand(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 异步删除 + /// + /// + /// + /// + /// + /// + public Task DeleteAsync(Expression> where, bool isLock = true) where T : class, new() + { + try + { + var result = isLock ? + SqlSugarDb.Deleteable().Where(where).With(SqlWith.RowLock).ExecuteCommandAsync() + : SqlSugarDb.Deleteable().Where(where).ExecuteCommandAsync(); + return result; + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + } + + /// + /// 通过多值(主键)删除数据集 + /// + /// 泛型参数(集合成员的类型) + /// 数据集合 + /// 值 + public int DeleteIn(List inValues) where T : class, new() + { + return SqlSugarDb.Deleteable().With(SqlWith.RowLock).In(inValues).ExecuteCommand(); + } + + #endregion + + /// + /// 是否存在 + /// + /// 泛型参数(集合成员的类型 + /// 查询表达式 + /// 值 + public bool IsExist(Expression> whereLambda) where T : class, new() + { + var datas = SqlSugarDb.Queryable().With(SqlWith.UpdLock).Any(whereLambda); + return datas; + } + + #region 私有方法 + + /// + /// SqlParameter转换SugarParameter + /// + /// 参数 + /// + private List ConvetParameter(List parameters) + { + var listParams = new List(); + foreach (var p in parameters) + { + var par = new SugarParameter(p.ParameterName, p.Value) + { + DbType = p.DbType, + Direction = p.Direction + }; + if (!string.IsNullOrWhiteSpace(p.TypeName)) + { + par.TypeName = p.TypeName; + } + listParams.Add(par); + } + + return listParams; + } + + /// + /// 过滤条件转换 + /// + /// 过滤条件 + /// 值 + private List ParseCondition(List contitons) + { + var conds = new List(); + contitons.Insert(0, new QueryCondition + { + Operator = QueryOperator.Equal, + Key = "1", + Value = "1" + }); + + #region Or条件组装 + var orConditional = new ConditionalCollections { ConditionalList = new List>() }; + foreach (var con in contitons.Where(m => m.Character == QueryCharacter.Or)) + { + if (orConditional.ConditionalList.Count == 0) + { + var cond = new KeyValuePair + (WhereType.And, new ConditionalModel() + { + FieldName = con.Key, + ConditionalType = (ConditionalType)(int)con.Operator, + FieldValue = con.Value.ToString() + }); + orConditional.ConditionalList.Add(cond); + } + else + { + var cond = new KeyValuePair + (WhereType.Or, new ConditionalModel() + { + FieldName = con.Key, + ConditionalType = (ConditionalType)(int)con.Operator, + FieldValue = con.Value.ToString() + }); + orConditional.ConditionalList.Add(cond); + } + } + #endregion + + #region And条件组装 + foreach (var con in contitons.Where(m => m.Character == QueryCharacter.And)) + { + if (con.Key.Contains(",")) + { + ParseKeyOr(con, orConditional); + } + else if (con.Operator == QueryOperator.DateRange) + { + conds.AddRange(ParseRange(con, con.Operator)); + } + else + { + conds.Add(new ConditionalModel() + { + FieldName = con.Key, + ConditionalType = (ConditionalType)(int)con.Operator, + FieldValue = con.Value.ToString() + }); + } + } + + #endregion + + //Or条件是否存在 + if (orConditional.ConditionalList.Count > 0) + { + conds.Add(orConditional); + } + + return conds; + } + + /// + /// Key逗号隔开转换Or条件 + /// + /// 过滤条件 + /// 条件集合 + /// 值 + private void ParseKeyOr(QueryCondition condition, ConditionalCollections conditionalCollections) + { + var objectKeys = condition.Key.Split(','); + foreach (var objKey in objectKeys) + { + if (conditionalCollections.ConditionalList.Count == 0) + { + var cond = new KeyValuePair + (WhereType.And, new ConditionalModel() + { + FieldName = objKey, + ConditionalType = (ConditionalType)(int)condition.Operator, + FieldValue = condition.Value.ToString() + }); + conditionalCollections.ConditionalList.Add(cond); + } + else + { + var cond = new KeyValuePair + (WhereType.Or, new ConditionalModel() + { + FieldName = objKey, + ConditionalType = (ConditionalType)(int)condition.Operator, + FieldValue = condition.Value.ToString() + }); + conditionalCollections.ConditionalList.Add(cond); + } + } + } + + /// + /// 转换区域 + /// + /// 过滤条件 + /// 条件类型 + /// 值 + private List ParseRange(QueryCondition condition, QueryOperator queryOperator) + { + var objectValue = condition.Value.ToString().Split('|'); + + var conditionalList = new List(); + if (objectValue.Length == 2) + { + var startValue = objectValue[0]; + var endValue = objectValue[1]; + if (queryOperator == QueryOperator.DateRange) + { + if (startValue.IndexOf(":", StringComparison.Ordinal) == -1) + { + startValue = startValue + " 00:00:00"; + } + if (endValue.IndexOf(":", StringComparison.Ordinal) == -1) + { + endValue = endValue + " 23:59:59"; + } + } + if (!string.IsNullOrWhiteSpace(objectValue[0])) + { + conditionalList.Add(new ConditionalModel() + { + FieldName = condition.Key, + ConditionalType = ConditionalType.GreaterThanOrEqual, + FieldValue = startValue + }); + } + if (!string.IsNullOrWhiteSpace(objectValue[1])) + { + conditionalList.Add(new ConditionalModel() + { + FieldName = condition.Key, + ConditionalType = ConditionalType.LessThanOrEqual, + FieldValue = endValue + }); + } + } + return conditionalList; + } + + /// + /// 排序转换 + /// + /// 排序 + /// 值 + private string ParseOrderBy(List orderBys) + { + var conds = ""; + foreach (var con in orderBys) + { + switch (con.Order) + { + case OrderSequence.Asc: + conds += $"{con.Sort} asc,"; + break; + case OrderSequence.Desc: + conds += $"{con.Sort} desc,"; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + return conds.TrimEnd(','); + } + + #endregion + + public void Dispose() + { + SqlSugarDb.Ado.Dispose(); + SqlSugarDb.Dispose(); + + } + + + } +} diff --git a/JinYuan.DAL/app.config b/JinYuan.DAL/app.config new file mode 100644 index 0000000..01c6fee --- /dev/null +++ b/JinYuan.DAL/app.config @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.DAL/packages.config b/JinYuan.DAL/packages.config new file mode 100644 index 0000000..c74b161 --- /dev/null +++ b/JinYuan.DAL/packages.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JinYuan.Helper/ArrayHelper.cs b/JinYuan.Helper/ArrayHelper.cs new file mode 100644 index 0000000..b57c9b0 --- /dev/null +++ b/JinYuan.Helper/ArrayHelper.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace JinYuan.Helper +{ + public class ArrayHelper + { + /// + /// 判断两个数组的元素是否相等 + /// + /// + /// + /// + public static bool Equal(T[] arr1, T[] arr2) + { + bool res = false; + if (arr1 == null || arr2 == null) + { + return res; + } + if (arr1.Length == arr2.Length) + { + res = true; + for (int index = 0; index < arr1.Length; ++index) + { + if (!arr1[index].Equals(arr2[index])) + { + res = false; + break; + } + } + } + return res; + } + + /// + /// 获取数组的子数组 + /// + /// 类型 + /// 数组 + /// 起始索引 + /// 长度 + /// + public static T[] GetSubArray(T[] arr, int startIndex, int length) + { + T[] res = new T[length]; + for (int index = 0; index < length; ++index) + { + res[index] = arr[startIndex + index]; + } + return res; + } + + /// + /// 数组合并 + /// + /// + /// + /// + /// + public static byte[] Combine(IEnumerable tList) + { + int allLength = 0; + foreach (byte[] t in tList) + { + allLength += t.Length; + } + byte[] res = new byte[allLength]; + int lenIndex = 0; + foreach (byte[] t in tList) + { + Array.Copy(t, 0, res, lenIndex, t.Length); + lenIndex += t.Length; + } + return res; + } + + /// + /// 数组格式化输出字符串 + /// + /// 待处理数据 + /// + public static string ArrayFormatOutput(T[] arr) + { + StringBuilder res = new StringBuilder(); + for (int index = 0; index < arr.Count() - 1; ++index) + { + res.Append(string.Format("{0}-", arr[index].ToString())); + } + if (arr.Count() - 1 > 0) + { + res.Append(arr[arr.Count() - 1]); + } + return res.ToString(); + } + + /// + /// 数组格式化输出字符串 + /// + /// + /// 待处理数据 + /// buffer 参数中开始发送数据的位置,该位置从零开始计数。 + /// 要发送的字节数。 + /// + public static string ArrayFormatOutput(T[] arr, int offset, int size) + { + StringBuilder res = new StringBuilder(); + for (int index = offset; index < size; ++index) + { + res.Append(string.Format("{0}-", arr[index].ToString())); + } + if (size - 1 > 0) + { + res.Append(arr[size]); + } + return res.ToString(); + } + + } +} diff --git a/JinYuan.Helper/CSVHelper.cs b/JinYuan.Helper/CSVHelper.cs new file mode 100644 index 0000000..7c5f2f9 --- /dev/null +++ b/JinYuan.Helper/CSVHelper.cs @@ -0,0 +1,346 @@ +using CsvHelper; +using CsvHelper.Configuration; +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; + +namespace JinYuan.Helper +{ + public class CSVHelper + { + /// + /// 读取CSV文件 + /// + /// csv文件名 + /// + public static List ReadCSV(string fileName, string strSeparator = "\t") + { + if (!File.Exists(fileName)) return null; + + using (var reader = new StreamReader(fileName, Encoding.Default)) + { + var cfg = new CsvConfiguration(CultureInfo.InvariantCulture) + { + Mode = CsvMode.Escape, + Escape = '\\', + Delimiter = strSeparator, // 设置分隔符号 + HeaderValidated = null, // 跳过表头验证 + MissingFieldFound = null // 忽略缺失字段 + }; + + using (var csv = new CsvReader(reader, cfg)) + { + var list = csv.GetRecords().ToList(); + return list; + } + } + } + + + /// + /// 写入CSV文件 + /// + /// csv文件名 + /// + public static bool WriterCSV(string fileName, List records) + { + try + { + FileStream Log = null; + if (!Directory.Exists(fileName)) + Directory.CreateDirectory(fileName); + string file = (fileName + DateTime.Now.ToString("yyyyMMdd")) + ".csv"; + var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture); + if (!File.Exists(file)) + { + Log = new FileStream(file, FileMode.Create); + } + else + { + cfg.HasHeaderRecord = false;//是否将第一行作为标题 + } + if (Log != null) + { + Log.Close(); + } + //Nuget获取CsvHelper + using (var writer = new StreamWriter(file, true, Encoding.Default)) + { + using (var csv = new CsvWriter(writer, cfg)) + { + csv.WriteRecords(records); + writer.Flush(); + return true; + } + } + } + catch (Exception ex) + { + + throw ex; + } + } + + + /// + /// 写入指定列表CSV文件 + /// + /// + /// + /// + /// + /// + public static bool WriterCSV(string directory, string fileName, string title, string content) + { + FileStream fs = null; + StreamWriter sw = null; + + try + { + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + string fullFileName = $@"{directory}\{fileName}"; + if (!File.Exists(fullFileName)) + { + fs = new FileStream(fullFileName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + sw.WriteLine(title); + } + else + { + fs = new FileStream(fullFileName, FileMode.Append, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + + sw.WriteLine(content); + + sw.Close(); + fs.Close(); + + return true; + } + catch (Exception ex) + { + sw?.Close(); + fs?.Close(); + } + + return false; + } + + + /// + /// 获取当天的日期的文件 + /// + /// + /// + public static List FindTodayFile(string CurrPath) + { + try + { + if (!Directory.Exists(CurrPath)) + { + return null; + } + DirectoryInfo di = new DirectoryInfo(CurrPath); + FileInfo[] ffis = di.GetFiles(); + string today = DateTime.Now.Year.ToString().Substring(0, 4) + DateTime.Now.Month.ToString("0#") + DateTime.Now.Day.ToString("0#"); + List listFilePath = new List(); + + for (int i = 0; i < ffis.Length; i++) + { + FileInfo tmp = ffis[i]; + if (tmp.Name.Substring(0, 8) == today) + { + listFilePath.Add(tmp.FullName); + } + } + return (listFilePath.Count > 0) ? listFilePath : null; + } + catch (Exception ex) + { + + throw ex; + } + + } + + /// + /// + /// + /// + /// + public static List FindHostFile(string CurrPath, DateTime date) + { + try + { + if (!Directory.Exists(CurrPath)) + { + return null; + } + DirectoryInfo di = new DirectoryInfo(CurrPath); + FileInfo[] ffis = di.GetFiles(); + string today = date.ToString().Substring(0, 4) + date.Month.ToString("0#") + date.Day.ToString("0#"); + //var result1 = Regex.Replace(date, @"[^0-9]+", ""); + //string today = result1.Substring(0,8); + List listFilePath = new List(); + + for (int i = 0; i < ffis.Length; i++) + { + FileInfo tmp = ffis[i]; + if (tmp.Name.Substring(0, 8) == today) + { + listFilePath.Add(tmp.FullName); + } + } + return (listFilePath.Count > 0) ? listFilePath : null; + } + catch (Exception ex) + { + + throw ex; + } + + } + + + /// + /// 导出到CSV文件 + /// + /// 报表DataTable + /// 导出路径 + /// 输出信息 + /// 自定义的列名称,以','英文逗号分隔 + /// 表名,一般为空 + /// 是否导出成功 + public static bool ExportDataTableToCSV(DataTable table, string filePath, out string msg, string columnName = null, string tableHeader = null) + { + try + { + string dirPath = Path.GetDirectoryName(filePath); + if (!Directory.Exists(dirPath)) + { + Directory.CreateDirectory(dirPath);//文件的父目录不存在就创建新目录 + } + bool IsAppend = false; //false为创建 true为追加 + if (File.Exists(filePath)) + { + IsAppend = true;//如果文件存在就不写入表头 + } + using (FileStream _stream = new FileStream(filePath, FileMode.Create | FileMode.Append, FileAccess.Write)) + { + StreamWriter _writer = new StreamWriter(_stream, Encoding.UTF8); + if (tableHeader != null) + { + _writer.WriteLine(tableHeader); + } + + if (columnName != null && !IsAppend) + { + _writer.WriteLine(columnName); + } + else if (columnName == null && !IsAppend) + { + List columnNameList = new List(); + foreach (DataColumn dc in table.Columns) + { + columnNameList.Add(dc.ColumnName); + } + _writer.WriteLine(string.Join(",", columnNameList)); + } + + for (int i = 0; i < table.Rows.Count; i++) + { + for (int j = 0; j < table.Columns.Count; j++) + { + _writer.Write(table.Rows[i][j].ToString()); + _writer.Write(","); + } + _writer.WriteLine(); + } + _writer.Close(); + msg = "导出CSV文件成功"; + return true; + } + } + catch (Exception ex) + { + msg = string.Format("导出CSV文件失败,原因:{0}", ex.Message); + return false; + } + } + + + /// + /// 导出报表为Csv + /// + /// DataTable + /// 物理路径 + /// 表头 + /// 字段标题,逗号分隔 + public static bool dt2csv(DataTable dt, string strFilePath, string tableheader, string columname) + { + try + { + string strBufferLine = ""; + StreamWriter strmWriterObj = new StreamWriter(strFilePath, false, System.Text.Encoding.UTF8); + strmWriterObj.WriteLine(tableheader); + strmWriterObj.WriteLine(columname); + for (int i = 0; i < dt.Rows.Count; i++) + { + strBufferLine = ""; + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j > 0) + strBufferLine += ","; + strBufferLine += dt.Rows[i][j].ToString(); + } + strmWriterObj.WriteLine(strBufferLine); + } + strmWriterObj.Close(); + return true; + } + catch + { + return false; + } + } + + /// + /// 将Csv读入DataTable + /// + /// csv文件路径 + /// 表示第n行是字段title,第n+1行是记录开始 + public static DataTable csv2dt(string filePath, int n, DataTable dt) + { + StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8, false); + int i = 0, m = 0; + reader.Peek(); + while (reader.Peek() > 0) + { + m = m + 1; + string str = reader.ReadLine(); + if (m >= n + 1) + { + string[] split = str.Split(','); + + System.Data.DataRow dr = dt.NewRow(); + for (i = 0; i < split.Length; i++) + { + dr[i] = split[i]; + } + dt.Rows.Add(dr); + } + } + return dt; + } + + } +} diff --git a/JinYuan.Helper/ChartHelper.cs b/JinYuan.Helper/ChartHelper.cs new file mode 100644 index 0000000..79583c7 --- /dev/null +++ b/JinYuan.Helper/ChartHelper.cs @@ -0,0 +1,213 @@ +using System; +using System.Drawing; +using System.Drawing.Text; +using System.Windows.Forms.DataVisualization.Charting; + +namespace JinYuan.Helper +{ + public class ChartHelper + { + static PrivateFontCollection font = new PrivateFontCollection(); + /// + /// Name:添加序列 + /// + /// + /// 图表对象 + /// 序列名称 + /// 图表类型 + /// 颜色 + /// 标记点颜色 + /// 是否显示数值 + public static void AddSeries(Chart chart, string seriesName, SeriesChartType chartType, ChartValueType chartValueType, MarkerStyle markerStyle, int markerSize, Color seriesColor, Color markColor, string LabelStyle, bool isShowBFH, bool showValue = false) + { + // 加载字体文件 Zen圓体-Regular + font.AddFontFile(Environment.CurrentDirectory + "\\Assts\\Fonts\\Zen圓体-Regular.ttf"); + //定义成新的字体对象 + FontFamily myFontFamily = new FontFamily(font.Families[0].Name, font); + Font myFont = new Font(myFontFamily, 9.0f, FontStyle.Bold); + + chart.Series.Add(seriesName); + chart.Series[seriesName].ChartType = chartType; + chart.Series[seriesName].Color = seriesColor; + if (showValue) + { + chart.Series[seriesName].IsValueShownAsLabel = showValue; + chart.Series[seriesName].XValueType = chartValueType; + chart.Series[seriesName].Label = LabelStyle; + chart.Series[seriesName].Font = myFont; + chart.Series[seriesName].MarkerStyle = markerStyle; + chart.Series[seriesName].MarkerColor = markColor; + chart.Series[seriesName].MarkerStyle = MarkerStyle.Circle; //线条上的数据点标志类型 + chart.Series[seriesName].MarkerSize = markerSize; //标志大小 + chart.Series[seriesName].LabelToolTip = "#VALX: #VALY"; + chart.Series[seriesName].LabelForeColor = markColor; + chart.Series[seriesName].LabelAngle = -75; + chart.Series[seriesName].BorderWidth = 3; + chart.Series[seriesName].LabelBorderWidth = 5; + + if (isShowBFH) + { + chart.Series[seriesName].YAxisType = AxisType.Secondary; + } + + } + } + + /// + /// Name:设置标题 + /// + /// + /// 图表对象 + /// 图表名称 + public static void SetTitle(Chart chart, string chartName, Font font, Docking docking, Color foreColor) + { + chart.Titles.Add(chartName); + chart.Titles[0].Font = font; + chart.Titles[0].Docking = docking; + chart.Titles[0].ForeColor = foreColor; + } + + /// + /// Name:设置样式 + /// 2019-04-23 14:04 + /// + /// 图表对象 + /// 背景颜色 + /// 字体颜色 + public static void SetStyle(Chart chart, Color backColor, Color foreColor) + { + chart.BackColor = backColor; + chart.ChartAreas[0].BackColor = backColor; + chart.ForeColor = Color.Red; + } + + /// + /// Name:设置图例 + /// Author: + /// + /// 图表对象 + /// 停靠位置 + /// 对齐方式 + /// 背景颜色 + /// 字体颜色 + public static void SetLegend(Chart chart, Docking docking, StringAlignment align, Color backColor, Color foreColor) + { + // 加载字体文件 + font.AddFontFile(Environment.CurrentDirectory + "\\Assts\\Fonts\\Zen圓体-Regular.ttf"); + //定义成新的字体对象 + FontFamily myFontFamily = new FontFamily(font.Families[0].Name, font); + Font myFont = new Font(myFontFamily, 9.0f, FontStyle.Regular); + + chart.Legends[0].Docking = docking; + chart.Legends[0].Alignment = align; + chart.Legends[0].BackColor = backColor; + chart.Legends[0].ForeColor = foreColor; + chart.Legends[0].Font = myFont; + + } + + /// + /// Name:设置XY轴 + /// Author: + /// + /// 图表对象 + /// X轴标题 + /// Y轴标题 + /// 坐标轴标题对齐方式 + /// 坐标轴字体颜色 + /// 坐标轴颜色 + /// 坐标轴箭头样式 + /// X轴的间距 + /// Y轴的间距 + public static void SetXY(Chart chart, string xTitle, string yTitle, int Angle, StringAlignment align, Color foreColor, Color lineColor, AxisArrowStyle arrowStyle, double xInterval, bool isShowBFH, bool isShowTime = false) + { + // 加载字体文件 + font.AddFontFile(Environment.CurrentDirectory + "\\Assts\\Fonts\\Zen圓体-Regular.ttf"); + //定义成新的字体对象 + FontFamily myFontFamily = new FontFamily(font.Families[0].Name, font); + Font myFont = new Font(myFontFamily, 15f, FontStyle.Regular); + + + chart.ChartAreas[0].AxisX.TitleForeColor = foreColor; + chart.ChartAreas[0].AxisX.LabelStyle = new LabelStyle() { ForeColor = foreColor }; + chart.ChartAreas[0].AxisX.LabelStyle.Angle = Angle; + chart.ChartAreas[0].AxisX.LineColor = lineColor; + chart.ChartAreas[0].AxisX.LabelStyle.ForeColor = lineColor; + chart.ChartAreas[0].AxisX.ArrowStyle = arrowStyle; + chart.ChartAreas[0].AxisX.Interval = xInterval; + chart.ChartAreas[0].AxisX.Title = xTitle; + chart.ChartAreas[0].AxisX.TitleAlignment = align; + + chart.ChartAreas[0].AxisY.TitleForeColor = foreColor; + chart.ChartAreas[0].AxisY.LabelStyle = new LabelStyle() { ForeColor = foreColor }; + chart.ChartAreas[0].AxisY.LineColor = lineColor; + chart.ChartAreas[0].AxisY.LabelStyle.ForeColor = lineColor; + chart.ChartAreas[0].AxisY.ArrowStyle = arrowStyle; + chart.ChartAreas[0].AxisY.Title = yTitle; + chart.ChartAreas[0].AxisY.TitleAlignment = align; + + if (isShowBFH) + { + chart.ChartAreas[0].AxisY2.Minimum = 0; + chart.ChartAreas[0].AxisY2.Maximum = 1.2; + chart.ChartAreas[0].AxisY2.Interval = 0.2; + chart.ChartAreas[0].AxisY2.LabelStyle = new LabelStyle() { ForeColor = foreColor }; + chart.ChartAreas[0].AxisY2.LineColor = lineColor; + chart.ChartAreas[0].AxisY2.LabelStyle.ForeColor = lineColor; + chart.ChartAreas[0].AxisY2.LabelStyle.Format = "0.00%"; + } + + ////设置图表显示样式 + if (isShowTime) + { + chart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; //毫秒格式: hh:mm:ss.fff ,后面几个f则保留几位毫秒小数,此时要注意轴的最大值和最小值不要差太大 + chart.ChartAreas[0].AxisX.LabelStyle.IntervalType = DateTimeIntervalType.Seconds; + chart.ChartAreas[0].AxisX.Interval = xInterval; //坐标值间隔1S + chart.ChartAreas[0].AxisX.LabelStyle.IsEndLabelVisible = false; //防止X轴坐标跳跃 + chart.ChartAreas[0].AxisX.MajorGrid.IntervalType = DateTimeIntervalType.Seconds; + + //chart.ChartAreas[0].AxisY.L = 1; //网格间隔 + + chart.ChartAreas[0].AxisX.Minimum = DateTime.Now.ToOADate(); //当前时间 + chart.ChartAreas[0].AxisX.Maximum = DateTime.Now.ToOADate(); + } + + + + } + + /// + /// Name:设置网格 + /// Author: + /// + /// 图表对象 + /// 网格线颜色 + /// X轴网格的间距 + /// Y轴网格的间距 + public static void SetMajorGrid(Chart chart, Color lineColor, double xInterval, double yInterval, bool isMajorGridX = false, bool isMajorGridY = false) + { + chart.ChartAreas[0].AxisX.MajorGrid.Enabled = isMajorGridX; + chart.ChartAreas[0].AxisY.MajorGrid.Enabled = isMajorGridY; + chart.ChartAreas[0].AxisY2.MajorGrid.Enabled = isMajorGridY; + if (isMajorGridX) + { + chart.ChartAreas[0].AxisX.MajorGrid.LineColor = lineColor; + + chart.ChartAreas[0].AxisX.MajorGrid.Interval = xInterval; + + chart.ChartAreas[0].AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash; + + } + + if (isMajorGridY) + { + chart.ChartAreas[0].AxisY.MajorGrid.LineColor = lineColor; + chart.ChartAreas[0].AxisY.MajorGrid.Interval = yInterval; + chart.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash; + } + + } + + + } +} diff --git a/JinYuan.Helper/ClearMemoryHelper.cs b/JinYuan.Helper/ClearMemoryHelper.cs new file mode 100644 index 0000000..736a551 --- /dev/null +++ b/JinYuan.Helper/ClearMemoryHelper.cs @@ -0,0 +1,31 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; + +namespace JinYuan.Helper +{ + public class ClearMemoryHelper + { + [DllImport("kernel32.dll")] + private static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max); + /// + /// 释放内存 + /// + public static void ClearMemory() + { + Task.Run(async () => + { + while (true) + { + await Task.Delay(4000); + GC.Collect(); + GC.WaitForPendingFinalizers(); + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + { + SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); + } + } + }); + } + } +} diff --git a/JinYuan.Helper/ConvertHelper.cs b/JinYuan.Helper/ConvertHelper.cs new file mode 100644 index 0000000..62a1371 --- /dev/null +++ b/JinYuan.Helper/ConvertHelper.cs @@ -0,0 +1,18 @@ +using System.Linq; + +namespace JinYuan.Helper +{ + public static class ConvertHelper + { + /// + /// 字节数组高低位转换 + /// + /// + /// + public static byte[] ByteReverse(this byte[] Arrbyte) + { + byte[] ArrByte = Arrbyte.Select((x, i) => new { x, i }).GroupBy(x => x.i / 2).SelectMany(x => new byte[] { x.Last().x, x.First().x }).ToArray(); + return ArrByte; + } + } +} diff --git a/JinYuan.Helper/DataGridViewHelper.cs b/JinYuan.Helper/DataGridViewHelper.cs new file mode 100644 index 0000000..3030637 --- /dev/null +++ b/JinYuan.Helper/DataGridViewHelper.cs @@ -0,0 +1,136 @@ +using System; +using System.Drawing; +using System.Reflection; +using System.Windows.Forms; + +namespace JinYuan.Helper +{ + public static class DataGridViewHelper + { + /// + /// 给DataGridView添加行号 + /// + /// dgv控件 + /// dgv参数 + public static void DgvRowPostPaint(DataGridView dgv, DataGridViewRowPostPaintEventArgs e) + { + try + { + //添加行号 + SolidBrush solidBrush = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor); + string lineNo = (e.RowIndex + 1).ToString(); + e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + + StringFormat sf = new StringFormat(); + sf.LineAlignment = StringAlignment.Center; + sf.Alignment = StringAlignment.Center; + e.Graphics.DrawString(lineNo, e.InheritedRowStyle.Font, solidBrush, new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth, dgv.RowTemplate.Height), sf); + } + catch (Exception ex) + { + MessageBox.Show("添加行号时发生错误,错误信息:" + ex.Message, "操作失败"); + } + } + + /// + /// 给DataGridView指定列改变前景色 + /// + /// + /// + public static void DgvRowPrePaint(DataGridView dgv, string Column, object sender, DataGridViewRowPrePaintEventArgs e) + { + + if (e.RowIndex >= dgv.Rows.Count - 1) + return; + DataGridViewRow dr = (sender as DataGridView).Rows[e.RowIndex]; + + try + { + if (dr.Cells[Column].Value != null && dr.Cells[Column].Value.Equals("OK")) + { + // 设置单元格的背景色 + //dr.Cells[Column].Style.BackColor = Color.LightGreen; + + // 设置单元格的前景色 + dr.Cells[Column].Style.ForeColor = Color.LightGreen; + } + else + { + //dr.Cells[Column].Style.BackColor = Color.Red; + dr.Cells[Column].Style.ForeColor = Color.Red; + } + } + catch (Exception ex) + { + MessageBox.Show("更改状态时发生错误,错误信息:" + ex.Message, "操作失败"); + + } + } + + /// + /// 给DataGridView绘制边框 + /// + /// dgv控件 + /// dgv参数 + public static void DgvRowPaint(DataGridView dgv, PaintEventArgs e, Color borderColor) + { + e.Graphics.DrawRectangle(new Pen(borderColor), new Rectangle(0, 0, dgv.Width - 1, dgv.Height - 1)); + } + + /// + /// 奇偶换色 + /// + public static void DgvStyle(DataGridView dgv, Color defaultBackColor, Color alternatingBackColor, Color gridColor) + { + //奇数行的背景色 + dgv.AlternatingRowsDefaultCellStyle.BackColor = alternatingBackColor; + dgv.AlternatingRowsDefaultCellStyle.SelectionBackColor = alternatingBackColor; + + //默认的行样式 + dgv.RowsDefaultCellStyle.BackColor = defaultBackColor; + dgv.RowsDefaultCellStyle.SelectionBackColor = defaultBackColor; + + + dgv.RowHeadersDefaultCellStyle.BackColor = defaultBackColor; + dgv.RowHeadersDefaultCellStyle.SelectionBackColor = defaultBackColor; + + //数据网格颜色 + dgv.GridColor = gridColor; + } + + + + + /// + /// 双缓冲,解决闪烁问题 + /// + /// + /// + public static void DoubleBufferedDataGirdView(this DataGridView dgv, bool flag) + { + Type dgvType = dgv.GetType(); + PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); + pi.SetValue(dgv, flag, null); + } + + + /// + /// 双缓冲,解决闪烁问题 + /// + /// + /// + public static void DoubleBufferedListView(this ListView lv, bool flag) + { + Type lvType = lv.GetType(); + PropertyInfo pi = lvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); + pi.SetValue(lv, flag, null); + } + + public static void DoubleBufferedListBox(this ListBox lb, bool flag) + { + Type lvType = lb.GetType(); + PropertyInfo pi = lvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); + pi.SetValue(lb, flag, null); + } + } +} diff --git a/JinYuan.Helper/DataTableExtend.cs b/JinYuan.Helper/DataTableExtend.cs new file mode 100644 index 0000000..b1cb9ee --- /dev/null +++ b/JinYuan.Helper/DataTableExtend.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Reflection; + +namespace JinYuan.Helper +{ + /// + /// DataTable扩展方法类 + /// + public static class DataTableExtend + { + /// + /// DataTable转成List + /// + public static List ToDataList(this DataTable dt) + { + var list = new List(); + var plist = new List(typeof(T).GetProperties()); + + if (dt == null || dt.Rows.Count == 0) + { + return null; + } + + foreach (DataRow item in dt.Rows) + { + T s = Activator.CreateInstance(); + for (int i = 0; i < dt.Columns.Count; i++) + { + PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); + if (info != null) + { + try + { + if (!Convert.IsDBNull(item[i])) + { + object v = null; + if (info.PropertyType.ToString().Contains("System.Nullable")) + { + v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType)); + } + else + { + v = Convert.ChangeType(item[i], info.PropertyType); + } + info.SetValue(s, v, null); + } + } + catch (Exception ex) + { + throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message); + } + } + } + list.Add(s); + } + return list; + } + + + /// + /// DataTable转成实体对象 + /// + /// + /// + /// + public static T ToDataEntity(this DataTable dt) + { + T s = Activator.CreateInstance(); + if (dt == null || dt.Rows.Count == 0) + { + return default(T); + } + var plist = new List(typeof(T).GetProperties()); + for (int i = 0; i < dt.Columns.Count; i++) + { + PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName); + if (info != null) + { + try + { + if (!Convert.IsDBNull(dt.Rows[0][i])) + { + object v = null; + if (info.PropertyType.ToString().Contains("System.Nullable")) + { + v = Convert.ChangeType(dt.Rows[0][i], Nullable.GetUnderlyingType(info.PropertyType)); + } + else + { + v = Convert.ChangeType(dt.Rows[0][i], info.PropertyType); + } + info.SetValue(s, v, null); + } + } + catch (Exception ex) + { + throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message); + } + } + } + return s; + } + + /// + /// List转成DataTable + /// + /// 实体类型 + /// 实体集合 + public static DataTable ToDataTable(List entities) + { + if (entities == null || entities.Count == 0) + { + return null; + } + + var result = CreateTable(); + FillData(result, entities); + return result; + } + + /// + /// 创建表 + /// + private static DataTable CreateTable() + { + var result = new DataTable(); + var type = typeof(T); + foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) + { + var propertyType = property.PropertyType; + if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))) + propertyType = propertyType.GetGenericArguments()[0]; + result.Columns.Add(property.Name, propertyType); + } + return result; + } + + /// + /// 填充数据 + /// + private static void FillData(DataTable dt, IEnumerable entities) + { + foreach (var entity in entities) + { + dt.Rows.Add(CreateRow(dt, entity)); + } + } + + /// + /// 创建行 + /// + private static DataRow CreateRow(DataTable dt, T entity) + { + DataRow row = dt.NewRow(); + var type = typeof(T); + foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) + { + row[property.Name] = property.GetValue(entity) ?? DBNull.Value; + } + return row; + } + } +} diff --git a/JinYuan.Helper/DeleteLog.cs b/JinYuan.Helper/DeleteLog.cs new file mode 100644 index 0000000..d71c767 --- /dev/null +++ b/JinYuan.Helper/DeleteLog.cs @@ -0,0 +1,206 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; + +namespace JinYuan.Helper +{ + public class DeleteLog + { + public static void Start(string[] strPata, short[] methodSelect) + { + Init(strPata, methodSelect); + } + + private static void Init(string[] strPata, short[] methodSelect) + { + Task.Run(() => + { + try + { + while (true) + { + for (int i = 0; i < strPata.Length; i++) + { + switch (methodSelect[i]) + { + case 0: + bool b = DeleteDirectory(strPata[i], 30); //删除该目录下 超过 30天的文件 + if (b) + { + LogHelper.Instance.WriteLog($"已清除路径:{strPata[i]},30天内过期日志"); + } + break; + case 1: + bool c = DeleteFile(strPata[i], 30); + if (c) + { + LogHelper.Instance.WriteLog($"已清除路径:{strPata[i]},30天内过期日志"); + } + break; + default: + break; + } + } + //24小时清一次 + Thread.Sleep(1000 * 60 * 60 * 24); + } + } + catch (Exception e) + { + Thread.Sleep(1000 * 60 * 60 * 28); + } + }); + } + + public static void DeleteDirectory(string target_dir) + { + string[] files = Directory.GetFiles(target_dir); + string[] dirs = Directory.GetDirectories(target_dir); + foreach (string file in files) + { + File.SetAttributes(file, FileAttributes.Normal); + File.Delete(file); + } + foreach (string dir in dirs) + { + DeleteDirectory(dir); + } + Directory.Delete(target_dir, false); + } + + private static bool DeleteDirectory(string fileDirect, int saveDay) + { + try + { + if (!Directory.Exists(fileDirect)) + { + LogHelper.Instance.WriteLog($"{fileDirect},文件夹不存在"); + return false; + } + DateTime nowTime = DateTime.Now; + string[] files = Directory.GetFiles(fileDirect, "*.*", SearchOption.AllDirectories); //获取该目录下所有 .txt文件 + foreach (string file in files) + { + FileInfo fileInfo = new FileInfo(file); + TimeSpan t = DateTime.Now - fileInfo.CreationTime; //当前时间 减去 文件创建时间 + int day = t.Days; + if (day > saveDay) //保存的时间,单位:天 + { + if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用 + { + if (fileDirect.Contains("Mes"))//MesLogs + { + Directory.Delete(fileInfo.Directory.Parent.FullName, true); + return true; + } + else//其它 + { + Directory.Delete(fileInfo.Directory.FullName, true); + return true; + } + } + else + { + LogHelper.Instance.WriteLog($"{fileInfo.FullName},文件被占用,无法操作!"); + } + } + } + } + catch (Exception err) + { + LogHelper.Instance.WriteLog($"APILog日志删除异常,异常原因:{err}"); + } + return false; + } + + public static bool DeleteFile(string fileDirect, int saveDay) + { + try + { + if (!Directory.Exists(fileDirect)) + { + LogHelper.Instance.WriteLog($"{fileDirect},文件夹不存在"); + return false; + } + DateTime nowTime = DateTime.Now; + string[] files = Directory.GetFiles(fileDirect, "*.*", SearchOption.AllDirectories); //获取该目录下所有 .txt文件 + foreach (string file in files) + { + FileInfo fileInfo = new FileInfo(file); + + TimeSpan t = DateTime.Now - fileInfo.LastWriteTime;// fileInfo.CreationTime; //当前时间 减去 文件创建时间 + int day = t.Days; + if (day > saveDay) //保存的时间,单位:天 + { + if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用 + { + System.IO.File.Delete(fileInfo.FullName); //删除文件 + } + else + { + LogHelper.Instance.WriteLog($"{fileInfo.FullName},文件被占用,无法操作!"); + } + } + } + return true; + } + catch (Exception err) + { + LogHelper.Instance.WriteLog($"Logs日志删除异常,异常原因:{err}"); + } + return false; + } + + [DllImport("kernel32.dll")] + public static extern IntPtr _lopen(string lpPathName, int iReadWrite); + + [DllImport("kernel32.dll")] + public static extern bool CloseHandle(IntPtr hObject); + + public const int OF_READWRITE = 2; + public const int OF_SHARE_DENY_NONE = 0x40; + public static readonly IntPtr HFILE_ERROR = new IntPtr(-1); + + /// + /// 判断文件是否被占用 + /// + /// + /// + private static bool IsOccupy(string file) + { + bool result = true; //默认状态此文件未被占用 + try + { + //string vFileName = @"c:\temp\temp.bmp"; + string vFileName = file; + if (!System.IO.File.Exists(vFileName)) + { + //Logger.Info("文件都不存在!"); + result = false; + } + IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE); + if (vHandle == HFILE_ERROR) + { + + //Log4Helper.WriteLog("文件被占用!", "错误提示"); + result = false; + } + CloseHandle(vHandle); + // Log4Helper.WriteLog("没有被占用!", "错误提示"); + + + } + catch (Exception err) + { + result = false; + //Log4Helper.WriteLog("判断文件是否被占用", err); + + + } + return result; + } + + } +} diff --git a/JinYuan.Helper/EnergyMeterHelper.cs b/JinYuan.Helper/EnergyMeterHelper.cs new file mode 100644 index 0000000..8858656 --- /dev/null +++ b/JinYuan.Helper/EnergyMeterHelper.cs @@ -0,0 +1,443 @@ +using JinYuan.Models; +using Org.BouncyCastle.Ocsp; +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; + +namespace JinYuan.Helper +{ + public class EnergyMeterHelper + { + public const int BufferSize = 1024;//1kb + private readonly object _lockObj = new object(); // 线程安全锁 + + private int _timeout = 2000; + private Ping _ping = null; + private IPEndPoint _endPoint = null; + private Socket _energyMeterSocket = null; + private PingReply _pingReply = null; + private string _lastError = ""; + + public enum ModBusExceptionCode //错误代码 + { + IllegalFunction = 01, + IllegalDataAddress, + IllegalDataValue, + SlaveDeviceFailure, + Acknowledge, + SlaveDeviceBusy, + GatewayPathUnavailable, + GatewayTargetDeviceFailed2Respond, + } + + /// + /// 构造函数 + /// + public EnergyMeterHelper() + { + // used to ping the PLC + // + this._ping = new Ping(); + + // EndPoint parametres + // + this._endPoint = new IPEndPoint(0, 0); + } + + /// + /// set ip and port + /// + public void SetTCPParams(IPAddress ip, int port) + { + if (ip == null) throw new ArgumentNullException(nameof(ip), "IP地址不能为空"); + if (port < 1 || port > 65535) throw new ArgumentOutOfRangeException(nameof(port), "端口号必须在1-65535之间"); + + // 禁止本地回环地址 + if (ip == IPAddress.Loopback || ip == IPAddress.IPv6Loopback) + { + throw new ArgumentException("禁止使用本地回环地址(127.0.0.1),请配置智能电表的真实IP地址", nameof(ip)); + } + + lock (_lockObj) + { + _endPoint = new IPEndPoint(ip, port); // 重新创建实例,避免修改原有对象 + } + } + + /// + /// returns the connection status + /// + public bool IsConnected + { + get + { + lock (_lockObj) + { + if (_energyMeterSocket == null) return false; + + try + { + bool part1 = _energyMeterSocket.Poll(100, SelectMode.SelectRead); + bool part2 = (_energyMeterSocket.Available == 0); + if (part1 && part2) + { + // 连接已断开,释放Socket + Close(); + return false; + } + return _energyMeterSocket.Connected; + } + catch (SocketException) + { + Close(); + return false; + } + catch (Exception) + { + return false; + } + } + } + } + + /// + /// close the socket + /// + /// + public void Close() + { + lock (_lockObj) + { + if (_energyMeterSocket == null) return; + try + { + // 优雅关闭:先关闭发送/接收,再释放 + if (_energyMeterSocket.Connected) + { + _energyMeterSocket.Shutdown(SocketShutdown.Both); + } + } + catch { } + finally + { + _energyMeterSocket.Close(); + _energyMeterSocket.Dispose(); + _energyMeterSocket = null; // 关键:置空,避免后续操作无效套接字 + } + } + } + + public bool Connect() + { + lock (_lockObj) + { + // 已连接则直接返回 + if (IsConnected) return true; + + // 先释放旧连接 + Close(); + + try + { + return TCPConnect(); + } + catch (Exception ex) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:连接异常 {ex.Message}"); + Close(); + return false; + } + } + } + + private bool TCPConnect() + { + // 若目标是本地回环地址,直接提示错误(关键!) + if (_endPoint.Address == IPAddress.Loopback || _endPoint.Address == IPAddress.IPv6Loopback) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:连接地址为本地回环(127.0.0.1),请配置电表真实IP!"); + return false; + } + + try + { + if (_endPoint.Address == IPAddress.None) + { + throw new InvalidOperationException("未设置有效的IP和端口"); + } + + // 重新创建Socket实例 + _energyMeterSocket = new Socket(_endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp) + { + SendTimeout = _timeout, + ReceiveTimeout = _timeout + }; + + // 异步连接(避免阻塞,可选) + IAsyncResult result = _energyMeterSocket.BeginConnect(_endPoint, null, null); + bool connectSuccess = result.AsyncWaitHandle.WaitOne(_timeout); + + if (connectSuccess && _energyMeterSocket.Connected) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:连接成功"); + return true; + } + + // 连接超时,释放当前Socket + _energyMeterSocket.Close(); + _energyMeterSocket.Dispose(); + _energyMeterSocket = null; + + return true; + } + catch (SocketException ex) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:网口连接失败 {ex.SocketErrorCode} - {ex.Message}"); + Close(); + return false; + } + catch (Exception ex) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:连接失败 {ex.Message}"); + Close(); + return false; + } + } + + public bool Ping() + { + if (_endPoint.Address == IPAddress.None) return false; + + try + { + var reply = _ping.Send(_endPoint.Address, _timeout); + return reply.Status == IPStatus.Success; + } + catch (Exception) + { + return false; + } + } + + public bool SendAndGetRes(byte[] bytes, ref List listM)//, ref JetReturnResult jet + { + // 参数校验 + if (bytes == null || bytes.Length == 0) + { + _lastError = "发送指令为空"; + return false; + } + if (listM == null) listM = new List(); + + var arrayPool = ArrayPool.Shared; + byte[] buffer = arrayPool.Rent(BufferSize);//new byte[1024]; + byte[] recvData = new byte[88 * 4 + 9];//0x58 + int size = recvData.Length; //0x58 + + + try + { + if (!Ping()) + { + _lastError = "Ping设备失败,网络不可达"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:{_lastError}"); + return false; + } + if (!IsConnected && !Connect()) + { + _lastError = "重连设备失败"; + return false; + } + + // 发送 + Send(bytes); + // 接收 + int recvLen = Receive(ref recvData, size); + if (recvLen <= 0) + { + _lastError = "未接收到设备响应"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now:yyyy-MM-dd}.txt", + $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 智能电表:{_lastError}"); + return false; + } + + // 解析 + if ((recvData[0] == Convert.ToByte(01 >> 8) && recvData[1] == Convert.ToByte(01)))//pTask.id + { + if (recvData[7] == 0x04)//读线圈寄存器功能码 + { + //数据赋值 + Array.Copy(recvData, 0, buffer, 0, recvData.Length); + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"电能表读取原始数据:{string.Join(" ", recvData)}"); + + decimal PhaseVoltageA = Convert.ToDecimal(HextoFloat(buffer[9], buffer[10], buffer[11], buffer[12])); + decimal PhaseVoltageB = Convert.ToDecimal(HextoFloat(buffer[13], buffer[14], buffer[15], buffer[16])); + decimal PhaseVoltageC = Convert.ToDecimal(HextoFloat(buffer[17], buffer[18], buffer[19], buffer[20])); + decimal PhaseCurrentA = Convert.ToDecimal(HextoFloat(buffer[21], buffer[22], buffer[23], buffer[24])); + decimal PhaseCurrentB = Convert.ToDecimal(HextoFloat(buffer[25], buffer[26], buffer[27], buffer[28])); + decimal PhaseCurrentC = Convert.ToDecimal(HextoFloat(buffer[29], buffer[30], buffer[31], buffer[32])); + decimal PhasePowerA = Convert.ToDecimal(HextoFloat(buffer[33], buffer[34], buffer[35], buffer[36])); + decimal PhasePowerB = Convert.ToDecimal(HextoFloat(buffer[37], buffer[38], buffer[39], buffer[40])); + decimal PhasePowerC = Convert.ToDecimal(HextoFloat(buffer[41], buffer[42], buffer[43], buffer[44])); + decimal ActivePower = Convert.ToDecimal(HextoFloat(buffer[121], buffer[122], buffer[123], buffer[124])); + decimal PowerFactor = Convert.ToDecimal(HextoFloat(buffer[133], buffer[134], buffer[135], buffer[136])); + decimal pt = 1; + decimal ct = 150 / 5; + decimal AccumulatedElectricity = Convert.ToDecimal(HextoFloat(buffer[181], buffer[182], buffer[183], buffer[184])); + + ElectricEnergy m = new ElectricEnergy(); + m.PhaseVoltageA = PhaseVoltageA; + m.PhaseVoltageB = PhaseVoltageB; + m.PhaseVoltageC = PhaseVoltageC; + m.PhaseCurrentA = PhaseCurrentA * ct; + m.PhaseCurrentB = PhaseCurrentB * ct; + m.PhaseCurrentC = PhaseCurrentC * ct; + m.PhasePowerA = PhaseVoltageA * PhaseCurrentA * ct; + m.PhasePowerB = PhaseVoltageB * PhaseCurrentB * ct; + m.PhasePowerC = PhaseVoltageC * PhaseCurrentC * ct; + m.ActivePower = ActivePower * ct; + m.PowerFactor = PowerFactor * ct; + m.pt = pt;//Convert.ToDecimal(HextoFloat(buffer[0], buffer[0], buffer[0], buffer[0])); + m.ct = ct;//Convert.ToDecimal(HextoFloat(buffer[0], buffer[0], buffer[0], buffer[0])); + m.AccumulatedElectricity = AccumulatedElectricity; + listM.Add(m); + } + else + { + switch (recvData[8]) + { + case (byte)ModBusExceptionCode.IllegalDataAddress: + _lastError = string.Format("SendAndGetRes():ReadInputRegister [IllegalDataAddress]"); + break; + case (byte)ModBusExceptionCode.IllegalDataValue: + _lastError = string.Format("SendAndGetRes():ReadInputRegister [IllegalDataValue]"); + break; + case (byte)ModBusExceptionCode.IllegalFunction: + _lastError = string.Format("SendAndGetRes():ReadInputRegister [IllegalFunction]"); + break; + default: + _lastError = string.Format("SendAndGetRes():ReadInputRegister [FunctionException]"); + break; + } + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"电能表读取数据异常,原因:{_lastError}"); + } + } + } + catch (Exception ex) + { + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"电能表读取原始数据:{string.Join(" ", recvData)}"); + TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"电能表读取数据异常,原因:{ex}"); + Close(); + return false; + } + finally + { + arrayPool.Return(buffer); + } + return true; + } + + /// + /// send a command to energy meter device + /// + /// + /// + private int Send(Byte[] command) + { + lock (_lockObj) + { + // 核心校验:Socket不为null且连接有效 + if (_energyMeterSocket == null || !IsConnected) + { + throw new SocketException((int)SocketError.NotConnected); + } + + int bytesSent = _energyMeterSocket.Send(command, 0, command.Length, SocketFlags.None); + return bytesSent; + } + } + + /// + /// receives a response from the plc + /// + /// + /// + /// + private int Receive(ref Byte[] response, int expectLen) + { + lock (_lockObj) + { + if (_energyMeterSocket == null || !IsConnected) + { + throw new SocketException((int)SocketError.NotConnected); + } + + int totalRecv = 0; + while (totalRecv < expectLen) + { + // 分段接收,避免单次接收不足 + int recvLen = _energyMeterSocket.Receive(response, totalRecv, expectLen - totalRecv, SocketFlags.None); + if (recvLen == 0) + { + throw new SocketException((int)SocketError.ConnectionReset); + } + totalRecv += recvLen; + } + + return totalRecv; + } + } + + + /// + /// HexToFloat + /// + /// 高字高字节 + /// 高字低字节 + /// 低字高字节 + /// 低字低字节 + /// float + public static float HextoFloat(byte H1, byte H2, byte D1, byte D2) + { + try + { + //byte-->short + int s1, s2; + s1 = Convert.ToInt32(H1 * 256) + Convert.ToInt32(H2); + s2 = Convert.ToInt32(D1 * 256) + Convert.ToInt32(D2); + + //将输入数值short转化为无符号unsigned short + int us1 = s1, us2 = s2; + if (s1 < 0) us1 += 65536; + if (s2 < 0) us2 += 65536; + //sign: 符号位, exponent: 阶码, mantissa:尾数 + int sign, exponent; + float mantissa; + //计算符号位 + sign = us1 / 32768; + //去掉符号位 + int emCode = us1 % 32768; + //计算阶码 + exponent = emCode / 128; + //计算尾数 + mantissa = (float)(emCode % 128 * 65536 + us2) / 8388608; + //代入公式 fValue = (-1) ^ S x 2 ^ (E - 127) x (1 + M) + return (float)Math.Pow(-1, sign) * (float)Math.Pow(2, exponent - 127) * (1 + mantissa); + } + catch (Exception ex) + { + return 0; + } + } + } +} + diff --git a/JinYuan.Helper/FileHelper.cs b/JinYuan.Helper/FileHelper.cs new file mode 100644 index 0000000..e7eea94 --- /dev/null +++ b/JinYuan.Helper/FileHelper.cs @@ -0,0 +1,267 @@ +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; + +namespace JinYuan.Helper +{ + public class FileHelper + { + #region 1.文本文件读写 + + + public static void WriteToTxt(string path, string content, bool isAppend = false) + { + //【1】创建文件流 + FileStream fileStream = new FileStream(path, isAppend ? FileMode.Append : FileMode.Create); + + //【2】创建写入器 + StreamWriter streamWriter = new StreamWriter(fileStream); + + //【3】以流的形式写入数据 + streamWriter.Write(content); + + //【4】关闭写入器 + streamWriter.Close(); + + //【5】关闭文件流 + fileStream.Close(); + } + + + public static string ReadFromTxt(string path) + { + //判断文件是否存在 + if (!File.Exists(path)) + { + return string.Empty; + } + + //【1】创建文件流 + FileStream fileStream = new FileStream(path, FileMode.Open); + + //【2】创建读取器 + StreamReader streamReader = new StreamReader(fileStream); + + //【3】以流的方式读取 + string content = streamReader.ReadToEnd(); + + //【4】关闭读取器 + streamReader.Close(); + + //【5】关闭文件流 + fileStream.Close(); + + return content; + + } + + #endregion + + #region 2.对象序列化文件 + + /// + /// 序列化一个对象到一个文件中 + /// + /// + /// + public static void SerializeObject(object obj, string path) + { + FileStream fileStream = null; + + try + { + fileStream = new FileStream(path, FileMode.Create); + + BinaryFormatter binaryFormatter = new BinaryFormatter(); + + binaryFormatter.Serialize(fileStream, obj); + + } + catch (Exception ex) + { + throw new Exception("序列化对象出错:" + ex.Message); + } + finally + { + fileStream.Close(); + } + } + + + public static T DeSerializeObject(string path) + { + FileStream fileStream = null; + + try + { + fileStream = new FileStream(path, FileMode.Open); + + BinaryFormatter binaryFormatter = new BinaryFormatter(); + + return (T)binaryFormatter.Deserialize(fileStream); + + } + catch (Exception ex) + { + throw new Exception("反序列化对象出错:" + ex.Message); + } + finally + { + fileStream.Close(); + } + } + + + #endregion + + #region 3.对象序列化字符串 + + /// + /// 将对象序列化成字符串 + /// + /// + /// + public static string SerializeObjToString(object obj) + { + IFormatter formatter = new BinaryFormatter(); + + string result = string.Empty; + + using (MemoryStream stream = new MemoryStream()) + { + formatter.Serialize(stream, obj); + + byte[] bytes = stream.ToArray(); + + result = Convert.ToBase64String(bytes); + + stream.Flush(); + + } + return result; + } + + /// + /// 将字符串反序列化成对象 + /// + /// + /// + /// + public static T DeSerializeObjFromString(string str) where T : class + { + IFormatter formatter = new BinaryFormatter(); + + byte[] bytes = Convert.FromBase64String(str); + + T obj = null; + + using (MemoryStream stream = new MemoryStream(bytes, 0, bytes.Length)) + { + obj = (T)formatter.Deserialize(stream); + } + + return obj; + } + + #endregion + + #region 4.文件的基本操作 + + /// + /// 文件复制 + /// + /// + /// + public static void CopyFile(string srcFileName, string desFileName) + { + if (File.Exists(desFileName)) + { + File.Delete(desFileName); + } + + File.Copy(srcFileName, desFileName); + + } + + + /// + /// 文件移动 + /// + /// + /// + public static void MoveFile(string srcFileName, string desFileName) + { + if (File.Exists(srcFileName)) + { + if (File.Exists(desFileName)) + { + File.Delete(desFileName); + } + + File.Move(srcFileName, desFileName); + } + } + + /// + /// 文件删除 + /// + /// + public static void DeleteFile(string fileName) + { + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + } + + #endregion + + + #region 5.文件夹的相关操作 + + /// + /// 获取指定目录下的所有文件 + /// + /// + /// + public static string[] GetFiles(string path) + { + return Directory.GetFiles(path); + } + + /// + /// 获取指定目录下的所有子目录 + /// + /// + /// + public static string[] GetDirectories(string path) + { + return Directory.GetDirectories(path); + } + + /// + /// 创建文件夹 + /// + /// + public static void CreateDirectory(string path) + { + Directory.CreateDirectory(path); + } + + /// + /// 删除指定目录下的所有子目录和文件 + /// + /// + public static void DeleteFiles(string path) + { + DirectoryInfo directory = new DirectoryInfo(path); + + directory.Delete(true); + } + + + #endregion + + } +} diff --git a/JinYuan.Helper/IniConfigHelper.cs b/JinYuan.Helper/IniConfigHelper.cs new file mode 100644 index 0000000..4d4c0e6 --- /dev/null +++ b/JinYuan.Helper/IniConfigHelper.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace JinYuan.Helper +{ + public class IniConfigHelper + { + /// + /// 文件路径 + /// + public static string iniFilePath = string.Empty; + + + #region API函数声明 + + [DllImport("kernel32")] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + + //需要调用GetPrivateProfileString的重载 + [DllImport("kernel32", EntryPoint = "GetPrivateProfileString")] + private static extern long GetPrivateProfileString(string section, string key, + string def, StringBuilder retVal, int size, string filePath); + + [DllImport("kernel32", EntryPoint = "GetPrivateProfileString")] + private static extern uint GetPrivateProfileStringA(string section, string key, + string def, Byte[] retVal, int size, string filePath); + + #endregion + + /// + /// + /// + /// + /// + public static void CreateIniFile(string StartupPath, string AppName) + { + iniFilePath = StartupPath + AppName; + if (!Directory.Exists(StartupPath)) + { + Directory.CreateDirectory(StartupPath); + } + if (!File.Exists(iniFilePath)) + { + File.Create(iniFilePath).Close(); + } + } + + + #region 读取INI文件 + /// + /// 根据节点及Key的值返回数据 + /// + /// 节点 + /// 键 + /// 默认值 + /// 路径 + /// 返回值 + public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath) + { + if (File.Exists(iniFilePath)) + { + StringBuilder stringBuilder = new StringBuilder(10240); + + GetPrivateProfileString(Section, Key, NoText, stringBuilder, 10240, iniFilePath); + + return stringBuilder.ToString(); + } + else + { + return string.Empty; + } + } + + + /// + /// 根据节点及Key的值返回数据 + /// + /// 节点 + /// 键 + /// 默认值 + /// 返回值 + public static string ReadIniData(string Section, string Key, string NoText) + { + return ReadIniData(Section, Key, NoText, iniFilePath); + } + + #endregion + + #region 写入Ini文件 + + /// + /// 根据节点及Key的值写入数据 + /// + /// 节点 + /// 键 + /// 值 + /// 路径 + /// 操作结果 + public static bool WriteIniData(string Section, string Key, string Value, string path) + { + long result = WritePrivateProfileString(Section, Key, Value, path); + + if (result == 0) + { + return false; + } + else + { + return true; + } + } + + /// + /// 根据节点及Key的值写入数据 + /// + /// 节点 + /// 键 + /// 值 + /// 操作结果 + public static bool WriteIniData(string Section, string Key, string Value) + { + return WriteIniData(Section, Key, Value, iniFilePath); + } + + #endregion + + #region 读取所有的Sections + + /// + /// 读取所有的Section + /// + /// 路径 + /// Section集合 + public static List ReadSections(string path) + { + byte[] buffer = new byte[65536]; + + uint length = GetPrivateProfileStringA(null, null, null, buffer, buffer.Length, path); + + int startIndex = 0; + + List sections = new List(); + + for (int i = 0; i < length; i++) + { + if (buffer[i] == 0) + { + sections.Add(Encoding.Default.GetString(buffer, startIndex, i - startIndex)); + startIndex = i + 1; + } + } + + return sections; + } + + /// + /// 读取所有的Section + /// + /// 路径 + /// Section集合 + public static List ReadSections() + { + byte[] buffer = new byte[65536]; + + uint length = GetPrivateProfileStringA(null, null, null, buffer, buffer.Length, iniFilePath); + + int startIndex = 0; + + List sections = new List(); + + for (int i = 0; i < length; i++) + { + if (buffer[i] == 0) + { + sections.Add(Encoding.Default.GetString(buffer, startIndex, i - startIndex)); + startIndex = i + 1; + } + } + + return sections; + } + + + + #endregion + + #region 根据某个Section读取所有的Keys + + /// + /// 根据某个Section读取所有的Keys + /// + /// 某个section + /// 路径 + /// key的集合 + public static List ReadKeys(string section, string path) + { + byte[] buffer = new byte[65536]; + + uint length = GetPrivateProfileStringA(section, null, null, buffer, buffer.Length, path); + + int startIndex = 0; + + List keys = new List(); + + for (int i = 0; i < length; i++) + { + if (buffer[i] == 0) + { + keys.Add(Encoding.Default.GetString(buffer, startIndex, i - startIndex)); + startIndex = i + 1; + } + } + + return keys; + + } + + /// + /// 根据某个Section读取所有的Keys + /// + /// 某个section + /// 路径 + /// key的集合 + public static List ReadKeys(string section) + { + byte[] buffer = new byte[65536]; + + uint length = GetPrivateProfileStringA(section, null, null, buffer, buffer.Length, iniFilePath); + + int startIndex = 0; + + List keys = new List(); + + for (int i = 0; i < length; i++) + { + if (buffer[i] == 0) + { + keys.Add(Encoding.Default.GetString(buffer, startIndex, i - startIndex)); + startIndex = i + 1; + } + } + + return keys; + + } + + #endregion + + } +} diff --git a/JinYuan.Helper/IniFileHelper.cs b/JinYuan.Helper/IniFileHelper.cs new file mode 100644 index 0000000..67298d2 --- /dev/null +++ b/JinYuan.Helper/IniFileHelper.cs @@ -0,0 +1,75 @@ +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace JinYuan.Helper +{ + public class IniFileHelper + { + private static string iniFilePath = "Configure.ini"; + + [DllImport("kernel32")] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + + [DllImport("kernel32")] + private static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); + + public static string ReadIniData(string Section, string Key) + { + try + { + if (File.Exists(iniFilePath)) + { + StringBuilder temp = new StringBuilder(1024); + GetPrivateProfileString(Section, Key, "", temp, 1024, iniFilePath); + return temp.ToString(); + } + MessageBox.Show("节点:" + Section + ",键名:" + Key + ":读取配置文件错误!"); + return null; + } + catch + { + throw; + } + } + + public static bool WriteIniData(string Section, string Key, string Value) + { + try + { + if (File.Exists(iniFilePath)) + { + if (WritePrivateProfileString(Section, Key, Value, iniFilePath) == 0L) + { + return false; + } + return true; + } + File.Create(iniFilePath).Close(); + if (WritePrivateProfileString(Section, Key, Value, iniFilePath) == 0L) + { + return false; + } + return true; + } + catch + { + throw; + } + } + + public static void CreateIniFile(string StartupPath, string AppName) + { + iniFilePath = StartupPath + AppName; + if (!Directory.Exists(StartupPath)) + { + Directory.CreateDirectory(StartupPath); + } + if (!File.Exists(iniFilePath)) + { + File.Create(iniFilePath).Close(); + } + } + } +} diff --git a/JinYuan.Helper/JinYuan.Helper.csproj b/JinYuan.Helper/JinYuan.Helper.csproj new file mode 100644 index 0000000..32b0bcd --- /dev/null +++ b/JinYuan.Helper/JinYuan.Helper.csproj @@ -0,0 +1,176 @@ + + + + + + Debug + AnyCPU + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360} + Library + Properties + JinYuan.Helper + JinYuan.Helper + v4.8 + 512 + true + + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\BouncyCastle.Cryptography.2.2.1\lib\net461\BouncyCastle.Cryptography.dll + + + ..\packages\CsvHelper.33.0.1\lib\net48\CsvHelper.dll + + + ..\packages\Enums.NET.4.0.1\lib\net45\Enums.NET.dll + + + ..\packages\SharpZipLib.1.3.3\lib\net45\ICSharpCode.SharpZipLib.dll + + + ..\packages\MathNet.Numerics.Signed.4.15.0\lib\net461\MathNet.Numerics.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + + ..\packages\Microsoft.IO.RecyclableMemoryStream.2.3.2\lib\net462\Microsoft.IO.RecyclableMemoryStream.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NLog.6.0.2\lib\net46\NLog.dll + + + False + bin\Debug\PLCCommunication.dll + + + ..\packages\SixLabors.Fonts.1.0.0\lib\netstandard2.0\SixLabors.Fonts.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + + ..\packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll + + + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + + ..\packages\System.Security.AccessControl.6.0.0\lib\net461\System.Security.AccessControl.dll + + + ..\packages\System.Security.Cryptography.Xml.6.0.1\lib\net461\System.Security.Cryptography.Xml.dll + + + ..\packages\System.Security.Permissions.6.0.0\lib\net461\System.Security.Permissions.dll + + + ..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll + + + + ..\packages\System.Text.Encoding.CodePages.6.0.0\lib\net461\System.Text.Encoding.CodePages.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {4C0BCB84-5CD7-4846-8363-C4C10D46E391} + JinYuan.Models + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + \ No newline at end of file diff --git a/JinYuan.Helper/JsonHelper.cs b/JinYuan.Helper/JsonHelper.cs new file mode 100644 index 0000000..a22bc4a --- /dev/null +++ b/JinYuan.Helper/JsonHelper.cs @@ -0,0 +1,90 @@ +using Newtonsoft.Json; +using System; +using System.IO; +using System.Runtime.Serialization.Json; +using System.Text; + +namespace JinYuan.Helper +{ + public class JsonHelper + { + /// + /// 使用Newtonsoft.json.dll对象序列化成Json字符串 + /// + /// + /// + /// + public static string EntityToJson(T t) + { + try + { + return JsonConvert.SerializeObject(t); + } + catch (Exception) + { + return string.Empty; + } + } + + /// + /// 使用Newtonsoft.json.dll 将Json字符串反序列化成对象 + /// + /// + /// + /// + public static T JsonToEntity(string json) + { + try + { + return (T)JsonConvert.DeserializeObject(json, typeof(T)); + } + catch (Exception) + { + return default(T); + } + } + + /// + /// 实体类转换成JSON字符串 + /// + /// + /// + /// + public static string EntityToJson2(T obj) + { + //序列化 + DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(T)); + MemoryStream msObj = new MemoryStream(); + //将序列化之后的Json格式数据写入流中 + js.WriteObject(msObj, obj); + msObj.Position = 0; + //从0这个位置开始读取流中的数据 + StreamReader sr = new StreamReader(msObj, Encoding.Default); + string json = sr.ReadToEnd(); + sr.Close(); + msObj.Close(); + return json; + } + + + /// + /// JSON字符串转换成实体类 + /// + /// + /// + /// + public static T JsonToEntity2(string json) where T : class + { + //反序列化 + using (var ms = new MemoryStream(Encoding.Default.GetBytes(json))) + { + DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(T)); + T model = (T)deseralizer.ReadObject(ms);// //反序列化ReadObject + return model; + } + } + + + + } +} diff --git a/JinYuan.Helper/LogHelper.cs b/JinYuan.Helper/LogHelper.cs new file mode 100644 index 0000000..9b67930 --- /dev/null +++ b/JinYuan.Helper/LogHelper.cs @@ -0,0 +1,310 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; + +namespace JinYuan.Helper +{ + /// + /// 日志操作类 + /// + public class LogHelper + { + private static object singleLock = new object(); + + /// + /// log日志文件路径 + /// + public static string logFilePath = string.Empty; + + + public static LogHelper _instance = null; + public static LogHelper Instance + { + + get + { + if (_instance == null) + { + lock (singleLock) + { + if (_instance == null) + { + _instance = new LogHelper(); + } + } + } + return _instance; + } + + } + + + + + /// + /// 初始化 + /// + /// + public void InitLog(string configPath) + { + logFilePath = configPath; + if (!Directory.Exists(logFilePath)) + { + Directory.CreateDirectory(logFilePath); + } + //if (!File.Exists(logFilePath)) + //{ + // File.Create(logFilePath).Close(); + //} + } + + + /// + /// 写日志文件数据库日志文件 + /// + /// 消息 + public void WriteError(string message) + { + + AddLog(message, "Error"); + } + + public void WriteEX(Exception ex) + { + AddLog(ex.Message + "\r\n" + ex.InnerException + "\r\n" + ex.StackTrace + "\r\n" + ex.Source, "SysErrorLog"); + } + + public void WriteEX(string ErrorName, Exception ex) + { + AddLog(ErrorName + "\r\n" + ex.Message + "\r\n" + ex.InnerException + "\r\n" + ex.StackTrace + "\r\n" + ex.Source, "SysErrorLog"); + } + /// + /// 写日志文件数据库日志文件 + /// + /// 消息 + /// 日志存储目录名称 + public void WriteError(Exception ex, string direName) + { + AddLog(ex.Message + "\r\n" + ex.InnerException + "\r\n" + ex.StackTrace + "\r\n" + ex.Source, direName); + } + + /// + /// / + /// + /// + /// + public void WriteError(string message, string direName) + { + AddLog(message, direName); + } + /// + /// 写日志文件数据库日志文件 + /// + /// 消息 + public void WriteLog(string message) + { + + AddLog(message, "Info"); + } + /// + /// 写日志文件数据库日志文件 + /// + /// 消息 + /// 日志存储目录名称 + public void WriteLog(string message, string direName) + { + + AddLog(message, direName); + } + + /// + /// 写日志文件数据库日志文件 + /// + /// 消息 + /// 日志存储目录名称 + private void AddLog(string message, string direName) + { + string fileLog = logFilePath; + if (fileLog == "") + { + return; + } + try + { + var applicationName = direName; + //从宿主配置文件中获取日志文件全路径 + //所有的接口日志文件放在一个目录下面,跟web站点的目录分开 + //日志文件一天放一个,按日期分开 + + if (string.IsNullOrEmpty(applicationName)) + { + applicationName = "Log"; + } + string logFullPath = fileLog + applicationName; + + if (!Directory.Exists(logFullPath)) + { + Directory.CreateDirectory(logFullPath); + } + //只保留30天的日志 + var deletePath = $@"{logFullPath}\{DateTime.Now.AddDays(-30):yyyyMMddHH}.txt"; + + if (File.Exists(deletePath)) + { + File.Delete(deletePath); + } + + logFullPath = $@"{logFullPath}\{DateTime.Now:yyyyMMddHH}.txt"; + if (!File.Exists(logFullPath)) + { + using (var fs = new FileStream(logFullPath, FileMode.Create, FileAccess.Write)) + { + StreamWriter sw = new StreamWriter(fs); + sw.Close(); + fs.Close(); + } + } + + using (StreamWriter writer = new StreamWriter(logFullPath, true)) + { + writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteLine(message); + writer.WriteLine(Environment.NewLine); + + } + + } + catch + { + // ignored + } + } + + /// + /// 轴位置日志类 + /// + public class PrintMotorLog + { + private static readonly Thread WriteThread; + private static readonly Queue MsgQueue;//先进先出集合 + public static readonly object FileLock; + private static readonly string FilePath = "D:\\LOCAL\\轴位置修改记录(查看文件就复制到副本到桌面!!!)\\"; + static PrintMotorLog() + { + FileLock = new object();//文件锁 + + WriteThread = new Thread(WriteMsg); + MsgQueue = new Queue(); + WriteThread.Start(); + } + + public static void LogInfo(string BegionTime, string MotorDescribe, string IndxDescribe, string FrontIndx, string NewIndx) + { + Monitor.Enter(MsgQueue); + string strData = BegionTime + "," + + MotorDescribe + "," + + IndxDescribe + "," + + FrontIndx + "," + + NewIndx + ","; + MsgQueue.Enqueue(strData); + Monitor.Exit(MsgQueue); + } + private static void WriteMsg() + { + while (true) + { + Thread.Sleep(10); + if (MsgQueue.Count > 0) + { + Monitor.Enter(MsgQueue); + string msg = MsgQueue.Dequeue(); + Monitor.Exit(MsgQueue); + Monitor.Enter(FileLock); + if (!Directory.Exists(FilePath)) + { + Directory.CreateDirectory(FilePath); + } + string strFilename = FilePath + "轴位置修改_" + System.DateTime.Now.ToString("yyyyMMdd") + ".csv"; + //用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,则此构造函数将创建一个新文件。 + try + { + if (!File.Exists(strFilename)) + { + //文件标头 19 + string strProInfoFileHead = @"日期时间,轴描述,位置描述,位置修改前,当前位置"; + StreamWriter sw = new StreamWriter(strFilename, true, UnicodeEncoding.GetEncoding("GB2312")); + sw.WriteLine(strProInfoFileHead); + sw.Flush(); + sw.Close(); + sw.Dispose(); + } + StreamWriter se = new StreamWriter(strFilename, true, UnicodeEncoding.GetEncoding("GB2312")); + se.WriteLine(msg); + se.Flush(); + se.Close(); + se.Dispose(); + } + catch (Exception) + { + + + } + Monitor.Exit(FileLock); + if (GetFileSize(strFilename) > 1024 * 5) + { + CopyToBak(strFilename); + } + } + } + } + private static long GetFileSize(string fileName) + { + long strRe = 0; + if (File.Exists(fileName)) + { + Monitor.Enter(FileLock); + try + { + var myFs = new FileStream(fileName, FileMode.Open); + strRe = myFs.Length / 1024; + myFs.Close(); + myFs.Dispose(); + } + catch (Exception) + { + + + } + Monitor.Exit(FileLock); + } + return strRe; + } + + private static void CopyToBak(string sFileName) + { + int fileCount = 0; + string sBakName = ""; + Monitor.Enter(FileLock); + try + { + do + { + fileCount++; + sBakName = sFileName + "." + fileCount + ".BAK"; + } + while (File.Exists(sBakName)); + File.Copy(sFileName, sBakName); + File.Delete(sFileName); + } + catch (Exception) + { + + + } + Monitor.Exit(FileLock); + } + } + } +} diff --git a/JinYuan.Helper/Logger.cs b/JinYuan.Helper/Logger.cs new file mode 100644 index 0000000..b77da55 --- /dev/null +++ b/JinYuan.Helper/Logger.cs @@ -0,0 +1,63 @@ +using NLog; +using System; + + + +public class Logger +{ + + private static readonly NLog.Logger loginfo = LogManager.GetLogger("loginfo"); + private static readonly NLog.Logger logerror = LogManager.GetLogger("logerror"); + private static readonly NLog.Logger logmqtt = LogManager.GetLogger("logmqtt"); + private static readonly NLog.Logger logWHX = LogManager.GetLogger("logWHX"); + + private static readonly NLog.Logger logsInfo = LogManager.GetLogger("logsInfo"); + private static readonly NLog.Logger logsMEStIME = LogManager.GetLogger("logsMEStIME"); + private static readonly NLog.Logger logsSql = LogManager.GetLogger("logsSql"); + private static readonly NLog.Logger logsSysErrorLog = LogManager.GetLogger("logsSysErrorLog"); + private static readonly NLog.Logger logsSysErrorLogcn = LogManager.GetLogger("logsSysErrorLogcn"); + public static void WriteInfo(string info) + { + Console.WriteLine(info); + if (loginfo.IsInfoEnabled) + { + loginfo.Info(info); + } + } + + public static void WriteMqtt(string info) + { + Console.WriteLine(info); + if (logmqtt.IsInfoEnabled) + { + logmqtt.Info(info); + } + } + + public static void WriteError(string error) + { + Console.WriteLine(error); + if (logerror.IsErrorEnabled) + { + logerror.Error(error); + } + } + + public static void WriteError(string info, Exception ex) + { + Console.WriteLine(info); + if (logerror.IsErrorEnabled) + { + logerror.Error(info, ex); + } + } + public static void WriteWHX(string info) + { + Console.WriteLine(info); + if (logWHX.IsErrorEnabled) + { + logWHX.Error(info); + } + } +} + diff --git a/JinYuan.Helper/MockDataGenerator.cs b/JinYuan.Helper/MockDataGenerator.cs new file mode 100644 index 0000000..f578a69 --- /dev/null +++ b/JinYuan.Helper/MockDataGenerator.cs @@ -0,0 +1,101 @@ +using JinYuan.Models; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace JinYuan.Helper +{ + public static class MockDataGenerator + { + public static readonly Random _random = new Random(); + + // 修改为与实际数据结构匹配的类 + public class ProdData + { + public string DisplayTime { get; set; } + public int ProdIn { get; set; } + public int ProdOut { get; set; } + public double OKRatio { get; set; } + } + + public class AlarmData + { + public string DataType { get; set; } + public int DataCount { get; set; } + } + + public class NGData + { + public string DataType { get; set; } + public int DataCount { get; set; } + } + + public static List Generate12HourData() + { + var result = new List(); + var random = new Random(); + + // 方法1:使用数组预定义顺序 + var timeSlots = new[] + { + "08:30", "09:30", "10:30", "11:30", "12:30", "13:30", "14:30", "15:30", "16:30", "17:30", + "18:30", "19:30", "20:30", "21:30", "22:30", "23:30", "00:30", "01:30", "02:30", "03:30", + "04:30", "05:30", "06:30", "07:30" + }; + + foreach (var timeSlot in timeSlots) + { + var prodIn = random.Next(800, 2000); + var prodOut = random.Next(700, prodIn); + var okRatio = Math.Round((double)prodOut / prodIn * 100, 2); + + result.Add(new Chart12HourData + { + DisplayTime = timeSlot, + ProdIn = prodIn, + ProdOut = prodOut, + OKRatio = okRatio.ToString("F2") + "%" + }); + } + + return result; // 不需要额外排序,因为已经按照需要的顺序生成 + } + + public static List GenerateAlarmTop10Data() + { + var alarmTypes = new[] + { + "设备故障", "原料异常", "温度超限", "压力异常", + "速度偏差", "位置错误", "通信中断", "电源故障", + "气压不足", "传感器异常" + }; + + return alarmTypes + .Select(type => new ChartDataType + { + DataType = type, + DataCount = _random.Next(5, 50) + }) + .OrderByDescending(x => x.DataCount) + .ToList(); + } + + public static List GenerateNGData() + { + var ngTypes = new[] + { + "尺寸超差", "表面划伤", "变形", "异物", + "色差", "气泡", "裂纹", "焊接不良" + }; + + return ngTypes + .Select(type => new ChartDataType + { + DataType = type, + DataCount = _random.Next(10, 100) + }) + .OrderByDescending(x => x.DataCount) + .ToList(); + } + } +} diff --git a/JinYuan.Helper/PLCAlarmParseHelper.cs b/JinYuan.Helper/PLCAlarmParseHelper.cs new file mode 100644 index 0000000..8458f58 --- /dev/null +++ b/JinYuan.Helper/PLCAlarmParseHelper.cs @@ -0,0 +1,232 @@ +using JinYuan.Models; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace JinYuan.Helper +{ + public static class PLCAlarmParseHelper + { + /// + /// 三菱将报警地址值转成报警List + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值R + /// + public static List MelsecByte2Status(int plcAddrSuffix, byte[] byteData, char plcAddrPrefix = 'R') + { + var listAlarmStatus = new List(); + // byte[]转为二进制字符串表示 + string strResult = ""; + for (int i = 0; i < byteData.Length; i++) + { + string strTemp = System.Convert.ToString(byteData[i], 2); + strTemp = strTemp.PadLeft(8, '0').StrReverse(); + strResult += strTemp; + } + + for (int i = 0; i < strResult.Length; i++) + { + var plcByte = i % 16; + //如果是16的倍数地址+1 + if (plcByte % 16 == 0 && i != 0) + { + plcAddrSuffix++; + } + //将地址和状态添加到结果集 + listAlarmStatus.Add(new AlarmStatus() + { + PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}", + Status = strResult[i] == '1' + }); + //if (strResult[i] == '1') + // Console.WriteLine($"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}:{strResult[i]}"); + } + + return listAlarmStatus; + } + + + /// + /// 欧姆龙NX系列Ethernet/IP通讯时将报警地址值转成报警List {直接读取标签地址/无需高低位互换} + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值R + /// + public static List OmronEIPByte2Status(int plcAddrSuffix, List byteData, char plcAddrPrefix = 'W') + { + var listAlarmStatus = new List(); + // byte[]转为二进制字符串表示 + string strResult = ""; + for (int i = 0; i < byteData.Count; i++) + { + string strTemp = System.Convert.ToString(byteData[i], 2); + strTemp = strTemp.PadLeft(8, '0').StrReverse(); + strResult += strTemp; + } + + for (int i = 0; i < strResult.Length; i++) + { + var plcByte = i % 16; + //如果是16的倍数地址+1 + if (plcByte % 16 == 0 && i != 0) + { + plcAddrSuffix++; + } + //将地址和状态添加到结果集 + listAlarmStatus.Add(new AlarmStatus() + { + PLCAdress = $"{plcAddrPrefix}6100[{plcAddrSuffix}].B[{plcByte.ToString()}]", + Status = strResult[i] == '1' + }); + } + + return listAlarmStatus; + } + + + /// + /// 欧姆龙FINS通讯读取EM数据寄存器是时将报警地址值转成报警List + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值W + /// + public static List OmronFinsByte2Status(int plcAddrSuffix, byte[] byteData, char plcAddrPrefix = 'D') + { + var listAlarmStatus = new List(); + #region 取消 + // byte[]转为二进制字符串表示 + //byte[] revBytes = SWAPbyte(byteData); //字节高低位互换 + //string strResult = ""; + //for (int i = 0; i < revBytes.Length; i++) + //{ + // string strTemp = System.Convert.ToString(revBytes[i], 2); + // strTemp = strTemp.PadLeft(8, '0').StrReverse(); + // strResult += strTemp; + //} + + //for (int i = 0; i < strResult.Length; i++) + //{ + // var plcByte = i % 500; + // //如果是16的倍数地址+1 + // if (plcByte % 500 == 0 && i != 0) + // { + // plcAddrSuffix++; + // } + // //将地址和状态添加到结果集 + // listAlarmStatus.Add(new AlarmStatus() + // { + // PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString()}", + // Status = strResult[i] == '1' + // }); + // //if (strResult[i] == '1') + // // Console.WriteLine($"{plcAddrPrefix}{plcAddrSuffix}.{plcByte.ToString("X")}:{strResult[i]}"); + //} + + //将地址和状态添加到结果集 + //for (int i = 0; i < byteData.Length / 2; i++) + //{ + // listAlarmStatus.Add(new AlarmStatus() + // { + // PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix + i}", + // Status = ShortLib.GetShortFromByteArray(byteData, (i * 2)) == 1, + // //Status = strResult[i] == '1' + // }); + //} + #endregion + int wordCount = byteData.Length / 2; // 16位整数数量 + + for (int i = 0; i < wordCount; i++) + { + int currentAddr = plcAddrSuffix + i; + int byteOffset = i * 2; + + // 组合字节为16位整数(大端序) + ushort wordValue = (ushort)( + (byteData[byteOffset] << 8) | + byteData[byteOffset + 1] + ); + + // 跳过0值(无报警) + if (wordValue == 0) continue; + + // 计算位地址(从1开始) + int bitPosition = wordValue; + string address = $"{plcAddrPrefix}{currentAddr}.{bitPosition}"; + + // 添加到报警列表(只添加实际触发的位) + listAlarmStatus.Add(new AlarmStatus() + { + PLCAdress = address, + Status = true // 只有触发的位才会被添加 + }); + } + return listAlarmStatus; + + } + + + /// + /// 欧姆龙FINS通讯读取W数据寄存器是时将报警地址值转成报警List + /// + /// PLC地址值,如100 + /// PLC读取出来的值 + /// PLC地址类型,默认值W + /// + //public static List OmronByte2Status(int plcAddrSuffix, byte[] byteData, char plcAddrPrefix = 'W') + //{ + // var listAlarmStatus = new List(); + + // var addrCount = byteData.Length / 2; + // // byte[]每个地址保存的都是bool值,只取双数index位 + // for (int i = 0; i < addrCount; i++) + // { + // //将地址和状态添加到结果集 + // listAlarmStatus.Add(new AlarmStatus() + // { + // PLCAdress = $"{plcAddrPrefix}{plcAddrSuffix + i}", + // Status = byteData[i * 2 + 1] == 1 + + // }); + // //if (byteData[i * 2 + 1] == 1) + // // Console.WriteLine($"原始数据 PLC地址:{plcAddrPrefix}{plcAddrSuffix + i} 报警值:{byteData[i * 2 + 1]}"); + // } + + // return listAlarmStatus; + //} + + + + + /// + /// 字符串反转 + /// + /// 需要反转字符串.Reverse() + /// + public static string StrReverse(this string str) + { + return new string(str.Reverse().ToArray()); + } + + + /// + ///byte字节高低位互换 + /// + /// + /// + public static byte[] SWAPbyte(byte[] data) + { + byte[] data2 = new byte[data.Length]; + for (int i = 0; i < data.Length; i += 2) + { + data2[i] = data[i + 1]; + data2[i + 1] = data[i]; + } + return data2; + } + } +} + diff --git a/JinYuan.Helper/Properties/AssemblyInfo.cs b/JinYuan.Helper/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6d47b23 --- /dev/null +++ b/JinYuan.Helper/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.Helper")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.Helper")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("258d0ab7-2b4f-4d8f-a3cd-7a8cb4a85360")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.Helper/ScanerHook.cs b/JinYuan.Helper/ScanerHook.cs new file mode 100644 index 0000000..a7cc54c --- /dev/null +++ b/JinYuan.Helper/ScanerHook.cs @@ -0,0 +1,291 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; + +namespace JinYuan.Helper +{ + public class ScanerHook + { + public delegate void ScanerDelegate(ScanerCodes codes); + public event ScanerDelegate ScanerEvent; + + //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函数代替获取当前实例的函数,防止钩子失效 + public static extern IntPtr GetModuleHandle(string name); + public ScanerHook() + { + } + public bool Start() + { + 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); + } + public bool Stop() + { + if (hKeyboardHook != 0) + { + bool retKeyboard = UnhookWindowsHookEx(hKeyboardHook); + hKeyboardHook = 0; + return retKeyboard; + + } + return true; + } + private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) + { + + + EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg)); + codes.Add(msg); + if (ScanerEvent != null && msg.message == 13 && msg.paramH > 0 && !string.IsNullOrEmpty(codes.Result)) + { + ScanerEvent(codes); + } + return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); + } + public class ScanerCodes + { + private int ts = 100; // 指定输入间隔为300毫秒以内时为连续输入 + private List> _keys = new List>(); + private List _keydown = new List(); // 保存组合键状态 + private List _result = new List(); // 返回结果集 + 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 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()); + _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()); + _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 + { + _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; + } + } +} diff --git a/JinYuan.Helper/SendDateMQTT.cs b/JinYuan.Helper/SendDateMQTT.cs new file mode 100644 index 0000000..0e0ec41 --- /dev/null +++ b/JinYuan.Helper/SendDateMQTT.cs @@ -0,0 +1,856 @@ +using JinYuan.Models; +using Newtonsoft.Json; +using PLCCommunication.MQTT; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + + +namespace JinYuan.Helper +{ + public class MqttService : IDisposable + { + private readonly MqttClient _mqttClient; + private readonly object _syncLock = new object(); + private readonly MqttConfig _config; + public class MqttConfig + { + public string ServerAddress { get; set; } = "10.22.161.1"; + public int ServerPort { get; set; } = 2883; + public string ClientId { get; set; } = "601PWM01"; + //进出站主题 + public string TopicInOut { get; set; } = "EVE/60J/TrackInOut/601PWM01"; + //预测性维护数据主题 + public string TopicForecast { get; set; } = "EVE/60J/EQP/601PWM01"; + // 其他配置项... + } + + public MqttService(MqttConfig config) + { + _config = config; + _mqttClient = new MqttClient(new MqttConnectionOptions + { + ClientId = _config.ClientId, + IpAddress = _config.ServerAddress, + Port = _config.ServerPort, + Credentials = new MqttCredential("", "") // 无用户名密码 + }); + InitializeConnection(); + StartHeartbeat();//心跳检测 + } + + #region 长连接 + /// + /// 初始化长连接 + /// + private void InitializeConnection() + { + lock (_syncLock) + { + if (_mqttClient.IsConnected) return; + var result = _mqttClient.ConnectServer(); + if (result.IsSuccess) + { + Logger.WriteMqtt("MQTT 长连接建立成功"); + // 订阅需要的主题 + SubscribeTopics(); + } + else + { + Logger.WriteMqtt($"MQTT 长连接建立失败: {result.Message}"); + } + } + } + /// + /// 订阅主题 + /// + private void SubscribeTopics() + { + //_mqttClient.OnMqttMessageReceived += MqttMessageReceived; + + var topics = new[] { _config.TopicInOut, _config.TopicForecast }; + foreach (var topic in topics) + { + var result = _mqttClient.SubscribeMessage(topic); + if (result.IsSuccess) + { + Logger.WriteMqtt($"订阅主题成功: {topic}"); + } + else + { + Logger.WriteMqtt($"订阅主题失败: {topic}, 错误: {result.Message}"); + } + } + } + + /// + /// 消息接收处理 + /// + /// + /// + private void MqttMessageReceived(MqttClient client, MqttApplicationMessage message) + { + Logger.WriteMqtt($"收到消息: 主题[{message.Topic}], 内容[{Encoding.UTF8.GetString(message.Payload)}]"); + } + #endregion + + #region 发送消息 + /// + /// 发送进出站消息 + /// + /// + public void SendInOutMessage(string action) + { + try + { + lock (_syncLock) + { + if (!_mqttClient.IsConnected) + Reconnect(); + + var message = BuildInOutMessage(action); + var result = _mqttClient.PublishMessage(new MqttApplicationMessage + { + Topic = _config.TopicInOut, + Payload = Encoding.UTF8.GetBytes(message), + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, + Retain = false + }); + + if (result.IsSuccess) + { + Logger.WriteMqtt($"进出站消息发送成功 主题:{_config.TopicInOut}: {message}"); + } + else + { + Logger.WriteError($"进出站消息发送失败: {result.Message}"); + } + } + } + catch (Exception ex) + { + Logger.WriteError($"发送进出站消息异常: {ex.Message}", ex); + } + } + + /// + /// 发送预测数据 + /// + /// + public void SendForecastMessage(Predictability_BM data) + { + try + { + lock (_syncLock) + { + if (!_mqttClient.IsConnected) + { + Reconnect(); + } + + var message = BuildForecastMessage(data); + var result = _mqttClient.PublishMessage(new MqttApplicationMessage + { + Topic = _config.TopicForecast, + Payload = Encoding.UTF8.GetBytes(message), + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, + Retain = false + }); + + if (result.IsSuccess) + { + Logger.WriteInfo($"预测数据发送成功 主题:{_config.TopicForecast}: {message}"); + } + else + { + Logger.WriteError($"预测数据发送失败: {result.Message}"); + } + } + } + catch (Exception ex) + { + Logger.WriteError($"发送预测数据异常: {ex.Message}", ex); + } + } + + + #endregion + + #region 构建消息 + /// + /// 构建进出站消息 + /// + /// + /// + private string BuildInOutMessage(string action) + { + try + { + var message = new EnterandExit + { + bu_id = "EVE8BU", + district_id = "JM", + factory_id = "60J", + production_line_id = "601L", + work_center_id = "601PWE01", + device_name = "601PWM01", + action = action, + action_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + }; + + return JsonConvert.SerializeObject(message, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.None + }); + } + catch (Exception ex) + { + Logger.WriteError($"构建进出站消息失败: {ex.Message}", ex); + return string.Empty; + } + } + + /// + /// 构建预测数据消息 + /// + /// + /// + public string BuildForecastMessage(Predictability_BM predictability) + { + try + { + CollectionUpload collectionUpload = new CollectionUpload() + { + bu_id = "EVE8BU", + district_id = "JM", + factory_id = "60J", + production_line_id = "601L", + production_processes_id = "", + work_center_id = "601PWE01", + station_id = "", + device_name = "601PWM01", + taglist = new List + { + new Collection + { + device_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + collection_items = new Dictionary + { + //扭矩 + {"Coating1_Torque1", predictability.Coating1_Torque1}, + {"Coating1_Torque2", predictability.Coating1_Torque2}, + {"Coating1_Torque3", predictability.Coating1_Torque3}, + {"Coating1_Torque4", predictability.Coating1_Torque4}, + {"Coating1_Torque5", predictability.Coating1_Torque5}, + {"Coating1_Torque6", predictability.Coating1_Torque6}, + {"Coating1_Torque7", predictability.Coating1_Torque7}, + {"Coating1_Torque8", predictability.Coating1_Torque8}, + {"Coating2_Torque1", predictability.Coating2_Torque1}, + {"Coating2_Torque2", predictability.Coating2_Torque2}, + {"Coating2_Torque3", predictability.Coating2_Torque3}, + {"Coating2_Torque4", predictability.Coating2_Torque4}, + {"Coating2_Torque5", predictability.Coating2_Torque5}, + {"Coating2_Torque6", predictability.Coating2_Torque6}, + {"Coating2_Torque7", predictability.Coating2_Torque7}, + {"Coating2_Torque8", predictability.Coating2_Torque8}, + {"Folding1_Torque1", predictability.Folding1_Torque1}, + {"Folding1_Torque2", predictability.Folding1_Torque2}, + {"Folding1_Torque3", predictability.Folding1_Torque3}, + {"Folding2_Torque1", predictability.Folding2_Torque1}, + {"Folding2_Torque2", predictability.Folding2_Torque2}, + {"Folding2_Torque3", predictability.Folding2_Torque3}, + //轴速度 + {"Coating1_AxisSpeed1", predictability.Coating1_AxisSpeed1}, + {"Coating1_AxisSpeed2", predictability.Coating1_AxisSpeed2}, + {"Coating1_AxisSpeed3", predictability.Coating1_AxisSpeed3}, + {"Coating1_AxisSpeed4", predictability.Coating1_AxisSpeed4}, + {"Coating1_AxisSpeed5", predictability.Coating1_AxisSpeed5}, + {"Coating1_AxisSpeed6", predictability.Coating1_AxisSpeed6}, + {"Coating1_AxisSpeed7", predictability.Coating1_AxisSpeed7}, + {"Coating1_AxisSpeed8", predictability.Coating1_AxisSpeed8}, + {"Coating2_AxisSpeed1", predictability.Coating2_AxisSpeed1}, + {"Coating2_AxisSpeed2", predictability.Coating2_AxisSpeed2}, + {"Coating2_AxisSpeed3", predictability.Coating2_AxisSpeed3}, + {"Coating2_AxisSpeed4", predictability.Coating2_AxisSpeed4}, + {"Coating2_AxisSpeed5", predictability.Coating2_AxisSpeed5}, + {"Coating2_AxisSpeed6", predictability.Coating2_AxisSpeed6}, + {"Coating2_AxisSpeed7", predictability.Coating2_AxisSpeed7}, + {"Coating2_AxisSpeed8", predictability.Coating2_AxisSpeed8}, + {"Folding1_AxisSpeed1", predictability.Folding1_AxisSpeed1}, + {"Folding1_AxisSpeed2", predictability.Folding1_AxisSpeed2}, + {"Folding1_AxisSpeed3", predictability.Folding1_AxisSpeed3}, + {"Folding2_AxisSpeed1", predictability.Folding2_AxisSpeed1}, + {"Folding2_AxisSpeed2", predictability.Folding2_AxisSpeed2}, + {"Folding2_AxisSpeed3", predictability.Folding2_AxisSpeed3}, + //轴位置 + {"Coating1_AxisPosition1", predictability.Coating1_AxisPosition1}, + {"Coating1_AxisPosition2", predictability.Coating1_AxisPosition2}, + {"Coating1_AxisPosition3", predictability.Coating1_AxisPosition3}, + {"Coating1_AxisPosition4", predictability.Coating1_AxisPosition4}, + {"Coating1_AxisPosition5", predictability.Coating1_AxisPosition5}, + {"Coating1_AxisPosition6", predictability.Coating1_AxisPosition6}, + {"Coating1_AxisPosition7", predictability.Coating1_AxisPosition7}, + {"Coating1_AxisPosition8", predictability.Coating1_AxisPosition8}, + {"Coating2_AxisPosition1", predictability.Coating2_AxisPosition1}, + {"Coating2_AxisPosition2", predictability.Coating2_AxisPosition2}, + {"Coating2_AxisPosition3", predictability.Coating2_AxisPosition3}, + {"Coating2_AxisPosition4", predictability.Coating2_AxisPosition4}, + {"Coating2_AxisPosition5", predictability.Coating2_AxisPosition5}, + {"Coating2_AxisPosition6", predictability.Coating2_AxisPosition6}, + {"Coating2_AxisPosition7", predictability.Coating2_AxisPosition7}, + {"Coating2_AxisPosition8", predictability.Coating2_AxisPosition8}, + {"Folding1_AxisPosition1", predictability.Folding1_AxisPosition1}, + {"Folding1_AxisPosition2", predictability.Folding1_AxisPosition2}, + {"Folding1_AxisPosition3", predictability.Folding1_AxisPosition3}, + {"Folding2_AxisPosition1", predictability.Folding2_AxisPosition1}, + {"Folding2_AxisPosition2", predictability.Folding2_AxisPosition2}, + {"Folding2_AxisPosition3", predictability.Folding2_AxisPosition3}, + //行程时间 + {"Coating1_Cylinder_TravelTime1", predictability.Coating1_Cylinder_TravelTime1}, + {"Coating1_Cylinder_TravelTime2", predictability.Coating1_Cylinder_TravelTime2}, + {"Coating1_Cylinder_TravelTime3", predictability.Coating1_Cylinder_TravelTime3}, + {"Coating1_Cylinder_TravelTime4", predictability.Coating1_Cylinder_TravelTime4}, + {"Coating1_Cylinder_TravelTime5", predictability.Coating1_Cylinder_TravelTime5}, + {"Coating1_Cylinder_TravelTime6", predictability.Coating1_Cylinder_TravelTime6}, + {"Coating1_Cylinder_TravelTime7", predictability.Coating1_Cylinder_TravelTime7}, + {"Coating1_Cylinder_TravelTime8", predictability.Coating1_Cylinder_TravelTime8}, + {"Coating1_Cylinder_TravelTime9", predictability.Coating1_Cylinder_TravelTime9}, + {"Coating1_Cylinder_TravelTime10", predictability.Coating1_Cylinder_TravelTime10}, + {"Coating1_Cylinder_TravelTime11", predictability.Coating1_Cylinder_TravelTime11}, + {"Coating1_Cylinder_TravelTime12", predictability.Coating1_Cylinder_TravelTime12}, + {"Coating1_Cylinder_TravelTime13", predictability.Coating1_Cylinder_TravelTime13}, + {"Coating1_Cylinder_TravelTime14", predictability.Coating1_Cylinder_TravelTime14}, + {"Coating2_Cylinder_TravelTime1", predictability.Coating2_Cylinder_TravelTime1}, + {"Coating2_Cylinder_TravelTime2", predictability.Coating2_Cylinder_TravelTime2}, + {"Coating2_Cylinder_TravelTime3", predictability.Coating2_Cylinder_TravelTime3}, + {"Coating2_Cylinder_TravelTime4", predictability.Coating2_Cylinder_TravelTime4}, + {"Coating2_Cylinder_TravelTime5", predictability.Coating2_Cylinder_TravelTime5}, + {"Coating2_Cylinder_TravelTime6", predictability.Coating2_Cylinder_TravelTime6}, + {"Coating2_Cylinder_TravelTime7", predictability.Coating2_Cylinder_TravelTime7}, + {"Coating2_Cylinder_TravelTime8", predictability.Coating2_Cylinder_TravelTime8}, + {"Coating2_Cylinder_TravelTime9", predictability.Coating2_Cylinder_TravelTime9}, + {"Coating2_Cylinder_TravelTime10", predictability.Coating2_Cylinder_TravelTime10}, + {"Coating2_Cylinder_TravelTime11", predictability.Coating2_Cylinder_TravelTime11}, + {"Coating2_Cylinder_TravelTime12", predictability.Coating2_Cylinder_TravelTime12}, + {"Coating2_Cylinder_TravelTime13", predictability.Coating2_Cylinder_TravelTime13}, + {"Coating2_Cylinder_TravelTime14", predictability.Coating2_Cylinder_TravelTime14}, + {"CornerCutting1_Cylinder_TravelTime1", predictability.CornerCutting1_Cylinder_TravelTime1}, + {"CornerCutting1_Cylinder_TravelTime2", predictability.CornerCutting1_Cylinder_TravelTime2}, + {"CornerCutting1_Cylinder_TravelTime3", predictability.CornerCutting1_Cylinder_TravelTime3}, + {"CornerCutting1_Cylinder_TravelTime4", predictability.CornerCutting1_Cylinder_TravelTime4}, + {"CornerCutting1_Cylinder_TravelTime5", predictability.CornerCutting1_Cylinder_TravelTime5}, + {"CornerCutting1_Cylinder_TravelTime6", predictability.CornerCutting1_Cylinder_TravelTime6}, + {"CornerCutting1_Cylinder_TravelTime7", predictability.CornerCutting1_Cylinder_TravelTime7}, + {"CornerCutting1_Cylinder_TravelTime8", predictability.CornerCutting1_Cylinder_TravelTime8}, + {"CornerCutting2_Cylinder_TravelTime1", predictability.CornerCutting2_Cylinder_TravelTime1}, + {"CornerCutting2_Cylinder_TravelTime2", predictability.CornerCutting2_Cylinder_TravelTime2}, + {"CornerCutting2_Cylinder_TravelTime3", predictability.CornerCutting2_Cylinder_TravelTime3}, + {"CornerCutting2_Cylinder_TravelTime4", predictability.CornerCutting2_Cylinder_TravelTime4}, + {"CornerCutting2_Cylinder_TravelTime5", predictability.CornerCutting2_Cylinder_TravelTime5}, + {"CornerCutting2_Cylinder_TravelTime6", predictability.CornerCutting2_Cylinder_TravelTime6}, + {"CornerCutting2_Cylinder_TravelTime7", predictability.CornerCutting2_Cylinder_TravelTime7}, + {"CornerCutting2_Cylinder_TravelTime8", predictability.CornerCutting2_Cylinder_TravelTime8}, + } + } + } + }; + // 根据实际数据结构调整 + return JsonConvert.SerializeObject(collectionUpload, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.None + }); + } + catch (Exception ex) + { + Logger.WriteError($"构建预测数据消息失败: {ex.Message}", ex); + return string.Empty; + } + } + #endregion + + /// + /// 重新连接 + /// + private void Reconnect() + { + try + { + _mqttClient.ConnectClose(); + InitializeConnection(); + } + catch (Exception ex) + { + Logger.WriteError($"MQTT重连失败: {ex.Message}", ex); + } + } + #region 资源释放跟心跳检测 + private Timer _heartbeatTimer; + private bool _disposed = false; + + + // 心跳检测 + private void StartHeartbeat() + { + _heartbeatTimer = new Timer(state => + { + try + { + if (!_mqttClient.IsConnected) + { + Logger.WriteMqtt("检测到MQTT连接断开,尝试重连..."); + Reconnect(); + } + } + catch (Exception ex) + { + Logger.WriteError($"心跳检测异常: {ex.Message}", ex); + } + }, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1)); // 每分钟检查一次 + } + + protected virtual void Dispose(bool disposing) + { + if (_disposed) return; + + if (disposing) + { + _heartbeatTimer?.Dispose(); + _mqttClient?.ConnectClose(); + _mqttClient?.Dispose(); + } + + _disposed = true; + } + + ~MqttService() + { + Dispose(false); + } + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + #endregion + } + /*public class SendDateMQTT + { + HslCommunication.MQTT.MqttClient mqttClientIN = null; + HslCommunication.MQTT.MqttClient mqttClientOUT = null; + HslCommunication.MQTT.MqttClient mqttClientForecast = null; + private static readonly object ObjectIN = new object(); + private static readonly object ObjectOUT = new object(); + private static readonly object ObjectForecast = new object(); + //10.22.160.144 + public string MQTTServerAddress = "10.22.161.1";//"10.22.161.1"; + public int MQTTServerPort = 2883;//2883 + public string ClientId = "601PWM01"; + + /// 进出站主题 + public string Topic = "EVE/60J/TrackInOut/601PWM01"; + /// CTPCTQ主题 + public string Topic1 = "EVE/60J/CTPCTQ/601PWM01"; + // 预测性维护数据主题 + public string Topic2 = "EVE/60J/EQP/601PWM01"; + + /// BU编码 + public string BU_id = "EVE8BU"; + /// 区域简称 + public string District_id = "JM"; + /// 工厂编码 + public string Factory_id = "60J"; + /// 工序编码 + public string Production_line_id = "601L"; + /// 工作中心编码 + public string Work_center_id = "601PWE01"; + /// 设备编码 + public string Device_name = "601PWM01"; + + /// + /// 发送Mqtt进站数据 + /// + /// + /// + /// + /// + public void EnterandExitSendMessgeIN() + { + try + { + + lock (ObjectIN) + { + if (mqttClientIN != null) { mqttClientIN.ConnectClose(); } + Connect(mqttClientIN, MQTTServerAddress, MQTTServerPort, "", ""); + SubscribeMessage(mqttClientIN, Topic); + PublishMessage(mqttClientIN, Topic, EnterandExitMessge("0")); + } + + + + } + catch (Exception ex) + { + Logger.WriteError($"发送进出站数据错误,{ex.Message}", ex); + //CommonMethods.AddLog(true, $"发送进出站数据错误,{ex.Message}"); + } + } + /// + /// 发送Mqtt出站数据 + /// + /// + /// + /// + /// + public void EnterandExitSendMessgeOUT() + { + try + { + + lock (ObjectOUT) + { + if (mqttClientOUT != null) { mqttClientOUT.ConnectClose(); } + Connect(mqttClientOUT, MQTTServerAddress, MQTTServerPort, "", ""); + SubscribeMessage(mqttClientOUT, Topic); + PublishMessage(mqttClientOUT, Topic, EnterandExitMessge("1")); + } + } + catch (Exception ex) + { + Logger.WriteError($"发送进出站数据错误,{ex.Message}", ex); + //CommonMethods.AddLog(true, $"发送进出站数据错误,{ex.Message}"); + } + } + /// + /// 发送采集项数据 + /// + /// + /// + /// + /// + public void CollectionSendMessgeForecast(Predictability_BM predictability) + { + try + { + + lock (ObjectForecast) + { + if (mqttClientForecast != null) { mqttClientForecast.ConnectClose(); } + Connect(mqttClientForecast, MQTTServerAddress, MQTTServerPort, "", ""); + SubscribeMessage(mqttClientForecast, Topic2); + PublishMessage(mqttClientForecast, Topic2, CollectionMessge(predictability)); + } + } + catch (Exception ex) + { + Logger.WriteError($"发送采集项数据错误,{ex.Message}", ex); + //CommonMethods.AddLog(false, $"发送采集项数据错误,{ex.Message}"); + } + } + + /// + /// 连接 + /// + /// + /// + /// + /// + /// + public void Connect(MqttClient mqttClient, string ip, int port, string name, string pwd, string clientId = "ClientId") + { + try + { + if (mqttClient != null) mqttClient.ConnectClose(); + + mqttClient = new MqttClient(new MqttConnectionOptions() + { + ClientId = clientId, + IpAddress = ip, + Port = port, + Credentials = new MqttCredential(name, pwd), // 设置了用户名和密码 + }); + + OperateResult connect = mqttClient.ConnectServer(); + if (connect.IsSuccess) + { + Logger.WriteMqtt("MQTT 连接服务器成功"); + } + else + { + Logger.WriteMqtt("MQTT 无法连接到服务器"); + } + + } + catch (Exception ex) + { + Logger.WriteError($"MQTT 无法连接到服务器: {ex.Message}"); + } + + + } + + /// + /// 发布信息 + /// + /// + public void PublishMessage(MqttClient mqttClient, string topic, string Message) + { + try + { + + OperateResult result = mqttClient.PublishMessage(new MqttApplicationMessage() + { + Topic = topic, // 主题 + QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, // 消息等级 + Payload = Encoding.UTF8.GetBytes(Message), // 数据 + Retain = false, // 是否保留 + }); + if (result.IsSuccess) + { + Logger.WriteMqtt($"发送消息到主题 [{topic}]: {Message}"); + } + else + { + Logger.WriteMqtt($"发送消息到主题 [{topic}] 失败: {result.Message}"); + } + + } + catch (Exception ex) + { + Logger.WriteError($"MQTT 无法连接到服务器: {ex.Message}"); + } + } + + /// + /// 订阅主题 + /// + /// + public void SubscribeMessage(MqttClient mqttClient, string Topic) + { + try + { + + mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 调用一次即可 + OperateResult Result = mqttClient.SubscribeMessage(Topic); // 订阅A的主题 + if (Result.IsSuccess) + { + Logger.WriteMqtt($"订阅成功[{Topic}]"); + } + else + { + Logger.WriteMqtt($"订阅失败[{Topic}]"); + } + + } + catch (Exception ex) + { + Logger.WriteError($"订阅失败[{ex.Message}]"); + } + } + + private static void MqttClient_OnMqttMessageReceived(MqttClient client, MqttApplicationMessage message) + { + Logger.WriteMqtt($"收到服务器信息[{message.ToString()}]"); + } + + /// + /// 拼接进出站json + /// + /// + /// + public string EnterandExitMessge(string action) + { + string messgeJson = string.Empty; + try + { + EnterandExit enterandExit = new EnterandExit() + { + bu_id = BU_id, + district_id = District_id, + factory_id = Factory_id, + production_line_id = Production_line_id, + production_processes_id = "", + work_center_id = Work_center_id, + station_id = "", + device_name = Device_name, + action = action, + action_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + + }; + var messageJson = JsonConvert.SerializeObject(enterandExit, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.None + }); + messgeJson = messageJson; + } + catch (Exception ex) + { + Logger.WriteError($"方法:上传MQTTServer数据,上传失败: {ex.Message}", ex); + } + return messgeJson; + } + + /// + /// 拼接采集项数据 + /// + /// + /// + public string CollectionMessge(Predictability_BM predictability) + { + string messgejson = string.Empty; + try + { + CollectionUpload collectionUpload = new CollectionUpload() + { + bu_id = BU_id, + district_id = District_id, + factory_id = Factory_id, + production_line_id = Production_line_id, + production_processes_id = "", + work_center_id = Work_center_id, + station_id = "", + device_name = Device_name, + taglist = new List + { + new Collection + { + device_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + collection_items = new Dictionary + { + //扭矩 + {"Coating1_Torque1", predictability.Coating1_Torque1}, + {"Coating1_Torque2", predictability.Coating1_Torque2}, + {"Coating1_Torque3", predictability.Coating1_Torque3}, + {"Coating1_Torque4", predictability.Coating1_Torque4}, + {"Coating1_Torque5", predictability.Coating1_Torque5}, + {"Coating1_Torque6", predictability.Coating1_Torque6}, + {"Coating1_Torque7", predictability.Coating1_Torque7}, + {"Coating1_Torque8", predictability.Coating1_Torque8}, + {"Coating2_Torque1", predictability.Coating2_Torque1}, + {"Coating2_Torque2", predictability.Coating2_Torque2}, + {"Coating2_Torque3", predictability.Coating2_Torque3}, + {"Coating2_Torque4", predictability.Coating2_Torque4}, + {"Coating2_Torque5", predictability.Coating2_Torque5}, + {"Coating2_Torque6", predictability.Coating2_Torque6}, + {"Coating2_Torque7", predictability.Coating2_Torque7}, + {"Coating2_Torque8", predictability.Coating2_Torque8}, + {"Folding1_Torque1", predictability.Folding1_Torque1}, + {"Folding1_Torque2", predictability.Folding1_Torque2}, + {"Folding1_Torque3", predictability.Folding1_Torque3}, + {"Folding2_Torque1", predictability.Folding2_Torque1}, + {"Folding2_Torque2", predictability.Folding2_Torque2}, + {"Folding2_Torque3", predictability.Folding2_Torque3}, + //轴速度 + {"Coating1_AxisSpeed1", predictability.Coating1_AxisSpeed1}, + {"Coating1_AxisSpeed2", predictability.Coating1_AxisSpeed2}, + {"Coating1_AxisSpeed3", predictability.Coating1_AxisSpeed3}, + {"Coating1_AxisSpeed4", predictability.Coating1_AxisSpeed4}, + {"Coating1_AxisSpeed5", predictability.Coating1_AxisSpeed5}, + {"Coating1_AxisSpeed6", predictability.Coating1_AxisSpeed6}, + {"Coating1_AxisSpeed7", predictability.Coating1_AxisSpeed7}, + {"Coating1_AxisSpeed8", predictability.Coating1_AxisSpeed8}, + {"Coating2_AxisSpeed1", predictability.Coating2_AxisSpeed1}, + {"Coating2_AxisSpeed2", predictability.Coating2_AxisSpeed2}, + {"Coating2_AxisSpeed3", predictability.Coating2_AxisSpeed3}, + {"Coating2_AxisSpeed4", predictability.Coating2_AxisSpeed4}, + {"Coating2_AxisSpeed5", predictability.Coating2_AxisSpeed5}, + {"Coating2_AxisSpeed6", predictability.Coating2_AxisSpeed6}, + {"Coating2_AxisSpeed7", predictability.Coating2_AxisSpeed7}, + {"Coating2_AxisSpeed8", predictability.Coating2_AxisSpeed8}, + {"Folding1_AxisSpeed1", predictability.Folding1_AxisSpeed1}, + {"Folding1_AxisSpeed2", predictability.Folding1_AxisSpeed2}, + {"Folding1_AxisSpeed3", predictability.Folding1_AxisSpeed3}, + {"Folding2_AxisSpeed1", predictability.Folding2_AxisSpeed1}, + {"Folding2_AxisSpeed2", predictability.Folding2_AxisSpeed2}, + {"Folding2_AxisSpeed3", predictability.Folding2_AxisSpeed3}, + //轴位置 + {"Coating1_AxisPosition1", predictability.Coating1_AxisPosition1}, + {"Coating1_AxisPosition2", predictability.Coating1_AxisPosition2}, + {"Coating1_AxisPosition3", predictability.Coating1_AxisPosition3}, + {"Coating1_AxisPosition4", predictability.Coating1_AxisPosition4}, + {"Coating1_AxisPosition5", predictability.Coating1_AxisPosition5}, + {"Coating1_AxisPosition6", predictability.Coating1_AxisPosition6}, + {"Coating1_AxisPosition7", predictability.Coating1_AxisPosition7}, + {"Coating1_AxisPosition8", predictability.Coating1_AxisPosition8}, + {"Coating2_AxisPosition1", predictability.Coating2_AxisPosition1}, + {"Coating2_AxisPosition2", predictability.Coating2_AxisPosition2}, + {"Coating2_AxisPosition3", predictability.Coating2_AxisPosition3}, + {"Coating2_AxisPosition4", predictability.Coating2_AxisPosition4}, + {"Coating2_AxisPosition5", predictability.Coating2_AxisPosition5}, + {"Coating2_AxisPosition6", predictability.Coating2_AxisPosition6}, + {"Coating2_AxisPosition7", predictability.Coating2_AxisPosition7}, + {"Coating2_AxisPosition8", predictability.Coating2_AxisPosition8}, + {"Folding1_AxisPosition1", predictability.Folding1_AxisPosition1}, + {"Folding1_AxisPosition2", predictability.Folding1_AxisPosition2}, + {"Folding1_AxisPosition3", predictability.Folding1_AxisPosition3}, + {"Folding2_AxisPosition1", predictability.Folding2_AxisPosition1}, + {"Folding2_AxisPosition2", predictability.Folding2_AxisPosition2}, + {"Folding2_AxisPosition3", predictability.Folding2_AxisPosition3}, + //行程时间 + {"Coating1_Cylinder_TravelTime1", predictability.Coating1_Cylinder_TravelTime1}, + {"Coating1_Cylinder_TravelTime2", predictability.Coating1_Cylinder_TravelTime2}, + {"Coating1_Cylinder_TravelTime3", predictability.Coating1_Cylinder_TravelTime3}, + {"Coating1_Cylinder_TravelTime4", predictability.Coating1_Cylinder_TravelTime4}, + {"Coating1_Cylinder_TravelTime5", predictability.Coating1_Cylinder_TravelTime5}, + {"Coating1_Cylinder_TravelTime6", predictability.Coating1_Cylinder_TravelTime6}, + {"Coating1_Cylinder_TravelTime7", predictability.Coating1_Cylinder_TravelTime7}, + {"Coating1_Cylinder_TravelTime8", predictability.Coating1_Cylinder_TravelTime8}, + {"Coating1_Cylinder_TravelTime9", predictability.Coating1_Cylinder_TravelTime9}, + {"Coating1_Cylinder_TravelTime10", predictability.Coating1_Cylinder_TravelTime10}, + {"Coating1_Cylinder_TravelTime11", predictability.Coating1_Cylinder_TravelTime11}, + {"Coating1_Cylinder_TravelTime12", predictability.Coating1_Cylinder_TravelTime12}, + {"Coating1_Cylinder_TravelTime13", predictability.Coating1_Cylinder_TravelTime13}, + {"Coating1_Cylinder_TravelTime14", predictability.Coating1_Cylinder_TravelTime14}, + {"Coating2_Cylinder_TravelTime1", predictability.Coating2_Cylinder_TravelTime1}, + {"Coating2_Cylinder_TravelTime2", predictability.Coating2_Cylinder_TravelTime2}, + {"Coating2_Cylinder_TravelTime3", predictability.Coating2_Cylinder_TravelTime3}, + {"Coating2_Cylinder_TravelTime4", predictability.Coating2_Cylinder_TravelTime4}, + {"Coating2_Cylinder_TravelTime5", predictability.Coating2_Cylinder_TravelTime5}, + {"Coating2_Cylinder_TravelTime6", predictability.Coating2_Cylinder_TravelTime6}, + {"Coating2_Cylinder_TravelTime7", predictability.Coating2_Cylinder_TravelTime7}, + {"Coating2_Cylinder_TravelTime8", predictability.Coating2_Cylinder_TravelTime8}, + {"Coating2_Cylinder_TravelTime9", predictability.Coating2_Cylinder_TravelTime9}, + {"Coating2_Cylinder_TravelTime10", predictability.Coating2_Cylinder_TravelTime10}, + {"Coating2_Cylinder_TravelTime11", predictability.Coating2_Cylinder_TravelTime11}, + {"Coating2_Cylinder_TravelTime12", predictability.Coating2_Cylinder_TravelTime12}, + {"Coating2_Cylinder_TravelTime13", predictability.Coating2_Cylinder_TravelTime13}, + {"Coating2_Cylinder_TravelTime14", predictability.Coating2_Cylinder_TravelTime14}, + {"CornerCutting1_Cylinder_TravelTime1", predictability.CornerCutting1_Cylinder_TravelTime1}, + {"CornerCutting1_Cylinder_TravelTime2", predictability.CornerCutting1_Cylinder_TravelTime2}, + {"CornerCutting1_Cylinder_TravelTime3", predictability.CornerCutting1_Cylinder_TravelTime3}, + {"CornerCutting1_Cylinder_TravelTime4", predictability.CornerCutting1_Cylinder_TravelTime4}, + {"CornerCutting1_Cylinder_TravelTime5", predictability.CornerCutting1_Cylinder_TravelTime5}, + {"CornerCutting1_Cylinder_TravelTime6", predictability.CornerCutting1_Cylinder_TravelTime6}, + {"CornerCutting1_Cylinder_TravelTime7", predictability.CornerCutting1_Cylinder_TravelTime7}, + {"CornerCutting1_Cylinder_TravelTime8", predictability.CornerCutting1_Cylinder_TravelTime8}, + {"CornerCutting2_Cylinder_TravelTime1", predictability.CornerCutting2_Cylinder_TravelTime1}, + {"CornerCutting2_Cylinder_TravelTime2", predictability.CornerCutting2_Cylinder_TravelTime2}, + {"CornerCutting2_Cylinder_TravelTime3", predictability.CornerCutting2_Cylinder_TravelTime3}, + {"CornerCutting2_Cylinder_TravelTime4", predictability.CornerCutting2_Cylinder_TravelTime4}, + {"CornerCutting2_Cylinder_TravelTime5", predictability.CornerCutting2_Cylinder_TravelTime5}, + {"CornerCutting2_Cylinder_TravelTime6", predictability.CornerCutting2_Cylinder_TravelTime6}, + {"CornerCutting2_Cylinder_TravelTime7", predictability.CornerCutting2_Cylinder_TravelTime7}, + {"CornerCutting2_Cylinder_TravelTime8", predictability.CornerCutting2_Cylinder_TravelTime8}, + } + } + } + }; + var messageJson = JsonConvert.SerializeObject(collectionUpload, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.None + }); + messgejson = messageJson; + } + catch (Exception ex) + { + Logger.WriteError($"生成Json数据失败: {ex.Message}", ex); + } + return messgejson; + } + }*/ +} diff --git a/JinYuan.Helper/StreamIOHelper.cs b/JinYuan.Helper/StreamIOHelper.cs new file mode 100644 index 0000000..a6a4df8 --- /dev/null +++ b/JinYuan.Helper/StreamIOHelper.cs @@ -0,0 +1,127 @@ +using System; +using System.IO; + +namespace JinYuan.Helper +{ + /// + /// 流读写IO辅助类 + /// + public class StreamIOHelper + { + /// + /// 写入文件字节流 + /// + /// 待写入的流 + /// 写入的文件流 + /// 是否在操作后关闭流 + /// 是否写入成功:true:成功;false:失败 + public static bool WriteStreamBytes(Stream stream, byte[] bys, bool isCloseStream = false) + { + //确保文件支持写入 + if (stream == null || !stream.CanWrite) + { + return false; + } + + try + { + //单次写入的长度 + int perWriteByteLen = 1024 * 1024; + //单次读取的索引下标 + int startIndex = 0; + //写入的总长度 + int allLen = bys.Length; + while (startIndex < allLen && startIndex >= 0) + { + stream.Write(bys, startIndex, (startIndex > allLen - perWriteByteLen) ? allLen - startIndex : perWriteByteLen); + startIndex += perWriteByteLen; + } + stream.Flush(); + return true; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message + "\t" + ex.StackTrace); + return false; + } + finally + { + if (isCloseStream) + { + CloseStream(stream); + } + } + } + + /// + /// 读取文件字节流 + /// 读取异常或者文件不存在时返回null; + /// + /// 读取的字节流 + /// 是否在操作后关闭流 + /// 读取到的文件字节流 + public static byte[] ReadStreamBytes(Stream stream, bool isCloseStream = false) + { + //检测是否支持读操作 + if (stream == null || !stream.CanRead || stream.Length == 0) + { + return null; + } + + try + { + byte[] resBytes = new byte[stream.Length]; + int allLen = (int)stream.Length; + //单次读取的长度,1024字节即1kb,1024*1024=1M + int perReadByteLen = 1024 * 1024; + //单次读取的索引下标 + int startIndex = 0; + //单次读取到的长度 + int readLen = 0; + while ((readLen = stream.Read(resBytes, startIndex, (startIndex > allLen - perReadByteLen) ? allLen - startIndex : perReadByteLen)) > 0) + { + startIndex += readLen; + } + if (startIndex == allLen) + { + return resBytes; + } + else + { + return ArrayHelper.GetSubArray(resBytes, 0, startIndex); + } + + } + catch (Exception ex) + { + Console.WriteLine(ex.Message + "\t" + ex.StackTrace); + return null; + } + finally + { + if (isCloseStream) + { + CloseStream(stream); + } + } + } + + /// + /// 关闭流 + /// + /// + public static void CloseStream(Stream fileInfo) + { + try + { + if (fileInfo != null) + fileInfo.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message + "\t" + ex.StackTrace); + } + } + + } +} diff --git a/JinYuan.Helper/StringSecurityHelper.cs b/JinYuan.Helper/StringSecurityHelper.cs new file mode 100644 index 0000000..7071792 --- /dev/null +++ b/JinYuan.Helper/StringSecurityHelper.cs @@ -0,0 +1,123 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace JinYuan.Helper +{ + /// + /// 字符串加密解密类 + /// + public class StringSecurityHelper + { + private static string md5Begin = "Hello"; + private static string md5End = "World"; + + #region SHA1 加密 + + /// + /// 使用SHA1加密字符串。 + /// + /// 输入字符串。 + /// 加密后的字符串。(40个字符) + public static string SHA1Encrypt(string inputString) + { + SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider(); + byte[] encryptedBytes = sha1.ComputeHash(Encoding.ASCII.GetBytes(inputString)); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < encryptedBytes.Length; i++) + { + sb.AppendFormat("{0:x2}", encryptedBytes[i]); + } + return sb.ToString(); + } + + #endregion + + #region DES 加密/解密 + + private static byte[] key = Encoding.ASCII.GetBytes("uiertysd"); + private static byte[] iv = Encoding.ASCII.GetBytes("99008855"); + + /// + /// DES加密。 + /// + /// 输入字符串。 + /// 加密后的字符串。 + public static string DESEncrypt(string inputString) + { + MemoryStream ms = null; + CryptoStream cs = null; + StreamWriter sw = null; + + DESCryptoServiceProvider des = new DESCryptoServiceProvider(); + try + { + ms = new MemoryStream(); + cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write); + sw = new StreamWriter(cs); + sw.Write(inputString); + sw.Flush(); + cs.FlushFinalBlock(); + return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); + } + finally + { + if (sw != null) sw.Close(); + if (cs != null) cs.Close(); + if (ms != null) ms.Close(); + } + } + + /// + /// DES解密。 + /// + /// 输入字符串。 + /// 解密后的字符串。 + public static string DESDecrypt(string inputString) + { + MemoryStream ms = null; + CryptoStream cs = null; + StreamReader sr = null; + + DESCryptoServiceProvider des = new DESCryptoServiceProvider(); + try + { + ms = new MemoryStream(Convert.FromBase64String(inputString)); + cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read); + sr = new StreamReader(cs); + return sr.ReadToEnd(); + } + catch + { + return string.Empty; + } + finally + { + if (sr != null) sr.Close(); + if (cs != null) cs.Close(); + if (ms != null) ms.Close(); + } + } + + #endregion + + + /// + /// MD5加密 + /// + /// MD5加密前字符串 + /// MD5加密后字符串 + public static string MD5Encrypt(string str) + { + str = string.Concat(md5Begin, str, md5End); + MD5 md5 = new MD5CryptoServiceProvider(); + byte[] fromData = Encoding.Unicode.GetBytes(str); + byte[] targetData = md5.ComputeHash(fromData); + string md5String = string.Empty; + foreach (var b in targetData) + md5String += b.ToString("x2"); + return md5String; + } + } +} diff --git a/JinYuan.Helper/TimedOperation.cs b/JinYuan.Helper/TimedOperation.cs new file mode 100644 index 0000000..e554558 --- /dev/null +++ b/JinYuan.Helper/TimedOperation.cs @@ -0,0 +1,36 @@ +using System; +using System.Diagnostics; +using System.Threading; + +namespace JinYuan.Helper +{ + /// + /// 操作计时功能 + /// + public class TimedOperation : IDisposable + { + private readonly Stopwatch _stopwatch; + private readonly string _operationName; + private readonly Action _onCompleted; + private bool _disposed = false; + + public TimedOperation(string operationName, Action onCompleted = null) + { + _stopwatch = Stopwatch.StartNew(); + _operationName = operationName; + _onCompleted = onCompleted; + } + + public long ElapsedMilliseconds => _stopwatch.ElapsedMilliseconds; + + public void Dispose() + { + if (!_disposed) + { + _stopwatch.Stop(); + _onCompleted?.Invoke(_stopwatch.ElapsedMilliseconds, _operationName); + _disposed = true; + } + } + } +} diff --git a/JinYuan.Helper/TimerReset.cs b/JinYuan.Helper/TimerReset.cs new file mode 100644 index 0000000..93b89ec --- /dev/null +++ b/JinYuan.Helper/TimerReset.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading; + +namespace JinYuan.Helper +{ + /// + /// 定时器重置时间间隔,定时器执行未超间隔则设置剩余时间后再次触发,超时则立即触发 + /// + public class TimerReset : IDisposable + { + private Timer timer; + private DateTime nextTime; + + /// + /// 使用using语句,在定时器TimerCallback中使用 + /// using语句块内为时间到时的执行代码,dispose计算使用的时间,来重设下次触发时间 + /// + /// 定时器 + /// 时间间隔 + public TimerReset(Timer tim, int ep) + { + timer = tim; + nextTime = DateTime.Now.AddMilliseconds(ep);//设置下次执行时间 + } + public void Dispose() + { + //执行完后,重新设置定时器下次执行时间. + TimeSpan timeout = nextTime.Subtract(DateTime.Now); + if (timeout < TimeSpan.Zero) + { + timeout = TimeSpan.Zero; + } + + timer.Change(timeout, Timeout.InfiniteTimeSpan); + } + } +} diff --git a/JinYuan.Helper/TxtHelper.cs b/JinYuan.Helper/TxtHelper.cs new file mode 100644 index 0000000..c77733b --- /dev/null +++ b/JinYuan.Helper/TxtHelper.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; + +namespace JinYuan.Helper +{ + public class TxtHelper + { + static ReaderWriterLockSlim sucessLogWriteLockSlim = new ReaderWriterLockSlim(); + + /// + /// 写入TEXT文本 + /// + /// 文件名 + /// 内容 + /// 保存结果 + public static bool WriteTxt(string fullName, string content) + { + FileStream fs = null; + StreamWriter sw = null; + + try + { + string directory = fullName.Substring(0, fullName.LastIndexOf('\\')); + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + sucessLogWriteLockSlim.EnterWriteLock();//加锁防止抢占 + if (!File.Exists(fullName)) + { + fs = new FileStream(fullName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + else + { + fs = new FileStream(fullName, FileMode.Append, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.UTF8); + } + + sw.WriteLine(content); + + sw.Close(); + fs.Close(); + + return true; + } + catch (Exception ex) + { + sw?.Close(); + fs?.Close(); + + } + finally + { + sucessLogWriteLockSlim.ExitWriteLock(); + } + + return false; + } + + } +} diff --git a/JinYuan.Helper/TypeParse.cs b/JinYuan.Helper/TypeParse.cs new file mode 100644 index 0000000..55d98d3 --- /dev/null +++ b/JinYuan.Helper/TypeParse.cs @@ -0,0 +1,386 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace JinYuan.Helper +{ + public class TypeParse + { + /// + /// 将数据库内取的值转成字符串 + /// + /// + /// + public static string Obj2Str(object obj) + { + return (obj != null) ? obj.ToString().Trim() : ""; + } + + /// + /// 判断对象是否为Int32类型的数字 + /// + /// + /// + public static bool IsNumeric(object expression) + { + if (expression != null) + { + return IsNumeric(expression.ToString()); + } + return false; + + } + + /// + /// 判断对象是否为Int32类型的数字 + /// + /// + /// + public static bool IsNumeric(string expression) + { + if (expression != null) + { + string str = expression; + if (str.Length > 0 && str.Length <= 11 && Regex.IsMatch(str, @"^[-]?[0-9]*[.]?[0-9]*$")) + { + if ((str.Length < 10) || (str.Length == 10 && str[0] == '1') || (str.Length == 11 && str[0] == '-' && str[1] == '1')) + { + return true; + } + } + } + return false; + + } + + /// + /// 是否为Double类型 + /// + /// + /// + public static bool IsDouble(object expression) + { + if (expression != null) + { + return Regex.IsMatch(expression.ToString(), @"^([0-9])[0-9]*(\.\w*)?$"); + } + return false; + } + + /// + /// string型转换为bool型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的bool类型结果 + public static bool StrToBool(object expression, bool defValue) + { + if (expression != null) + { + return StrToBool(expression.ToString(), defValue); + } + return defValue; + } + + /// + /// string型转换为bool型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的bool类型结果 + public static bool StrToBool(string expression, bool defValue) + { + try + { + if (expression != null) + { + if (string.Compare(expression, "true", true) == 0) + { + return true; + } + else if (string.Compare(expression, "false", true) == 0) + { + return false; + } + } + } + catch (Exception) + { + return defValue; + } + return defValue; + } + + /// + /// 将对象转换为Int32类型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的int类型结果 + public static int StrToInt(object expression, int defValue) + { + if (expression != null) + { + return StrToInt(expression.ToString(), defValue); + } + return defValue; + } + + /// + /// 将对象转换为Int32类型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的int类型结果 + public static int StrToInt(string str, int defValue) + { + try + { + if (str == null) + return defValue; + str = str.Trim(); + if (str.Length > 0 && str.Length <= 11 && Regex.IsMatch(str, @"^[-]?[0-9]*$")) + { + if ((str.Length < 10) || (str.Length == 10 && str[0] == '1') || (str.Length == 11 && str[0] == '-' && str[1] == '1')) + { + return Convert.ToInt32(str); + } + } + } + catch (Exception) + { + return defValue; + } + return defValue; + } + + /// + /// string型转换为float型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的int类型结果 + public static float StrToFloat(object strValue, float defValue) + { + if ((strValue == null)) + { + return defValue; + } + return StrToFloat(strValue.ToString(), defValue); + } + + /// + /// string型转换为float型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的int类型结果 + public static float StrToFloat(string strValue, float defValue = 0) + { + + if (strValue == null) + { + return defValue; + } + else if (strValue.IndexOf(".") > 10) + { + return defValue; + } + float intValue = defValue; + try + { + if (strValue != null) + { + bool IsFloat = Regex.IsMatch(strValue, @"^([-]|[0-9])[0-9]*(\.\w*)?$"); + if (IsFloat) + { + intValue = Convert.ToSingle(strValue); + } + } + } + catch (Exception) + { + return defValue; + } + return intValue; + } + + /// + /// object型转换为decimal型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的decimal类型结果 + public static decimal StrToDecimal(object strValue, decimal defValue = 0) + { + if ((strValue == null)) + { + return defValue; + } + + return StrToDecimal(strValue.ToString(), defValue); + } + + /// + /// string型转换为decimal型 + /// + /// 要转换的字符串 + /// 缺省值 + /// 转换后的decimal类型结果 + public static decimal StrToDecimal(string strValue, decimal defValue) + { + if (strValue == null || strValue == "") + { + return defValue; + } + + decimal intValue = defValue; + try + { + if (strValue != null) + { + bool IsDecimal = Regex.IsMatch(strValue, @"^([-]|[0-9])[0-9]*(\.\w*)?$"); + if (IsDecimal) + { + intValue = Convert.ToDecimal(strValue); + //int precision = 15; // 假设数据库中的精度为15 + //int scale = 3; // 假设数据库中的小数位数为3 + // 检查valueToInsert是否超出精确度和小数位数 + if (Math.Floor(intValue * (decimal)Math.Pow(18, 3)) > (decimal)Math.Pow(18, 15 - 3)) + { + intValue = -9999; + } + } + } + } + catch (Exception) + { + return defValue; + } + return intValue; + } + + + /// + /// 判断给定的字符串数组(strNumber)中的数据是不是都为数值型 + /// + /// 要确认的字符串数组 + /// 是则返加true 不是则返回 false + public static bool IsNumericArray(string[] strNumber) + { + if (strNumber == null) + { + return false; + } + if (strNumber.Length < 1) + { + return false; + } + foreach (string id in strNumber) + { + if (!IsNumeric(id)) + { + return false; + } + } + return true; + + } + + /// + /// 将数据库内取的值转成日期 + /// + /// + /// + public static DateTime Obj2DateTime(object obj) + { + try + { + if (obj != null) + { + return DateTime.Parse(obj.ToString()); + } + else + { + return Convert.ToDateTime("1900-1-1 00:00:00"); + } + } + catch + { + return Convert.ToDateTime("1900-1-1 00:00:00"); + } + } + + /// + /// 判断字符串是否是yyyy-mm-dd字符串 + /// + /// 待判断字符串 + /// 判断结果 + public static bool IsDateString(string str) + { + bool formatPassed = Regex.IsMatch(str, @"(\d{4})-(\d{1,2})-(\d{1,2})"); + + if (!formatPassed) + return false; + + DateTime date; + + return DateTime.TryParse(str, out date); + } + + /// + /// 判断字符串是否是 HH:mm 或者 HH:mm:ss 格式 + /// + /// 待判断字符串 + /// 是否包含秒 + /// 判断结果 + public static bool IsTimeString(string str, bool includeSecond) + { + string patten = @"([0-1][0-9]|2[0-3]):([0-5][0-9])"; + + if (includeSecond) + patten = @"([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"; + + bool formatPassed = Regex.IsMatch(str, patten); + + return formatPassed; + } + + /// + /// 日期转换成unix时间戳 + /// + /// + /// + public static long DateTimeToUnixTimestamp(DateTime dateTime) + { + DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, dateTime.Kind); + return Convert.ToInt64((dateTime - start).TotalSeconds); + } + + /// + /// unix时间戳转换成日期 + /// + /// 时间戳(秒) + /// + public static DateTime UnixTimestampToDateTime(DateTime target, long timeStamp) + { + DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, target.Kind); + return start.AddSeconds(timeStamp); + } + + /// + /// 日期转换成unix时间戳(13位精确到毫秒) + /// + /// + /// + public static long DateTimeToUnixTimestamp_Ms(DateTime dateTime) + { + DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + return Convert.ToInt64(dateTime.Subtract(start).TotalMilliseconds); + } + } +} diff --git a/JinYuan.Helper/XmlHelper.cs b/JinYuan.Helper/XmlHelper.cs new file mode 100644 index 0000000..f2d012e --- /dev/null +++ b/JinYuan.Helper/XmlHelper.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Xml.Serialization; + +namespace JinYuan.Helper +{ + /// + /// 序列化辅助类 + /// + public class XmlHelper + { + + /// + /// 二进制方式的序列化 + /// + /// 类型 + /// 序列化对象 + /// 序列化后的内存 + public static Stream BinarySerialize(T obj) + { + MemoryStream serMs = new MemoryStream(); + IFormatter iBinaryFormatter = new BinaryFormatter(); + iBinaryFormatter.Serialize(serMs, obj); + if (serMs.Length > 0) + serMs.Position = 0; + return serMs; + } + + /// + /// 二进制方式的反序列化 + /// + /// 类型 + /// 待序列化的内存 + /// 反序列化后的对象 + public static T BinaryDeserializer(Stream ms) where T : class + { + T res = default(T); + if (ms.Length > 0) + ms.Position = 0; + IFormatter iBinaryFormatter = new BinaryFormatter(); + res = iBinaryFormatter.Deserialize(ms) as T; + return res; + } + + /// + /// Xml方式的序列化 + /// + /// 类型 + /// 序列化对象 + /// 序列化后的内存 + public static Stream XmlSerialize(T obj) + { + MemoryStream serMs = new MemoryStream(); + XmlSerializer ser = new XmlSerializer(obj.GetType()); + try + { + ser.Serialize(serMs, obj); + if (serMs.Length > 0) + serMs.Position = 0; + } + catch (Exception ex) + { + //LogHelper.Current.WriteEx(string.Format("序列化对象异常:{0}", obj.ToString()), ex); + return null; + } + + return serMs; + } + + /// + /// Xml方式的序列化 + /// + /// + /// + public static Stream XmlSerializeObj(object obj) + { + MemoryStream serMs = new MemoryStream(); + XmlSerializer ser = new XmlSerializer(obj.GetType()); + ser.Serialize(serMs, obj); + if (serMs.Length > 0) + serMs.Position = 0; + return serMs; + } + + /// + /// Xml方式的反序列化 + /// + /// 类型 + /// 待序列化的内存 + /// 反序列化后的对象 + public static T XmlDeserializer(Stream ms) where T : class + { + T res = default(T); + if (ms.Length > 0) + ms.Position = 0; + XmlSerializer ser = new XmlSerializer(typeof(T)); + res = ser.Deserialize(ms) as T; + return res; + } + + /// + /// 将List集合保存成XML文档 + /// + /// + /// + /// + public static bool SaveListToXML(List lstT, string filePath) + { + try + { + FileInfo fInfo = new FileInfo(filePath); + if (!fInfo.Directory.Exists) + { + fInfo.Directory.Create(); + } + Stream stream = XmlSerialize(lstT); + if (stream != null) + { + byte[] bs = StreamIOHelper.ReadStreamBytes(stream); + using (FileStream fs = new FileStream(filePath, FileMode.Create)) + { + fs.Write(bs, 0, bs.Length); + } + stream.Close(); + return true; + } + else + { + return false; + } + + } + catch (Exception ex) + { + //LogHelper.Current.WriteEx("将List保存成XML文档发生异常", ex, EnumLogType.Error); + return false; + } + } + + + /// + /// 读取XML信息成List集合 + /// + public static List ReadXMLToList(string filePath) + { + try + { + FileInfo fInfo = new FileInfo(filePath); + if (!fInfo.Directory.Exists) + { + fInfo.Directory.Create(); + } + using (FileStream fs = new FileStream(filePath, FileMode.Open)) + { + var crList = XmlDeserializer>(fs); + return crList; + } + } + catch (Exception ex) + { + //LogHelper.Current.WriteEx("读取XML转换成List异常", ex, EnumLogType.Error); + return null; + } + } + + /// + /// 将类的实例保存成XML文档 + /// + /// + /// + /// + /// + public static bool SaveModelToXML(T t, string filePath) where T : class + { + try + { + FileInfo fInfo = new FileInfo(filePath); + if (!fInfo.Directory.Exists) + { + fInfo.Directory.Create(); + } + using (FileStream fs = new FileStream(filePath, FileMode.Create)) + { + using (Stream stream = XmlSerialize(t)) + { + byte[] bs = StreamIOHelper.ReadStreamBytes(stream); + fs.Write(bs, 0, bs.Length); + } + } + return true; + } + catch (Exception ex) + { + //LogHelper.Current.WriteEx("将Class保存成XML文档发生异常", ex, EnumLogType.Error); + return false; + } + } + + /// + /// 将XML文档中数据读取到类的实例中 + /// + /// + /// + /// + public static T ReadXMLToModel(string filePath) where T : class + { + try + { + FileInfo fInfo = new FileInfo(filePath); + if (!fInfo.Directory.Exists) + { + fInfo.Directory.Create(); + } + using (FileStream fs = new FileStream(filePath, FileMode.Open)) + { + T model = XmlDeserializer(fs); + return model; + } + } + catch (Exception ex) + { + //LogHelper.Current.WriteEx("读取XML转换成实例异常", ex, EnumLogType.Error); + return default(T); + } + } + } +} diff --git a/JinYuan.Helper/app.config b/JinYuan.Helper/app.config new file mode 100644 index 0000000..a2625f6 --- /dev/null +++ b/JinYuan.Helper/app.config @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.Helper/packages.config b/JinYuan.Helper/packages.config new file mode 100644 index 0000000..daf59d1 --- /dev/null +++ b/JinYuan.Helper/packages.config @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JinYuan.MES/Enums/MesResType.cs b/JinYuan.MES/Enums/MesResType.cs new file mode 100644 index 0000000..9ce04d8 --- /dev/null +++ b/JinYuan.MES/Enums/MesResType.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Enums +{ + /// + /// + /// + public enum MesResType + { + [Description("停线")] + A = 1, + [Description("排出")] + B = 2, + [Description("警示")] + C = 3, + [Description("OK值")] + D = 4, + [Description("未知的结果")] + UnKnow = 99999 + } +} diff --git a/JinYuan.MES/Enums/MesUploadType.cs b/JinYuan.MES/Enums/MesUploadType.cs new file mode 100644 index 0000000..643b470 --- /dev/null +++ b/JinYuan.MES/Enums/MesUploadType.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Enums +{ + /// + /// MES上传的三种类型 + /// + public enum MesUploadType + { + /// + /// 单进整出 + /// + [Description("DZ")] + DZ = 1, + /// + /// 整进整出 + /// + [Description("ZZ")] + ZZ = 2, + /// + /// 单进单出 + /// + [Description("DD")] + DD = 3, + + } +} + diff --git a/JinYuan.MES/IMes.cs b/JinYuan.MES/IMes.cs new file mode 100644 index 0000000..10c6eaf --- /dev/null +++ b/JinYuan.MES/IMes.cs @@ -0,0 +1,164 @@ +using JinYuan.MES.Enums; +using JinYuan.MES.Models; +using JinYuan.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES +{ + /// + /// MES接口 + /// + public interface IMes + { + /// + /// 登录接口 + /// + Task<(bool Success, string Message, string MesUserLevel)> LoginAsync(string url, string siteCode, string lineCode, string equipNum, string userName, string passWord); + + Task<(bool Success, string Message)> LoginAsync(string url, string siteCode, string lineCode, string equipNum, string UserCardID); + + /// + /// 设备参数设定值请求接口 + /// + Task<(ParamReturnData Data, string Mesage)> GetParamSetRequestAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName); + + /// + /// 参数设定值变更接口 + /// + Task<(bool Success, string ResJson)> ParamChangeAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List paramChangeItems); + + /// + /// 箱唛信息获取 + /// + Task<(bool success, string mesMessage, MesResType mesResType, List cartonTagInfos)> QueryCartonAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode); + + /// + /// 栈板信息获取 + /// + Task<(bool success, string mesMessage, MesResType mesResType, string palletCode, List palletTagInfos)> QueryPalletAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode); + + /// + /// 客户标签与系统标签绑定 + /// + Task<(bool success, string mesMessage, MesResType mesResType)> BindingAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode, string palletCode, string custcartonCode, string custpalletCode, List custcarton, List custpallet); + + ///// + ///// 复投单个上传(只上传条码,不上传卷芯码) + ///// + //Task<(bool Success, string MesMessage, MesResType MesResType)> SingleFTCellInStationAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, string BarCode); + + ///// + ///// 电芯进站接口(多个) + ///// + //Task<(bool Success, List MesMessage, List MesResType)> ManyCellInStationAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List listBar); + + //Task<(bool Success, List MesMessage, List MesResType, List CellCode)> ManyCellInStationAsync1(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List listBar); + + ///// + ///// 电芯出站接口(多个) + ///// + //Task<(bool Success, List MesMessage, List MesResType)> OutboundInformationsAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List listBar); + + ///// + ///// 组装出站(单电池) + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + //Task<(bool Success, string Mesage, MesResType MesResType)> SingleCellInAndOutStationAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, BGearEntity m, int type, string materialLotCodeLocator); + + + ///// + ///// 原材料上传 + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + //Task<(bool Success, string MesMessage, MesResType MesResType)> RawMaterialStationAsync(string url, string MaterialCode, string equipNum, string BarCode); + ///// + ///// 产品过程加工参数接口 + ///// + //Task<(bool Success, string ResJson)> ProductProcessParamAsync(string url, string siteCode, string userName, string equipNum, string lineCode, string materialCode, MesUploadType unloadType, List productProcessParam); + + ///// + ///// 产品结果加工参数接口 + ///// + //Task<(bool Success, string ResJson)> ProducResultParamAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, BGearEntity m, MesUploadType unloadType, string insertTime); + + ///// + ///// 单电芯出站 + ///// + //Task<(bool Success, string Mesage, MesResType MesResType)> SingleCellOutStationAsync(string url, string siteCode, string lineCode, string equipNum, string modelName, string materialCode, string userName, BGearEntity m, int type, string materialLotCodeLocator); + + ///// + ///// 多电芯出站接口 + ///// + //Task<(bool Success, List MesMessage, List MesResType)> ManyCellOutStationAsync(string url, string siteCode, string lineCode, string equipNum, string modelName, string materialCode, string userName, List m, int type, string materialLotCodeLocator,List listNGCode,List listNGMessage); + + /// + /// 设备运行状态接口 + /// + Task<(bool Success, string ResJson)> UploadEquStatusAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, string guid, string statusCode, List faultCodes); + + /// + /// 设备报警接口 + /// + Task<(bool Success, string Mesage)> UploadEquAlarmAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List alarmObj, string guid); + + /// + /// 能耗数据上传 + /// + Task<(bool Success, string Mesage)> UploadEquEnergyAsync(string url, string siteCode, string lineCode, string equipNum, string userName, List electricMeterNum, List wattrs); + + /// + /// 风速仪数据上传 + /// + Task<(bool Success, string Mesage)> UploadDeviceCollectDataAsync(string url, string equipNum, List antiDustAirSpeedNum, List collectData); + /// + /// 自动分档--获取OCV挡位 + /// + Task<(bool Success, List MesLevel, List MesPassage, List MesMessage)> GetOCVShiftAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode, string materialCode, string userName, List barCodeList); + + /// + /// 获取国内OCV数据 + /// + Task<(bool Success, string Mesage, MesData data)> GetOcvListAsync(string url, string warehouseCode, string customerCode, List barCodeList); + + + /// + /// 翻包设备上传绑定信息接口-内箱翻内箱(适用于G11仓) + /// + /// + /// + /// + /// + /// + /// + //Task<(bool Success, string MesMessage, MesResType MesResType)> GetAroundBagListAsync(string url, string warehouseCode, string customerCode, string CardBarcode, List InnerBoxLabelList); + + /// + /// 翻包设备拉取不完整VDA数据 + /// + /// + /// + /// + /// + /// + //Task<(bool Success, string Mesage, DataItem data)> GetVDAListAsync(string url, string warehouseCode, string customerCode, string CardBarcode); + } +} diff --git a/JinYuan.MES/JinYuan.MES.csproj b/JinYuan.MES/JinYuan.MES.csproj new file mode 100644 index 0000000..ab32da6 --- /dev/null +++ b/JinYuan.MES/JinYuan.MES.csproj @@ -0,0 +1,93 @@ + + + + + Debug + AnyCPU + {530B6426-08E7-461C-91DC-787F876620FC} + Library + Properties + JinYuan.MES + JinYuan.MES + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\JinYuan.VirtualDataLibrary\bin\Debug\JinYuan.VirtualDataLibrary.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360} + JinYuan.Helper + + + {4C0BCB84-5CD7-4846-8363-C4C10D46E391} + JinYuan.Models + + + + + + + + \ No newline at end of file diff --git a/JinYuan.MES/MESApiHelper.cs b/JinYuan.MES/MESApiHelper.cs new file mode 100644 index 0000000..198080e --- /dev/null +++ b/JinYuan.MES/MESApiHelper.cs @@ -0,0 +1,164 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES +{ + public static class MESApiHelper + { + private static readonly HttpClient _httpClient; + private static string _appId; + private static string _appKey; + private static string _token; + private static DateTime _tokenExpireTime; + + private const string TOKEN_URL = "https://example.com/api/oauth/token"; // Token 获取地址 + + static MESApiHelper() + { + _httpClient = new HttpClient(); + _httpClient.Timeout = TimeSpan.FromSeconds(10); // 设置默认超时 + } + + /// + /// 初始化 AppId 和 AppKey + /// + /// + /// + public static void Initialize(string appId, string appKey) + { + _appId = appId; + _appKey = appKey; + } + + /// + /// 确保 Token 有效 + /// + private static async Task EnsureTokenValidAsync() + { + if (string.IsNullOrEmpty(_token) || DateTime.Now >= _tokenExpireTime) + { + await RefreshTokenAsync(); + } + } + + /// + /// 刷新 Token + /// + private static async Task RefreshTokenAsync() + { + var tokenRequest = new + { + appId = _appId, + appKey = _appKey + }; + + var response = await SendRequestAsync(TOKEN_URL, HttpMethod.Post, tokenRequest, false); + + if (response != null && response.Success) + { + _token = response.Token; + _tokenExpireTime = DateTime.Now.AddSeconds(response.Expire); + } + else + { + throw new Exception("获取 Token 失败"); + } + } + + /// + /// 发送 HTTP 请求 + /// + /// 返回类型 + /// 请求地址 + /// HTTP 方法 + /// 请求数据 + /// 是否需要认证 + /// + public static async Task SendRequestAsync(string url, HttpMethod method, object data = null, bool requiresAuth = true) + { + if (requiresAuth) + { + await EnsureTokenValidAsync(); + } + + using (var request = new HttpRequestMessage(method, url)) + { + if (requiresAuth) + { + request.Headers.Add("Authorization", $"Bearer {_token}"); + } + + if (data != null) + { + var json = JsonConvert.SerializeObject(data); + request.Content = new StringContent(json, Encoding.UTF8, "application/json"); + } + + var response = await _httpClient.SendAsync(request); + var content = await response.Content.ReadAsStringAsync(); + + if (!response.IsSuccessStatusCode) + { + throw new HttpRequestException($"请求失败: {response.StatusCode}, {content}"); + } + + return JsonConvert.DeserializeObject(content); + } + } + + /// + /// 发送 HTTP 请求并返回字符串 + /// + /// 请求地址 + /// HTTP 方法 + /// 请求数据 + /// 是否需要认证 + /// + public static async Task SendRequestStringAsync(string url, HttpMethod method, object data = null, bool requiresAuth = true) + { + if (requiresAuth) + { + await EnsureTokenValidAsync(); + } + + using (var request = new HttpRequestMessage(method, url)) + { + if (requiresAuth) + { + request.Headers.Add("Authorization", $"Bearer {_token}"); + } + + if (data != null) + { + //var json = JsonConvert.SerializeObject(data); + request.Content = new StringContent(data.ToString(), Encoding.UTF8, "application/json"); + } + + var response = await _httpClient.SendAsync(request); + var content = await response.Content.ReadAsStringAsync(); + + if (!response.IsSuccessStatusCode) + { + throw new HttpRequestException($"请求失败: {response.StatusCode}, {content}"); + } + + return content; + } + } + } + + /// + /// Token 响应模型 + /// + public class TokenResponse + { + public bool Success { get; set; } + public string Token { get; set; } + public int Expire { get; set; } + } + +} diff --git a/JinYuan.MES/MesDataProcess.cs b/JinYuan.MES/MesDataProcess.cs new file mode 100644 index 0000000..d2b09f5 --- /dev/null +++ b/JinYuan.MES/MesDataProcess.cs @@ -0,0 +1,1726 @@ +using JinYuan.Helper; +using JinYuan.MES.Enums; +using JinYuan.MES.Models; +using JinYuan.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using static System.Runtime.CompilerServices.RuntimeHelpers; + +namespace JinYuan.MES +{ + public class MesDataProcess : IMes + { + + #region 1、登录验证 √ + + /// 账号密码登录(异步方法) + /// + /// API地址 + /// 站点代码 + /// 线体代码 + /// 设备编号 + /// 用户名 + /// 密码 + /// 用户卡ID + /// 返回结果(是否成功、消息) userCardID = UserCardID + public async Task<(bool Success, string Message, string MesUserLevel)> LoginAsync(string url, string siteCode, string lineCode, string equipNum, string userName, string passWord) + { + bool res = false; // 操作结果 + string resJson = ""; // 日志信息 + string message = ""; // 消息 + string mesUserName = "";//mes返回登陆权限 + + try + { + // 创建请求模型 + var model = new LoginEntity + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + userName = userName, + passWord = passWord, + + }; + + // 序列化请求数据 + var nowDate = DateTime.Now; + var postData = JsonConvert.SerializeObject(model); + + // 记录请求开始时间 + var sw = Stopwatch.StartNew(); + + // 调用异步API + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postData, false); + + // 记录请求结束时间 + sw.Stop(); + + // 如果返回结果为空,记录日志并返回 + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用员工权限校验接口:{url},请求数据为:{postData},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\员工权限校验\{nowDate.ToString("HH")}.txt", resJson); + return (res, message, mesUserName); + } + + // 解析返回结果 + var res1 = JsonConvert.DeserializeObject(result); + + // 如果操作成功 + if (res1 != null && res1.success && string.IsNullOrEmpty(res1.code) && string.IsNullOrEmpty(res1.message)) + { + //mes登陆权限赋值 + //if (res1.rows[0].username == userName) { mesUserName = res1.rows[0].permissionLevel; } + if (res1.rows[0] == userName) { mesUserName = res1.rows[0]; } + res = true; + message = res1.message; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用员工权限校验接口:{url},请求数据为:{postData}\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\员工权限校验\{nowDate.ToString("HH")}.txt", resJson); + } + else + { + // 如果操作失败,记录日志 + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + message = res1?.message ?? "未知错误"; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用员工权限校验接口:{url},请求数据为:{postData}\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\员工权限校验\{nowDate.ToString("HH")}.txt", resJson); + } + } + catch (Exception ex) + { + // 捕获异常并记录日志 + message = "调用员工权限校验接口发生异常"; + resJson = $"调用员工权限校验接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("调用员工权限校验接口", ex); + } + + // 返回结果 + return (res, message, mesUserName); + } + + /// + /// 刷卡登录 + /// + /// + /// + /// + /// + /// + /// + public async Task<(bool Success, string Message)> LoginAsync(string url, string siteCode, string lineCode, string equipNum, string UserCardID) + { + bool res = false; // 操作结果 + string resJson = ""; // 日志信息 + string message = ""; // 消息 + + try + { + // 创建请求模型 + var model = new LoginEntity + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + userCardID = UserCardID, + + }; + + // 序列化请求数据 + var nowDate = DateTime.Now; + var postData = JsonConvert.SerializeObject(model); + + // 记录请求开始时间 + var sw = Stopwatch.StartNew(); + + // 调用异步API + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postData, false); + + // 记录请求结束时间 + sw.Stop(); + + // 如果返回结果为空,记录日志并返回 + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用员工权限校验接口:{url},请求数据为:{postData},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\员工权限校验\{nowDate.ToString("HH")}.txt", resJson); + return (res, message); + } + + // 解析返回结果 + var res1 = JsonConvert.DeserializeObject(result); + + // 如果操作成功 + if (res1 != null && res1.success && string.IsNullOrEmpty(res1.code) && string.IsNullOrEmpty(res1.message)) + { + res = true; + message = res1.message; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用员工权限校验接口:{url},请求数据为:{postData}\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\员工权限校验\{nowDate.ToString("HH")}.txt", resJson); + } + else + { + // 如果操作失败,记录日志 + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + message = res1?.message ?? "未知错误"; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用员工权限校验接口:{url},请求数据为:{postData}\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\员工权限校验\{nowDate.ToString("HH")}.txt", resJson); + } + } + catch (Exception ex) + { + // 捕获异常并记录日志 + message = "调用员工权限校验接口发生异常"; + resJson = $"调用员工权限校验接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("调用员工权限校验接口", ex); + } + + // 返回结果 + return (res, message); + } + #endregion + + #region 2、获取MES参数请求 + /// + /// 获取MES参数请求 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public async Task<(ParamReturnData Data, string Mesage)> GetParamSetRequestAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName) + { + string resJson = ""; + string mesage = ""; // 用于存储消息 + + try + { + var model = new + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + materialCode = materialCode, + userName = userName + }; + + var nowDate = DateTime.Now; + var postcontent = JsonConvert.SerializeObject(model); + + var sw = new Stopwatch(); + sw.Start(); + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + + sw.Stop(); + + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备参数设定值请求接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备参数设定值请求\{nowDate.ToString("HH")}.txt", resJson); + return (null, mesage); + } + + var res1 = ReturnMesMsg(result); + if (res1.success) + { + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备参数设定值请求接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备参数设定值请求\{nowDate.ToString("HH")}.txt", resJson); + } + else + { + var resData = res1 == null ? "" : result; + mesage = "MES返回结果为空"; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备参数设定值请求接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备参数设定值请求\{nowDate.ToString("HH")}.txt", resJson); + } + return (res1, mesage); + } + catch (Exception ex) + { + mesage = $"设备参数设定值请求接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("设备参数设定值请求接口", ex); + return (null, mesage); + } + } + #endregion + + #region 3、参数变更请求 + /// + /// 参数变更请求 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public async Task ParamChange(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List paramChangeItems) + { + bool res = false; + string resJson = ""; + try + { + var model = new ParamChange + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + materialCode = materialCode, + userName = userName, + }; + + var nowDate = DateTime.Now; + var postcontent = JsonConvert.SerializeObject(model); + + var sw = new Stopwatch(); + sw.Start(); + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + sw.Stop(); + + + var resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用参数设定值变更接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\MesLogs\{nowDate.ToString("yyyyMMdd")}\参数设定值变更\{nowDate.ToString("HH")}.txt", resJson); + + } + catch (Exception ex) + { + resJson = $"参数设定值变更接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("参数设定值变更接口", ex); + } + + return res; + + } + #endregion + + + + /// + /// 将MES返回的category转换为MesResType + /// + private MesResType GetMesResType(string category) + { + if (string.IsNullOrEmpty(category)) + return MesResType.B; + + switch (category.ToUpper()) + { + case "A": + return MesResType.A; // 停线 + case "B": + return MesResType.B; // 排出 + case "C": + return MesResType.C; // 忽略(需警示) + case "D": + return MesResType.D; // 成功 + default: + return MesResType.B; // 默认排出 + } + } + + #region 箱唛信息获取 + /// + /// 箱唛信息获取 + /// + /// API地址 /api/public/equip/auto/cartonquery + /// 工厂代码 + /// 产线编号 + /// 设备编号 + /// 卡板码(箱唛号) + /// 返回结果(是否成功、消息列表、响应类型列表) + public async Task<(bool success, string mesMessage, MesResType mesResType, List cartonTagInfos)> QueryCartonAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode) + { + bool success = false; // 操作结果 + string rawJson = ""; // + string message = ""; // 消息列表 + MesResType mesResType = MesResType.C; + List cartonTagInfos = new List(); + + try + { + // 参数验证 + if (string.IsNullOrEmpty(containerCode)) + { + message = "容器码为空"; + return (success, message, mesResType, cartonTagInfos); + } + + // 创建请求模型 + var model = new QueryCartonPalletParam + { + siteCode = siteCode, + equipNum = equipNum, + lineCode = lineCode, + containerCode = containerCode + }; + + + // 序列化请求数据 + var nowDate = DateTime.Now; + var postcontent = JsonConvert.SerializeObject(model); + + // 记录请求开始时间 + var sw = Stopwatch.StartNew(); + + // 调用异步API + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + // 记录请求结束时间 + sw.Stop(); + rawJson = result; + + // 如果请求耗时超过1秒,记录日志 + long outTime = sw.ElapsedMilliseconds; + if (outTime > 1000) + { + //LogHelper.Instance.WriteLog($"进站PC<=>MES上传耗时:{outTime}ms,电芯码:{listBar[0]},{listBar[1]},{listBar[2]},{listBar[3]}", "MESTime"); + LogHelper.Instance.WriteLog($"箱唛信息获取PC<=>MES耗时:{outTime}ms", "MESTime"); + } + + // 记录请求日志 + string requestLog = $"{nowDate:yyyy-MM-dd HH:mm:ss.fff}:调用箱唛信息获取接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds):yyyy-MM-dd HH:mm:ss.fff}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate:yyyyMMdd}\箱唛信息获取\{nowDate:HH}.txt", requestLog); + + // 如果返回结果为空,记录日志并返回 + if (string.IsNullOrEmpty(result)) + { + //string resData = result == "" ? "" : result; + //resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用箱唛信息获取接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + //TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\箱唛信息获取\{nowDate.ToString("HH")}.txt", resJson); + //return (success, mesMessage, mesResType, cartonTagInfos); + message = "MES接口返回空结果"; + return (success, message, mesResType, cartonTagInfos); + } + + // 解析返回结果 + var response = JsonConvert.DeserializeObject(result); + + // 如果操作成功 + if (response != null && response.success) + { + success = true; + ProcessCartonResponse(response, ref message, ref mesResType, ref cartonTagInfos); // 处理返回结果 + //resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用箱唛信息获取接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + //TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\箱唛信息获取\{nowDate.ToString("HH")}.txt", resJson); + if (success && mesResType == MesResType.D) + { + message = $"箱唛信息获取成功,共获取 {cartonTagInfos?.Count ?? 0} 个标签信息"; + return (success, message, mesResType, cartonTagInfos); + } + else + { + return (success, message, mesResType, cartonTagInfos); + } + } + else + { + //// 如果操作失败,记录日志 + //var resData = response == null ? "" : result; + //resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用箱唛信息获取接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + //TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\箱唛信息获取\{nowDate.ToString("HH")}.txt", resJson); + // 如果操作失败 + message = response?.message ?? "MES接口返回失败状态"; + mesResType = GetMesResType(response?.category); + return (success, message, mesResType, cartonTagInfos);//MesResult>.Fail(message, mesResType, rawJson); + } + } + catch (Exception ex) + { + // 捕获异常并记录日志 + message = $"箱唛信息获取接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("箱唛信息获取接口", ex); + } + + // 返回结果 + return (success, message, mesResType, cartonTagInfos); + } + + /// + /// 箱唛信息获取返回数据处理 + /// + /// + /// + /// + /// + private void ProcessCartonResponse(MesResponseCarton response, ref string message, ref MesResType mesResType, ref List cartonTagInfos) + { + if (response != null) + { + cartonTagInfos = response.rows ?? new List(); + message = response.message; + if (response.success) + { + mesResType = MesResType.D; + message = "MES箱唛信息获取成功 "; + // 检查数据完整性 + if (cartonTagInfos.Count == 0) + { + message = "未获取到箱唛标签信息"; + mesResType = MesResType.B; + } + } + else + { + mesResType = GetMesResType(response.category); + } + } + else + { + message = "响应数据为空"; + mesResType = MesResType.B; + } + } + #endregion + + #region 栈板获取 + /// + /// 栈板信息获取 + /// + /// API地址 /api/public/equip/auto/palletquery + /// 工厂代码 + /// 产线编号 + /// 设备编号 + /// 卡板码(箱唛号) + /// 返回结果(是否成功、消息列表、响应类型列表) + public async Task<(bool success, string mesMessage, MesResType mesResType, string palletCode, List palletTagInfos)> QueryPalletAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode) + { + bool success = false; // 操作结果 + string rawJson = ""; // 日志信息 + string message = ""; // 消息列表 + string palletCode = ""; // 栈板编码 + MesResType mesResType = MesResType.C; + List palletTagInfos = new List(); + + try + { + if (string.IsNullOrEmpty(containerCode)) + { + message = "容器码为空"; + return (success, message, mesResType, palletCode, palletTagInfos); + } + var model = new QueryCartonPalletParam + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + containerCode = containerCode + }; + + var nowDate = DateTime.Now; + var postcontent = JsonConvert.SerializeObject(model); + + + var sw = Stopwatch.StartNew(); + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + sw.Stop(); + + rawJson = result; + + // 如果请求耗时超过1秒,记录日志 + long outTime = sw.ElapsedMilliseconds; + if (outTime > 1000) + { + LogHelper.Instance.WriteLog($"栈板信息获取PC<=>MES耗时:{outTime}ms", "MESTime"); + } + + // 记录请求日志 + string requestLog = $"{nowDate:yyyy-MM-dd HH:mm:ss.fff}:调用栈板信息获取接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds):yyyy-MM-dd HH:mm:ss.fff}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate:yyyyMMdd}\栈板信息获取\{nowDate:HH}.txt", requestLog); + + // 如果返回结果为空,记录日志并返回 + if (string.IsNullOrEmpty(result)) + { + message = "MES接口返回空结果"; + return (success, message, mesResType, palletCode, palletTagInfos); + } + + // 解析返回结果 + var response = JsonConvert.DeserializeObject(result); + if (response != null && response.success) + { + success = true; + ProcessPalletResponse(response, ref message, ref mesResType, ref palletCode, ref palletTagInfos); // 处理返回结果 + if (success && mesResType == MesResType.D) + { + message = $"栈板信息获取成功,共获取 {palletTagInfos?.Count ?? 0} 个标签信息"; + } + + } + else + { + message = response?.message ?? "MES接口返回失败状态"; + mesResType = GetMesResType(response?.category); + } + } + catch (Exception ex) + { + message = $"栈板信息获取接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("栈板信息获取接口", ex); + } + + // 返回结果 + return (success, message, mesResType, palletCode, palletTagInfos); + } + + /// + /// 栈板信息获取返回数据处理 + /// + /// + /// + /// + /// + private void ProcessPalletResponse(MesResponsePallet response, ref string message, ref MesResType mesResType, ref string palletCode, ref List palletTagInfos) + { + if (response == null || response.rows == null || response.rows.Count == 0) + { + message = "响应数据为空或无有效行数据"; + mesResType = MesResType.B; + return; + } + + PalletRow firstRow = response.rows[0]; + palletCode = firstRow?.palletCode ?? string.Empty; + palletTagInfos = firstRow?.tagList ?? new List(); + + if (response.success) + { + mesResType = MesResType.D; + message = "MES栈板信息获取成功 "; + + // 检查数据完整性 + if (palletTagInfos.Count == 0) + { + message = "未获取到栈板标签信息"; + mesResType = MesResType.B; + } + else + { + message = "栈板信息获取成功"; + } + } + else + { + mesResType = GetMesResType(response.category); + message = response.message ?? "MES接口返回失败"; + } + + + } + #endregion + + #region 客户标签与系统标签绑定 + /// + /// 客户标签与系统标签绑定 + /// + /// API地址 /api/public/equip/auto/ //TODO 待补充! + /// 工厂代码 + /// 产线编号 + /// 设备编号 + /// 卡板码(箱唛号) + /// 栈板码 + /// 客户箱唛码 + /// 客户栈板码 + /// 客户箱唛信息 + /// 客户栈板信息 + /// 返回结果(是否成功、消息列表、响应类型列表) + public async Task<(bool success, string mesMessage, MesResType mesResType)> BindingAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode, string palletCode, string custcartonCode, string custpalletCode, List custcarton, List custpallet) + { + bool success = false; // 操作结果 + string rawJson = ""; // 日志信息 + string message = ""; // 消息列表 + MesResType mesResType = MesResType.C; + + try + { + // 参数验证 + if (string.IsNullOrEmpty(containerCode)) + { + message = "容器码为空"; + return (success, message, mesResType); + } + + // 创建请求模型 + var model = new BindingParam + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + containerCode = containerCode, + palletCode = palletCode, + custcartonCode = custcartonCode, + custpalletCode = custpalletCode, + custcarton = custcarton, + custpallet = custpallet + }; + + // 序列化请求数据 + var nowDate = DateTime.Now; + var postcontent = JsonConvert.SerializeObject(model); + + // 记录请求开始时间 + var sw = Stopwatch.StartNew(); + + // 调用异步API + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + // 记录请求结束时间 + sw.Stop(); + rawJson = result; + + // 如果请求耗时超过1秒,记录日志 + long outTime = sw.ElapsedMilliseconds; + if (outTime > 1000) + { + //LogHelper.Instance.WriteLog($"进站PC<=>MES上传耗时:{outTime}ms,电芯码:{listBar[0]},{listBar[1]},{listBar[2]},{listBar[3]}", "MESTime"); + LogHelper.Instance.WriteLog($"客户标签与系统标签绑定PC<=>MES耗时:{outTime}ms", "MESTime"); + } + + // 记录请求日志 + string requestLog = $"{nowDate:yyyy-MM-dd HH:mm:ss.fff}:调用客户标签与系统标签绑定接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds):yyyy-MM-dd HH:mm:ss.fff}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate:yyyyMMdd}\客户标签与系统标签绑定\{nowDate:HH}.txt", requestLog); + + // 如果返回结果为空,记录日志并返回 + if (string.IsNullOrEmpty(result)) + { + //string resData = result == "" ? "" : result; + //resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用客户标签与系统标签绑定接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + //TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\客户标签与系统标签绑定\{nowDate.ToString("HH")}.txt", resJson); + //return (res, mesMessage, mesResType); + message = "MES接口返回空结果"; + //return MesResult.Fail(message, MesResType.B, rawJson); + return (success, message, mesResType); + } + + // 解析返回结果 + var response = JsonConvert.DeserializeObject(result); + + // 如果操作成功 + if (response != null && response.success) + { + success = true; + ProcessBindingResponse(response, ref message, ref mesResType); // 处理返回结果 + //resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用客户标签与系统标签绑定接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + //TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\卡板电芯信息上传(装箱)\{nowDate.ToString("HH")}.txt", resJson); + if (success && mesResType == MesResType.D) + { + message = "客户标签与系统标签绑定成功"; + //return MesResult.Ok(true, message, rawJson); + return (success, message, mesResType); + } + else + { + //return MesResult.Fail(message, mesResType, rawJson); + return (success, message, mesResType); + } + } + else + { + //// 如果操作失败,记录日志 + //var resData = res1 == null ? "" : result; + //resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用客户标签与系统标签绑定接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + //TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\客户标签与系统标签绑定\{nowDate.ToString("HH")}.txt", resJson); + // 如果操作失败 + message = response?.message ?? "MES接口返回失败状态"; + //mesResType = GetMesResType(response?.category); + //return MesResult.Fail(message, mesResType, rawJson); + return (success, message, mesResType); + } + } + catch (Exception ex) + { + //// 捕获异常并记录日志 + //resJson = $"客户标签与系统标签绑定接口发生异常:{ex.Message}"; + //LoggerHelp.WriteLog($"客户标签与系统标签绑定接口{ex}"); + // 捕获异常并记录日志 + message = $"客户标签与系统标签绑定接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("客户标签与系统标签绑定接口", ex); + //return MesResult.Fail(message, MesResType.B, rawJson); + return (success, message, mesResType); + } + + // 返回结果 + //return (res, mesMessage, mesResType); + } + + /// + /// 客户标签与系统标签绑定返回数据处理 + /// + /// + /// + /// + /// + private void ProcessBindingResponse(MesResponse response, ref string message, ref MesResType mesResType) + { + if (response != null) + { + message = response.message; + if (response.success) + { + mesResType = MesResType.D; + message = "MES客户标签与系统标签绑定成功"; + } + else + { + //mesResType = GetMesResType(response.category); + } + } + else + { + message = "响应数据为空"; + mesResType = MesResType.B; + } + } + #endregion + + private List GetTagDataVOList(BGearEntity m, string insertTime, string equipNum,Payload1 payload1) + { + //var AGearList = + + List datavolist = new List(); + + string strFileName = System.Environment.CurrentDirectory + "\\采集项目表.csv"; + + FileStream fileStream = new FileStream(strFileName, FileMode.Open, FileAccess.Read, FileShare.Read); + StreamReader streamReader = new StreamReader(fileStream); + _ = streamReader.ReadLine(); + while (!streamReader.EndOfStream) + { + string line = streamReader.ReadLine(); + string[] keys = line.Split(new string[] { "," },StringSplitOptions.RemoveEmptyEntries); + if (keys.Length == 3) + { + var temp = m.GetType().GetProperty(keys[1]).GetValue(m, null); + if (keys[1] == "TestTime" && string.IsNullOrEmpty(insertTime)) + { + datavolist.Add(new TagDataVOListItem() + { + tagCode = keys[0], + tagValue = insertTime,//m + tagTime = DateTime.Now.ToString(), + tagCalculateResult = "Y", + tagRemark = keys[2] + }); + } + else + { + datavolist.Add(new TagDataVOListItem() + { + tagCode = keys[0], + tagValue = temp == null ? "0" : temp.ToString(),//m + tagTime = DateTime.Now.ToString(), + tagCalculateResult = "Y", + tagRemark = keys[2] + }); + } + } + } + + //return datavolist; + //} + + //#region 本地字段没有,手动赋值 + + //{//非Y项//工序名称 + // // 产线名称 + // // 设备编号 + // //操作员 + // //班次 + // //生产型号 + + // // 工厂名称 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "factory_name", + // tagValue = payload1.siteCode, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "工厂名称" + // }); + // // 工序名称 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "process_name", + // tagValue = m.CSBYHPROCESSNAME, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "工序名称" + // }); + // // 产线名称 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "production_line_name", + // tagValue = payload1.lineCode, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "产线名称" + // }); + // // 设备编码 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "equipment_id", + // tagValue = equipNum, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "设备编码" + // }); + // // 操作员 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "operator", + // tagValue = payload1.userName, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "操作员" + // }); + // // 班次 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "work_shift", + // tagValue = m.CSBYHSCHEDULE, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "班次" + // }); + // // 生产型号 + // datavolist.Add(new TagDataVOListItem() + // { + // tagCode = "product_model", + // tagValue = payload1.materialCode, + // tagTime = DateTime.Now.ToString(), + // tagCalculateResult = "", + // tagRemark = "生产型号" + // }); + //} + + //#endregion + + return datavolist; + } + + + #region 12、设备状态 + /// + /// 设备状态 + /// + /// API URL + /// 站点代码 + /// 生产线代码 + /// 设备编号 + /// 物料代码 + /// 用户名 + /// 唯一标识 + /// 状态代码 + /// 故障代码列表 + /// 返回操作结果和消息 + public async Task<(bool Success, string ResJson)> UploadEquStatusAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, string guid, string statusCode, List faultCodes) + { + bool res = false; + string resJson = ""; + + try + { + DateTime nowDate = DateTime.Now; + string sNowDate = nowDate.ToString("yyyy-MM-dd HH:mm:ss"); + + var parameters = new EqpStatusParam + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + materialCode = materialCode, + userName = userName, + seatId = "", + recordDate = sNowDate, + statusCode = statusCode.ToString(), + uploadTime = sNowDate, + guid = guid + }; + + // 设置故障代码列表 + parameters.faultCodeList = faultCodes; + + var postcontent = JsonConvert.SerializeObject(parameters); + var sw = Stopwatch.StartNew(); + + // 异步调用 + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + sw.Stop(); + + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{sNowDate}:调用设备运行状态接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备运行状态\{nowDate.ToString("HH")}.txt", resJson); + return (res, resJson); + } + + var res1 = ReturnMesMsg(result); + if (!res1.success) + { + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + resJson = $"{sNowDate}:调用设备运行状态接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备运行状态\{nowDate.ToString("HH")}.txt", resJson); + } + else + { + res = true; + resJson = $"{sNowDate}:调用设备运行状态接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备运行状态\{nowDate.ToString("HH")}.txt", resJson); + } + } + catch (Exception ex) + { + resJson = $"设备运行状态接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("设备运行状态接口", ex); + } + + return (res, resJson); + } + #endregion + + #region 13、设备报警上传接口 + /// + /// 设备报警上传接口 + /// + /// API URL + /// 站点代码 + /// 生产线代码 + /// 设备编号 + /// 物料代码 + /// 用户名 + /// 报警数据列表 + /// 唯一标识 + /// 返回操作结果和消息 + public async Task<(bool Success, string Mesage)> UploadEquAlarmAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List alarmObj, string guid) + { + bool res = false; + string resJson = ""; + string mesage = ""; // 用于存储消息 + + try + { + var nowDate = DateTime.Now; + + if (alarmObj.Count > 0) + { + Console.WriteLine($"{nowDate}: 开始处理报警数据,数量:{alarmObj.Count}"); + + var model = new UploadAlarmParam + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + materialCode = materialCode, + userName = userName, + recordDate = nowDate.ToString("yyyy-MM-dd HH:mm:ss"), + guid = guid, + seatId = "" + }; + + model.alarmLineList = new List(); + for (int j = 0; j < alarmObj.Count; j++) + { + AlarmLineListItem alarmList = new AlarmLineListItem + { + alarmEndTime = System.Convert.ToString(alarmObj[j].EndTime), + alarmType = alarmObj[j].AlarmType, + alarmName = alarmObj[j].AlarmContent, + alarmStartTime = System.Convert.ToString(alarmObj[j].StartTime), + faultCode = alarmObj[j].AlarmCode + }; + model.alarmLineList.Add(alarmList); + + Console.WriteLine($"{nowDate}: 添加报警数据 - 报警类型:{alarmObj[j].AlarmType}, 报警内容:{alarmObj[j].AlarmContent}"); + } + + var postcontent = JsonConvert.SerializeObject(model); + Console.WriteLine($"{nowDate}: 请求数据已序列化:{postcontent}"); + + var sw = Stopwatch.StartNew(); + Console.WriteLine($"{nowDate}: 开始调用设备报警信息接口"); + + // 异步调用 + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + sw.Stop(); + Console.WriteLine($"{nowDate}: 接口调用完成,耗时:{sw.ElapsedMilliseconds}ms"); + + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备报警信息接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\报警信息\{nowDate.ToString("HH")}.txt", resJson); + Console.WriteLine($"{nowDate}: 接口返回结果为空"); + return (res, mesage); + } + + var res1 = ReturnMesMsg(result); + if (!res1.success) + { + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + mesage = res1.message; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备报警信息接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\报警信息\{nowDate.ToString("HH")}.txt", resJson); + Console.WriteLine($"{nowDate}: 接口调用失败,消息:{mesage}"); + } + else + { + res = true; + mesage = res1.message; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备报警信息接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\报警信息\{nowDate.ToString("HH")}.txt", resJson); + Console.WriteLine($"{nowDate}: 接口调用成功,消息:{mesage}"); + } + } + else + { + Console.WriteLine($"{nowDate}: 报警数据为空,无需处理"); + } + } + catch (Exception ex) + { + resJson = $"调用设备报警信息接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("调用设备报警信息接口", ex); + Console.WriteLine($"{DateTime.Now}: 发生异常:{ex.Message}"); + } + + return (res, mesage); + } + #endregion + + #region 14、上传设备能耗数据 + /// + /// 上传设备能耗数据 + /// + /// API URL + /// 站点代码 + /// 生产线代码 + /// 设备编号 + /// 用户名 + /// 电表编号列表 + /// 能耗数据列表 + /// 返回操作结果和日志信息 + public async Task<(bool Success, string Mesage)> UploadEquEnergyAsync(string url, string siteCode, string lineCode, string equipNum, string userName, List electricMeterNum, List wattrs) + { + bool res = false; + string mesage = ""; + + try + { + var nowDate = DateTime.Now; + Console.WriteLine($"{nowDate}: 开始处理设备能耗数据"); + + // 序列化请求数据 + var postcontent = JsonConvert.SerializeObject(wattrs); + Console.WriteLine($"{nowDate}: 请求数据已序列化:{postcontent}"); + + var sw = Stopwatch.StartNew(); + Console.WriteLine($"{nowDate}: 开始调用设备能耗信息接口"); + + // 异步调用 + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + sw.Stop(); + Console.WriteLine($"{nowDate}: 接口调用完成,耗时:{sw.ElapsedMilliseconds}ms"); + + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + mesage = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备能耗信息接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备能耗信息\{nowDate.ToString("HH")}.txt", mesage); + Console.WriteLine($"{nowDate}: 接口返回结果为空"); + return (res, mesage); + } + + var res1 = ReturnMesMsg(result); + if (!res1.success) + { + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + mesage = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备能耗信息接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备能耗信息\{nowDate.ToString("HH")}.txt", mesage); + Console.WriteLine($"{nowDate}: 接口调用失败,返回结果:{resData}"); + } + else + { + res = true; + mesage = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用设备能耗信息接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\设备能耗信息\{nowDate.ToString("HH")}.txt", mesage); + Console.WriteLine($"{nowDate}: 接口调用成功,返回结果:{result}"); + } + } + catch (Exception ex) + { + mesage = $"调用设备能耗信息接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("调用设备能耗信息接口", ex); + Console.WriteLine($"{DateTime.Now}: 发生异常:{ex.Message}"); + } + + return (res, mesage); + } + #endregion + + #region 15、风速仪数据上传至MES + /// + /// 风速仪数据上传至MES + /// + /// API URL + /// 设备编号 + /// 风速仪编号列表 + /// 采集数据列表 + /// 返回操作结果和消息 + public async Task<(bool Success, string Mesage)> UploadDeviceCollectDataAsync(string url, string equipNum, List antiDustAirSpeedNum, List collectData) + { + bool res = false; + string resJson = ""; + string mesage = ""; // 用于存储消息 + + try + { + if (collectData == null || collectData.Count == 0) + { + mesage = "采集数据为空,无需处理"; + Console.WriteLine($"{DateTime.Now}: {mesage}"); + return (res, mesage); + } + + var nowDate = DateTime.Now; + Console.WriteLine($"{nowDate}: 开始处理风速仪数据"); + + // 创建请求模型 + UploadDeviceCollectData uploadDevice = new UploadDeviceCollectData + { + appid = "e1012966a936170c6fcab98e24042d10", + device_code = equipNum, + collect_time = GetUnixTimestamp() + }; + + // 填充采集数据 + List list = new List(); + for (int i = 0; i < collectData.Count; i++) + { + Collect_code_value_list _Value_List = new Collect_code_value_list + { + target_code = 5, + target_value = collectData[i].ToString(), + target_value_tag = antiDustAirSpeedNum[i] + }; + list.Add(_Value_List); + + Console.WriteLine($"{nowDate}: 添加采集数据 - 风速仪编号:{antiDustAirSpeedNum[i]}, 采集值:{collectData[i]}"); + } + uploadDevice.collect_code_value_list = list; + + // 序列化请求数据 + string postcontent = JsonConvert.SerializeObject(uploadDevice); + Console.WriteLine($"{nowDate}: 请求数据已序列化:{postcontent}"); + + var sw = Stopwatch.StartNew(); + Console.WriteLine($"{nowDate}: 开始调用风速接口"); + + // 异步调用 + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + sw.Stop(); + Console.WriteLine($"{nowDate}: 接口调用完成,耗时:{sw.ElapsedMilliseconds}ms"); + + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用风速接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\风速信息\{nowDate.ToString("HH")}.txt", resJson); + mesage = "接口返回结果为空"; + Console.WriteLine($"{nowDate}: {mesage}"); + return (res, mesage); + } + + var res1 = ReturnMesMsg(result); + if (!res1.success) + { + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + mesage = res1.message; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用风速接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\风速信息\{nowDate.ToString("HH")}.txt", resJson); + Console.WriteLine($"{nowDate}: 接口调用失败,消息:{mesage}"); + } + else + { + res = true; + mesage = res1.message; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用风速接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\风速信息\{nowDate.ToString("HH")}.txt", resJson); + Console.WriteLine($"{nowDate}: 接口调用成功,消息:{mesage}"); + } + } + catch (Exception ex) + { + resJson = $"调用风速接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("调用风速接口", ex); + Console.WriteLine($"{DateTime.Now}: 发生异常:{ex.Message}"); + } + + return (res, mesage); + } + #endregion + + + /// + /// 序列化各类返回 + /// + /// + /// + /// + private T ReturnMesMsg(string ret) + { + + try + { + return JsonConvert.DeserializeObject(ret); + } + catch (System.Exception ex) + { + return default(T); + } + } + + public List GetMesType(int Num) + { + List mesResTypes = new List(); + for (int i = 0; i < Num; i++) + { + mesResTypes.Add(MesResType.B); + } + return mesResTypes; + } + + + public List GetListString(int Num, string str) + { + List mesResTypes = new List(); + for (int i = 0; i < Num; i++) + { + mesResTypes.Add(str); + } + return mesResTypes; + } + + + /// + ///本地时间为Unix时间戳 + /// + /// + public static long GetUnixTimestamp() + { + return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; + } + + public Task<(bool Success, string ResJson)> ParamChangeAsync(string url, string siteCode, string lineCode, string equipNum, string materialCode, string userName, List paramChangeItems) + { + throw new NotImplementedException(); + } + + + //public Task<(bool Success, string ResJson)> ProductProcessParamAsync(string url, string siteCode, string userName, string equipNum, string lineCode, string materialCode, MesUploadType unloadType, List productProcessParam) + //{ + // throw new NotImplementedException(); + //} + + + //#endregion + + + #region 17、自动分档接口 + public async Task<(bool Success, List MesLevel, List MesPassage, List MesMessage)> GetOCVShiftAsync(string url, string siteCode, string lineCode, string equipNum, string containerCode, string materialCode, string userName, List barCodeList) + { + bool res = false; + string resJson = ""; + List mesLevel = GetListString(barCodeList.Count, "1"); + List mesPassage = GetListString(barCodeList.Count, ""); // 通道 + List mesMessage = GetListString(barCodeList.Count, "");// 信息 + //List mesPassagewayNum = GetListString(barCodeList.Count, ""); // + + try + { + DateTime nowDate = DateTime.Now; + string sNowDate = nowDate.ToString("yyyy/MM/dd HH:mm:ss"); + + var parameters = new GetOCVShift + { + siteCode = siteCode, + lineCode = lineCode, + equipNum = equipNum, + recordDate = sNowDate, + qty = barCodeList.Count.ToString(), + containerCode = containerCode, + materialCode = materialCode, + userName = userName, + materiallotCodeList = barCodeList, + }; + + var postcontent = JsonConvert.SerializeObject(parameters); + var sw = Stopwatch.StartNew(); + + // 异步调用 + string result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, postcontent, false); + + sw.Stop(); + + if (string.IsNullOrEmpty(result)) + { + string resData = result == "" ? "" : result; + resJson = $"{sNowDate}:调用自动分档接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\自动分档\{nowDate.ToString("HH")}.txt", resJson); + return (res, mesLevel, mesPassage, mesMessage); + } + + var res1 = ReturnMesMsg(result); + if (!res1.success) + { + var resData = res1 == null ? "" : JsonConvert.SerializeObject(res1); + resJson = $"{sNowDate}:调用自动分档接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\自动分档\{nowDate.ToString("HH")}.txt", resJson); + } + else + { + res = true; + //GetDMCMesResData(res1, barCodeList, ref mesLevel, ref mesPassage, ref mesMessage); + resJson = $"{sNowDate}:调用自动分档接口:{url},请求数据为:{postcontent},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{JsonConvert.SerializeObject(result)}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\自动分档\{nowDate.ToString("HH")}.txt", resJson); + } + } + catch (Exception ex) + { + resJson = $"自动分档接口发生异常:{ex.Message}"; + LogHelper.Instance.WriteEX("自动分档接口", ex); + } + + return (res, mesLevel, mesPassage, mesMessage); + } + + #endregion + + #region 18、获取OCV数据 + public async Task<(bool Success, string Mesage, MesData data)> GetOcvListAsync(string url, string warehouseCode, string customerCode, List barCodeList) + { + bool res = false; // 操作结果 + string mesage = ""; // 消息 + string result = string.Empty; + var nowDate = DateTime.Now; + MesData mesData = new MesData(); + string resJson = ""; + try + { + var request = new + { + warehouseCode = warehouseCode, + customerCode = customerCode, + stdSnList = barCodeList + }; + + var sw = Stopwatch.StartNew(); + // 异步调用 + result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, request, true); + sw.Stop(); + + if (string.IsNullOrEmpty(result)) + { + var resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用获取OCV信息接口:{url},请求数据为:{JsonConvert.SerializeObject(request)},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\获取OCV信息\{nowDate.ToString("HH")}.txt", resJson); + mesage = "MES未返回数据"; + return (res, mesage, null); + } + + res = true; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用获取OCV信息接口:{url},请求数据为:{JsonConvert.SerializeObject(request)},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\获取OCV信息\{nowDate.ToString("HH")}.txt", resJson); + + // 处理MES响应数据 + + //var data = ProcessMESResponse(result); + //if (data == null) + //{ + // mesage = $"条码{barCodeList[0]}的MES数据处理失败"; + // return (res, mesage, data); + //} + //else + //{ + + // //处理成功 + // return (res, mesage, data); + //} + + } + catch (Exception ex) + { + resJson = $"获取OCV信息异常:{ex.Message}"; + mesage = $"获取OCV信息异常:{ex.Message}"; + LogHelper.Instance.WriteEX("获取OCV接口", ex); + } + + return (res, mesage, mesData); + } + #endregion + + #region 19、翻包设备上传绑定信息接口-内箱翻内箱(适用于G11仓) + public async Task<(bool Success, string MesMessage, MesResType MesResType)> GetAroundBagListAsync(string url, string warehouseCode, string customerCode, string CardBarcode, List InnerBoxLabelLists) + { + bool res = false; // 操作结果 + string mesage = ""; // 用于存储消息 + MesResType mesResType = MesResType.A; // 默认为 NG + + string result = string.Empty; + var nowDate = DateTime.Now; + string resJson = ""; + try + { + var model = new WmsUpload + { + warehouseCode = warehouseCode, + customerCode = customerCode, + equipmentCode = "0019", + equipmentName = "19号翻包机", + trayLabel = CardBarcode, + }; + //托盘详细信息 + model.innerBoxLabelList = InnerBoxLabelLists; + + var sw = Stopwatch.StartNew(); + // 异步调用 + result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, model, true); + sw.Stop(); + + if (string.IsNullOrEmpty(result)) + { + var resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:翻包设备上传绑定信息接口(内箱翻内箱):{url},请求数据为:{JsonConvert.SerializeObject(model)},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\翻包上传绑定信息\{nowDate.ToString("HH")}.txt", resJson); + mesage = "WMS返回数据为空"; + return (res, mesage, mesResType); + } + + // 处理MES响应数据 + var res1 = ReturnMesMsg(result); + res = true; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:翻包设备上传绑定信息接口(内箱翻内箱):{url},请求数据为:{JsonConvert.SerializeObject(model)},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\翻包上传绑定信息\{nowDate.ToString("HH")}.txt", resJson); + + mesage = res1.message; + + if (res1.result) + { + mesResType = MesResType.D; //MES OK + + } + + } + catch (Exception ex) + { + resJson = $"翻包上传绑定信息异常:{ex.Message}"; + LogHelper.Instance.WriteEX("翻包上传绑定信息", ex); + } + + return (res, mesage, mesResType); + } + + + #endregion + + #region 18、获取VDA数据 + public async Task<(bool Success, string Mesage, DataItem data)> GetVDAListAsync(string url, string warehouseCode, string customerCode, string CardBarcode) + { + bool res = false; // 操作结果 + string mesage = ""; // 消息 + string result = string.Empty; + var nowDate = DateTime.Now; + DataItem mesData = new DataItem(); + string resJson = ""; + try + { + var request = new VdaGetData + { + warehouseCode = warehouseCode, + customerCode = customerCode, + labelTemplateCode = "VDA-C", + codeDataList = new List + { + new CodeData { trayLabel = CardBarcode } + } + }; + + var sw = Stopwatch.StartNew(); + // 异步调用 + result = await MESApiHelper.SendRequestStringAsync(url, HttpMethod.Post, request, true); + sw.Stop(); + + if (string.IsNullOrEmpty(result)) + { + var resData = result == "" ? "" : result; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用翻包拉取不完整VDA信息接口:{url},请求数据为:{JsonConvert.SerializeObject(request)},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{resData}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\拉取不完整VDA信息\{nowDate.ToString("HH")}.txt", resJson); + mesage = "MES未返回数据"; + return (res, mesage, null); + } + + res = true; + resJson = $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用翻包拉取不完整VDA信息接口:{url},请求数据为:{JsonConvert.SerializeObject(request)},\n{nowDate.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{result}"; + TxtHelper.WriteTxt($@"D:\APILog\Logs\MesLogs\{nowDate.ToString("yyyyMMdd")}\拉取不完整VDA信息\{nowDate.ToString("HH")}.txt", resJson); + + // 处理MES响应数据 + + var data = ProcessMESResponse(result); + if (data == null) + { + mesage = $"底托卡板条码{CardBarcode}获取VDA接口dataList失败"; + return (res, mesage, mesData); + } + else + { + + //处理成功 + return (res, mesage, data); + } + + } + catch (Exception ex) + { + resJson = $"拉取不完整VDA信息异常:{ex.Message}"; + mesage = $"拉取不完整VDA信息异常:{ex.Message}"; + LogHelper.Instance.WriteEX("拉取不完整VDA接口", ex); + } + + return (res, mesage, mesData); + } + + /// + /// 处理MES系统返回的数据 + /// + /// + /// + private DataItem ProcessMESResponse(string response) + { + if (string.IsNullOrEmpty(response)) + { + return null; + } + + try + { + var (success, data) = ParseMESData(response); + return success ? data : null; + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX("处理MES响应时发生错误", ex); + return null; + } + } + + private (bool success, DataItem data) ParseMESData(in string jsonResponse) + { + // 使用 JObject 动态解析 JSON 数据 + var jsonObject = JObject.Parse(jsonResponse); + + // 使用模式匹配和空值检查 + if (!(jsonObject["result"] is JToken resultToken) || + //!resultToken.ToObject() || + !(jsonObject["dataList"] is JArray dataList) || + dataList.Count == 0) + { + return (false, null); + } + + var dataObject = dataList[0] as JObject; + if (dataObject == null) + { + return (false, null); + } + + return (true, new DataItem + { + receiver = GetStringValue(dataObject, "receiver"),//1 + unloading = GetStringValue(dataObject, "unloading"),//2 + adciveNo = GetStringValue(dataObject, "adciveNo"),//3 暂时不使用 数字+条形码(格式为39码) + supplier = GetStringValue(dataObject, "supplier"),//4 + netWeight = GetStringValue(dataObject, "netWeight"),//5 + groWeight = GetStringValue(dataObject, "groWeight"),//6 + noBoxes = GetStringValue(dataObject, "noBoxes"),//7 + partNo = GetStringValue(dataObject, "partNo"),//8 数字+条形码(格式为39码) + bmwDmc = GetStringValue(dataObject, "bmwDmc"),//8-1 二维码 + bmwDmcJYA = GetStringValue(dataObject, "bmwDmcJYA"),//8-1 二维码(解析后) + + quantity = GetStringValue(dataObject, "quantity"),//9 数字+条形码(格式为39码) + skuDescr = GetStringValue(dataObject, "skuDescr"),//10 + sku = GetStringValue(dataObject, "sku"),//11.1 + packageNo = GetStringValue(dataObject, "packageNo"),//11.2 + spid = GetStringValue(dataObject, "spid"),//12 数字+条形码(格式为39码) + date = GetStringValue(dataObject, "date"),//13 + drawNo = GetStringValue(dataObject, "drawNo"),//14 + serialNo = GetStringValue(dataObject, "serialNo"),//15 数字+条形码(格式为39码) + batchNo = GetStringValue(dataObject, "batchNo"),//16 数字+条形码(格式为39码) + + //TestTime = GetDateTimeValue(dataObject, "TestTime"), + //OCV5 = GetDoubleValue(dataObject, "OCV5"), + //OCVTIME1 = GetDateTimeValue(dataObject, "OCVTIME1"), + }); + } + + // 辅助方法,使用 C# 7.3 的 in 参数 + private string GetStringValue(in JObject obj, in string propertyName) + => obj[propertyName]?.ToString(); + + private double? GetDoubleValue(in JObject obj, in string propertyName) + { + if (obj[propertyName] is JToken token && token.Type != JTokenType.Null) + { + try + { + return token.ToObject(); + } + catch + { + //LogError($"转换属性 {propertyName} 到 double 类型失败"); + return null; + } + } + return null; + } + + private DateTime? GetDateTimeValue(in JObject obj, in string propertyName) + { + if (obj[propertyName] is JToken token && token.Type != JTokenType.Null) + { + try + { + return token.ToObject(); + } + catch + { + //LogError($"转换属性 {propertyName} 到 DateTime 类型失败"); + return null; + } + } + return null; + } + #endregion + } +} diff --git a/JinYuan.MES/Models/BatteryInfo.cs b/JinYuan.MES/Models/BatteryInfo.cs new file mode 100644 index 0000000..cc19902 --- /dev/null +++ b/JinYuan.MES/Models/BatteryInfo.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; + +namespace JinYuan.MES.Models +{ + + /// + /// 卡板电芯信息上传(装箱)接口参数类 + /// + public class PackParam + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 卡板码(箱唛号) + /// + public string ContainerCode { get; set; } + public int capacity { get; set; } + /// + /// 档位 + /// + public string grade { get; set; } + public string materialCode { get; set; } + /// + /// 电芯信息列表 + /// + public List cellDataVOList { get; set; } + }; + + + public class BatteryInfo + { + //电芯条码 + public string identification { get; set; } + + //电芯条码位置 + public string locationBat { get; set; } + } +} diff --git a/JinYuan.MES/Models/BindingParam.cs b/JinYuan.MES/Models/BindingParam.cs new file mode 100644 index 0000000..563c968 --- /dev/null +++ b/JinYuan.MES/Models/BindingParam.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; + +namespace JinYuan.MES.Models +{ + + /// + /// 客户标签与系统标签绑定 + /// + public class BindingParam + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 卡板码 + /// + public string containerCode { get; set; } + /// + /// 栈板码 + /// + public string palletCode { get; set; } + /// + /// 客户箱唛码 + /// + public string custcartonCode { get; set; } + /// + /// 客户栈板码 + /// + public string custpalletCode { get; set; } + /// + /// 客户箱唛信息 + /// + public List custcarton { get; set; } + /// + /// 客户栈板信息 + /// + public List custpallet { get; set; } + }; + +} diff --git a/JinYuan.MES/Models/CartonParam.cs b/JinYuan.MES/Models/CartonParam.cs new file mode 100644 index 0000000..fbf868a --- /dev/null +++ b/JinYuan.MES/Models/CartonParam.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace JinYuan.MES.Models +{ + + /// + /// 箱唛/栈板信息获取接口参数类 + /// + public class QueryCartonPalletParam + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 卡板码 + /// + public string containerCode { get; set; } + }; + +} diff --git a/JinYuan.MES/Models/EqpStatusParam.cs b/JinYuan.MES/Models/EqpStatusParam.cs new file mode 100644 index 0000000..f74c546 --- /dev/null +++ b/JinYuan.MES/Models/EqpStatusParam.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 设备状态上传接口参数类 + /// + public class EqpStatusParam + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 库位ID + /// + public string seatId { get; set; } + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 设备状态 。Run:(正常运行)、Alert:(故障调试)、Idle:(闲置待机)、Maintain(停止运行) + /// + public string statusCode { get; set; } + /// + /// 状态变更时间 + /// + public string uploadTime { get; set; } + /// + /// 唯一标识符号 + /// + public string guid { get; set; } + /// + /// 故障代码数组 + /// + public List faultCodeList { get; set; } + } + + public class FaultCodeList + { + /// + /// 故障代码 + /// + public string faultCode { get; set; } + } +} diff --git a/JinYuan.MES/Models/GetOCVShift.cs b/JinYuan.MES/Models/GetOCVShift.cs new file mode 100644 index 0000000..bd4d51b --- /dev/null +++ b/JinYuan.MES/Models/GetOCVShift.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + internal class GetOCVShift + { + /// + /// 站点编码 + /// + public string siteCode { get; set; } + /// + /// 产线编码 + /// + public string lineCode { get; set; } + /// + /// 设备编码 + /// + public string equipNum { get; set; } + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 传入条码的个数 + /// + public string qty { get; set; } + /// + /// 托盘码 + /// + public string containerCode { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 条码数组 + /// + public List materiallotCodeList { get; set; } + } +} diff --git a/JinYuan.MES/Models/LoginEnyity.cs b/JinYuan.MES/Models/LoginEnyity.cs new file mode 100644 index 0000000..e1a6b71 --- /dev/null +++ b/JinYuan.MES/Models/LoginEnyity.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 登录 + /// + public class LoginEntity + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 员工密码 + /// + public string passWord { get; set; } + /// + /// 刷卡员工账号 + /// + public string userCardID { get; set; } + } +} diff --git a/JinYuan.MES/Models/ManyCellInStation.cs b/JinYuan.MES/Models/ManyCellInStation.cs new file mode 100644 index 0000000..942667b --- /dev/null +++ b/JinYuan.MES/Models/ManyCellInStation.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + + /// + /// 多个电池进站 + /// + public class ManyCellInStation + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + + /// + /// 产品类型 + /// + public string productType { get; set; } + /// + /// 电芯条码 + /// + // public List identificationList { get; set; } + public string identification { get; set; } + /// + /// 容器条码 + /// + public List containerCodeList { get; set; } + } + +} diff --git a/JinYuan.MES/Models/ManyCellOutStation.cs b/JinYuan.MES/Models/ManyCellOutStation.cs new file mode 100644 index 0000000..f24f94e --- /dev/null +++ b/JinYuan.MES/Models/ManyCellOutStation.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + + /// + /// 多个电池出站 × + /// + public class ManyCellOutStation + { + /// + /// + /// + public string siteCode { get; set; } + /// + /// + /// + public string lineCode { get; set; } + /// + /// + /// + public string equipNum { get; set; } + /// + /// + /// + public string materialCode { get; set; } + /// + /// + /// + public string userName { get; set; } + /// + /// 产品类型 + /// + public string productType { get; set; } + /// + /// 完工数 + /// + public string completeQty { get; set; } + /// + /// 托盘码 + /// + public string containerCode { get; set; } + /// + /// 1:通用出站;2:合芯出站;3:虚拟码替换出站;4:追溯标识替换出站;5:合芯有顶盖出站 + /// + public int type { get; set; } + + /// + /// 条码数组 + /// + public List identiftyList { get; set; } + + } + + + public class identiftyList + { + + /// + /// 产品条码 + /// + public string identification { get; set; } + /// + /// 原材料信息 + /// + public List materialLotList = new List(); + /// + /// 原材料条码 + /// + public string materialLotCode { get; set; } + /// + /// 原材料上料位置 + /// + public string materialLotCodeLocator { get; set; } + /// + /// 质量状态 + /// + public string qualityStatus { get; set; } + /// + /// 关联条码 + /// + public string qrCode { get; set; } + /// + /// NG编码 + /// + public List ngCode = new List(); + /// + /// NG错误信息 + /// + public string ngMessage = ""; + + } + + +} diff --git a/JinYuan.MES/Models/MesResponse.cs b/JinYuan.MES/Models/MesResponse.cs new file mode 100644 index 0000000..250147f --- /dev/null +++ b/JinYuan.MES/Models/MesResponse.cs @@ -0,0 +1,390 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 执行结果 + /// + public class MesResponse + { + /// + /// 错误代码 错误代码,成功不返回 + /// + public string code { get; set; } + /// + /// 数据处理消息 成功不返回 + /// + public string message { get; set; } + /// + /// 成功标识 false失败 true 成功 + /// + public bool success { get; set; } + } + + + + + + #region 获取箱唛信息 + public class MesResponseCarton + { + /// + /// 返回箱唛信息参数 + /// + public List rows { get; set; } + /// + /// MES信息返回成功标识 false失败 true 成功,整盘绑定无问题允许放行:true;箱唛还没完全绑定成功:false + /// + public bool success { get; set; } + /// + /// 返回错误代码:成功200,错误204 + /// + public string code { get; set; } + /// + /// 返回报错消息类型:A:停线、B:排出、C:忽略(需警示) + /// + public string category { get; set; } + /// + /// 返回失败原因 + /// + public string message { get; set; } + } + + public class TagInfo + { + /// + /// 箱唛信息参数代码 + /// + public string tagCode { get; set; } + /// + /// 箱唛信息参数值 + /// + public string tagValue { get; set; } + } + + #endregion + + + #region 获取栈板信息 + + public class PalletRow + { + /// + /// 栈板编码 + /// + public string palletCode { get; set; } + /// + /// 标签信息列表 + /// + public List tagList { get; set; } + } + + public class MesResponsePallet + { + /// + /// 返回栈板信息参数 + /// + public List rows { get; set; } + /// + /// MES信息返回成功标识 false失败 true 成功,整盘绑定无问题允许放行:true;箱唛还没完全绑定成功:false + /// + public bool success { get; set; } + /// + /// 返回错误代码:成功200,错误204 + /// + public string code { get; set; } + /// + /// 返回报错消息类型:A:停线、B:排出、C:忽略(需警示) + /// + public string category { get; set; } + /// + /// 返回失败原因 + /// + public string message { get; set; } + } + #endregion + + + #region 员工校验反馈 + public class MesResponseLogin + { + /// + /// 返回参数 + /// + // public List rows { get; set; } + public List rows { get; set; } + /// + /// 错误代码 错误代码,成功不返回 + /// + public string code { get; set; } + /// + /// MES信息返回成功标识 false失败 true 成功 + /// + public bool success { get; set; } + /// + /// 数据处理消息 成功不返回 + /// + public string message { get; set; } + /// + /// 报错消息类型 A=停线,B=排出,C=忽略(需警示) + /// + public string category { get; set; } + /// + /// 返回参数条数 + /// + public int total { get; set; } + } + public class RowsItemLogin + { + /// + /// 用户名 + /// + public string username { get; set; } + /// + /// 用户名权限 + /// + public string permissionLevel { get; set; } + } + #endregion + + #region 自动分档返回接口 + public class MesResponseGrad + { + /// + /// 返回参数 + /// + public List rows { get; set; } + /// + /// MES信息返回成功标识 false失败 true 成功 + /// + public bool success { get; set; } + /// + /// 返回参数条数 + /// + public int total { get; set; } + } + + public class RowsItemGrad + { + /// + /// 返回成品条码 + /// + public string identification { get; set; } + /// + /// 返回等级 + /// + public string level { get; set; } + /// + /// + /// + public string rank { get; set; } + /// + /// 返回通道 + /// + public string passage { get; set; } + /// + /// 返回信息 + /// + public string message { get; set; } + /// + /// + /// + public string ngType { get; set; } + /// + /// + /// + //public string passagewayNum { get; set; } + } + #endregion + + #region 获取OCV返回接口 + public class MESOCVResponse + { + public bool result { get; set; } + public string code { get; set; } + public string message { get; set; } + public List dataList { get; set; } + } + public class MesData + { + public string factoryCode { get; set; } + public string factoryDescription { get; set; } + public string sku { get; set; } + public string cellModel { get; set; } + public int warehouseId { get; set; } + public int customerId { get; set; } + public string TransNo { get; set; } + public string Employee { get; set; } + public DateTime? Optime { get; set; } + public DateTime? TestTime { get; set; } + public string CardID { get; set; } + public string StdSN { get; set; } + public string Thickness1 { get; set; } + public string Thickness2 { get; set; } + public string Thickness3 { get; set; } + public string Thickness4 { get; set; } + public string Thickness5 { get; set; } + public string Weighing { get; set; } + public string Resistance { get; set; } + public string CellResistance { get; set; } + public string CellVoltage { get; set; } + public string CellCapacity { get; set; } + public string insulationCurrent { get; set; } + public string OVCResistance1 { get; set; } + public string OVCResistance2 { get; set; } + public string OVCResistance3 { get; set; } + public double? OCV1 { get; set; } + public double? OCV2 { get; set; } + public double? OCV3 { get; set; } + public double? OCV4 { get; set; } + public double? OCV5 { get; set; } + public DateTime? OCVTIME1 { get; set; } + public DateTime? OCVTIME2 { get; set; } + public DateTime? OCVTIME3 { get; set; } + public DateTime? OCVTIME4 { get; set; } + public DateTime? OCVTIME5 { get; set; } + public string K1 { get; set; } + public string K2 { get; set; } + public string warehouseCodeRot { get; set; } + public string customerCodeRot { get; set; } + } + #endregion + + #region 获取VDA信息 + public class VDAResponse + { + public string result { get; set; } + public string code { get; set; } + public string message { get; set; } + public List dataList { get; set; } + } + public class DataItem + { + + public string trayLabel { get; set; } + /// + /// 1 + /// + public string receiver { get; set; } + /// + /// 2 + /// + public string unloading { get; set; } + /// + /// 3暂时不使用 数字+条形码(格式为39码) + /// + public string adciveNo { get; set; } + /// + /// 4 + /// + public string supplier { get; set; } + /// + /// 5 + /// + public string netWeight { get; set; } + /// + /// 6 + /// + public string groWeight { get; set; } + /// + /// 7 + /// + public string noBoxes { get; set; } + /// + /// 8数字+条形码(格式为39码) + /// + public string partNo { get; set; } + /// + /// 8-1 二维码 + /// + public string bmwDmc { get; set; } + /// + /// 8-1 二维码(解析后) + /// + public string bmwDmcJYA { get; set; } + /// + /// 9数字+条形码(格式为39码) + /// + public string quantity { get; set; } + /// + /// 10 + /// + public string skuDescr { get; set; } + /// + /// 11.1 + /// + public string sku { get; set; } + /// + /// 11.2 + /// + public string packageNo { get; set; } + /// + /// 12 数字+条形码(格式为39码) + /// + public string spid { get; set; } + /// + /// 13 + /// + public string date { get; set; } + /// + /// 14 + /// + public string drawNo { get; set; } + /// + /// 15 数字+条形码(格式为39码) + /// + public string serialNo { get; set; } + /// + /// 16 数字+条形码(格式为39码) + /// + public string batchNo { get; set; } + + } + + #endregion + + #region WMS上传反馈 + public class WMSResponse + { + /// + /// 结果 + /// + public bool result { get; set; } + /// + /// 错误码 + /// + public string code { get; set; } + /// + /// 信息 + /// + public string message { get; set; } + } + #endregion + + + /// + /// 执行结果Entity,带返回值 + /// + /// + public class RequestResult : MesResponse + { + public T Result { get; set; } + } + + + /// + /// 执行结果List,带返回值 + /// + /// + public class RequestResultList : MesResponse + { + public List Result { get; set; } + } + +} diff --git a/JinYuan.MES/Models/ParamChange.cs b/JinYuan.MES/Models/ParamChange.cs new file mode 100644 index 0000000..bf7146b --- /dev/null +++ b/JinYuan.MES/Models/ParamChange.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 设备参数设定值变更 + /// + public class ParamChange + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 变更时间 + /// + public string changeTime { get; set; } + /// + /// 数据组编码 + /// + public string tagGroupCode { get; set; } + /// + /// 数据组描述 + /// + public string tagGroupDescription { get; set; } + /// + /// 数据项数组 + /// + public List tagList { get; set; } + } + public class TagListItem + { + /// + /// 数据项编码 + /// + public string tagCode { get; set; } + /// + /// 变更前计量单位 + /// + public string unitBefore { get; set; } + /// + /// 变更前标准值 + /// + public string standardValueBefore { get; set; } + /// + /// 变更前符合值 + /// + public string trueValueBefore { get; set; } + /// + /// 变更前不符合值 + /// + public string falseValueBefore { get; set; } + /// + /// 变更前最小值 + /// + public int minValueBefore { get; set; } + /// + /// 变更前最大值 + /// + public int maxValueBefore { get; set; } + /// + /// 变更后计量单位 + /// + public string unitAfter { get; set; } + /// + /// 变更后标准值 + /// + public string standardValueAfter { get; set; } + /// + /// 变更后符合值 + /// + public string trueValueAfter { get; set; } + /// + /// 变更后不符合值 + /// + public string falseValueAfter { get; set; } + /// + /// 变更后最小值 + /// + public int minValueAfter { get; set; } + /// + /// 变更后最大值 + /// + public int maxValueAfter { get; set; } + } +} diff --git a/JinYuan.MES/Models/ParamReturnData.cs b/JinYuan.MES/Models/ParamReturnData.cs new file mode 100644 index 0000000..0e4a60e --- /dev/null +++ b/JinYuan.MES/Models/ParamReturnData.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 设备参数设定值返回 + /// + public class ParamReturnData + { + /// + /// 返回参数 + /// + public List rows { get; set; } + /// + /// 成功标识 + /// + public bool success { get; set; } + /// + /// 返回参数条数 + /// + public int total { get; set; } + } + + + /// + /// 返回参数项 + /// + public class RowsItem + { + /// + /// 数据组编码 + /// + public string tagGroupCode { get; set; } + /// + /// 配方0002 + /// + public string tagGroupDescription { get; set; } + /// + /// 数据组描述 + /// + public List tagList { get; set; } + } + + /// + /// 数据组描述 + /// + public class ReturnDataTagListItem + { + /// + /// + /// + public string tagCode { get; set; } + /// + /// 真空度设定值 + /// + public string tagDescription { get; set; } + /// + /// + /// + public string valueType { get; set; } + /// + /// + /// + public string unit { get; set; } + /// + /// + /// + public string standardValue { get; set; } + /// + /// + /// + public string trueValue { get; set; } + /// + /// + /// + public string falseValue { get; set; } + /// + /// + /// + public string minValue { get; set; } + /// + /// + /// + public string maxValue { get; set; } + /// + /// + /// + public string tagRemark { get; set; } + } +} diff --git a/JinYuan.MES/Models/ProductProcessParam.cs b/JinYuan.MES/Models/ProductProcessParam.cs new file mode 100644 index 0000000..8c11595 --- /dev/null +++ b/JinYuan.MES/Models/ProductProcessParam.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 产品过程加工参数 + /// + public class ProductProcessParam + { + } +} diff --git a/JinYuan.MES/Models/ProductResultParameters.cs b/JinYuan.MES/Models/ProductResultParameters.cs new file mode 100644 index 0000000..040945d --- /dev/null +++ b/JinYuan.MES/Models/ProductResultParameters.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 结果加工参数 + /// + public class ProductResultParameters + { + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 类型单进整出:DZ 整进整出:ZZ 单进单出:DD 未传时默认按照ZZ进行数据解析 + /// + public string type { get; set; } + /// + /// 设备数据 + /// + public string payload { get; set; } + } + + /// + /// 单进整出 + /// + public class Payload1 + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 物料编码 工单产成品物料号 + /// + public string materialCode { get; set; } + /// + /// 小车号 装载电池的小车编号 + /// + public string carCode { get; set; } + /// + /// 补录 是否属于补录数据(BL=补录,JS=及时上传) + /// + public string collection { get; set; } + /// + /// 采集时间 数据的采集时间 + /// + public string recordDate { get; set; } + /// + /// 条码数量 传入条码的个数 + /// + public int qty { get; set; } + /// + /// RFID托杯码 + /// + public string containerCode { get; set; } + /// + /// 条码数组 + /// + + public IdentificationListItem identification { get; set; } + public List tagDataVOList { get; set; } + } + + public class IdentificationListItem + { + /// /// + /// 条码 + /// + public string identification { get; set; } + /// + /// 质量状态 各产品所有参数的整体判断结果(Y/N) + /// + public string qualityStatus { get; set; } + /// + /// 采集数组 + /// + + } + + + + public class TagDataVOListItem + { + /// + /// 设备每个采集项规定的编号 + /// + public string tagCode { get; set; } + /// + /// 采集值 + /// + public string tagValue { get; set; } + /// + /// 采集项采集时间 + /// + public string tagTime { get; set; } + /// + /// 各产品所有参数的整体判断结果(Y/N) + /// + public string tagCalculateResult { get; set; } + /// + /// 采集项描述 + /// + public string tagRemark { get; set; } + } +} diff --git a/JinYuan.MES/Models/SingleCellInStation.cs b/JinYuan.MES/Models/SingleCellInStation.cs new file mode 100644 index 0000000..8728277 --- /dev/null +++ b/JinYuan.MES/Models/SingleCellInStation.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 单个电池进站 + /// + public class SingleCellInStation + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// + /// + public string identification { get; set; } + /// + /// + /// + public string productType { get; set; } + } + +} diff --git a/JinYuan.MES/Models/SingleCellOutStation.cs b/JinYuan.MES/Models/SingleCellOutStation.cs new file mode 100644 index 0000000..35c27d2 --- /dev/null +++ b/JinYuan.MES/Models/SingleCellOutStation.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + + + public class MaterialLotListItem + { + /// + /// + /// + public string materialLotCode { get; set; } + /// + /// + /// + public string materialLotCodeLocator { get; set; } + } + + public class IdentiftyListItem + { + /// + /// 条码 + /// + public string identification { get; set; } + /// + /// 质量状态 + /// + public string qualityStatus { get; set; } + /// + /// 关联条码 + /// + public string qrCode { get; set; } + /// + /// NG2信息,NG1信息 + /// + public string ngMessage { get; set; } + /// + /// + /// + public List ngCode { get; set; } + /// + /// + /// + public List materialLotList { get; set; } + } + + public class SingleCellOutStation + { + /// + /// + /// + public string siteCode { get; set; } + /// + /// + /// + public string lineCode { get; set; } + /// + /// + /// + public string equipNum { get; set; } + /// + /// + /// + public string userName { get; set; } + /// + /// + /// + public string productType { get; set; } + + public string completeQty { get; set; } + + public string materialCode { get; set; } + + /// + /// + /// + public string containerCode { get; set; } + + public string type { get; set; } + + + + public List identiftyList { get; set; } = new List(); + } + + //public class AssembleLineList + //{ + // public string identification { get; set; } + + // public string qualityStatus{ get; set; } + + // public string qrCode { get; set; } + + // public List ngCode { get; set;} = new List(); + + // public string ngMessage { get; set; } + //} + +} diff --git a/JinYuan.MES/Models/UploadAlarmParam.cs b/JinYuan.MES/Models/UploadAlarmParam.cs new file mode 100644 index 0000000..b75362b --- /dev/null +++ b/JinYuan.MES/Models/UploadAlarmParam.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + /// + /// 报警数据上传接口参数类 + /// + public class UploadAlarmParam + { + /// + /// 工厂代码 + /// + public string siteCode { get; set; } + /// + /// 产线编号 + /// + public string lineCode { get; set; } + /// + /// 设备编号 + /// + public string equipNum { get; set; } + /// + /// 物料编码 + /// + public string materialCode { get; set; } + /// + /// 员工账号 + /// + public string userName { get; set; } + /// + /// 采集时间 + /// + public string recordDate { get; set; } + /// + /// 唯一标识符号 + /// + public string guid { get; set; } + /// + /// 库位ID 库位ID,化成段用 + /// + public string seatId { get; set; } + /// + /// 报警数组 + /// + public List alarmLineList { get; set; } + } + + + /// + /// 报警数组 + /// + public class AlarmLineListItem + { + /// + /// 报警消除时间 + /// + public string alarmEndTime { get; set; } + /// + /// 报警类型 + /// + public string alarmType { get; set; } + /// + /// 报警名称 + /// + public string alarmName { get; set; } + /// + /// 报警开始时间 + /// + public string alarmStartTime { get; set; } + /// + /// 故障代码 + /// + public string faultCode { get; set; } + } +} diff --git a/JinYuan.MES/Models/UploadDeviceCollectData.cs b/JinYuan.MES/Models/UploadDeviceCollectData.cs new file mode 100644 index 0000000..3e5c756 --- /dev/null +++ b/JinYuan.MES/Models/UploadDeviceCollectData.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + internal class UploadDeviceCollectData + { + /// + /// 应用id,对应不同系统对接 + /// + public string appid { get; set; } + /// + /// 采集指标类型和具体值的集合 + /// + public List collect_code_value_list { get; set; } + /// + /// 采集时间,unix时间戳,整数类型 + /// + public long collect_time { get; set; } + /// + /// 设备编号 + /// + public string device_code { get; set; } + } + public class Collect_code_value_list + { + /// + /// 指标类型,1 温度 2湿度 3露点 4粉尘 5风速,整数类型 + /// + public int target_code { get; set; } + /// + /// 指标对应采集值,若是某个指标或某个指标的某个值未采集到,则传N + /// + public string target_value { get; set; } + /// + /// 风速仪标签,风速仪值对应target_value + /// + public string target_value_tag { get; set; } + } + + + public class UploadDeviceCollectDataResult + { + /// + /// + /// + public int status { get; set; } + /// + /// + /// + public Data data { get; set; } + /// + /// + /// + public string message { get; set; } + } + + public class Data + { + } +} diff --git a/JinYuan.MES/Models/VdaGetData.cs b/JinYuan.MES/Models/VdaGetData.cs new file mode 100644 index 0000000..a7ed3c3 --- /dev/null +++ b/JinYuan.MES/Models/VdaGetData.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + public class VdaGetData + { + /// + /// 所属仓库 + /// + public string warehouseCode { get; set; } + /// + /// 货主 + /// + public string customerCode { get; set; } + public string labelTemplateCode { get; set; } + public List codeDataList { get; set; } + } + + public class CodeData + { + public string trayLabel { get; set; } + } +} diff --git a/JinYuan.MES/Models/WattrMeter.cs b/JinYuan.MES/Models/WattrMeter.cs new file mode 100644 index 0000000..efc08a0 --- /dev/null +++ b/JinYuan.MES/Models/WattrMeter.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + public class WattrMeter + { + + /// + /// 工厂代码 + /// + public System.String siteCode { get; set; } + + /// + /// 产线编号 + /// + public System.String lineCode { get; set; } + + /// + /// 设备编号 + /// + public System.String equipNum { get; set; } + + /// + /// 电表编号 + /// + public System.String electricMeterNum { get; set; } + + /// + /// 员工账号 + /// + public System.String userName { get; set; } + + /// + /// 工序编号 + /// + public System.String specName { get; set; } + + /// + /// 采集时间 + /// + public System.String recordDate { get; set; } + + /// + /// 有功电能(累计电能)KWH + /// + public System.Decimal? accumulatedElectricity { get; set; } + + /// + /// A相电压 V + /// + public System.Decimal? phaseVoltageA { get; set; } + + /// + /// B相电压 V + /// + public System.Decimal? phaseVoltageB { get; set; } + + /// + /// C相电压 V + /// + public System.Decimal? phaseVoltageC { get; set; } + + /// + /// A相电流 + /// + public System.Decimal? phaseCurrentA { get; set; } + + /// + /// B相电流 + /// + public System.Decimal? phaseCurrentB { get; set; } + + /// + /// C相电流 + /// + public System.Decimal? phaseCurrentC { get; set; } + + /// + /// A相功率 + /// + public System.Decimal? phasePowerA { get; set; } + + /// + /// B相功率 + /// + public System.Decimal? phasePowerB { get; set; } + + /// + /// C相功率 + /// + public System.Decimal? phasePowerC { get; set; } + + /// + /// 总有功功率 + /// + public System.Decimal? activePower { get; set; } + + /// + /// 总功率因数 + /// + public System.Decimal? powerFactor { get; set; } + + /// + /// 电流变比 + /// + public System.Decimal? pt { get; set; } + + /// + /// 电压变比 + /// + public System.Decimal? ct { get; set; } + } +} diff --git a/JinYuan.MES/Models/WmsUpload.cs b/JinYuan.MES/Models/WmsUpload.cs new file mode 100644 index 0000000..a1301ea --- /dev/null +++ b/JinYuan.MES/Models/WmsUpload.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.MES.Models +{ + public class WmsUpload + { + /// + /// 所属仓库 + /// + public string warehouseCode { get; set; } + /// + /// 货主 + /// + public string customerCode { get; set; } + /// + /// 设备编码 + /// + public string equipmentCode { get; set; } + /// + /// 设备名称 + /// + public string equipmentName { get; set; } + /// + /// 底托(卡板) + /// + public string trayLabel { get; set; } + /// + /// 详细信息 + /// + public List innerBoxLabelList { get; set; } + } + + public class InnerBoxLabelInfo + { + /// + /// 外箱标签(宝马层托)托盘码 + /// + public string outerBoxLabel { get; set; } + /// + /// 内箱标签,电芯码 + /// + public string innerBoxLabel { get; set; } + /// + /// 质检结果,N-良品 Y-不良品 + /// + public string iqcState { get; set; } + /// + /// 电芯位置,G11需传该字段 + /// + public string batteriesLocation { get; set; } + } +} diff --git a/JinYuan.MES/Properties/AssemblyInfo.cs b/JinYuan.MES/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..01e120f --- /dev/null +++ b/JinYuan.MES/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.MES")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.MES")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("530b6426-08e7-461c-91dc-787f876620fc")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.MES/app.config b/JinYuan.MES/app.config new file mode 100644 index 0000000..b20d2b2 --- /dev/null +++ b/JinYuan.MES/app.config @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.MES/packages.config b/JinYuan.MES/packages.config new file mode 100644 index 0000000..e46d5a8 --- /dev/null +++ b/JinYuan.MES/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/JinYuan.Models/AGearEntity.cs b/JinYuan.Models/AGearEntity.cs new file mode 100644 index 0000000..113d2d9 --- /dev/null +++ b/JinYuan.Models/AGearEntity.cs @@ -0,0 +1,48 @@ +using JinYuan.Models.HelperAttribute; +using PLCCommunication; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace JinYuan.Models +{ + /// + /// 打标工位 + /// + public class AGearEntity + { + /// + /// 时间 + /// + [SugarColumn(IsPrimaryKey = true)] + [DataGridViewColumn(Name = "InTestTime")] + public string TestTime { get; set; } + + /// + /// 箱唛码 + /// + [DataGridViewColumn(Name = "InContainerCode")] + public string ContainerCode { get; set; } + + /// + /// 栈板码 + /// + [DataGridViewColumn(Name = "InPalletCode")] + public string PalletCode { get; set; } + + /// + /// 结果 + /// + [DataGridViewColumn(Name = "InResult")] + public string Result { get; set; } + /// + /// 备注 + /// + [DataGridViewColumn(Name = "InRemark")] + public string Remark { get; set; } + } +} diff --git a/JinYuan.Models/Alarm/AlarmData.cs b/JinYuan.Models/Alarm/AlarmData.cs new file mode 100644 index 0000000..a7af2e3 --- /dev/null +++ b/JinYuan.Models/Alarm/AlarmData.cs @@ -0,0 +1,78 @@ +using CsvHelper.Configuration.Attributes; + +namespace JinYuan.Models +{ + /// + /// 工位报警数据 + /// + public class AlarmData + { + /// + /// 报警唯一标识符 + /// + public string AlarmGuid { get; set; } + + /// + /// 报警地址 + /// + public string PLCAdress { get; set; } + + /// + /// 报警内容 + /// + public string AlarmContent { get; set; } + + /// + /// 报警代码 + /// + public string AlarmCode { get; set; } + + /// + /// 报警类型 停机报警/非停机报警 + /// + public string AlarmType { get; set; } + + /// + /// 报警开始时间 + /// + public System.String StartTime { get; set; } + + /// + /// 报警消除时间 + /// + public System.String EndTime { get; set; } + + /// + /// 报警描述 + /// + public string AlarmDesc { get; set; } + + /// + /// 报警状态 传1或0,1是开始报警,0结束报警 + /// + public string AlarmState { get; set; } + + /// + /// 更新状态 + /// + public int Flag { get; set; } + } + + public class AlarmCSVData + { + + /// + /// 报警开始时间 + /// + [Name("报警时间")] + public string StartTime { get; set; } + + /// + /// 报警内容 + /// + /// + [Name("报警内容")] + public string AlarmContent { get; set; } + + } +} diff --git a/JinYuan.Models/Alarm/AlarmStatus.cs b/JinYuan.Models/Alarm/AlarmStatus.cs new file mode 100644 index 0000000..7ea9546 --- /dev/null +++ b/JinYuan.Models/Alarm/AlarmStatus.cs @@ -0,0 +1,15 @@ +namespace JinYuan.Models +{ + public class AlarmStatus + { + /// + /// 报警地址 + /// + public string PLCAdress { get; set; } + + /// + /// 报警状态 + /// + public bool Status { get; set; } + } +} diff --git a/JinYuan.Models/AlarmCountEntry.cs b/JinYuan.Models/AlarmCountEntry.cs new file mode 100644 index 0000000..58a4e79 --- /dev/null +++ b/JinYuan.Models/AlarmCountEntry.cs @@ -0,0 +1,30 @@ +using System; + +namespace JinYuan.Models +{ + public class AlarmCountEntry + { + /// + /// PLC地址 + /// + public string PLCAdress { get; set; } + + /// + /// 报警内容 + /// + public string AlarmContent { get; set; } + + /// + /// 报警次数 + /// + public int AlarmCount { get; set; } + /// + /// 班次 + /// + public string Class { get; set; } + /// + /// 更新时间 + /// + public DateTime AlarmTime { get; set; } + } +} diff --git a/JinYuan.Models/AlarmForm.cs b/JinYuan.Models/AlarmForm.cs new file mode 100644 index 0000000..fab63c2 --- /dev/null +++ b/JinYuan.Models/AlarmForm.cs @@ -0,0 +1,42 @@ +using CsvHelper.Configuration.Attributes; + +namespace JinYuan.Models +{ + /// + /// 报警表单数据 + /// + public class AlarmForm + { + /// + /// 报警地址 + /// + [Name("寄存器地址")] + public string PLCAdress { get; set; } + /// + /// 中语报警内容 + /// + [Name("中语报警信息")] + public string AlarmContent { get; set; } + /// + /// 报警代码 + /// + [Name("故障代码")] + public string AlarmCode { get; set; } + /// + /// 英语报警内容 + /// + [Name("英语报警信息")] + public string EnAlarmContent { get; set; } + /// + /// 匈牙利语报警内容 + /// + [Name("匈牙利语报警信息")] + public string HuAlarmContent { get; set; } + /// + /// 马来语报警内容 + /// + [Name("马来语报警信息")] + public string MsAlarmContent { get; set; } + } + +} diff --git a/JinYuan.Models/AxleLog.cs b/JinYuan.Models/AxleLog.cs new file mode 100644 index 0000000..ed125da --- /dev/null +++ b/JinYuan.Models/AxleLog.cs @@ -0,0 +1,38 @@ +namespace JinYuan.Models +{ + /// + /// 电机位置记录 + /// + public class AxleLog + { + private string _m_AxleDscribe;//轴描述 + private string _m_AxleLocation;//位置描述 + private string _m_AxleAddress;//PLC地址 + + /// + /// 描述 + /// + public string m_AxleDscribe + { + get { return _m_AxleDscribe; } + set { _m_AxleDscribe = value; } + } + + /// + /// 位置描述 + /// + public string m_AxleLocation + { + get { return _m_AxleLocation; } + set { _m_AxleLocation = value; } + } + /// + /// 地址 + /// + public string m_AxleAddress + { + get { return _m_AxleAddress; } + set { _m_AxleAddress = value; } + } + } +} diff --git a/JinYuan.Models/BGearEntity.cs b/JinYuan.Models/BGearEntity.cs new file mode 100644 index 0000000..3b419e7 --- /dev/null +++ b/JinYuan.Models/BGearEntity.cs @@ -0,0 +1,51 @@ +using JinYuan.Models.HelperAttribute; +using SqlSugar; +using System.Collections.Generic; +using System.Xml.Linq; +using static System.Net.Mime.MediaTypeNames; + +namespace JinYuan.Models +{ + /// + /// 包装出站工位 + /// + public class BGearEntity + { + /// + /// 测试时间 + /// + [DataGridViewColumn(Name = "OutTestTime")] + public string TestTime { get; set; } + + /// + /// 箱唛码 + /// + [DataGridViewColumn(Name = "OutContainerCode")] + public string ContainerCode { get; set; } + + /// + /// 栈板码 + /// + [DataGridViewColumn(Name = "OutPalletCode")] + public string PalletCode { get; set; } + + /// + /// 重量 + /// + [DataGridViewColumn(Name = "OutWeight")] + public string Weight { get; set; } + /// + /// 综合结果 + /// + [DataGridViewColumn(Name = "OutResult")] + public string Result { get; set; } + + /// + /// 备注 + /// + [DataGridViewColumn(Name = "OutRemark")] + public string Remark { get; set; } + + + } +} diff --git a/JinYuan.Models/BGearEntity2.cs b/JinYuan.Models/BGearEntity2.cs new file mode 100644 index 0000000..9641f19 --- /dev/null +++ b/JinYuan.Models/BGearEntity2.cs @@ -0,0 +1,306 @@ +using JinYuan.Models.HelperAttribute; + +namespace JinYuan.Models +{ + /// + /// + /// + public class BGearEntity2 + { + /// + /// + /// + //public BGearEntity() + //{ + //} + + /// + /// 通道号 + /// + [DataGridViewColumn(Name = "OutChannelNo")] + [DataGridColumnAttribute("ChannelNo")] + + public string ChannelNo { get; set; } + /// + /// 时间 + /// + [DataGridViewColumn(Name = "OutTestTime")] + [DataGridColumnAttribute("TestTime")] + + public string TestTime { get; set; } + /// + /// 物料编码 + /// + [DataGridColumnAttribute("FrmHistory_dgv_Main_MaterialCode")] + + public string MaterialCode { get; set; } + /// + /// RFID托杯码 + /// + //[DataGridViewColumn(Name = "OutRFID")] + + public string RFID { get; set; } + /// + /// 电芯码 + /// + [DataGridViewColumn(Name = "OutBarCode")] + [DataGridColumnAttribute("BarCode")] + + public string BarCode { get; set; } + + /// + /// 离子风速 + /// + [DataGridViewColumn(Name = "OutWindSpeed")] + [DataGridColumnAttribute("WindSpeed")] + + public string WindSpeed { get; set; } + /// + /// 离子风清洁设备号 + /// + [DataGridViewColumn(Name = "OutWindDeviceNum")] + [DataGridColumnAttribute("WindDeviceNum")] + public string WindDeviceNum { get; set; } + + /// + /// 端面检测设备号1 + /// + [DataGridViewColumn(Name = "OutCCDFaceTestDeviceNum1")] + public string CCDFaceTestDeviceNum1 { get; set; } + /// + /// 端面检测设备号2 + /// + [DataGridViewColumn(Name = "OutCCDFaceTestDeviceNum2")] + public string CCDFaceTestDeviceNum2 { get; set; } + /// + /// 端面检测设备号3 + /// + [DataGridViewColumn(Name = "OutCCDFaceTestDeviceNum3")] + public string CCDFaceTestDeviceNum3 { get; set; } + /// + /// 端面检测设备号4 + /// + [DataGridViewColumn(Name = "OutCCDFaceTestDeviceNum4")] + public string CCDFaceTestDeviceNum4 { get; set; } + + /// + /// 柱面检测设备号1 + /// + [DataGridViewColumn(Name = "OutCCDCylinderTestDeviceNum1")] + public string CCDCylinderTestDeviceNum1 { get; set; } + /// + /// 柱面检测设备号2 + /// + [DataGridViewColumn(Name = "OutCCDCylinderTestDeviceNum2")] + public string CCDCylinderTestDeviceNum2 { get; set; } + /// + /// 柱面检测设备号3 + /// + [DataGridViewColumn(Name = "OutCCDCylinderTestDeviceNum3")] + public string CCDCylinderTestDeviceNum3 { get; set; } + + /// + /// 负极焊接区2D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDNegativeTerminalWeldingZone2DInspectionResult")] + public string CCDNegativeTerminalWeldingZone2DInspectionResult { get; set; } + + + /// + /// 负极焊接区2D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDNegativeTerminalWeldingZone2DInspectionNGReasons")] + public string CCDNegativeTerminalWeldingZone2DInspectionNGReasons { get; set; } + + + /// + /// 盖板2D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDCoverPlate2DInspectionResult")] + public string CCDCoverPlate2DInspectionResult { get; set; } + ///// + ///// 正极柱检测结果 + ///// + //[DataGridViewColumn(Name = "OutCCDPosCylinderTestResult")] + //public string CCDPosCylinderTestResult { get; set; } + ///// + ///// 负极柱检测结果 + ///// + //[DataGridViewColumn(Name = "OutCCDNegCylinderTestResult")] + //public string CCDNegCylinderTestResult { get; set; } + + + /// + /// 盖板2D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDCoverPlate2DInspectionNGReasons")] + public string CCDCoverPlate2DInspectionNGReasons { get; set; } + + /// + /// 负极焊接区2.5D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDNegativeTerminalWeldingZone25DInspectionResult")] + public string CCDNegativeTerminalWeldingZone25DInspectionResult { get; set; } + + + /// + /// 负极焊接区2.5D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDNegativeTerminalWeldingZone25DInspectionNGReasons")] + public string CCDNegativeTerminalWeldingZone25DInspectionNGReasons { get; set; } + + + /// + /// 盖板2.5D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDCoverPlate25DInspectionResult")] + public string CCDCoverPlate25DInspectionResult { get; set; } + + + /// + /// 盖板2.5D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDCoverPlate25DInspectionNGReasons")] + public string CCDCoverPlate25DInspectionNGReasons { get; set; } + + + /// + /// 极柱2D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDTerminalPost2DInspectionResult")] + public string CCDTerminalPost2DInspectionResult { get; set; } + + + /// + /// 极柱2D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDTerminalPost2DInspectionNGReasons")] + public string CCDTerminalPost2DInspectionNGReasons { get; set; } + + + /// + /// 极柱3D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDTerminalPost3DInspectionResult")] + public string CCDTerminalPost3DInspectionResult { get; set; } + + + /// + /// 极柱3D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDTerminalPost3DInspectionNGReasons")] + public string CCDTerminalPost3DInspectionNGReasons { get; set; } + + + + /// + /// 密封钉2D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDSealingNail2DInspectionResult")] + public string CCDSealingNail2DInspectionResult { get; set; } + + + /// + /// 密封钉2D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDSealingNail2DInspectionNGReasons")] + public string CCDSealingNail2DInspectionNGReasons { get; set; } + + + /// + /// 密封钉3D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDSealingNail3DInspectionResult")] + public string CCDSealingNail3DInspectionResult { get; set; } + + + /// + /// 密封钉3D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDSealingNail3DInspectionNGReasons")] + public string CCDSealingNail3DInspectionNGReasons { get; set; } + + + /// + /// 上部R角2.5D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDTopFillet25DInspectionResult")] + public string CCDTopFillet25DInspectionResult { get; set; } + + + /// + /// 上部R角2.5D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDTopFillet25DInspectionNGReasons")] + public string CCDTopFillet25DInspectionNGReasons { get; set; } + + + /// + /// 底部R角2.5D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDBottomFillet25DInspectionResult")] + public string CCDBottomFillet25DInspectionResult { get; set; } + + + /// + /// 底部R角2.5D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDBottomFillet25DInspectionNGReasons")] + public string CCDBottomFillet25DInspectionNGReasons { get; set; } + + + /// + /// 柱面2.5D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDCylindricalSurface25DInspectionResult")] + public string CCDCylindricalSurface25DInspectionResult { get; set; } + + + /// + /// 柱面2.5D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDCylindricalSurface25DInspectionNGReasons")] + public string CCDCylindricalSurface25DInspectionNGReasons { get; set; } + + + /// + /// 柱面3D检测结果 + /// + [DataGridViewColumn(Name = "OutCCDCylindricalSurface3DInspectionResult")] + public string CCDCylindricalSurface3DInspectionResult { get; set; } + + + /// + /// 柱面3D检测NG原因 + /// + [DataGridViewColumn(Name = "OutCCDCylindricalSurface3DInspectionNGReasons")] + public string CCDCylindricalSurface3DInspectionNGReasons { get; set; } + + + /// + /// 综合结果 + /// + [DataGridViewColumn(Name = "OutResult")] + public string Result { get; set; } + /// + /// NG详情 + /// + [DataGridViewColumn(Name = "OutInfo")] + public string Info { get; set; } + /// + /// 备注 + /// + [DataGridViewColumn(Name = "OutRemark")] + public string Remark { get; set; } + /// + /// 出站是否上传MES + /// + [DataGridViewColumn(Name = "OutFlag")] + public string Flag { get; set; } + /// + /// 结果数据是否上传MES + /// + public string Flag1 { get; set; } + + } +} diff --git a/JinYuan.Models/BatteryStatus.cs b/JinYuan.Models/BatteryStatus.cs new file mode 100644 index 0000000..c73c83f --- /dev/null +++ b/JinYuan.Models/BatteryStatus.cs @@ -0,0 +1,12 @@ + + +namespace JinYuan.Models +{ + public class BatteryStatus + { + public int batteryId { get; set; } + + public int status { get; set; } + + } +} diff --git a/JinYuan.Models/CGearEntity.cs b/JinYuan.Models/CGearEntity.cs new file mode 100644 index 0000000..02f9ee2 --- /dev/null +++ b/JinYuan.Models/CGearEntity.cs @@ -0,0 +1,41 @@ +using JinYuan.Models.HelperAttribute; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace JinYuan.Models +{ + /// + /// 箱唛打印工位 + /// + public class CGearEntity + { + /// + /// 时间 + /// + [SugarColumn(IsPrimaryKey = true)] + [DataGridViewColumn(Name = "TestTime")] + public string TestTime { get; set; } + + /// + /// 箱唛码 + /// + [DataGridViewColumn(Name = "ContainerCode")] + public string ContainerCode { get; set; } + + /// + /// 结果 + /// + [DataGridViewColumn(Name = "Result")] + public string Result { get; set; } + /// + /// 备注 + /// + [DataGridViewColumn(Name = "Remark")] + public string Remark { get; set; } + } +} diff --git a/JinYuan.Models/CPKModel.cs b/JinYuan.Models/CPKModel.cs new file mode 100644 index 0000000..b10e4f1 --- /dev/null +++ b/JinYuan.Models/CPKModel.cs @@ -0,0 +1,134 @@ +namespace JinYuan.Models +{ + //子组大小:这个与计算内的CPK值又非常打的关系,即是分组的样本个数,数据的分组在此处需要说明的是,必须 + //是根据实际情况来填写,比如每次抽样为5个,那么子组大小为5个,我们不能随心所欲的任意填写这个值,否则 + //将没有实际意义。 + //上规格:用户录入的上规格值 + //目标值:用户输入的目标值,即期望达到的中心值 + //下规格:用户输入的下规格值 + + + public class CPKModel + { + /// + /// 总样本数 。参与分析的数据的个数 + /// + public int TotalNumber { get; set; } + /// + /// 图表类型 .说明进行分析的控制图的类型,此处为XR控制图 + /// + public string ChartType { get; set; } + /// + /// 平均值 所有样本数据的平均值 + /// + public double MeanVlaue { get; set; } + /// + /// 最大值 所有样本的最大值 + /// + public double MaxValue { get; set; } + /// + /// 最小值 + /// + public double MinValue { get; set; } + + /// + /// 正的3倍标准差线 + /// + public double Pos3Sigma { get; set; } + /// + /// 负的3倍标准差线 + /// + public double Neg3Sigma { get; set; } + /// + /// 组内标准差值 + /// + public double GroupSTDEV { get; set; } + /// + /// 整体标准差值 + /// + public double WholeSTDEV { get; set; } + + /// + /// 组内CPK值 工序能力指数,与规格值及上述标准差值相关联 + /// + public double GroupCPK { get; set; } + /// + /// 整体CPK值 工序能力指数,与规格值及上述标准差值相关联 + /// + public double WholeCPK { get; set; } + + /// + /// 组内CP值 Cp值是衡量过程满足产品品质标准的成都,也叫制程精密度,Cp值越大,表示过程变异越小,过程能力越差 + /// + public double GroupCP { get; set; } + /// + /// 整体CP值 Cp值是衡量过程满足产品品质标准的成都,也叫制程精密度,Cp值越大,表示过程变异越小,过程能力越差 + /// + public double WholeCP { get; set; } + + /// + /// 组内CPL值 相对应于下规格的工序能力值; + /// + public double GroupCPL { get; set; } + /// + /// 整体CPL值 相对应于下规格的工序能力值; + /// + public double WholeCPL { get; set; } + + /// + /// 组内CPU值 相对应于上规格的工序能力值; + /// + public double GroupCPU { get; set; } + /// + /// 整体CPU值 相对应于上规格的工序能力值; + /// + public double WholeCPU { get; set; } + + /// + /// 组内PPM + public double GroupPPM_LSL { get; set; } + /// + /// 整体PPM + public double WholePPM_LSL { get; set; } + + /// + /// 实际检测PPM + public double MeasuredPPM_LSL { get; set; } + + /// + /// 组内PPM + public double GroupPPM_USL { get; set; } + /// + /// 整体PPM + public double WholePPM_USL { get; set; } + /// + /// 实际检测PPM + public double MeasuredPPM_USL { get; set; } + /// + /// 组内PPM Total值,预测的总的不合格品数 + /// + public double GroupPPM_Total { get; set; } + /// + /// 整体PPM + public double WholePPM_Total { get; set; } + + /// + /// 实际检测PPM + public double MeasuredPPM_Total { get; set; } + + /// + /// 制程准确度,值越小越好 + /// + public double CA { get; set; } + + + } +} diff --git a/JinYuan.Models/CTPCTQDate.cs b/JinYuan.Models/CTPCTQDate.cs new file mode 100644 index 0000000..e4e45de --- /dev/null +++ b/JinYuan.Models/CTPCTQDate.cs @@ -0,0 +1,228 @@ +using System.Collections.Generic; + +namespace JinYuan.Models +{ + + + /// + /// 进出站上传数据 + /// + public class EnterandExit + { + /// + /// BU编码 + /// + public string bu_id; + /// + /// 区域简称 + /// + public string district_id; + /// + /// 工厂编码 + /// + public string factory_id; + /// + /// 产线编码 + /// + public string production_line_id; + /// + /// 工序编码 + /// + public string production_processes_id; + /// + /// 工作中心编码 + /// + public string work_center_id; + /// + /// 工站 + /// + public string station_id; + /// + /// 设备编码 + /// + public string device_name; + /// + /// 进出站标识 + /// + public string action; + /// + /// 动作时间(进出站) + /// + public string action_time; + } + + public class CollectionUpload + { + /// + /// BU编码 + /// + public string bu_id; + /// + /// 区域简称 + /// + public string district_id; + /// + /// 工厂编码 + /// + public string factory_id; + /// + /// 产线编码 + /// + public string production_line_id; + /// + /// 工序编码 + /// + public string production_processes_id; + /// + /// 工作中心编码 + /// + public string work_center_id; + /// + /// 工站 + /// + public string station_id; + /// + /// 设备编码 + /// + public string device_name; + /// + /// 采集项数据列表 + /// + public List taglist { get; set; } + + } + + public class Collection + { + /// + /// 时间 + /// + public string device_time { get; set; } + /// + /// 采集项键值对 + /// + public Dictionary collection_items { get; set; } + } + + #region 预测性数据采集项对象 + public class Predictability_BM + { + //------------------------------------------------------------------------扭矩 扭矩 扭矩 扭矩 + public string Coating1_Torque1 { get; set; } + public string Coating1_Torque2 { get; set; } + public string Coating1_Torque3 { get; set; } + public string Coating1_Torque4 { get; set; } + public string Coating1_Torque5 { get; set; } + public string Coating1_Torque6 { get; set; } + public string Coating1_Torque7 { get; set; } + public string Coating1_Torque8 { get; set; } + public string Coating2_Torque1 { get; set; } + public string Coating2_Torque2 { get; set; } + public string Coating2_Torque3 { get; set; } + public string Coating2_Torque4 { get; set; } + public string Coating2_Torque5 { get; set; } + public string Coating2_Torque6 { get; set; } + public string Coating2_Torque7 { get; set; } + public string Coating2_Torque8 { get; set; } + public string Folding1_Torque1 { get; set; } + public string Folding1_Torque2 { get; set; } + public string Folding1_Torque3 { get; set; } + public string Folding2_Torque1 { get; set; } + public string Folding2_Torque2 { get; set; } + public string Folding2_Torque3 { get; set; } + //------------------------------------------------------------------------轴速度 轴速度 轴速度 轴速度 + public string Coating1_AxisSpeed1 { get; set; } + public string Coating1_AxisSpeed2 { get; set; } + public string Coating1_AxisSpeed3 { get; set; } + public string Coating1_AxisSpeed4 { get; set; } + public string Coating1_AxisSpeed5 { get; set; } + public string Coating1_AxisSpeed6 { get; set; } + public string Coating1_AxisSpeed7 { get; set; } + public string Coating1_AxisSpeed8 { get; set; } + public string Coating2_AxisSpeed1 { get; set; } + public string Coating2_AxisSpeed2 { get; set; } + public string Coating2_AxisSpeed3 { get; set; } + public string Coating2_AxisSpeed4 { get; set; } + public string Coating2_AxisSpeed5 { get; set; } + public string Coating2_AxisSpeed6 { get; set; } + public string Coating2_AxisSpeed7 { get; set; } + public string Coating2_AxisSpeed8 { get; set; } + public string Folding1_AxisSpeed1 { get; set; } + public string Folding1_AxisSpeed2 { get; set; } + public string Folding1_AxisSpeed3 { get; set; } + public string Folding2_AxisSpeed1 { get; set; } + public string Folding2_AxisSpeed2 { get; set; } + public string Folding2_AxisSpeed3 { get; set; } + + //------------------------------------------------------------------------轴位置 轴位置 轴位置 轴位置 + public string Coating1_AxisPosition1 { get; set; } + public string Coating1_AxisPosition2 { get; set; } + public string Coating1_AxisPosition3 { get; set; } + public string Coating1_AxisPosition4 { get; set; } + public string Coating1_AxisPosition5 { get; set; } + public string Coating1_AxisPosition6 { get; set; } + public string Coating1_AxisPosition7 { get; set; } + public string Coating1_AxisPosition8 { get; set; } + public string Coating2_AxisPosition1 { get; set; } + public string Coating2_AxisPosition2 { get; set; } + public string Coating2_AxisPosition3 { get; set; } + public string Coating2_AxisPosition4 { get; set; } + public string Coating2_AxisPosition5 { get; set; } + public string Coating2_AxisPosition6 { get; set; } + public string Coating2_AxisPosition7 { get; set; } + public string Coating2_AxisPosition8 { get; set; } + public string Folding1_AxisPosition1 { get; set; } + public string Folding1_AxisPosition2 { get; set; } + public string Folding1_AxisPosition3 { get; set; } + public string Folding2_AxisPosition1 { get; set; } + public string Folding2_AxisPosition2 { get; set; } + public string Folding2_AxisPosition3 { get; set; } + //------------------------------------------------------------------------行程时间 行程时间 行程时间 行程时间 + public string Coating1_Cylinder_TravelTime1 { get; set; } + public string Coating1_Cylinder_TravelTime2 { get; set; } + public string Coating1_Cylinder_TravelTime3 { get; set; } + public string Coating1_Cylinder_TravelTime4 { get; set; } + public string Coating1_Cylinder_TravelTime5 { get; set; } + public string Coating1_Cylinder_TravelTime6 { get; set; } + public string Coating1_Cylinder_TravelTime7 { get; set; } + public string Coating1_Cylinder_TravelTime8 { get; set; } + public string Coating1_Cylinder_TravelTime9 { get; set; } + public string Coating1_Cylinder_TravelTime10 { get; set; } + public string Coating1_Cylinder_TravelTime11 { get; set; } + public string Coating1_Cylinder_TravelTime12 { get; set; } + public string Coating1_Cylinder_TravelTime13 { get; set; } + public string Coating1_Cylinder_TravelTime14 { get; set; } + public string Coating2_Cylinder_TravelTime1 { get; set; } + public string Coating2_Cylinder_TravelTime2 { get; set; } + public string Coating2_Cylinder_TravelTime3 { get; set; } + public string Coating2_Cylinder_TravelTime4 { get; set; } + public string Coating2_Cylinder_TravelTime5 { get; set; } + public string Coating2_Cylinder_TravelTime6 { get; set; } + public string Coating2_Cylinder_TravelTime7 { get; set; } + public string Coating2_Cylinder_TravelTime8 { get; set; } + public string Coating2_Cylinder_TravelTime9 { get; set; } + public string Coating2_Cylinder_TravelTime10 { get; set; } + public string Coating2_Cylinder_TravelTime11 { get; set; } + public string Coating2_Cylinder_TravelTime12 { get; set; } + public string Coating2_Cylinder_TravelTime13 { get; set; } + public string Coating2_Cylinder_TravelTime14 { get; set; } + public string CornerCutting1_Cylinder_TravelTime1 { get; set; } + public string CornerCutting1_Cylinder_TravelTime2 { get; set; } + public string CornerCutting1_Cylinder_TravelTime3 { get; set; } + public string CornerCutting1_Cylinder_TravelTime4 { get; set; } + public string CornerCutting1_Cylinder_TravelTime5 { get; set; } + public string CornerCutting1_Cylinder_TravelTime6 { get; set; } + public string CornerCutting1_Cylinder_TravelTime7 { get; set; } + public string CornerCutting1_Cylinder_TravelTime8 { get; set; } + public string CornerCutting2_Cylinder_TravelTime1 { get; set; } + public string CornerCutting2_Cylinder_TravelTime2 { get; set; } + public string CornerCutting2_Cylinder_TravelTime3 { get; set; } + public string CornerCutting2_Cylinder_TravelTime4 { get; set; } + public string CornerCutting2_Cylinder_TravelTime5 { get; set; } + public string CornerCutting2_Cylinder_TravelTime6 { get; set; } + public string CornerCutting2_Cylinder_TravelTime7 { get; set; } + public string CornerCutting2_Cylinder_TravelTime8 { get; set; } + + } + #endregion +} diff --git a/JinYuan.Models/CapSize.cs b/JinYuan.Models/CapSize.cs new file mode 100644 index 0000000..d2fbe04 --- /dev/null +++ b/JinYuan.Models/CapSize.cs @@ -0,0 +1,26 @@ +using System; + + +namespace JinYuan.Models +{ + public class CapSize + { + public int layers { get; set; } + public int rowsPerLayer { get; set; } + public int colsPerLayer { get; set; } + + public CapSize() { } + + public CapSize(int layers, int rowsPerLayer, int colsPerLayer) + { + this.layers = layers; + this.rowsPerLayer = rowsPerLayer; + this.colsPerLayer = colsPerLayer; + } + + public int getCapsize() + { + return layers * rowsPerLayer * colsPerLayer; + } + } +} diff --git a/JinYuan.Models/Chart12HourData.cs b/JinYuan.Models/Chart12HourData.cs new file mode 100644 index 0000000..a86ef80 --- /dev/null +++ b/JinYuan.Models/Chart12HourData.cs @@ -0,0 +1,29 @@ +namespace JinYuan.Models +{ + /// + /// 24小时统计表数据 + /// + public class Chart12HourData + { + /// + /// 优率 + /// + public string DisplayTime { get; set; } + /// + /// 产出数 + /// + public int ProdIn { set; get; } + /// + /// 投入数 + /// + public int ProdOut { set; get; } + /// + /// 不良数量 + /// + public int ProdNg { set; get; } + /// + /// 优率 + /// + public string OKRatio { get; set; } + } +} diff --git a/JinYuan.Models/ChartDataType.cs b/JinYuan.Models/ChartDataType.cs new file mode 100644 index 0000000..21a2f48 --- /dev/null +++ b/JinYuan.Models/ChartDataType.cs @@ -0,0 +1,17 @@ +namespace JinYuan.Models +{ + /// + /// 不良統計 + /// + public class ChartDataType + { + /// + /// 數據類型 + /// + public string DataType { get; set; } + /// + /// 數量 + /// + public int DataCount { get; set; } + } +} diff --git a/JinYuan.Models/ContainerEntity.cs b/JinYuan.Models/ContainerEntity.cs new file mode 100644 index 0000000..dd0792c --- /dev/null +++ b/JinYuan.Models/ContainerEntity.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.Models +{ + public class ContainerEntity + { + public string container_id { get; set; } + + public DateTime? create_time { get; set; } + + } +} diff --git a/JinYuan.Models/ContainerKVDetail.cs b/JinYuan.Models/ContainerKVDetail.cs new file mode 100644 index 0000000..1eb9f79 --- /dev/null +++ b/JinYuan.Models/ContainerKVDetail.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.Models +{ + public class ContainerKVDetail + { + public string container_id { get; set; } + + public string tag_code { get; set; } + + public string tag_value { get; set; } + public DateTime create_time { get; set; } + } +} diff --git a/JinYuan.Models/DGearEntity.cs b/JinYuan.Models/DGearEntity.cs new file mode 100644 index 0000000..f8497bc --- /dev/null +++ b/JinYuan.Models/DGearEntity.cs @@ -0,0 +1,37 @@ +using JinYuan.Models.HelperAttribute; +using SqlSugar; +using System.Collections.Generic; +using static System.Net.Mime.MediaTypeNames; + +namespace JinYuan.Models +{ + /// + /// 箱唛打印工位 + /// + public class DGearEntity + { + /// + /// 时间 + /// + [SugarColumn(IsPrimaryKey = true)] + [DataGridViewColumn(Name = "TestTime")] + public string TestTime { get; set; } + + /// + /// 箱唛码 + /// + [DataGridViewColumn(Name = "ContainerCode")] + public string ContainerCode { get; set; } + + /// + /// 结果 + /// + [DataGridViewColumn(Name = "Result")] + public string Result { get; set; } + /// + /// 备注 + /// + [DataGridViewColumn(Name = "Remark")] + public string Remark { get; set; } + } +} diff --git a/JinYuan.Models/DataTurnover.cs b/JinYuan.Models/DataTurnover.cs new file mode 100644 index 0000000..b7c2621 --- /dev/null +++ b/JinYuan.Models/DataTurnover.cs @@ -0,0 +1,66 @@ +using JinYuan.Models.HelperAttribute; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace JinYuan.Models +{ + /// + /// 组盘临时表 + /// + public class DataTurnover + { + + /// + /// 时间 + /// + //[SugarColumn(IsPrimaryKey = true)] + public System.DateTime? Time { get; set; } + + /// + /// 电池码 + /// + [SugarColumn(IsPrimaryKey = true)] + public string identification { get; set; } + + /// + /// 托盘码 + /// + public string containerCode { get; set; } + + /// + /// 设备编码 + /// + public string equipNum { get; set; } + + /// + /// 电芯位置号 + /// + //public string Location { get; set; } + + + /// + /// 托盘位置号 + /// + //public string Grade { get; set; } + + /// + /// 装箱次数 + /// + //public string PackNum { get; set; } + + /// + /// 装箱时间 + /// + //public string PackTime { get; set; } + + /// + /// 信息 + /// + public string Message { get; set; } + } +} diff --git a/JinYuan.Models/DeviceOEE.cs b/JinYuan.Models/DeviceOEE.cs new file mode 100644 index 0000000..49600a9 --- /dev/null +++ b/JinYuan.Models/DeviceOEE.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; + +namespace JinYuan.Models +{ + + /// + /// 设备综合效率 + /// + public class DeviceOEE + { + /// + /// 生产总数 + /// + public int TotalQty { set; get; } + /// + /// 良品数 + /// + public int ProOKQty { set; get; } + /// + /// 良率 + /// + public double YieldRate { set; get; } + /// + /// 稼动率 + /// + public double UtilizationRate { set; get; } + /// + /// PPM + /// + public int PPM { set; get; } + /// + /// 风速仪器 + /// + public List listWindSpeed { set; get; } + /// + /// 报警 + /// + public List ListAlarmData { set; get; } + + /// + /// 不良统计 + /// + public List ListNGData { set; get; } + } + + + + + + public class Hour12Data + { + /// + /// 12小时产能 + /// + public List chart12HourDatas { set; get; } + } + + public class List12HourData + { + public List dataTime { set; get; } + public List dataTotal { set; get; } + public List dataOk { set; get; } + public List dataLV { set; get; } + } +} diff --git a/JinYuan.Models/EGearEntity.cs b/JinYuan.Models/EGearEntity.cs new file mode 100644 index 0000000..75c83d1 --- /dev/null +++ b/JinYuan.Models/EGearEntity.cs @@ -0,0 +1,41 @@ +using JinYuan.Models.HelperAttribute; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace JinYuan.Models +{ + /// + /// 栈板打印工位 + /// + public class EGearEntity + { + /// + /// 时间 + /// + [SugarColumn(IsPrimaryKey = true)] + [DataGridViewColumn(Name = "TestTime")] + public string TestTime { get; set; } + + /// + /// 栈板码 + /// + [DataGridViewColumn(Name = "PalletCode")] + public string PalletCode { get; set; } + + /// + /// 结果 + /// + [DataGridViewColumn(Name = "printPalletResult")] + public string Result { get; set; } + /// + /// 备注 + /// + [DataGridViewColumn(Name = "printpalletRemark")] + public string Remark { get; set; } + } +} diff --git a/JinYuan.Models/ElectricEnergy.cs b/JinYuan.Models/ElectricEnergy.cs new file mode 100644 index 0000000..798b654 --- /dev/null +++ b/JinYuan.Models/ElectricEnergy.cs @@ -0,0 +1,79 @@ +namespace JinYuan.Models +{ + /// + /// 智能电表 + /// + public class ElectricEnergy + { + + /// + /// 有功电能(累计电能)KWH + /// + public System.Decimal? AccumulatedElectricity { get; set; } + + /// + /// A相电压 V + /// + public System.Decimal? PhaseVoltageA { get; set; } + + /// + /// B相电压 + /// + public System.Decimal? PhaseVoltageB { get; set; } + + /// + /// C相电压 + /// + public System.Decimal? PhaseVoltageC { get; set; } + + /// + /// A相电流 + /// + public System.Decimal? PhaseCurrentA { get; set; } + + /// + /// B相电流 + /// + public System.Decimal? PhaseCurrentB { get; set; } + + /// + /// C相电流 + /// + public System.Decimal? PhaseCurrentC { get; set; } + + /// + /// A相功率 + /// + public System.Decimal? PhasePowerA { get; set; } + + /// + /// B相功率 + /// + public System.Decimal? PhasePowerB { get; set; } + + /// + /// C相功率 + /// + public System.Decimal? PhasePowerC { get; set; } + + /// + /// 总有功功率 + /// + public System.Decimal? ActivePower { get; set; } + + /// + /// 总功率因数 + /// + public System.Decimal? PowerFactor { get; set; } + + /// + /// 电压变比 + /// + public System.Decimal? pt { get; set; } + + /// + /// 电流变比 + /// + public System.Decimal? ct { get; set; } + } +} diff --git a/JinYuan.Models/HelperAttribute/AnnotationUtils.cs b/JinYuan.Models/HelperAttribute/AnnotationUtils.cs new file mode 100644 index 0000000..dad53a3 --- /dev/null +++ b/JinYuan.Models/HelperAttribute/AnnotationUtils.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace JinYuan.Models.HelperAttribute +{ + public static class AnnotationUtils + { + public static List GetPropertiesWithAnnotation(Type type) where T : Attribute + { + var properties = type.GetProperties().Where(p => p.GetCustomAttributes(typeof(T), true).Length > 0).ToList(); + return properties; + } + + /// + /// 获取当前类的DataGridViewColumn + /// + /// + /// + public static List GetDataGridViewColumns(this object obj) + { + Type typeObj = obj.GetType(); + var properties = AnnotationUtils.GetPropertiesWithAnnotation(typeObj); + + List list = new List(); + foreach (var property in properties) + { + DataGridViewColumn attribute = property.GetCustomAttribute(); + //数据源名称 + attribute.DataPropertyName = property.Name; + list.Add(attribute); + } + + return list; + } + + } +} diff --git a/JinYuan.Models/HelperAttribute/DataGridColumnAttribute.cs b/JinYuan.Models/HelperAttribute/DataGridColumnAttribute.cs new file mode 100644 index 0000000..33c66f2 --- /dev/null +++ b/JinYuan.Models/HelperAttribute/DataGridColumnAttribute.cs @@ -0,0 +1,25 @@ +using System; + +namespace JinYuan.Models.HelperAttribute +{ + /// + /// 数据表格列映射特性(支持字段/属性) + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] + public sealed class DataGridColumnAttribute : Attribute + { + /// + /// 目标列名(默认使用成员名) + /// + public string ColumnName { get; set; } + + /// + /// 列数据类型(默认使用成员类型) + /// + public Type ColumnType { get; set; } + + public DataGridColumnAttribute() { } + + public DataGridColumnAttribute(string columnName) => ColumnName = columnName; + } +} diff --git a/JinYuan.Models/HelperAttribute/DataGridViewColumn.cs b/JinYuan.Models/HelperAttribute/DataGridViewColumn.cs new file mode 100644 index 0000000..5c4ec28 --- /dev/null +++ b/JinYuan.Models/HelperAttribute/DataGridViewColumn.cs @@ -0,0 +1,11 @@ +using System; + +namespace JinYuan.Models.HelperAttribute +{ + public class DataGridViewColumn : Attribute + { + public string HeaderText { get; set; } + public string Name { get; set; } + public string DataPropertyName { get; set; } + } +} diff --git a/JinYuan.Models/HelperAttribute/DataTableMapper.cs b/JinYuan.Models/HelperAttribute/DataTableMapper.cs new file mode 100644 index 0000000..222c3b3 --- /dev/null +++ b/JinYuan.Models/HelperAttribute/DataTableMapper.cs @@ -0,0 +1,155 @@ +using JinYuan.Models.HelperAttribute; +using System; +using System.Collections.Generic; +using System.Data; +using System.Reflection; + + + +/// +/// DataTable 映射工具 +/// +/// +/// DataTable 映射工具 +/// +public static class DataTableMapper +{ + /// + /// 实体类型转换为 DataTable 结构(含注解解析) + /// + public static DataTable ToSchema(Type type) + { + var dt = new DataTable(type.Name); + var members = type.GetMembers(BindingFlags.Public | BindingFlags.Instance); + + foreach (var member in members) + { + var prop = member as PropertyInfo; + var field = member as FieldInfo; + if ((prop != null && !prop.CanRead) || (field == null && prop == null)) continue; + + var attr = member.GetCustomAttribute(); + var colName = attr != null ? attr.ColumnName : member.Name; + var colType = attr != null && attr.ColumnType != null ? attr.ColumnType : + (prop != null ? prop.PropertyType : field.FieldType); + + var column = dt.Columns.Add(colName, colType); + column.AllowDBNull = !(colType.GetTypeInfo().IsValueType && + !colType.GetTypeInfo().IsGenericType); + } + return dt; + } + + /// + /// 实体集合转换为 DataTable(含注解映射) + /// 使用: var dt = DataTableMapper.ToDataTable (employees, typeof (Employee)); + /// + public static DataTable ToDataTable(this IEnumerable entities, Type type) + { + var dt = ToSchema(type); + if (entities == null) return dt; + + foreach (var entity in entities) + { + var row = dt.NewRow(); + FillDataRow(entity, row, type); + dt.Rows.Add(row); + } + return dt; + } + + private static void FillDataRow(object entity, DataRow row, Type type) + { + foreach (DataColumn column in row.Table.Columns) + { + MemberInfo member = null; + foreach (var m in type.GetMembers(BindingFlags.Public | BindingFlags.Instance)) + { + var attr = m.GetCustomAttribute(); + var mName = attr != null ? attr.ColumnName : m.Name; + if (string.Equals(mName, column.ColumnName, StringComparison.OrdinalIgnoreCase)) + { + member = m; + break; + } + } + + if (member == null) continue; + + object value; + if (member is PropertyInfo prop) + { + value = prop.GetValue(entity); + } + else if (member is FieldInfo field) + { + value = field.GetValue(entity); + } + else + { + continue; + } + + row[column] = value ?? DBNull.Value; + } + } + + /// + /// DataTable 转换为 List + /// 使用案例: var employeeList = dt.ToList(); + /// + public static List ToList(this DataTable dt) where T : new() + { + var list = new List(); + var type = typeof(T); + var members = type.GetMembers(BindingFlags.Public | BindingFlags.Instance); + + foreach (DataRow row in dt.Rows) + { + var item = new T(); + foreach (var member in members) + { + var prop = member as PropertyInfo; + var field = member as FieldInfo; + if ((prop != null && !prop.CanWrite) || (field == null && prop == null)) continue; + + var attr = member.GetCustomAttribute(); + var colName = attr != null ? attr.ColumnName : member.Name; + if (dt.Columns.Contains(colName)) + { + var value = row[colName]; + if (value != DBNull.Value) + { + if (prop != null) + { + prop.SetValue(item, Convert.ChangeType(value, prop.PropertyType)); + } + else if (field != null) + { + field.SetValue(item, Convert.ChangeType(value, field.FieldType)); + } + } + } + } + list.Add(item); + } + return list; + } + + /// + /// 循环获取当前 DataTable 的列名称,通过自定义的获取名称方法获取新的列名并替换 + /// + /// 要处理的 DataTable + /// 自定义的获取新列名的方法 + /// 列名替换后的 DataTable + public static DataTable ReplaceColumnNamesWithCustomMethod(this DataTable dt, Func GetNewColumnName) + { + for (int i = 0; i < dt.Columns.Count; i++) + { + string originalColumnName = dt.Columns[i].ColumnName; + string newColumnName = GetNewColumnName(originalColumnName); + dt.Columns[i].ColumnName = newColumnName; + } + return dt; + } +} \ No newline at end of file diff --git a/JinYuan.Models/Hourprod.cs b/JinYuan.Models/Hourprod.cs new file mode 100644 index 0000000..52d1a96 --- /dev/null +++ b/JinYuan.Models/Hourprod.cs @@ -0,0 +1,47 @@ +using SqlSugar; + +namespace JinYuan.Models +{ + /// + /// 24小时产能 + /// + public class Hourprod + { + /// + /// 日期 + /// + [SugarColumn(IsPrimaryKey = true)] + public System.String FDate { get; set; } + + /// + /// 小时 + /// + [SugarColumn(IsPrimaryKey = true)] + public System.Int32 FHour { get; set; } + + /// + /// 投入数 + /// + public System.Int32 ProdIn { get; set; } + + /// + /// 产出数 + /// + public System.Int32 ProdOut { get; set; } + + /// + /// 时间 + /// + public System.DateTime? TestTime { get; set; } + + /// + /// PPM + /// + public System.Int32 Ppm { get; set; } + + /// + /// 稼动率 + /// + public System.Decimal JiaDL { get; set; } + } +} diff --git a/JinYuan.Models/JinYuan.Models.csproj b/JinYuan.Models/JinYuan.Models.csproj new file mode 100644 index 0000000..b6a08a7 --- /dev/null +++ b/JinYuan.Models/JinYuan.Models.csproj @@ -0,0 +1,137 @@ + + + + + Debug + AnyCPU + {4C0BCB84-5CD7-4846-8363-C4C10D46E391} + Library + Properties + JinYuan.Models + JinYuan.Models + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\CsvHelper.33.0.1\lib\net48\CsvHelper.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + + ..\packages\MiniExcel.1.36.1\lib\net45\MiniExcel.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\LargeSquareOne\Lib\PLCCommunication.dll + + + ..\packages\SqlSugar.5.1.4.175\lib\SqlSugar.dll + + + + ..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll + + + + + ..\packages\System.Memory.4.5.0\lib\netstandard2.0\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JinYuan.Models/MotorLog.cs b/JinYuan.Models/MotorLog.cs new file mode 100644 index 0000000..7f6173d --- /dev/null +++ b/JinYuan.Models/MotorLog.cs @@ -0,0 +1,39 @@ +namespace JinYuan.Models +{ + + /// + /// 轴位置记录 + /// + public class MotorLog + { + private string _m_MotorDscribe;//轴描述 + private string _m_MotorLocation;//位置描述 + private string _m_MotorAddress;//PLC地址 + + /// + /// 描述 + /// + public string m_MotorDscribe + { + get { return _m_MotorDscribe; } + set { _m_MotorDscribe = value; } + } + + /// + /// 位置描述 + /// + public string m_MotorLocation + { + get { return _m_MotorLocation; } + set { _m_MotorLocation = value; } + } + /// + /// 地址 + /// + public string m_MotorAddress + { + get { return _m_MotorAddress; } + set { _m_MotorAddress = value; } + } + } +} diff --git a/JinYuan.Models/NgCodeEntity.cs b/JinYuan.Models/NgCodeEntity.cs new file mode 100644 index 0000000..e4edff4 --- /dev/null +++ b/JinYuan.Models/NgCodeEntity.cs @@ -0,0 +1,22 @@ +using JinYuan.Models.HelperAttribute; +using SqlSugar; + +namespace JinYuan.Models +{ + /// + /// ngCode实体类 + /// + public class NgCodeEntity + { + /// + /// 编码 + /// + public string ngCode { get; set; } + /// + /// 不良信息 + /// + public string ngMessage { get; set; } + + + } +} diff --git a/JinYuan.Models/PalletEntity.cs b/JinYuan.Models/PalletEntity.cs new file mode 100644 index 0000000..78a8c6c --- /dev/null +++ b/JinYuan.Models/PalletEntity.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.Models +{ + public class PalletEntity + { + public string pallet_id { get; set; } + + public string container_id { get; set; } + public DateTime create_time { get; set; } + + } +} diff --git a/JinYuan.Models/PalletKVDetail.cs b/JinYuan.Models/PalletKVDetail.cs new file mode 100644 index 0000000..ef36900 --- /dev/null +++ b/JinYuan.Models/PalletKVDetail.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.Models +{ + public class PalletKVDetail + { + public string pallet_id { get; set; } + + public string tag_code { get; set; } + + public string tag_value { get; set; } + public DateTime create_time { get; set; } + } +} diff --git a/JinYuan.Models/PlcDevice.cs b/JinYuan.Models/PlcDevice.cs new file mode 100644 index 0000000..de4c389 --- /dev/null +++ b/JinYuan.Models/PlcDevice.cs @@ -0,0 +1,189 @@ +using MiniExcelLibs.Attributes; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.IO.Ports; +using System.Threading; + +namespace JinYuan.Models +{ + /// + /// 通信设备实体类 + /// + public class PlcDevice + { + /// + /// PLC编号 + /// + public int PlcNum { get; set; } + /// + /// IP地址 + /// + public string IPAddress { get; set; } + /// + /// 端口 + /// + public int Port { get; set; } + + /// + /// PLC类型 + /// + public string PLCType { get; set; } + /// + /// 是否启用 + /// + public bool IsActive { get; set; } + /// + /// 心跳地址 + /// + public string HeartBeat { get; set; } + /// + /// 是否启用心跳消息 + /// + public bool IsHeartBeat { get; set; } + /// + /// 链接成功标志 + /// + public bool IsConnected { get; set; } + /// + /// 是否是首次连接 + /// + public bool IsFirstConnect { get; set; } = true; + + /// + /// 重连周期 + /// + + public int ReConnectTime { get; set; } = 2000; + + /// + /// 休眠时间 + /// + + public int SleepTime { get; set; } = 10; + + /// + /// 大小端 + /// + [JsonIgnore] + public int DataFormat { get; set; } = 0; + /// + /// 出错次数 + /// + public int ErrorTimes { get; set; } + + /// + /// 容错次数 + /// + public int AllowErrorTimes { get; set; } = 3; + + /// + /// 多线程取消源标志位 + /// + public CancellationTokenSource Cts { get; set; } + /// + /// 通信组集合 + /// + public List GroupList { get; set; } = new List(); + } + + + public class PlcGroup + { + /// + /// PLC编号 + /// + public int PlcNum { get; set; } + /// + ///通信组名称 + /// + public string GroupName { get; set; } + /// + /// 起始地址 + /// + public string Start { get; set; } + /// + /// 长度 + /// + public ushort Length { get; set; } + /// + /// 是否为触发读取 + /// + public bool IsTiggerRead { get; set; } + + /// + /// 是否需要反馈结果到PLC + /// + public bool IsFeedbackPlc { get; set; } + + /// + /// 是否启用 + /// + public bool IsActive { get; set; } + /// + /// 备注说明 + /// + public string Remark { get; set; } + /// + /// 变量集合 + /// + [ExcelIgnore] + public List VarList { get; set; } + } + + /// + /// 变量属性类 + /// + public class PlcVariable + { + /// + /// PLC编号 + /// + public int PlcNum { get; set; } + /// + /// 变量名称 + /// + public string VarName { get; set; } + + /// + /// 变量地址 + /// + public string VarAddress { get; set; } + /// + /// 起始索引 + /// + public string Start { get; set; } + /// + /// 数据类型 + /// + public string DataType { get; set; } + /// + /// 偏移或长度 + /// + public int OffsetOrLength { get; set; } + /// + /// 所属通信组名称 + /// + public string GroupName { get; set; } + } + + + public class PlcStates + { + // ... 现有的属性 ... + public short OldStatus { get; set; } + public int StatusCount { get; set; } + public string GuidAlarm { get; set; } + public List Status { get; set; } + } + + // 串口配置类 + public class SerialPortConfig + { + public bool IsActive { get; set; } + public string PortName { get; set; } + public int BaudRate { get; set; } + public string DeviceName { get; set; } + public SerialPort serialPort { get; set; } + public bool IsConnected { get; set; } + } +} diff --git a/JinYuan.Models/PrintData.cs b/JinYuan.Models/PrintData.cs new file mode 100644 index 0000000..01bc68b --- /dev/null +++ b/JinYuan.Models/PrintData.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.Models +{ + public class PrintData + { + public string siteCode { get; set; } + public string lineCode { get; set; } + public string equipName { get; set; } + public string ContainerCode { get; set; } + public string weight { get; set; } + public string containerTypeCode { get; set; } + public string virtualContainerCode { get; set; } + public string groupNum { get; set; } + public string supplierCode { get; set; } + public string customerCode { get; set; } + public string customerName { get; set; } + public string packQty { get; set; } + public string batchQty { get; set; } + public string soNum { get; set; } + public string customerOrder { get; set; } + public string soLineNum { get; set; } + public string materialCode { get; set; } + public string materialName { get; set; } + public string model { get; set; } + public string grade { get; set; } + public string voltage { get; set; } + public string inresistance { get; set; } + public string capacity { get; set; } + public string productDate { get; set; } + public string rohs { get; set; } + public string locatorCode { get; set; } + public string locatorName { get; set; } + public string enableFlag { get; set; } + public string actualLoadQty { get; set; } + public string palletCode { get; set; } + public string containerCode { get; set; } + public string poNum { get; set; } + public string autoFlag { get; set; } + } +} diff --git a/JinYuan.Models/Properties/AssemblyInfo.cs b/JinYuan.Models/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c23b09c --- /dev/null +++ b/JinYuan.Models/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.Models")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.Models")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("4c0bcb84-5cd7-4846-8363-c4c10d46e391")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.Models/SysConfig/BTWConfig.cs b/JinYuan.Models/SysConfig/BTWConfig.cs new file mode 100644 index 0000000..100e76b --- /dev/null +++ b/JinYuan.Models/SysConfig/BTWConfig.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + + +namespace JinYuan.Models +{ + public class BTWConfig + { + /// + /// 是否连接打印机服务器 + /// + public bool IsConnectPrinter; + /// + /// 箱唛码模板路径 + /// + public string containerBTWPath; + + /// + /// 栈板码模板路径 + /// + public string palletBTWPath; + + /// + /// printerName + /// + public string printerName; + } +} diff --git a/JinYuan.Models/SysConfig/Device.cs b/JinYuan.Models/SysConfig/Device.cs new file mode 100644 index 0000000..ca60ec0 --- /dev/null +++ b/JinYuan.Models/SysConfig/Device.cs @@ -0,0 +1,317 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; + +namespace JinYuan.Models +{ + /// + /// 通信设备实体类 + /// + public class Device + { + /// + /// IP地址 + /// + public string IPAddress { get; set; } + /// + /// 端口 + /// + public int Port { get; set; } + + /// + /// PLC类型 + /// + public string PLCType { get; set; } + /// + /// 当前设备的连接状态 + /// + + public bool IsConnected { get; set; } + + /// + /// 是否是首次连接 + /// + + public bool IsFirstConnect { get; set; } = true; + + /// + /// 重连周期 + /// + + public int ReConnectTime { get; set; } = 2000; + + /// + /// 休眠时间 + /// + + public int SleepTime { get; set; } = 10; + + /// + /// 大小端 + /// + [JsonIgnore] + public int DataFormat { get; set; } = 0; + /// + /// 出错次数 + /// + public int ErrorTimes { get; set; } + + /// + /// 容错次数 + /// + public int AllowErrorTimes { get; set; } = 3; + + /// + /// 多线程取消源标志位 + /// + public CancellationTokenSource Cts { get; set; } + + /// + /// 计时器 + /// + + public Stopwatch Stopwatch { get; set; } + + /// + /// 所有归档变量的集合 + /// + + public List StoreVarList { get; set; } = new List(); + + /// + /// 按工位读取 + /// + + public List WorkVarList { get; set; } = new List(); + /// + /// 通信组集合 + /// + public List GroupList { get; set; } = new List(); + /// + /// 所有变量的集合 + /// + public List VarList { get; set; } = new List(); + + /// + /// 所有变量名称与值的集合 + /// + public Dictionary CurrentValue { get; set; } = new Dictionary(); + + /// + /// 定义报警触发和消除事件 + /// + public event Action AlarmTrigEvent; + + /// + /// 变量初始化 + /// + public void Init() + { + foreach (var gp in GroupList) + { + + if (gp.IsTiggerRead) + { + WorkVarList.Add(gp); + } + foreach (var variable in gp.VarList) + { + if (!gp.IsTiggerRead) + { + VarList.Add(variable); + + + if (CurrentValue.ContainsKey(variable.VarName)) + { + CurrentValue[variable.VarName] = "NA"; + } + else + { + CurrentValue.Add(variable.VarName, "NA"); + } + } + + } + } + } + + + + + /// + /// 索引器,通过键名获取到数据 + /// + /// + /// + [JsonIgnore] + public object this[string key] + { + get + { + if (CurrentValue.ContainsKey(key)) + { + return CurrentValue[key]; + } + else + { + return null; + } + } + } + + /// + /// 实时更新 + /// + /// + public void Update(Variable variable) + { + //更新处理 + if (CurrentValue.ContainsKey(variable.VarName)) + { + CurrentValue[variable.VarName] = variable.VarValue; + } + else + { + CurrentValue.Add(variable.VarName, variable.VarValue); + } + + //报警处理 + if (variable.HighAlarmEnable || variable.LowAlarmEnable) + { + float compareValue = 0.0f; + + if (variable.DataType.ToLower() == "bool") + { + compareValue = Convert.ToBoolean(variable.VarValue) ? 1.0f : 0.0f; + } + else + { + compareValue = Convert.ToSingle(variable.VarValue); + } + + int compareResult = 0; + //高报警时,触发事件 + if (variable.HighAlarmEnable) + { + compareResult = Compare(compareValue, variable.HighAlarmValue, variable.HighAlarmCacheValue, true); + + if (compareResult != 0) + { + //通过事件做通知 + + OnAlarmAckEvent(variable, new AlarmEventArgs() + { + Name = variable.VarName, + CurrentValue = variable.VarValue.ToString(), + SetValue = variable.HighAlarmValue.ToString(), + AlarmNote = variable.HighAlarmNote, + IsTrigger = compareResult == 1 + }); + } + + variable.HighAlarmCacheValue = compareValue; + } + else + { + compareResult = Compare(compareValue, variable.LowAlarmValue, variable.LowAlarmCacheValue, false); + + if (compareResult != 0) + { + //通过事件做通知 + + OnAlarmAckEvent(variable, new AlarmEventArgs() + { + Name = variable.VarName, + CurrentValue = variable.VarValue.ToString(), + SetValue = variable.LowAlarmValue.ToString(), + AlarmNote = variable.LowAlarmNote, + IsTrigger = compareResult == 1 + }); + + } + variable.LowAlarmCacheValue = compareValue; + } + } + } + + /// + /// 报警触发的事件 + /// + //public event AlarmTriggerEventDelegate AlarmTriggerEvent; + + /// + /// 触发事件 + /// + /// + /// + private void OnAlarmAckEvent(object sender, AlarmEventArgs e) + { + //AlarmTriggerEvent?.Invoke(sender, e); + } + + /// + /// 报警比较 + /// + /// 当前值 + /// 设置值 + /// 缓存值 + /// 上升沿还是下降沿 + /// 比较结果,1表示触发,-1表示消除,0表示无变化 + private int Compare(float current, float set, float last, bool isPositive) + { + if (isPositive) + { + if (current >= set && last < set) + { + return 1; + } + if (current < set && last >= set) + { + return -1; + } + } + else + { + if (current <= set && last > set) + { + return 1; + } + if (current > set && last <= set) + { + return -1; + } + } + return 0; + } + } + + public class AlarmEventArgs : EventArgs + { + /// + /// 变量名称 + /// + public string Name { get; set; } + + /// + /// 当前值 + /// + public string CurrentValue { get; set; } + + /// + /// 报警说明 + /// + public string AlarmNote { get; set; } + + /// + /// 报警设定值 + /// + public string SetValue { get; set; } + + /// + /// 是否为触发 + /// + public bool IsTrigger { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/Enum.cs b/JinYuan.Models/SysConfig/Enum.cs new file mode 100644 index 0000000..6bcc8fb --- /dev/null +++ b/JinYuan.Models/SysConfig/Enum.cs @@ -0,0 +1,18 @@ +namespace JinYuan.Models +{ + /// + /// 所有窗体枚举,小于临界窗体的为固定窗体,不执行关闭 + /// + public enum FormNames + { + 集中监控, + 数据监控, + 日志报警, + 临界窗体, + 数据分析, + 数据追溯, + 参数设置, + 系统设置, + 用户管理 + } +} diff --git a/JinYuan.Models/SysConfig/FDConfig.cs b/JinYuan.Models/SysConfig/FDConfig.cs new file mode 100644 index 0000000..d483068 --- /dev/null +++ b/JinYuan.Models/SysConfig/FDConfig.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace JinYuan.Models +{ + public class FDConfig + { + /// + /// 编号 + /// + + public int FdNum { get; set; } + /// + /// OK拉带类型1 + /// + public string OKLD1Type { get; set; } + /// + /// OK拉带类型2 + /// + public string OKLD2Type { get; set; } + /// + /// OK拉带类型3 + /// + public string OKLD3Type { get; set; } + /// + /// OK拉带类型4 + /// + public string OKLD4Type { get; set; } + /// + /// NG拉带类型5 + /// + public string NGLD5Type { get; set; } + /// + /// NG拉带类型6 + /// + public string NGLD6Type { get; set; } + /// + /// NG拉带类型7 + /// + public string NGLD7Type { get; set; } + /// + /// 是否开启分档 + /// + public bool IsFDActive { get; set; } + /// + ///是否激活NG电池不分类排出 + /// + + public bool IsNGActive { get; set; } + + + } +} diff --git a/JinYuan.Models/SysConfig/Group.cs b/JinYuan.Models/SysConfig/Group.cs new file mode 100644 index 0000000..c1286ed --- /dev/null +++ b/JinYuan.Models/SysConfig/Group.cs @@ -0,0 +1,47 @@ +using MiniExcelLibs.Attributes; +using System.Collections.Generic; + +namespace JinYuan.Models +{ + /// + /// 通信组实体类 + /// + public class Group + { + /// + ///通信组名称 + /// + public string GroupName { get; set; } + /// + /// 起始地址 + /// + public string Start { get; set; } + /// + /// 长度 + /// + public ushort Length { get; set; } + /// + /// 是否为触发读取 + /// + public bool IsTiggerRead { get; set; } + + /// + /// 是否需要反馈结果到PLC + /// + public bool IsFeedbackPlc { get; set; } + + /// + /// 是否启用 + /// + public bool IsActive { get; set; } + /// + /// 备注说明 + /// + public string Remark { get; set; } + /// + /// 变量集合 + /// + [ExcelIgnore] + public List VarList { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/PLCConfig.cs b/JinYuan.Models/SysConfig/PLCConfig.cs new file mode 100644 index 0000000..4af9511 --- /dev/null +++ b/JinYuan.Models/SysConfig/PLCConfig.cs @@ -0,0 +1,43 @@ +namespace JinYuan.Models +{ + public class PLCConfig + { + /// + /// PLC编号 + /// + + public int PlcNum { get; set; } + /// + /// PLC类型 + /// + public string PLCType { get; set; } + /// + /// IP地址 + /// + public string IPAddress { get; set; } + /// + /// 端口号 + /// + public string Port { get; set; } + /// + /// 心跳地址 + /// + + public string HeartBeat { get; set; } + /// + /// 是否启用心跳 + /// + + public bool IsHeartBeat { get; set; } + /// + ///PLC是否激活 + /// + + public bool IsActive { get; set; } + /// + /// 备注 + /// + public string Remark { get; set; } + + } +} diff --git a/JinYuan.Models/SysConfig/PLCGroupVariable.cs b/JinYuan.Models/SysConfig/PLCGroupVariable.cs new file mode 100644 index 0000000..15ab5df --- /dev/null +++ b/JinYuan.Models/SysConfig/PLCGroupVariable.cs @@ -0,0 +1,19 @@ +namespace JinYuan.Models +{ + public class PLCGroupVariable : Variable + { + /// + /// 变量名称 + /// + public int ArrayStart { get; set; } + + /// + /// 电池数量 + /// + public int CellSum { get; set; } + /// + /// 电池数量 + /// + public string BTName { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/ParamBase.cs b/JinYuan.Models/SysConfig/ParamBase.cs new file mode 100644 index 0000000..a7261e3 --- /dev/null +++ b/JinYuan.Models/SysConfig/ParamBase.cs @@ -0,0 +1,33 @@ +using SqlSugar; + +namespace JinYuan.Models +{ + /// + /// + /// + public class ParamBase + { + /// + /// + /// + public ParamBase() + { + } + + /// + /// 序号 + /// + public System.Int32? fNo { get; set; } + + /// + /// 参数名称 + /// + [SugarColumn(IsPrimaryKey = true)] + public System.String ParaName { get; set; } + + /// + /// 备注 + /// + public System.String Remark { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/ParamList.cs b/JinYuan.Models/SysConfig/ParamList.cs new file mode 100644 index 0000000..ef67072 --- /dev/null +++ b/JinYuan.Models/SysConfig/ParamList.cs @@ -0,0 +1,42 @@ +using SqlSugar; + +namespace JinYuan.Models +{ + public class ParamList + { + /// + /// + /// + [SugarColumn(IsPrimaryKey = true)] + public System.String ModelName { get; set; } + + /// + /// + /// + [SugarColumn(IsPrimaryKey = true)] + public System.String ParaName { get; set; } + + /// + /// + /// + public System.String ParaValueMin { get; set; } + /// + /// + /// + public System.String ParaValueMax { get; set; } + /// + /// + /// + public System.String Uint { get; set; } + + /// + /// + /// + public System.String Remark { get; set; } + + /// + /// + /// + public System.DateTime? UpdateTime { get; set; } = System.DateTime.Now; + } +} diff --git a/JinYuan.Models/SysConfig/PlcGroupConfig.cs b/JinYuan.Models/SysConfig/PlcGroupConfig.cs new file mode 100644 index 0000000..e78f56a --- /dev/null +++ b/JinYuan.Models/SysConfig/PlcGroupConfig.cs @@ -0,0 +1,128 @@ +namespace JinYuan.Models +{ + public class PlcGroupConfig + { + /// + /// PLC编号 + /// + private int _plcNum; + public int PlcNum + { + get => _plcNum; + set + { + if (_plcNum == value) return; + _plcNum = value; + + } + } + + /// + /// 通信组 + /// + private string _groupName; + public string GroupName + { + get => _groupName; + set + { + if (_groupName == value) return; + _groupName = value; + + } + } + + /// + /// 通信组起始地址 + /// + private string _start; + public string Start + { + get => _start; + set + { + if (_start == value) return; + _start = value; + + } + } + + private int _length; + + public int Length + { + get => _length; + set + { + if (_length == value) return; + _length = value; + + } + } + + + private bool _isTiggerRead; + /// + /// 是否触发读取 + /// + public bool IsTiggerRead + { + get => _isTiggerRead; + set + { + if (_isTiggerRead == value) return; + _isTiggerRead = value; + + } + } + + + private bool _isFeedbackPlc; + /// + ///是否有返回PLC + /// + public bool IsFeedbackPlc + { + get => _isFeedbackPlc; + set + { + if (_isFeedbackPlc == value) return; + _isFeedbackPlc = value; + + } + } + + private bool _isActive; + /// + /// 是否激活 + /// + public bool IsActive + { + get => _isActive; + set + { + if (_isActive == value) return; + _isActive = value; + + } + } + + private string _remark; + /// + /// 备注 + /// + public string Remark + { + get => _remark; + set + { + if (_remark == value) return; + _remark = value; + + } + + } + + + } +} diff --git a/JinYuan.Models/SysConfig/ProductModel.cs b/JinYuan.Models/SysConfig/ProductModel.cs new file mode 100644 index 0000000..a6aff95 --- /dev/null +++ b/JinYuan.Models/SysConfig/ProductModel.cs @@ -0,0 +1,21 @@ +using SqlSugar; + +namespace JinYuan.Models +{ + public class ProductModel + { + /// + /// + /// + [SugarColumn(IsPrimaryKey = true)] + public System.String ModelName { get; set; } + /// + /// 物料编码 + /// + public System.String MaterialCode { get; set; } + /// + /// + /// + public System.String Remark { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/ProductModelParam.cs b/JinYuan.Models/SysConfig/ProductModelParam.cs new file mode 100644 index 0000000..1cbca54 --- /dev/null +++ b/JinYuan.Models/SysConfig/ProductModelParam.cs @@ -0,0 +1,46 @@ +namespace JinYuan.Models +{ + /// + /// 产品型号参数范围 + /// + public class ProductModelParam + { + /// + /// OCV内阻最大值 + /// + public decimal OcvIrMax { set; get; } + /// + /// OCV内阻最小值 + /// + public decimal OcvIrMin { set; get; } + + /// + /// OCV电压最大值 + /// + public decimal OcvVoltageMax { set; get; } + /// + /// OCV电压最小值 + /// + public decimal OcvVoltageMin { set; get; } + + /// + /// OCV静置时间最大值 + /// + public decimal OcvTimeMax { set; get; } + /// + /// OCV静置时间最小值 + /// + public decimal OcvTimeMin { set; get; } + + + /// + /// 常数A + /// + public decimal CoefficientA { get; set; } + /// + ///常数B + /// + public decimal ExponentB { get; set; } + + } +} diff --git a/JinYuan.Models/SysConfig/SysAdmin.cs b/JinYuan.Models/SysConfig/SysAdmin.cs new file mode 100644 index 0000000..068c4df --- /dev/null +++ b/JinYuan.Models/SysConfig/SysAdmin.cs @@ -0,0 +1,24 @@ +using SqlSugar; + +namespace JinYuan.Models +{ + /// + /// 登录实体类型 + /// + public class SysAdmin + { + [SugarColumn(IsPrimaryKey = true, IsIgnore = true)] + public int LoginId { get; set; } + public string LoginName { get; set; } + public string LoginPwd { get; set; } + public string LoginUid { get; set; } + public string LoginLevel { get; set; } + public bool SystemLog { get; set; } + public bool CpkData { get; set; } + public bool HistoryData { get; set; } + public bool ParamSet { get; set; } + public bool SystemSet { get; set; } + public bool UserManage { get; set; } + + } +} diff --git a/JinYuan.Models/SysConfig/SysConfig.cs b/JinYuan.Models/SysConfig/SysConfig.cs new file mode 100644 index 0000000..faaf37b --- /dev/null +++ b/JinYuan.Models/SysConfig/SysConfig.cs @@ -0,0 +1,70 @@ +namespace JinYuan.Models +{ + public class SysConfig + { + /// + /// 开机自动启动 + /// + public bool AutoStart { get; set; } + /// + ///启动自动登录 + /// + public bool AutoLogin { get; set; } + /// + ///无操作自动锁屏 + /// + public bool AutoLock { get; set; } + /// + ///锁屏间隙时间,单位是分钟 + /// + public int LockPeriod { get; set; } + + /// + ///无操作自动锁屏 + /// + public bool AutoQieHuanM { get; set; } + /// + ///锁屏间隙时间,单位是分钟 + /// + public int QieHuanMPeriod { get; set; } + /// + /// 调试模式 + /// + public bool IsDebugMode { get; set; } + /// + ///曲线显示数量 + /// + public int ShowSeriesCount { get; set; } + /// + /// 开启刷卡模式 + /// + public bool SwipeCardMode { get; set; } + /// + /// MES/非MES模式切换 + /// + public bool MesModeSwitching { get; set; } + /// + /// 切屏 + /// + public bool ScreenCutting { get; set; } + /// + /// 获取MES参数 + /// + public bool GetMesParam { get; set; } + + /// + /// 线程耗时日志保存 + /// + public bool SaveThreadTime { get; set; } + + /// + /// 开启无卷芯码进出站一体模式 + /// + public bool NoRollCodeMode { get; set; } + + /// + /// 工位号 + /// + public string GongWei { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/SysLog.cs b/JinYuan.Models/SysConfig/SysLog.cs new file mode 100644 index 0000000..d1c82d1 --- /dev/null +++ b/JinYuan.Models/SysConfig/SysLog.cs @@ -0,0 +1,38 @@ +namespace JinYuan.Models +{ + public class SysLog + { + /// + /// 插入时间 + /// + public string InsertTime { get; set; } + /// + /// 报警类型 + /// + public string LogType { get; set; } + /// + /// 日志信息 + /// + public string Note { get; set; } + /// + /// 操作人员 + /// + public string Operater { get; set; } + /// + /// 变量名称 + /// + public string VarName { get; set; } + /// + /// 报警设置值 + /// + public string AlarmSet { get; set; } + /// + /// 报警值 + /// + public string AlarmValue { get; set; } + /// + /// 报警类型 + /// + public string AlarmType { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/Variable.cs b/JinYuan.Models/SysConfig/Variable.cs new file mode 100644 index 0000000..3bdcb52 --- /dev/null +++ b/JinYuan.Models/SysConfig/Variable.cs @@ -0,0 +1,103 @@ +using MiniExcelLibs.Attributes; + +namespace JinYuan.Models +{ + /// + /// 变量属性类 + /// + public class Variable + { + /// + /// 变量名称 + /// + public string VarName { get; set; } + + /// + /// 变量地址 + /// + public string VarAddress { get; set; } + /// + /// 起始索引 + /// + public string Start { get; set; } + /// + /// 数据类型 + /// + public string DataType { get; set; } + /// + /// 偏移或长度 + /// + public int OffsetOrLenght { get; set; } + /// + /// 所属通信组名称 + /// + public string GroupName { get; set; } + /// + /// 备注说明 + /// + public string Remark { get; set; } + /// + /// 是否上升沿报警 + /// + public bool PosAlarm { get; set; } + /// + /// 是否下降沿报警 + /// + public bool NegAlarm { get; set; } + /// + /// 转换系数 + /// + public float Scale { get; set; } = 1.0f; + /// + /// 偏移值 + /// + public float Offset { get; set; } = 0.0f; + + /// + /// 变量的值 + /// + [ExcelIgnore] + public object VarValue { get; set; } + + /// + /// 高报警启用 + /// + public bool HighAlarmEnable { get; set; } + + /// + /// 高报警设定值 + /// + public float HighAlarmValue { get; set; } + + /// + /// 高报警说明 + /// + public string HighAlarmNote { get; set; } + + /// + /// 高报警缓存值 + /// + [ExcelIgnore] + public float HighAlarmCacheValue { get; set; } + /// + /// 低报警启用 + /// + public bool LowAlarmEnable { get; set; } + + /// + /// 低报警设定值 + /// + public float LowAlarmValue { get; set; } + + /// + /// 低报警说明 + /// + public string LowAlarmNote { get; set; } + + /// + /// 低报警缓存值 + /// + [ExcelIgnore] + public float LowAlarmCacheValue { get; set; } + } +} diff --git a/JinYuan.Models/SysConfig/VariableConfig.cs b/JinYuan.Models/SysConfig/VariableConfig.cs new file mode 100644 index 0000000..1371586 --- /dev/null +++ b/JinYuan.Models/SysConfig/VariableConfig.cs @@ -0,0 +1,113 @@ +namespace JinYuan.Models +{ + // 变量配置模型 + public class VariableConfig + { + + public string _varName; + + public string VarName + { + get => _varName; + set + { + if (_varName == value) return; + _varName = value; + + } + } + + public string _varAddress; + public string VarAddress + { + get => _varAddress; + set + { + if (_varAddress == value) return; + _varAddress = value; + + } + } + + public string _start; + public string Start + { + get => _start; + set + { + if (_start == value) return; + _start = value; + + } + } + + + public string _dataType; + public string DataType + { + get => _dataType; + set + { + if (_dataType == value) return; + _dataType = value; + + } + } + + + public int _offsetOrLength; + public int OffsetOrLength + { + get => _offsetOrLength; + set + { + if (_offsetOrLength == value) return; + _offsetOrLength = value; + + } + } + /// + /// PLC编号 + /// + private int _plcNum; + public int PlcNum + { + get => _plcNum; + set + { + if (_plcNum == value) return; + _plcNum = value; + + } + } + /// + /// 通信组 + /// + private string _groupName; + public string GroupName + { + get => _groupName; + set + { + if (_groupName == value) return; + _groupName = value; + + } + } + private string _remark; + public string Remark + { + get => _remark; + set + { + if (_remark == value) return; + _remark = value; + + } + + } + + + + } +} diff --git a/JinYuan.Models/app.config b/JinYuan.Models/app.config new file mode 100644 index 0000000..90f0655 --- /dev/null +++ b/JinYuan.Models/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.Models/packages.config b/JinYuan.Models/packages.config new file mode 100644 index 0000000..c068d60 --- /dev/null +++ b/JinYuan.Models/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JinYuan.VirtualDataLibrary/CommonMethods.cs b/JinYuan.VirtualDataLibrary/CommonMethods.cs new file mode 100644 index 0000000..2cad9bb --- /dev/null +++ b/JinYuan.VirtualDataLibrary/CommonMethods.cs @@ -0,0 +1,808 @@ +using JinYuan.DAL; +using JinYuan.Models; +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using System.IO; +using System.Threading; +using JinYuan.Helper; +using JinYuan.MES; +using PLC; +using PLC.PLCAlarm; +using System.Xml.Linq; +using JinYuan.MES.Models; +using HML; +using System.Data; +using System.Collections.Concurrent; +using JinYuan.VirtualDataLibrary.Utlis; + +namespace JinYuan.VirtualDataLibrary +{ + public class CommonMethods + { + /// + /// 本地数据库 + /// + public static ISugarHepler db = new SQLSugarService(); + /// + /// C段出站数据库 + /// + public static ISugarHepler dbC = new SQLSugarService(); + /// + /// 远程服务段数据库 + /// + public static ISugarHepler dbServer = new SQLSugarService(); + /// + /// 全局的PLC链接 + /// + public static List plcDevices; + /// + /// plc状态 + /// + public static readonly Dictionary> plcStatuses = new Dictionary>(); + /// + /// 报警 + /// + public static AlarmManager alarmManager = new AlarmManager(); + /// + /// MES接口 + /// + public static IMes hbgMes = new MesDataProcess(); + /// + /// 参数 + /// + public static ProductModelParam parRange = new ProductModelParam(); + /// + /// 全局钩子 + /// + public static ScanerHook listener = new ScanerHook(); + + /// + /// 创建个全局焊接功率队列数据存储 + /// + public static List> QWeldingPowerData = new List>(); + + /// + /// 创建个全局入壳推力队列数据存储 + /// + public static List> QPlanenessData = new List>(); + + /// + /// 创建全局的登录对象 + /// + public static SysAdmin currentAdmin = null; + /// + /// 创建全局的登录对象 + /// + public static List listNgCodeEntity = new List(); + /// + /// 登录是否成功 + /// + public static bool IsLoginOk = false; + + //创建一个全局的配置对象 + public static SysConfig sysConfig = new SysConfig(); + + public static int InvadTime; + + /// + /// 智能电表 + /// + public static List listElectricEnergy = new List(); + + /// + /// 电能表 + /// + public static EnergyMeterHelper energyMeter = new EnergyMeterHelper(); + + /// + ///是否开启刷新 + /// + public static bool isRefreshTimerWeeding = false; + + /// + /// SQL语句 + /// + public static DBSQL dBSQL { get; } = new DBSQL(); + + public static M_DBCtrl m_DBCtrl { get; } = new M_DBCtrl(); + + /// + /// MES配置文件类 + /// + public static MesConfig mesConfig = new MesConfig(); + + /// + /// 打印模板配置文件类 + /// + public static BTWConfig btwConfig = new BTWConfig(); + + ///创建一个全局的连接状态 + public static bool connectState = false; + + /// + /// 滴答次数 + /// + public static int tickCount = 0; + /// + /// QIEHUAN + /// + public static int tickHomeCount = 0; + /// + /// 报警信息 + /// + public static string SlideAlarmText = "当前无报警"; + /// + /// 退出 + /// + public static bool IsExit = false; + /// + /// 是否登出账户 + /// + public static bool LoginOut = false; + /// + /// 是否上传MES + /// + public static bool IsUpMes { get; set; } + /// + /// 是否运行 + /// + public static bool IsRun { get; set; } = false; + /// + /// 上一次设备状态 + /// + public static int DeviceStatus = 0; + /// + /// 上一次Guid + /// + public static string DeviceGuid = ""; + /// + ///第一次读取 + /// + public static bool IsFirst = false; + /// + /// 焊接功率波形图显示条数 + /// + public static int ChatLineCount = 3; + /// + /// 员工号 + /// + public static string strWorker { get; set; } + /// + /// 是否开启智能电表 + /// + public static bool IsStartZNDB { get; set; } = false; + /// + /// 白夜班 + /// + public static string strClass { get; set; } = "白班"; + /// + /// 时间变更 + /// + public static string ChangeClassTime { get; set; } = "20:30:00"; + /// + /// 设备状态 + /// + public static List Statues { get; set; } + + /// + /// 服务器链接状态 + /// + public static bool EMCStatues { get; set; } + + #region 小时产能 + /// + /// 上个时间点的总数 + /// + public static int LastTotalNum { get; set; } = 0; + /// + /// 上个时间点良品数 + /// + public static int LastOkNum { get; set; } = 0; + /// + /// 上一次重置计数的时间 + /// + public static string LastResetTime { get; set; } + /// + /// 上一次的小时 + /// + public static int LastHour { get; set; } + #endregion + + /// + /// + /// + public static List ListOmronGroups { get; set; } + + /// + /// 12小时产能 + /// + public static List Lst_Prod12HourData = new List(); + /// + /// 不良选项(检测项不良) + /// + public static List Lst_DefectTypeQty = new List(); + + /// + /// PLC报警前10项 + /// + public static List Lst_AlarmTop10_Qty = new List(); + /// + /// 参数项设置 + /// + public static List paramlists { get; set; } + + /// + /// 线程控制 + /// + public static ManualResetEvent ResetEventRecv = new ManualResetEvent(true); + + + #region 计数项 + /// + /// 生产总数 + /// + public static float TotalQty = 0; + + public static float ProOKQty = 0; + + public static float Ppm = 0; + + public static double JiaDL = 0.0; + + public static List AntiDustAirSpeed = new List(); + /// + /// PLC开机/运行时间 + /// + public static List PlcOpenAndRunTime = new List(); + /// + /// PLC开机/运行时间地址 + /// + public static List PlcOpenAndRunTimeAdress = new List { "D50", "D52", "D54", "D56", "D58", "D60" }; + public static int ProdGaoRFIDNgQty = 0;//高托杯 绑定卷心码 + public static int ProdDiRFIDNgQty = 0;//低托杯 绑定钢壳码 + + public static int ProdGangKeRFIDNgQty = 0;//钢壳托杯 绑定出站钢壳码 + public static int ProdJuanBarNgQty = 0; + public static int ProdGangKeBarNgQty = 0; + + public static int ProdRuKeTuiliNgQty = 0; + public static int ProdCCDNgQty = 0; + public static int ProdMesOutNGQty = 0; + #endregion + + #region 配置信息 + /// + /// 错误日志路径 + /// + public static string strErrorLogspath = "D:\\APILog\\Logs\\ErrorLogs"; + + public static string strSystemLogspath = "D:\\APILog\\Logs\\SystemLogs"; + public static string strAlarmLogspath = "D:\\APILog\\Logs\\AlarmLogs"; + + public static string strsqlLogspath = ""; + /// + /// 删除路径 + /// + public static string strDeletepath = ""; + /// + /// 能耗保存路径 + /// + public static string strWattrMeterpath = "D:\\APILog\\Logs\\智能电表数据"; + /// + /// MES路径日志 + /// + public static string strMesLogspath = "D:\\APILog\\Logs\\MesLogs"; + /// + /// 设备状态信息路径 + /// + public static string strDeviceStatusPath = System.Windows.Forms.Application.StartupPath + "\\Config\\DeviceStatus.cfg"; + + + /// + /// 主界面下列表绑定数据 + /// + public static DropDownListPlusItemCollection DropDownItemList = new DropDownListPlusItemCollection(); + + + /// + /// PLC读取寄存器配置文件路径 + /// + public static string ConfigPath = Path.Combine(System.Windows.Forms.Application.StartupPath, "ini\\PlcConfig.ini"); + /// + /// 系统程序配置文件路径 + /// + //public static string iniFilePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "ini\\Configure.ini"); + + public static string xmlFilePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "Config\\Configure.xml"); + /// + /// 配置文件字典 + /// + public static Dictionary> Configxml = new Dictionary>(); + + + #region 读取配置文件 + + // 读取 XML 配置文件 + public static Dictionary> ReadXmlConfig(string filePath) + { + var config = new Dictionary>(); + if (!File.Exists(filePath)) + { + MessageBox.Show($"配置文件不存在:{filePath}\n请检查Config文件夹是否存在,且包含Configure.xml文件"); + return config; + } + + XDocument xmlDoc = XDocument.Load(filePath); + + foreach (var sectionElement in xmlDoc.Root.Elements()) + { + string sectionName = sectionElement.Name.LocalName; + config[sectionName] = new Dictionary(); + + foreach (var keyElement in sectionElement.Elements()) + { + string key = keyElement.Name.LocalName; + string value = keyElement.Value; + config[sectionName][key] = value; + } + } + + return config; + } + + // 获取配置值 + public static string GetConfigValue(Dictionary> config, string section, string key, string defaultValue) + { + if (config.ContainsKey(section) && config[section].ContainsKey(key)) + { + return config[section][key]; + } + return defaultValue; + } + + + // 写入 XML 文件 + public static void WriteXmlFile(Dictionary> config, string filePath) + { + XDocument xmlDoc = new XDocument(new XElement("Configuration")); + + foreach (var section in config) + { + var sectionElement = new XElement(section.Key); + foreach (var keyValue in section.Value) + { + sectionElement.Add(new XElement(keyValue.Key, keyValue.Value)); + } + xmlDoc.Root.Add(sectionElement); + } + xmlDoc.Save(filePath); + } + + /// + /// 单个配置数据保存 + /// + /// + /// + /// + public static void UpdateConfig(string INFO, string Type, string value) + { + // 更新 Configxml 中的 SteelshellCount + CommonMethods.Configxml[INFO][Type] = value; + + // 将更新后的 Configxml 写入文件 + CommonMethods.WriteXmlFile(CommonMethods.Configxml, CommonMethods.xmlFilePath); + } + + + /// + ///读取配置文件 + /// + public static SysConfig GetSysConfig() + { + try + { + + #region 系统配置文件 + return sysConfig = new SysConfig + { + AutoStart = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "AutoStart", "true")), + AutoLogin = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "AutoLogin", "true")), + AutoLock = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "AutoLockScreen", "false")), + LockPeriod = Convert.ToInt32(GetConfigValue(Configxml, "CONFIG_INFO", "LockIntervalTime", "0")), + AutoQieHuanM = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "AutoSwitchMonitor", "false")), + QieHuanMPeriod = Convert.ToInt32(GetConfigValue(Configxml, "CONFIG_INFO", "SwitchMonitorInterval", "0")), + ShowSeriesCount = Convert.ToInt32(GetConfigValue(Configxml, "CONFIG_INFO", "CurveDisplayCount", "0")), + SwipeCardMode = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "EnableCardMode", "false")), + MesModeSwitching = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "MESModeSwitch", "false")), + GetMesParam = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "FetchMESParams", "false")), + SaveThreadTime = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "SaveThreadTimeLog", "false")), + IsDebugMode = Convert.ToBoolean(GetConfigValue(Configxml, "CONFIG_INFO", "IsDebugMode", "true")) + }; + #endregion + } + catch (Exception) + { + return sysConfig = null; + } + } + + /// + /// 获取MES配置文件 + /// + public static MesConfig GetMesConfig() + { + try + { + #region MES配置文件 + return mesConfig = new MesConfig + { + siteCode = GetConfigValue(Configxml, "MES_CONFIG", "SiteCode", "57M"), + lineCode = GetConfigValue(Configxml, "MES_CONFIG", "LineCode", "PW-571"), + equipNum = GetConfigValue(Configxml, "MES_CONFIG", "EquipNum", "571VIM01"), + CustomerPartNum = GetConfigValue(Configxml, "MES_CONFIG", "CustomerPartNum", "491VIM01"), + containerCode = GetConfigValue(Configxml, "MES_CONFIG", "ContainerCode", "PLT43F030000001"), + MESURLAddressIP = GetConfigValue(Configxml, "MES_CONFIG", "MESIp", "10.100.111.81"), + MESURLAddressPort = GetConfigValue(Configxml, "MES_CONFIG", "MESPort", "80"), + EmployeeAuthCheck = GetConfigValue(Configxml, "MES_CONFIG", "EmployeeAuthCheck", "571VIM01"), + DeviceParamRequest = GetConfigValue(Configxml, "MES_CONFIG", "DeviceParamRequest", "571VIM01"), + DeviceParamChange = GetConfigValue(Configxml, "MES_CONFIG", "DeviceParamChange", "491581VIM01VIM01"), + DeviceAlarm = GetConfigValue(Configxml, "MES_CONFIG", "DeviceAlarm", "581VIM01"), + DeviceStatus = GetConfigValue(Configxml, "MES_CONFIG", "DeviceStatus", "581VIM01"), + EnergyConsumption = GetConfigValue(Configxml, "MES_CONFIG", "EnergyConsumption", "581VIM01"), + Anemometer = GetConfigValue(Configxml, "MES_CONFIG", "Anemometer", "581VIM01"), + //AppID = GetConfigValue(Configxml, "MES_CONFIG", "APPID", "491VIM01"), + //AppKey = GetConfigValue(Configxml, "MES_CONFIG", "APPKEY", "491VIM01"), + //GetTokenUrl = GetConfigValue(Configxml, "MES_CONFIG", "GetTokenUrl", "491VIM01"), + queryCartonUrl = GetConfigValue(Configxml, "MES_CONFIG", "QueryCartonUrl", ""), + queryPalletUrl = GetConfigValue(Configxml, "MES_CONFIG", "QueryPalletUrl", ""), + bindingUrl = GetConfigValue(Configxml, "MES_CONFIG", "BindingUrl", ""), + customerType = GetConfigValue(Configxml, "MES_CONFIG", "customerType", "O2"), + }; + #endregion + } + catch (Exception) + { + return mesConfig = null; + } + } + + /// + /// 获取BTW配置文件 + /// + public static BTWConfig GetBtwConfig() + { + try + { + #region 打印模板路径配置文件 + return btwConfig = new BTWConfig + { + IsConnectPrinter = Convert.ToBoolean(GetConfigValue(Configxml, "BTW_CONFIG", "IsConnectPrinter", "false")), + containerBTWPath = GetConfigValue(Configxml, "BTW_CONFIG", "ContainerBTWPath", ""), + palletBTWPath = GetConfigValue(Configxml, "BTW_CONFIG", "PalletBTWPath", ""), + printerName = GetConfigValue(Configxml, "BTW_CONFIG", "PrinterName", ""), + }; + #endregion + } + catch (Exception) + { + return btwConfig = null; + } + } + + #endregion + + public static string deviceConfigPath = Application.StartupPath + "\\Config\\Device.xlsx"; + public static string groupConfigPath = Application.StartupPath + "\\Config\\Group.xlsx"; + public static string variableConfigPath = Application.StartupPath + "\\Config\\Variable.xlsx"; + public static string FdConfigFilePath = Application.StartupPath + "\\Config\\FdConfig.xlsx"; + + + #region 保存配置文件 + /// + /// 保存启动自动登录 + /// + /// + /// + public static bool SaveAutoStart(bool value) + { + Configxml["CONFIG_INFO"]["AutoStart"] = value.ToString(); // 修改自动登录为 True + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + /// + /// 保存开机自动启动 + /// + /// + /// + public static bool SaveAutoLogin(bool value) + { + Configxml["CONFIG_INFO"]["AutoLogin"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 保存无操作自动锁屏 + /// + /// + /// + public static bool SaveAutoLock(bool value) + { + Configxml["CONFIG_INFO"]["AutoLockScreen"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + public static bool SaveConnectPrinter(bool value) + { + Configxml["BTW_CONFIG"]["IsConnectPrinter"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 保存锁屏间隔时间 + /// + /// + /// + public static bool SaveLockPeriod(int value) + { + Configxml["CONFIG_INFO"]["LockIntervalTime"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + + /// + /// 保存无操作自动切换监控界面 + /// + /// + /// + public static bool SaveAutoQieHuanM(bool value) + { + Configxml["CONFIG_INFO"]["AutoSwitchMonitor"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + + /// + /// 保存无操作自动切换监控界面 + /// + /// + /// + public static bool SaveIsDebug(bool value) + { + Configxml["CONFIG_INFO"]["IsDebugMode"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 保存切换监控界面间隔时间 + /// + /// + /// + public static bool SaveQieHuanMPeriod(int value) + { + Configxml["CONFIG_INFO"]["SwitchMonitorInterval"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 保存曲线显示数量 + /// + /// + /// + public static bool SaveShowSeriesCount(int value) + { + Configxml["CONFIG_INFO"]["CurveDisplayCount"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 开启刷卡模式 + /// + /// + /// + public static bool SaveSwipeCardMode(bool value) + { + Configxml["CONFIG_INFO"]["EnableCardMode"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + /// + /// MES/非MES模式 + /// + /// + /// + public static bool SaveOpenMesModel(bool value) + { + Configxml["CONFIG_INFO"]["MESModeSwitch"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 获取MES参数 + /// + /// + /// + public static bool SaveGetMesParam(bool value) + { + Configxml["CONFIG_INFO"]["FetchMESParams"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + + /// + /// 保存线程耗时操作 + /// + /// + /// + public static bool SaveSaveThreadTime(bool value) + { + Configxml["CONFIG_INFO"]["SaveThreadTimeLog"] = value.ToString(); + WriteXmlFile(Configxml, xmlFilePath); + return true; + } + #endregion + + #endregion + + #region 委托信息 + //创建委托 + // 数据监视委托 + public static Action AddDataMonitorDelegate; + /// + /// 系统日志 + /// + public static Action AddLogDelegate; + /// + /// 操作日志 + /// + public static Action AddOPLogDelegate; + /// + /// 报警日志 + /// + public static Action AddAlarmDelegate; + /// + /// 显示报警信息 + /// + public static Action ShowAlarmDelegate; + /// + /// 参数更新 + /// + public static Action ChangeParamDelegate; + /// + /// + /// + public static Action AddHomeDelegate; + /// + /// 显示进站信息 + /// + public static Action> ShowFeedingDelegate; + /// + /// 显示出站数据 + /// + public static Action> ShowBlankingDelegate; + /// + /// 显示箱唛打印信息 + /// + public static Action> ShowPrintContainergDelegate; + /// + /// 显示栈板打印信息 + /// + public static Action> ShowPrintPalletDelegate; + /// + /// 数据监视委托 + /// + /// + /// + public static void AddDataMonitorLog(int type, string info) + { + //调用委托 + if (AddDataMonitorDelegate != null) + { + AddDataMonitorDelegate(type, info); + } + } + + /// + /// 写入系统日志 + /// + /// 是否为错误信息 + /// 日志信息 + public static void AddLog(bool isError, string info) + { + //调用委托 + if (AddLogDelegate != null) + { + AddLogDelegate(isError, info); + } + } + /// + /// 写入操作日志 + /// + /// + /// + public static void AddOPLog(bool isError, string info) + { + //调用委托 + if (AddLogDelegate != null) + { + AddOPLogDelegate(isError, info); + } + } + + public static void AddAlarmLog(SysLog sysLog) + { + //调用委托 + if (AddAlarmDelegate != null) + { + AddAlarmDelegate(sysLog); + } + } + + /// + /// 显示报警日志 + /// + /// + public static void ShowAlarmLog(string info) + { + //调用委托 + if (ShowAlarmDelegate != null) + { + ShowAlarmDelegate(info); + } + } + + public static void ChangeParamData() + { + //调用委托 + if (ChangeParamDelegate != null) + { + ChangeParamDelegate(); + } + } + #endregion + + /// + /// TODO PLC变量集合 + /// KEY = VarAddress + /// + public static ConcurrentDictionary PLCVariable = new ConcurrentDictionary(); + + // 打印机 + /// + /// zebra + /// + public static BartenderPrinter containerPrint; + //public static string containerPrintName = "ContainerPrint"; + + /// + /// 栈板 + /// + public static BartenderPrinter palletPrint; + //public static string palletPrintName = "PalletPrint"; + + /// + /// 3S + /// + //public static BartenderPrinter _3SPrint; + //public static string _3SPrintName = "3SPrint"; + + /// + /// 6J + /// + //public static BartenderPrinter _6JPrint; + //public static string _6JPrintName = "6JPrint"; + + public static PrintSocket.TCPClient tcpClient; + } + + +} diff --git a/JinYuan.VirtualDataLibrary/DBSQL.cs b/JinYuan.VirtualDataLibrary/DBSQL.cs new file mode 100644 index 0000000..8f00361 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/DBSQL.cs @@ -0,0 +1,648 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.VirtualDataLibrary +{ + public class DBSQL + { + + /// + /// 获取PLC换型参数绑定值 + /// + /// + /// + public string GetPlcParamSql(string modelName) + { + string strSql = $@"SELECT + '{modelName}' AS `ModelName`, + `pb`.`PLCAddress`, + `pc`.`PLCValue`, + `pc`.`UpdateTime`, + `pb`.`PLCRemark`, + `pb`.`OrderNum` + FROM + `Plcconfigbase` `pb` + LEFT JOIN + (SELECT * FROM `Plcconfig` WHERE `ModelName` = '{modelName}') `pc` + ON + `pb`.`PLCAddress` = `pc`.`PLCAddress` + ORDER BY + `pb`.`OrderNum`"; + + return strSql; + } + + /// + /// 获取产品型号参数 + /// + /// + /// + public string GetParamSql(string strModelType) + { + string strSql = $@"SELECT + `pb`.`ParaName`, + '{strModelType}' AS `ModelName`, + `pl`.`ParaValueMin`, + `pl`.`ParaValueMax`, + `pl`.`Uint`, + `pb`.`Remark`, + `pl`.`UpdateTime` + FROM + `Parambase` `pb` + LEFT JOIN + (SELECT * FROM `ParamList` WHERE `ModelName` = '{strModelType}') `pl` + ON + `pb`.`ParaName` = `pl`.`ParaName` + ORDER BY + `pb`.`fNo` ASC"; + + return strSql; + } + + + /// + /// 获取产品型号列表 + /// + /// + /// + public string GetProdTypeSql(string strProdType = "") + { + string strSql = @"SELECT * FROM ProductModel "; + if (strProdType != "") + { + strSql += string.Format(" where ModelName='{0}'", strProdType); + } + strSql += " order by ModelName"; + return strSql; + } + + + /// + /// 获取产品型号 + /// + /// + /// + public string GetProductParaByProdModel(string strModelType) + { + string strSql = $@"SELECT + `pb`.`ParaName`, + '{strModelType}' AS `ModelName`, + `pl`.`ParaValueMin`, + `pl`.`ParaValueMax`, + `pl`.`Uint`, + `pb`.`Remark`, + `pl`.`UpdateTime` + FROM + `Parambase` `pb` + LEFT JOIN + (SELECT * FROM `Paramlist` WHERE `ModelName` = '{strModelType}') `pl` + ON + `pb`.`ParaName` = `pl`.`ParaName` + ORDER BY + `pb`.`fNo` ASC"; + + return strSql; + } + + + public string GetPLCConfigBases() + { + string strSql = string.Format(@"SELECT * FROM `Plcconfigbase` ORDER BY `OrderNum`"); + + return strSql; + } + + + public string GetSysAdminSql() + { + string strSql = string.Format(@"SELECT + `LoginId`, + `LoginName`, + `LoginPwd`, + `LoginUid`, + `LoginLevel`, + `SystemLog`, + `CpkData`, + `HistoryData`, + `ParamSet`, + `SystemSet`, + `UserManage` + FROM + `SysAdmin`"); + + return strSql; + } + + /// + /// 查询历史数据 + /// + /// + /// + /// + /// + public string SelectHostData(int type, string strRfid, string strBarCode, string strDate1, string strDate2) + { + if (string.IsNullOrWhiteSpace(strDate1)) strDate1 = "1970-01-01 00:00:00"; + if (string.IsNullOrWhiteSpace(strDate2)) strDate2 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + string searchKey = strRfid?.Replace("'", "''") ?? ""; + //if (string.IsNullOrEmpty(safeBarCode)) + // return strSql; + + var queryTemplate = new Dictionary + { + { 0, ("`ContainerCode`, DATE_FORMAT(`TestTime`, '%Y-%m-%d %H:%i:%s') AS `TestTime`, `PalletCode`, `Result`, `Remark`", "`AGearEntity`", "`TestTime`", "`ContainerCode`") }, + { 1, ("`ContainerCode`, DATE_FORMAT(`TestTime`, '%Y-%m-%d %H:%i:%s') AS `TestTime`, `Result`, `Remark`", "`DGearEntity`", "`TestTime`", "`ContainerCode`") }, + //{ 6, ("`PalletCode`, DATE_FORMAT(`TestTime`, '%Y-%m-%d %H:%i:%s') AS `TestTime`, `Result`, `Remark`", "`EGearEntity`", "`TestTime`", "`PalletCode`") }, + { 2, ("`ContainerCode`, `PalletCode`, DATE_FORMAT(`TestTime`, '%Y-%m-%d %H:%i:%s') AS `TestTime`, `Weight`,`Result`, `Remark`", "`BGearEntity`", "`TestTime`", "`ContainerCode`") }, + { 3, ("`container_id` AS `ContainerCode`, `tag_code`, `tag_value`, DATE_FORMAT(`create_time`, '%Y-%m-%d %H:%i:%s') AS `TestTime`", "`ContainerKVDetail`", "`create_time`", "`container_id`") }, + { 4, ("`pallet_id` AS `PalletCode`, DATE_FORMAT(`create_time`, '%Y-%m-%d %H:%i:%s') AS `TestTime`, `tag_code`, `tag_value`", "`PalletKVDetail`", "`create_time`", "`pallet_id`") }, + { 5, ("`pallet_id` AS `PalletCode`, `container_id` AS `ContainerCode`, DATE_FORMAT(`create_time`, '%Y-%m-%d %H:%i:%s') AS `TestTime`", "`PalletEntity`", "`create_time`", "") } + }; + + var (selectSql, tableName, timeField, searchField) = queryTemplate[type]; + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.AppendFormat("SELECT {0} FROM {1} WHERE {2} >= '{3}' AND {4} <= '{5}'", + selectSql,tableName,timeField,strDate1.Replace("'", "''"),timeField,strDate2.Replace("'", "''")); + + if (!string.IsNullOrWhiteSpace(searchKey)) + { + if (type == 5) + { + // type=5特殊处理:同时匹配PalletCode和ContainerCode + sqlBuilder.AppendFormat(" AND (`PalletCode` LIKE '%{0}%' OR `ContainerCode` LIKE '%{0}%')", searchKey); + } + else if (type == 6) + { + // type=6特殊处理:同时匹配pallet_id和container_id + sqlBuilder.AppendFormat(" AND (`pallet_id` LIKE '%{0}%' OR `container_id` LIKE '%{0}%')", searchKey); + } + else + { + // 普通类型:匹配指定搜索字段 + sqlBuilder.AppendFormat(" AND {0} LIKE '%{1}%'", searchField, searchKey); + } + } + + // 返回纯SQL字符串(无自定义参数格式) + return sqlBuilder.ToString(); + + + } + + + /// + /// 查询报警历史数据 + /// + /// + /// + /// + /// + public string SelectHostAlarmData(string start, string end, int alarmType) + { + string strSql = ""; + switch (alarmType) + { + case 1: + strSql = @"SELECT + DATE_FORMAT(`AlarmTime`, '%Y-%m-%d %H:%i:%s') AS `AlarmTime`, + `PLCAdress`, + `AlarmContent`, + `AlarmCount`, + `Class` + FROM + `AlarmCountEntry` + WHERE + `AlarmTime` >= '" + start + "' AND `AlarmTime` <= '" + end + $"' AND `Class` = '{CommonMethods.strClass}'"; + break; + case 2: + strSql = @"SELECT + DATE_FORMAT(`AlarmTime`, '%Y-%m-%d %H:%i:%s') AS `AlarmTime`, + `PLCAdress`, + `AlarmContent`, + `AlarmCount`, + `Class` + FROM + `AlarmCountEntry` + WHERE + `AlarmTime` >= '" + start + "' AND `AlarmTime` <= '" + end + $"' AND `Class` = '{CommonMethods.strClass}'"; + break; + default: + case 0: + strSql = @"SELECT + DATE_FORMAT(`AlarmTime`, '%Y-%m-%d %H:%i:%s') AS `AlarmTime`, + `PLCAdress`, + `AlarmContent`, + `AlarmCount`, + `Class` + FROM + `AlarmCountEntry` + WHERE + `AlarmTime` >= '" + start + "' AND `AlarmTime` <= '" + end + "'"; + break; + } + #region 旧 + //if (alarmType == "全天") + //{ + // strSql = @"SELECT + // DATE_FORMAT(`AlarmTime`, '%Y-%m-%d %H:%i:%s') AS `AlarmTime`, + // `PLCAdress`, + // `AlarmContent`, + // `AlarmCount`, + // `Class` + // FROM + // `AlarmCountEntry` + // WHERE + // `AlarmTime` >= '" + start + "' AND `AlarmTime` <= '" + end + "'"; + //} + //else if (alarmType == "白班") + //{ + // strSql = @"SELECT + // DATE_FORMAT(`AlarmTime`, '%Y-%m-%d %H:%i:%s') AS `AlarmTime`, + // `PLCAdress`, + // `AlarmContent`, + // `AlarmCount`, + // `Class` + // FROM + // `AlarmCountEntry` + // WHERE + // `AlarmTime` >= '" + start + "' AND `AlarmTime` <= '" + end + "' AND `Class` = '白班'"; + //} + //else + //{ + // strSql = @"SELECT + // DATE_FORMAT(`AlarmTime`, '%Y-%m-%d %H:%i:%s') AS `AlarmTime`, + // `PLCAdress`, + // `AlarmContent`, + // `AlarmCount`, + // `Class` + // FROM + // `AlarmCountEntry` + // WHERE + // `AlarmTime` >= '" + start + "' AND `AlarmTime` <= '" + end + "' AND `Class` = '夜班'"; + //} + #endregion + return strSql; + } + + /// + /// 按日统计 + /// + /// + /// + /// + public string GetStaticByDay(string startDateTime, string endDateTime) + { + string strSql = $@"SELECT + DATE_FORMAT(`TestTime`, '%Y-%m-%d %H:00:00') AS `Day`, + `ProdIn`, + `ProdOut`, + `Ppm`, + CONCAT(CAST(ROUND(`JiaDL` * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN `ProdIn` > 0 THEN ROUND(COALESCE(`ProdOut`, 0) / COALESCE(`ProdIn`, 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{startDateTime}' AND '{endDateTime}' + GROUP BY + `TestTime`, `ProdOut`, `ProdIn`, `Ppm`, `JiaDL` + UNION ALL + SELECT + 'Total' AS `Day`, + SUM(`ProdIn`) AS ProdIn, + SUM(`ProdOut`) AS ProdOut, + AVG(`Ppm`) AS Ppm, + CONCAT(CAST(ROUND(AVG(`JiaDL`) * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN SUM(`ProdIn`) > 0 THEN ROUND(COALESCE(SUM(`ProdOut`), 0) / COALESCE(SUM(`ProdIn`), 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{startDateTime}' AND '{endDateTime}'"; + + return strSql; + } + + /// + /// 按周查询 + /// + /// + /// + /// + public string GetStaticByWeek(string startDateTime, string endDateTime) + { + string strSql = $@"SELECT + DATE_FORMAT(`TestTime`, '%Y-%m') AS `Week`, + SUM(`ProdIn`) AS ProdIn, + SUM(`ProdOut`) AS ProdOut, + AVG(`Ppm`) AS Ppm, + CONCAT(CAST(ROUND(`JiaDL` * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN SUM(`ProdIn`) > 0 THEN ROUND(COALESCE(SUM(`ProdOut`), 0) / COALESCE(SUM(`ProdIn`), 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{startDateTime}' AND '{endDateTime}' + GROUP BY + DATE_FORMAT(`TestTime`, '%Y-%m'), `JiaDL` + UNION ALL + SELECT + 'Total' AS `Week`, + SUM(`ProdIn`) AS ProdIn, + SUM(`ProdOut`) AS ProdOut, + AVG(`Ppm`) AS Ppm, + CONCAT(CAST(ROUND(AVG(`JiaDL`) * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN SUM(`ProdIn`) > 0 THEN ROUND(COALESCE(SUM(`ProdOut`), 0) / COALESCE(SUM(`ProdIn`), 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{startDateTime}' AND '{endDateTime}'"; + + return strSql; + } + + + /// + /// 按月查询 + /// + /// + /// + /// + public string GetStaticByMonth(string startDateTime, string endDateTime) + { + string strSql = $@"SELECT + DATE_FORMAT(`TestTime`, '%Y-%m') AS `Month`, + SUM(`ProdIn`) AS ProdIn, + SUM(`ProdOut`) AS ProdOut, + AVG(`Ppm`) AS Ppm, + CONCAT(CAST(ROUND(`JiaDL` * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN SUM(`ProdIn`) > 0 THEN ROUND(COALESCE(SUM(`ProdOut`), 0) / COALESCE(SUM(`ProdIn`), 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{startDateTime}' AND '{endDateTime}' + GROUP BY + DATE_FORMAT(`TestTime`, '%Y-%m'), `JiaDL` + UNION ALL + SELECT + 'Total' AS `Month`, + SUM(`ProdIn`) AS ProdIn, + SUM(`ProdOut`) AS ProdOut, + AVG(`Ppm`) AS Ppm, + CONCAT(CAST(ROUND(AVG(`JiaDL`) * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN SUM(`ProdIn`) > 0 THEN ROUND(COALESCE(SUM(`ProdOut`), 0) / COALESCE(SUM(`ProdIn`), 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{startDateTime}' AND '{endDateTime}'"; + + return strSql; + } + + /// + /// 按班次统计 + /// + /// + /// + /// + /// + public string GetStaticByShift(DateTime dateTime, int shift, string changeShiftTime) + { + string sDateTime1 = string.Empty; + string sDateTime2 = string.Empty; + if (shift == 0)// 白班 + { + DateTime sTempDateTime = Convert.ToDateTime($"{dateTime.ToString("yyyy-MM-dd")} {changeShiftTime}"); + + sDateTime1 = sTempDateTime.AddHours(-12).ToString("yyyy-MM-dd HH:mm:ss"); + sDateTime2 = sTempDateTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + else + { + sDateTime1 = $"{dateTime.ToString("yyyy-MM-dd")} {changeShiftTime}"; + sDateTime2 = Convert.ToDateTime(sDateTime1).AddHours(12).ToString("yyyy-MM-dd HH:mm:ss"); + } + + string strsql = $@"SELECT + DATE_FORMAT(`TestTime`, '%Y-%m-%d %H:00:00') AS `TestTime`, + `ProdIn`, + `ProdOut`, + `Ppm`, + CONCAT(CAST(ROUND(`JiaDL` * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN `ProdIn` > 0 THEN ROUND(COALESCE(`ProdOut`, 0) / COALESCE(`ProdIn`, 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{sDateTime1}' AND '{sDateTime2}' + GROUP BY + `TestTime`, `ProdOut`, `ProdIn`, `Ppm`, `JiaDL` + UNION ALL + SELECT + 'Total' AS `Time`, + SUM(`ProdIn`) AS ProdIn, + SUM(`ProdOut`) AS ProdOut, + AVG(`Ppm`) AS Ppm, + CONCAT(CAST(ROUND(AVG(`JiaDL`) * 100, 1) AS CHAR(10)), '%') AS `JiaDL`, + CONCAT(CAST( + CASE + WHEN SUM(`ProdIn`) > 0 THEN ROUND(COALESCE(SUM(`ProdOut`), 0) / COALESCE(SUM(`ProdIn`), 0) * 100, 2) + ELSE 0 + END AS CHAR(10)), '%') AS `Prod` + FROM + `Hourprod` + WHERE + `TestTime` BETWEEN '{sDateTime1}' AND '{sDateTime2}'"; + + return strsql; + } + + + /// + /// 获取最新的数据 + /// + /// + public string GetStatic(string strDateTime) + { + + string strsql = $@" SELECT [FDate] + ,[FHour] + ,[ProdIn] + ,[ProdOut] + ,[TestTime] + FROM [dbo].[Hourprod] where FDate='{strDateTime}' order by TestTime desc"; + return strsql; + } + + /// + /// 根据条码查询是否存在 + /// + /// + /// + public string GetBarcode(string barCode) + { + string strSql = $@"SELECT EXISTS( + SELECT 1 + FROM `CGearEntity` + WHERE BarCode = '{barCode}') AS barcode_exists"; + return strSql; + } + + ///// + ///// 根据条码获取挡位最新的一条数据 + ///// + ///// + ///// + //public string GetJetCodeTop1Sql(string barCode) + //{ + // string strSql = $@"SELECT + // `InsulationTestShift` + // FROM + // `BGearEntity` + // WHERE `BarCode` = '{barCode}' ORDER BY `TestTime` DESC + // LIMIT 1"; + // return strSql; + //} + + ///// + ///// 根据条码获取重量直径最新的一条数据 + ///// + ///// + ///// + //public string GetOutStationTop1Sql(string barCode) + //{ + // string strSql = $@"SELECT + // `BarCode`, + // `Weight`, + // `Diameter` + // FROM + // `BGearEntity` + // WHERE `BarCode` = '{barCode}' ORDER BY `TestTime` DESC + // LIMIT 1"; + // return strSql; + //} + + /// + /// 获取表头注释 + /// + /// + public string GetSqlFields(string tableName) + { + string strSql = $@"SELECT + COLUMN_NAME, + DATA_TYPE, + COLUMN_COMMENT + FROM + INFORMATION_SCHEMA.COLUMNS + WHERE + TABLE_SCHEMA = 'largesquareone' AND TABLE_NAME = '{tableName}' + ORDER BY + ORDINAL_POSITION;"; + return strSql; + } + } + + public class M_DBCtrl + { + /// --本机数据库表名 + /// + /// + //public string machineInSQLTable = "agearentity"; + public string machineOutSQLTable = "bgearentity"; + + private string[] headerTextOut; + /// + /// 出站数据库表头 + /// + public string[] HeaderTextOut + { + get { return headerTextOut; } + set { headerTextOut = value; } + } + + /// 查询SQL数据库中的数据,并以string数组列表形式返回 + /// + /// + /// + /// 所查询到的数据,null表示不存在 + public List SQLAllDataSearchToStrArrList(string strSql) + { + List strResArrList = new List(); + List strResList = new List(); + try + { + DataTable dt = CommonMethods.db.QueryDataTable(strSql); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + for (int j = 0; j < dt.Columns.Count; j++) + { + string resRow = dt.Rows[i][j].ToString(); + strResList.Add(resRow); + } + string[] strResArr = strResList.ToArray(); + strResList.Clear(); + strResArrList.Add(strResArr); + } + } + } + catch (Exception e) + { + return strResArrList = new List(); + } + return strResArrList; + } + + /// 根据下标在返回的数据库表信息 集合中获取相应数据 + /// index 0:字段 2:中文注释 1:变量类型int\char等 + /// + /// liststring[]类型的集合 + /// string[] 的下标 + /// + public String[] HeaderTextAssignment(List SqlList, int index) + { + string[] headStringlist = new string[SqlList.Count]; + // int i = 0; + try + { + for (int i = 0; i < SqlList.Count; i++) + { + headStringlist[i] = SqlList[i][index]; + } + } + catch (Exception) + { + } + return headStringlist; + } + } +} diff --git a/JinYuan.VirtualDataLibrary/DelegateLib.cs b/JinYuan.VirtualDataLibrary/DelegateLib.cs new file mode 100644 index 0000000..697365e --- /dev/null +++ b/JinYuan.VirtualDataLibrary/DelegateLib.cs @@ -0,0 +1,43 @@ + +using JinYuan.Models; +using PLCCommunication; +using System.Collections.Generic; + +namespace JinYuan.VirtualDataLibrary +{ + + public delegate void dgStationFunction(JYResult bArrays, object plcModel); + + /// + /// 显示上料信息 + /// + /// + /// + //public delegate void dgShowFeeding(List list); + /// + /// 显示下料信息 + /// + /// + /// + //public delegate void dgShowBlanking(List list); + /// + /// 设备综合效率 + /// + /// + public delegate void DGShow12HourData(DeviceOEE device12Hour); + + /// + /// 设备综合效率 + /// + /// + public delegate void DGShowAlarmData(DeviceOEE deviceAlarm); + + + /// + /// 焊机功率 + /// Welding machine power + /// + public delegate void DGShowWeldingPowerData(List DataList); + + +} diff --git a/JinYuan.VirtualDataLibrary/JinYuan.VirtualDataLibrary.csproj b/JinYuan.VirtualDataLibrary/JinYuan.VirtualDataLibrary.csproj new file mode 100644 index 0000000..11df8a5 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/JinYuan.VirtualDataLibrary.csproj @@ -0,0 +1,120 @@ + + + + + Debug + AnyCPU + {2AB7E380-7795-448A-933C-0F6A081B5E7E} + Library + Properties + JinYuan.VirtualDataLibrary + JinYuan.VirtualDataLibrary + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll + + + False + ..\Libs\HML.dll + + + False + ..\Libs\PLCCommunication.dll + + + False + ..\Libs\2016\Seagull.BarTender.Print.dll + + + + + + + + + + + + + + + + + + + Form + + + MsgshowTip.cs + + + + True + True + Resources.resx + + + + + + + {114aa012-29c9-418c-a2d6-3173c5341f51} + JinYuan.DAL + + + {258d0ab7-2b4f-4d8f-a3cd-7a8cb4a85360} + JinYuan.Helper + + + {530b6426-08e7-461c-91dc-787f876620fc} + JinYuan.MES + + + {4c0bcb84-5cd7-4846-8363-c4c10d46e391} + JinYuan.Models + + + {486aecd0-c2bf-43c5-b7d7-88e565ade4b7} + PLC + + + + + + + + MsgshowTip.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/JinYuan.VirtualDataLibrary/MesConfig.cs b/JinYuan.VirtualDataLibrary/MesConfig.cs new file mode 100644 index 0000000..83eeb13 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/MesConfig.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.VirtualDataLibrary +{ + public class MesConfig + { + /// + /// 工厂代码 + /// + public string siteCode = ""; + /// + /// 产线编号 + /// + public string lineCode = ""; + /// + /// 设备编号 + /// + public string equipNum = ""; + /// + /// 客户料号 + /// + public string CustomerPartNum = ""; + + /// + /// 容器编码 + /// + public string containerCode = ""; + /// + /// MES密码 + /// + public string mesPwd = ""; + /// + /// MES账户 + /// + public string mesUserName = ""; + + /// + /// 电表编号 + /// + public List electricMeterNum = new List(); + + /// + /// 风速仪个数 + /// + public int AntiDustAirSpeedCount = 0; + /// + /// 风速仪编号 + /// + public List listAntiDustAirSpeedNum = new List(); + + /// + /// 权限 + /// + public string userLevel = ""; + /// + /// mes返回权限 + /// + public string mesUserLevel = ""; + /// + /// 物料编码 + /// + public string MaterialCode = ""; + /// + /// 生产型号 + /// + public string ModelName = ""; + + private Dictionary modelMapping = new Dictionary() + { + { "MB36", 1 }, + { "MB31", 2 }, + { "MB56", 3 } + }; + + /// + /// 将电池型号转换成下发PLC的型号编号 + /// + /// + /// + public int GetModel(string modelName) + { + if (modelMapping.TryGetValue(modelName, out int result)) + { + return result; // 键存在,返回对应值 + } + // 键不存在,返回0 + return 0; + } + /// + /// 客户类型 + /// + public string customerType = ""; + /// + /// 是否上传MES + /// + public bool isUpMes = false; + /// + /// MES接口URL地址中的IP地址 + /// + public string MESURLAddressIP = "10.100.111.81"; + /// + /// MES接口URL地址中的端口号 + /// + public string MESURLAddressPort = "80"; + /// + /// 是否连接MES + /// + public bool isConnected = false; + /// + /// 是否刷卡? + /// + public bool Isshuaka = false; + /// + /// 是否登录成功? + /// + public bool IsLoginOK = false; + /// + /// 是否登录MES成功? + /// + public bool IsLoginMesOK = false; + /// + /// 获取MES参数 + /// + public bool IsMesParam = false; + /// + /// MES超时 + /// + public long MesOutTime = 0; + /// + /// 焊接点个数 + /// + public int weldNum = 0; + /// + /// 是否2个电表(此功能仅适用于908-6负极焊接两台设备共用一台敢接机只有一个电表) + /// + public bool IsTwoDianBiao = false; + /// + /// 电表编号 + /// + public string ElectricMeterNum = ""; + /// + /// 除尘风速 + /// + public decimal antiDustAirSpeed = 0; + + /// + /// 电机旋转速度 + /// + public decimal dianjiXzSpeed = 0; + /// + /// 设备状态上传时间 + /// + public int EquStatuasTime = 0; + /// + /// 获取服务器数据 + /// + public bool IsGet_Server = true; + /// + /// 生成假数据 + /// + public bool IsDebug = true; + /// + /// 卡板托盘计数 + /// + public int CoreCount = 0; + /// + /// 卡板托盘生成时间 + /// + public string CardTime = ""; + /// + /// 卡板码是否发送成功 + /// + public bool CardSuccess = false; + + /// + /// 原材料上料位置 + /// + public string materialLotCodeLocator = ""; + + /// + /// 存储服务器IP地址 + /// + public string RotueServerIP = "192.168.2.108"; + /// + /// 员工权限校验 + /// + public string EmployeeAuthCheck = "http://10.100.111.81/core/api/public/equipment/base/user/permission/verify"; + ///// + ///// 原材料投入信息 + ///// + //public string MaterialInputInfo = "http://10.100.111.81/core/api/public/raw/material/input/un/first/process"; + /// + /// 设备参数设定值请求 + /// + public string DeviceParamRequest = "http://10.100.111.81/core/api/public/param/setting/request"; + /// + /// 设备参数设定值变更 + /// + public string DeviceParamChange = "http://10.100.111.81/core/api/public/param/setting/change"; + + /// + /// 箱唛信息获取 + /// + public string queryCartonUrl = "http://10.100.111.81/core/api/public/equip/auto/cartonquery"; + + /// + /// 栈板信息获取 + /// + public string queryPalletUrl = "http://10.100.111.81/core/api/public/equip/auto/palletquery"; + + /// + /// 客户标签与系统标签绑定 + /// + public string bindingUrl = "http://10.100.111.81/core/api/public/equip/auto/customer/bind"; + /// + /// 设备报警信息 + /// + public string DeviceAlarm = "http://10.100.111.81/core/api/public/equipment/alarm/currency"; + /// + /// 设备运行状态 + /// + public string DeviceStatus = "http://10.100.111.81/core/api/public/eve/pm/eqm/run/status/operation"; + /// + /// 能耗数据 + /// + public string EnergyConsumption = "http://10.100.111.81/core/api/public/eve/pm/energy/consumption/collection/submit"; + /// + /// 设备风速接口 + /// + public string Anemometer = "https://iot.eveportal.com:9470/eve_api/ems/iot/upload_device_collect_data"; + + ///// + ///// 进出站一体模式× + ///// + //public string InAndOutStationMesUrl = "http://10.17.96.73/core/api/public/14j/out/station/process/turn-in-out"; + + /// + /// appId + /// + public string AppID = "e36ef900320d442f850913e2ebc1d7a1"; + /// + /// AppKey + /// + public string AppKey = "8279ce76217245f48c0cc495c09124a3"; + /// + /// 获取TOKEN + /// + public string GetTokenUrl = "https://esb.evebattery.com:13502/gateway/ewms-eu/openapi/oauth/token"; + } +} diff --git a/JinYuan.VirtualDataLibrary/MsgshowTip.Designer.cs b/JinYuan.VirtualDataLibrary/MsgshowTip.Designer.cs new file mode 100644 index 0000000..cdda500 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/MsgshowTip.Designer.cs @@ -0,0 +1,89 @@ +namespace JinYuan.VirtualDataLibrary +{ + partial class MsgshowTip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label1 = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.Image = global::JinYuan.VirtualDataLibrary.Properties.Resources.感叹号提示_块红色; + this.pictureBox1.Location = new System.Drawing.Point(6, 3); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(87, 80); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("微软雅黑", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label1.ForeColor = System.Drawing.Color.Red; + this.label1.Location = new System.Drawing.Point(95, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(345, 28); + this.label1.TabIndex = 1; + this.label1.Text = "与PLC链接断开,请检查通讯线路!"; + // + // timer1 + // + this.timer1.Interval = 500; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // MsgshowTip + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Yellow; + this.ClientSize = new System.Drawing.Size(434, 84); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "MsgshowTip"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "MsgshowTip"; + this.Load += new System.EventHandler(this.MsgshowTip_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Timer timer1; + } +} \ No newline at end of file diff --git a/JinYuan.VirtualDataLibrary/MsgshowTip.cs b/JinYuan.VirtualDataLibrary/MsgshowTip.cs new file mode 100644 index 0000000..319c15e --- /dev/null +++ b/JinYuan.VirtualDataLibrary/MsgshowTip.cs @@ -0,0 +1,115 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace JinYuan.VirtualDataLibrary +{ + public partial class MsgshowTip : Form + { + /// + /// 图标和文本之间的间距(像素) + /// + const int IconTextSpacing = 3; + /// + /// 显示文字 + /// + string _tipText; + /// + /// 提示图标 + /// + public Image TipIcon { get; set; } + + /// + /// 提示文本 + /// + public string TipText + { + get { return _tipText ?? string.Empty; } + set { _tipText = value; } + } + + public MsgshowTip(string Msg) + { + //双缓冲。有必要 + SetStyle(ControlStyles.UserPaint, true); + DoubleBuffered = true; + InitializeComponent(); + this._tipText = Msg; + } + + private void MsgshowTip_Load(object sender, EventArgs e) + { + //ProcessClientSize(); + ProcessLocation(); + label1.Text = _tipText; + timer1.Enabled = true; + } + + /// + /// 根据图标和文字处理窗体尺寸 + /// + private void ProcessClientSize() + { + Size size = Size.Empty; + if (TipIcon != null) + { + size += TipIcon.Size; + } + if (TipText.Length != 0) + { + if (TipIcon != null) + { + size.Width += IconTextSpacing;//图标与文字的间距 + } + var textSize = TextRenderer.MeasureText(TipText, this.Font); + size.Width += textSize.Width; + if (size.Height < textSize.Height) { size.Height = textSize.Height; } + } + this.ClientSize = size + Padding.Size; + } + private int x, y; //显示的坐标变量 + + private void timer1_Tick(object sender, EventArgs e) + { + this.Close(); + } + + private void ProcessLocation() + { + + #region 弹窗显示在屏幕中间 + this.y = (Screen.PrimaryScreen.Bounds.Height - 30 - this.Height) / 2; + this.x = (Screen.PrimaryScreen.Bounds.Width - 10 - this.Width) / 2; + this.Location = new Point(this.x, this.y); + #endregion + + #region 弹窗显示在屏幕右下角 + //this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width + 15; + //this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height * i - 5 * i; + //this.Location = new Point(this.x, this.y); + #endregion + + #region 弹窗跟随鼠标位置 + //var p = BasePoint; + //p.X -= Screen.PrimaryScreen.WorkingArea.Width - this.Width - 1000;//Screen.PrimaryScreen.WorkingArea.Width-this.Width / 2; + + ////横向处理。距离屏幕左右两边太近时的处理 + //int screenWidth; + //if (p.X < 10) + //{ + // p.X = 10; + //} + //else if (p.X + this.Width > (screenWidth = Screen.PrimaryScreen.Bounds.Width) - 10) + //{ + // p.X = screenWidth - 10 - this.Width; + //} + + ////纵向处理。在鼠标上方显示 + //p.Y -= this.Height + 20; + + //this.Location = p; + #endregion + } + + } +} diff --git a/JinYuan.VirtualDataLibrary/MsgshowTip.resx b/JinYuan.VirtualDataLibrary/MsgshowTip.resx new file mode 100644 index 0000000..1f666f2 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/MsgshowTip.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/JinYuan.VirtualDataLibrary/Properties/AssemblyInfo.cs b/JinYuan.VirtualDataLibrary/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..52f93ec --- /dev/null +++ b/JinYuan.VirtualDataLibrary/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("JinYuan.VirtualDataLibrary")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JinYuan.VirtualDataLibrary")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("2ab7e380-7795-448a-933c-0f6a081b5e7e")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/JinYuan.VirtualDataLibrary/Properties/Resources.Designer.cs b/JinYuan.VirtualDataLibrary/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f8bac29 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace JinYuan.VirtualDataLibrary.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("JinYuan.VirtualDataLibrary.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 感叹号提示_块红色 { + get { + object obj = ResourceManager.GetObject("感叹号提示-块红色", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/JinYuan.VirtualDataLibrary/Properties/Resources.resx b/JinYuan.VirtualDataLibrary/Properties/Resources.resx new file mode 100644 index 0000000..23cf1b4 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\感叹号提示-块红色.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/JinYuan.VirtualDataLibrary/Resources/感叹号提示-块红色.png b/JinYuan.VirtualDataLibrary/Resources/感叹号提示-块红色.png new file mode 100644 index 0000000..eef6632 Binary files /dev/null and b/JinYuan.VirtualDataLibrary/Resources/感叹号提示-块红色.png differ diff --git a/JinYuan.VirtualDataLibrary/Utlis/BartenderPrinter.cs b/JinYuan.VirtualDataLibrary/Utlis/BartenderPrinter.cs new file mode 100644 index 0000000..7bc786d --- /dev/null +++ b/JinYuan.VirtualDataLibrary/Utlis/BartenderPrinter.cs @@ -0,0 +1,271 @@ +using JinYuan.Helper; +using Seagull.BarTender.Print; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + +namespace JinYuan.VirtualDataLibrary.Utlis +{ + public class BartenderPrinter + { + LabelFormatDocument print; + Engine engine; + string PrinterName; + string PrintLabelType; + + /// + /// 初始化打印机 + /// + /// 打印机名称通过该名称指定打印机 + /// 打印机类型 + public BartenderPrinter(string PrinterName, string PrintLabelType) + { + this.PrinterName = PrinterName; + this.PrintLabelType = PrintLabelType; + engine = new Engine(true); + } + + public BartenderPrinter(string PrinterName) + { + this.PrinterName = PrinterName; + engine = new Engine(true); + } + + + public string[] read(string path) + { + try + { + LabelFormatDocument print; + + + //System.Diagnostics.Process.Start("ExpLore", path); + + + print = engine.Documents.Open(path); + //print.PrintSetup.PrinterName = "Microsoft Print to PDF"; + //print.PrintSetup.PrinterName = "TSC MX340F"; + XmlDocument xml = new XmlDocument(); + xml.LoadXml(print.SubStrings.XML); + //string s = print.SubStrings.XML; + //获取XML中SubStrings/SubString + XmlNodeList nodeList = xml.SelectNodes("SubStrings/SubString"); + string[] printColumns = new string[print.SubStrings.Count]; + int count = 0; + foreach (XmlNode node in nodeList) + { + printColumns[count] = node.Attributes["Name"].Value; + count++; + } + //获取栏位 + return printColumns; + } + catch (Exception ex) + { + throw new Exception(ex.ToString()); + } + } + + /// + /// 执行打印 + /// + /// 文件地址 + /// 字段栏位映射,key BTname ,value BTValue + /// + public bool write(string path, string jobName, Dictionary printValue) + { + try + { + print = engine.Documents.Open(path); + //print.PrintSetup.PrinterName = "Microsoft Print to PDF"; + //print.PrintSetup.PrinterName = "TSC MX340"; + //print.PrintSetup.PrinterName = "TSC TTP-346MU"; + print.PrintSetup.PrinterName = this.PrinterName; + foreach (var oneItem in printValue) + { + print.SubStrings.SetSubString(oneItem.Key, oneItem.Value); + //log.Debug("[" + oneItem.Key + "]=" + oneItem.Value); + } + //Thread.Sleep(100); + + Result result = print.Print(jobName); //print.Print("Label Print"); + + return result == Result.Success ? true : false; + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + return false; + } + } + + /// + /// 读取btw檔 并确认各栏位是否能对应的到 + /// + /// + /// + /// + /// + /// + public string LoadColumns(string FileId, string Path, DataTable SourceDataTable, DataTable DtPrintColumn) + { + try + { + string msg = ""; + + string[] btwColumns = read(Path); + for (int i = 0; i < btwColumns.Length; i++)//版面欄位數量 + { + bool flag = false; + foreach (DataColumn dc in SourceDataTable.Columns)//資料庫欄位數量 + { + if (btwColumns[i] == dc.ColumnName) + { + flag = true; + } + } + + if (flag == false) + { + if (msg == "") { msg = btwColumns[i]; } + else { msg += "," + btwColumns[i]; } + } + } + + if (msg == "") + { + DataTable dt = DtPrintColumn; + string Id = FileId; + + DataRow[] drAry = dt.Select(" Id='" + Id + "'"); + for (int j = 0; j < drAry.Length; j++) + { + dt.Rows.Remove(drAry[j]); + } + dt.AcceptChanges(); + + DataRow drNew; + for (int j = 0; j < btwColumns.Length; j++) + { + drNew = dt.NewRow(); + drNew["Id"] = Id; + drNew["Value"] = btwColumns[j]; + dt.Rows.Add(drNew); + } + dt.AcceptChanges(); + } + + return msg; + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + return ex.ToString(); + } + } + + // 列印 Reel或Box或Carton标签 + // TODO 偵測非同步處理 + public bool PrintLabel(DataRow dr) + { + try + { + string Id = ""; + string fileIdColumnName = ""; + string filePathColumnName = ""; + if (dr == null) + { + LogHelper.Instance.WriteError("DataRow is NULL"); + return false; + } + DataTable columnDT = new DataTable(); + if (PrintLabelType == "Box") + { + fileIdColumnName = "FileId"; + filePathColumnName = "Path"; + + } + else if (PrintLabelType == "Reel") + { + fileIdColumnName = "ReelFileId"; + filePathColumnName = "ReelFilePath"; + + } + else if (PrintLabelType == "Carton") + { + fileIdColumnName = "FileId"; + filePathColumnName = "Path"; + + } + else if (PrintLabelType == "Carton2") + { + fileIdColumnName = "FileId2"; + filePathColumnName = "Path2"; + } + else + { + LogHelper.Instance.WriteError("PrintLabelType =" + PrintLabelType); + return false; + } + + Id = dr[fileIdColumnName].ToString(); + + DataRow[] drAry = columnDT.Select("id='" + Id + "'"); + + Dictionary printValue = new Dictionary(); + + for (int i = 0; i < drAry.Length; i++) + { + string column = drAry[i][1].ToString(); + + printValue.Add(column, dr[column].ToString().TrimEnd()); + + } + bool writeResult = write(dr[filePathColumnName].ToString(), PrintLabelType, printValue); + return writeResult; + + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + throw ex; + } + } + + //列印 Interior Label 或 Outer Label + public bool PrintSimpleLabel(string chrCkdh, string jobname, string FilePath) + { + try + { + Dictionary printValue = new Dictionary(); + printValue.Add("chrCkdh", chrCkdh.TrimEnd()); + bool writeResult = write(FilePath, jobname, printValue); + return writeResult; + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + throw ex; + } + } + + public bool Close() + { + try + { + engine.Dispose(); + + return true; + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + return false; + } + } + } +} diff --git a/JinYuan.VirtualDataLibrary/Utlis/PrintDataTransfer.cs b/JinYuan.VirtualDataLibrary/Utlis/PrintDataTransfer.cs new file mode 100644 index 0000000..8982238 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/Utlis/PrintDataTransfer.cs @@ -0,0 +1,943 @@ +//using JinYuan.VirtualDataLibrary.Utlis; +//using System; +//using System.Collections.Generic; +//using System.IO; +//using System.Linq; +//using System.Text; +using JinYuan.MES.Models; +using Newtonsoft.Json; +using PLCCommunication.BasicFramework; + +//using System.Net; +//using System.Net.Sockets; +//using System.Threading.Tasks; + + +//namespace JinYuan.VirtualDataLibrary.Utlis +//{ +// public class PrintDataModel +// { +// public string PrintTaskId { get; set; } = Guid.NewGuid().ToString(); +// public string PrinterName { get; set; } +// public string Code { get; set; } +// public Dictionary PrintFields { get; set; } = new Dictionary(); +// public int CopyCount { get; set; } = 1; +// public DateTime PrintTime { get; set; } = DateTime.Now; +// } + +// // 通信响应实体(服务端返回处理结果) +// public class PrintResponseModel +// { +// public bool Success { get; set; } +// public string Message { get; set; } +// public string PrintTaskId { get; set; } +// } + +// /// +// /// Socket通信工具类(兼容所有.NET版本) +// /// +// public static class SocketPrintHelper +// { +// // JSON序列化配置(中文不转义、缩进) +// private static readonly JsonSerializerSettings _jsonSettings = new JsonSerializerSettings +// { +// Formatting = Formatting.Indented, +// StringEscapeHandling = StringEscapeHandling.EscapeNonAscii // 中文不转义 +// }; + +// /// +// /// 发送打印数据(客户端核心方法) +// /// +// public static PrintResponseModel SendPrintData(string serverIp, int serverPort, Dictionary printData, int timeout = 5000) +// { +// TcpClient tcpClient = null; +// NetworkStream stream = null; +// try +// { +// tcpClient = new TcpClient +// { +// ReceiveTimeout = timeout, +// SendTimeout = timeout +// }; +// tcpClient.Connect(serverIp, serverPort); +// stream = tcpClient.GetStream(); +// bool bconnnet = tcpClient.Connected; + + +// // 使用Newtonsoft.Json序列化 +// string jsonData = JsonConvert.SerializeObject(printData, _jsonSettings); +// byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonData); + +// // 发送数据长度 +// byte[] lengthBytes = BitConverter.GetBytes(jsonBytes.Length); +// if (BitConverter.IsLittleEndian) +// Array.Reverse(lengthBytes); +// stream.Write(lengthBytes, 0, lengthBytes.Length); +// stream.Write(jsonBytes, 0, jsonBytes.Length); +// Console.WriteLine($"已发送打印数据(任务ID:{printData}):\n{jsonData}"); + +// // 接收响应 +// PrintResponseModel response = ReceivePrintResponse(stream, printData["container"], timeout); +// return response; +// } +// catch (SocketException ex) +// { +// return new PrintResponseModel +// { +// Success = false, +// Message = $"连接服务端失败:{ex.Message}(IP:{serverIp}:{serverPort})", +// PrintTaskId = printData["container"] +// }; +// } +// catch (TimeoutException) +// { +// return new PrintResponseModel +// { +// Success = false, +// Message = $"通信超时(超时时间:{timeout}ms)", +// PrintTaskId = printData["container"] +// }; +// } +// catch (Exception ex) +// { +// return new PrintResponseModel +// { +// Success = false, +// Message = $"发送打印数据失败:{ex.Message}", +// PrintTaskId = printData["container"] +// }; +// } +// finally +// { +// stream?.Close(); +// tcpClient?.Close(); +// } +// } + +// /// +// /// 接收服务端响应 +// /// +// private static PrintResponseModel ReceivePrintResponse(NetworkStream stream, string printTaskId, int timeout) +// { +// // 读取长度 +// byte[] lengthBuffer = new byte[4]; +// int readLength = stream.Read(lengthBuffer, 0, lengthBuffer.Length); +// if (readLength != 4) +// throw new Exception("读取响应长度失败"); + +// if (BitConverter.IsLittleEndian) +// Array.Reverse(lengthBuffer); +// int dataLength = BitConverter.ToInt32(lengthBuffer, 0); + +// // 读取数据 +// byte[] dataBuffer = new byte[dataLength]; +// int totalRead = 0; +// while (totalRead < dataLength) +// { +// int read = stream.Read(dataBuffer, totalRead, dataLength - totalRead); +// if (read == 0) +// throw new Exception("服务端断开连接"); +// totalRead += read; +// } + +// // 使用Newtonsoft.Json反序列化 +// string jsonResponse = Encoding.UTF8.GetString(dataBuffer); +// return new PrintResponseModel +// { +// Success = true, +// Message = $"发送打印数据成功", +// PrintTaskId = printTaskId +// }; +// } + +// /// +// /// 服务端接收打印数据 +// /// +// public static PrintDataModel ReceivePrintData(NetworkStream stream, int timeout) +// { +// // 读取长度 +// byte[] lengthBuffer = new byte[4]; +// int readLength = stream.Read(lengthBuffer, 0, lengthBuffer.Length); +// if (readLength != 4) +// throw new Exception("读取数据长度失败"); + +// if (BitConverter.IsLittleEndian) +// Array.Reverse(lengthBuffer); +// int dataLength = BitConverter.ToInt32(lengthBuffer, 0); + +// // 读取数据 +// byte[] dataBuffer = new byte[dataLength]; +// int totalRead = 0; +// while (totalRead < dataLength) +// { +// int read = stream.Read(dataBuffer, totalRead, dataLength - totalRead); +// if (read == 0) +// throw new Exception("客户端断开连接"); +// totalRead += read; +// } + +// // 核心修改:Newtonsoft.Json反序列化 +// string jsonData = Encoding.UTF8.GetString(dataBuffer); +// PrintDataModel printData = JsonConvert.DeserializeObject(jsonData, _jsonSettings); +// Console.WriteLine($"服务端接收打印数据(任务ID:{printData.PrintTaskId}):\n{jsonData}"); +// return printData; +// } + +// /// +// /// 服务端发送响应数据 +// /// +// public static void SendPrintResponse(NetworkStream stream, PrintResponseModel response) +// { +// // 核心修改:Newtonsoft.Json序列化 +// string jsonResponse = JsonConvert.SerializeObject(response, _jsonSettings); +// byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonResponse); + +// // 发送长度+数据(逻辑不变) +// byte[] lengthBytes = BitConverter.GetBytes(jsonBytes.Length); +// if (BitConverter.IsLittleEndian) +// Array.Reverse(lengthBytes); +// stream.Write(lengthBytes, 0, lengthBytes.Length); +// stream.Write(jsonBytes, 0, jsonBytes.Length); +// } +// } + +//} + +///// +///// 打印数据发送客户端 +///// +//public class PrintDataClient +//{ +// private readonly string _serverIp; +// private readonly int _serverPort; + +// public PrintDataClient(string serverIp, int serverPort) +// { +// _serverIp = serverIp; +// _serverPort = serverPort; +// } + +// /// +// /// 构建并发送打印数据 +// /// +// public void SendPrintTask(Dictionary printData) +// { + +// // 发送打印数据 +// PrintResponseModel response = SocketPrintHelper.SendPrintData(_serverIp, _serverPort, printData, 5000); + +// // 处理响应结果 +// if (response.Success) +// { +// Console.WriteLine($"打印任务提交成功(任务ID:{response.PrintTaskId}):{response.Message}"); +// } +// else +// { +// Console.WriteLine($"打印任务提交失败(任务ID:{response.PrintTaskId}):{response.Message}"); +// } +// } +//} + + + +///// +///// 打印数据接收服务端(打印机终端/打印服务器侧) +///// +//public class PrintDataServer +//{ +// private readonly int _port; +// private TcpListener _listener; +// private bool _isRunning; + +// public PrintDataServer(int port) +// { +// _port = port; +// } + +// /// +// /// 启动服务端 +// /// +// public void Start() +// { +// _isRunning = true; +// _listener = new TcpListener(IPAddress.Any, _port); +// _listener.Start(); +// Console.WriteLine($"打印数据服务端已启动,监听端口:{_port}"); + +// // 异步接受客户端连接 +// Task.Run(async () => +// { +// while (_isRunning) +// { +// try +// { +// TcpClient client = await _listener.AcceptTcpClientAsync(); +// Console.WriteLine($"客户端连接:{((IPEndPoint)client.Client.RemoteEndPoint).Address}"); +// // 处理客户端请求(异步,避免阻塞) +// HandleClientAsync(client); +// } +// catch (Exception ex) +// { +// if (_isRunning) +// Console.WriteLine($"接受客户端连接失败:{ex.Message}"); +// } +// } +// }); +// } + +// /// +// /// 处理客户端请求 +// /// +// private async Task HandleClientAsync(TcpClient client) +// { +// using (client) +// { +// try +// { +// NetworkStream stream = client.GetStream(); +// client.ReceiveTimeout = 5000; +// client.SendTimeout = 5000; + +// // 1. 接收打印数据 +// PrintDataModel printData = SocketPrintHelper.ReceivePrintData(stream, 5000); + +// // 2. 处理打印任务(对接你的打印逻辑) +// PrintResponseModel response = ProcessPrintTask(printData); + +// // 3. 发送响应给客户端 +// SocketPrintHelper.SendPrintResponse(stream, response); +// } +// catch (Exception ex) +// { +// Console.WriteLine($"处理客户端请求失败:{ex.Message}"); +// // 发送失败响应 +// try +// { +// SocketPrintHelper.SendPrintResponse(client.GetStream(), new PrintResponseModel +// { +// Success = false, +// Message = ex.Message, +// PrintTaskId = "" +// }); +// } +// catch { } +// } +// } +// } + +// /// +// /// 处理打印任务 +// /// +// private PrintResponseModel ProcessPrintTask(PrintDataModel printData) +// { +// try +// { +// // -------------------------- +// // 此处对接你的实际打印逻辑: +// // 1. 根据PrinterName选择打印机 +// // 2. 解析PrintFields填充打印模板 +// // 3. 调用打印机SDK执行打印 +// // -------------------------- +// Console.WriteLine($"开始处理打印任务(ID:{printData.PrintTaskId}):"); +// Console.WriteLine($" 打印机:{printData.PrinterName}"); +// Console.WriteLine($" 托盘号:{printData.Code}"); +// Console.WriteLine($" 打印份数:{printData.CopyCount}"); +// Console.WriteLine($" 打印字段:"); +// foreach (var field in printData.PrintFields) +// { +// Console.WriteLine($" {field.Key} = {field.Value}"); +// } + +// // 模拟打印成功(替换为你的实际打印代码) +// // CommonMethods.PrintLabel(printData); + +// return new PrintResponseModel +// { +// Success = true, +// Message = $"打印任务已执行(份数:{printData.CopyCount})", +// PrintTaskId = printData.PrintTaskId +// }; +// } +// catch (Exception ex) +// { +// return new PrintResponseModel +// { +// Success = false, +// Message = $"打印任务执行失败:{ex.Message}", +// PrintTaskId = printData.PrintTaskId +// }; +// } +// } + +// /// +// /// 停止服务端 +// /// +// public void Stop() +// { +// _isRunning = false; +// _listener?.Stop(); +// Console.WriteLine("打印数据服务端已停止"); +// } +//} + + + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace PrintSocket +{ + public class StateObject + { + public Socket workSocket = null; + public const int BufferSize = 2000; + public byte[] buffer = new byte[BufferSize]; + public StringBuilder sb = new StringBuilder(); + } + + //服务端类 + public class TCPServer + { + //私有变量 + private SocketMessage m_SocketMsgDelegate = null; + private Socket m_Listener = null; + private Socket m_ServerHandler = null; + + //公开变量 + public delegate void SocketMessage(object obj); + public string m_strInfo = null; + + public void InitServer(string strAddr, int nPort, SocketMessage sockMsg = null) //初始化 + { + if (sockMsg != null) + { + m_SocketMsgDelegate = sockMsg; + } + if (m_Listener != null) + { + try { m_Listener.Close(); } catch { } + m_Listener = null; + } + + //创建套接字 + IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(strAddr), nPort); + m_Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + try + { + m_Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + + m_Listener.Bind(ipe); + m_Listener.Listen(10); + + //开启异步监听连接 + m_Listener.BeginAccept(new AsyncCallback(AcceptCallback), m_Listener); + m_SocketMsgDelegate?.Invoke("Server online"); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + m_SocketMsgDelegate?.Invoke(e.Message); + } + } + + private void AcceptCallback(IAsyncResult iar) + { + Socket listener = (Socket)iar.AsyncState; + m_ServerHandler = listener.EndAccept(iar); //结束接收请求 + + //创建状态对象 + StateObject state = new StateObject(); + state.workSocket = m_ServerHandler; + m_strInfo = m_ServerHandler.RemoteEndPoint.ToString(); + m_SocketMsgDelegate?.Invoke("Client online"); + + //开启数据回调 + m_ServerHandler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); + listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); + } + + private void ReceiveCallback(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket handler = state.workSocket; + + if (handler != null && handler.Connected) + { + //读取数据 + int bytesRead = handler.EndReceive(ar); + if (bytesRead > 0) + { + string content = Encoding.UTF8.GetString(state.buffer, 0, bytesRead); + state.sb.Append(content); + string fullContent = state.sb.ToString(); + + m_SocketMsgDelegate?.Invoke(fullContent); + + state.sb.Clear(); + handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); + } + else + { + m_SocketMsgDelegate?.Invoke("Client offline"); + m_Listener.BeginAccept(new AsyncCallback(AcceptCallback), m_Listener); + } + } + else + { + m_SocketMsgDelegate?.Invoke("Server offline"); + } + } + catch (SocketException ex) + { + Console.WriteLine(ex.ToString()); + m_SocketMsgDelegate?.Invoke($"{ex.ErrorCode} {ex.Message}"); + m_SocketMsgDelegate?.Invoke("Client offline"); + m_Listener.BeginAccept(new AsyncCallback(AcceptCallback), m_Listener); + } + } + + public void Send(String data) + { + try + { + if (m_ServerHandler == null || !m_ServerHandler.Connected) + { + Console.WriteLine("服务器Socket未连接,无法发送数据"); + return; + } + + byte[] byteData = Encoding.UTF8.GetBytes(data); + m_ServerHandler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), m_ServerHandler); + } + catch (Exception ex) + { + Console.WriteLine($"服务器发送数据异常:{ex.Message}"); + } + + } + + private void SendCallback(IAsyncResult ar) + { + try + { + Socket handler = (Socket)ar.AsyncState; + int bytesSent = handler.EndSend(ar); + } + catch (Exception e) + { + Console.WriteLine($"服务器发送回调异常:{e.Message}"); + } + } + + public void CloseSocket() + { + try + { + if (m_ServerHandler != null && m_ServerHandler.Connected) + { + m_ServerHandler.Shutdown(SocketShutdown.Both); + m_ServerHandler.Close(); + } + m_Listener?.Close(); + } + catch (Exception ex) + { + Console.WriteLine($"关闭服务器Socket异常:{ex.Message}"); + } + } + } + + //客户端类 + public class TCPClient + { + public delegate void SocketMessage(object obj); + private SocketMessage m_SocketMsgDelegate = null; + private Socket m_Client = null; + private Socket m_Handler = null; + private IPEndPoint m_ipe; + public string m_strInfo; + + public void InitClient(string strAddr, int nPort, SocketMessage sockMsg = null) + { + if (sockMsg != null) + { + m_SocketMsgDelegate = sockMsg; + } + if (m_Client != null) + { + try { m_Client.Close(); } catch { } + m_Client = null; + } + try + { + //端口及IP + m_ipe = new IPEndPoint(IPAddress.Parse(strAddr), nPort); + //创建套接字 + m_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + + //开始连接到服务器 + m_Client.BeginConnect(m_ipe, new AsyncCallback(ConnectCallback), m_Client); + } + catch (Exception e) + { + // 捕获初始化异常,仅提示不抛异常 + string errorMsg = $"客户端初始化连接失败:{e.Message}"; + Console.WriteLine(errorMsg); + m_SocketMsgDelegate?.Invoke(errorMsg); + } + } + + private void ConnectCallback(IAsyncResult ar) + { + try + { + m_Handler = (Socket)ar.AsyncState; + m_Handler.EndConnect(ar); + + m_strInfo = m_Handler.LocalEndPoint.ToString(); + m_SocketMsgDelegate?.Invoke("Connection"); + + + //创建状态对象 + StateObject state = new StateObject(); + state.workSocket = m_Handler; + + //开启数据回调 + m_Handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state); + + } + catch (Exception e) + { + Console.WriteLine($"客户端连接异常:{e.Message}"); + m_SocketMsgDelegate?.Invoke($"ConnectError: {e.Message}"); + } + } + + private void ReceiveCallBack(IAsyncResult iar) + { + try + { + StateObject state = (StateObject)iar.AsyncState; + Socket handler = state.workSocket; + + if (handler != null && handler.Connected) + { + //读取数据 + int bytesRead = handler.EndReceive(iar); + if (bytesRead > 0) + { + string content = Encoding.UTF8.GetString(state.buffer, 0, bytesRead); + state.sb.Append(content); + string fullContent = state.sb.ToString(); + + m_SocketMsgDelegate?.Invoke(fullContent); + + state.sb.Clear(); + handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state); + } + else + { + m_SocketMsgDelegate?.Invoke("Server offline"); + + //关闭并且允许重复使用 + m_Client.Disconnect(true); + //重新连接到服务器 + m_Client.BeginConnect(m_ipe, new AsyncCallback(ConnectCallback), m_Client); + } + } + else + { + m_SocketMsgDelegate?.Invoke("Client offline"); + } + + } + catch (SocketException ex) + { + Console.WriteLine($"客户端接收异常:{ex.Message}"); + m_SocketMsgDelegate?.Invoke($"{ex.ErrorCode} {ex.Message}"); + m_SocketMsgDelegate?.Invoke("DISCONNECT"); + } + } + + + public void Send(Dictionary printData) + { + try + { + // 前置校验:确保 Socket 有效且已连接 + if (m_Handler == null || !m_Handler.Connected) + { + Console.WriteLine("客户端Socket未连接,无法发送JSON数据"); + m_SocketMsgDelegate?.Invoke("Socket未连接,发送失败"); + + return; + } + // 使用Newtonsoft.Json序列化 + string jsonData = JsonConvert.SerializeObject(printData); + byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonData); + m_Handler.BeginSend(jsonBytes, 0, jsonBytes.Length, SocketFlags.None, new AsyncCallback(SendCallback), m_Handler); + } + catch (Exception ex) + { + // 捕获并上报所有异常 + Console.WriteLine($"客户端发送JSON数据异常:{ex.Message}"); + m_SocketMsgDelegate?.Invoke(ex.Message); + } + } + + public bool IsConnected() + { + return m_Handler != null && m_Handler.Connected; + } + + public void Send(String data) + { + try + { + // 确保 Socket 有效 + if (m_Handler == null || !m_Handler.Connected) + { + Console.WriteLine("客户端Socket未连接,无法发送字符串数据"); + return; + } + + byte[] byteData = Encoding.UTF8.GetBytes(data); + m_Handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), m_Handler); + } + catch (Exception ex) + { + Console.WriteLine($"客户端发送字符串数据异常:{ex.Message}"); + } + } + + private void SendCallback(IAsyncResult ar) + { + try + { + Socket handler = (Socket)ar.AsyncState; + int bytesSent = handler.EndSend(ar); + Console.WriteLine($"Sent {bytesSent} bytes to server."); + m_SocketMsgDelegate?.Invoke($"发送成功,字节数:{bytesSent}"); + } + catch (Exception e) + { + Console.WriteLine($"客户端发送回调异常:{e.Message}"); + m_SocketMsgDelegate?.Invoke($"SendCallbackError: {e.Message}"); + } + } + + public void CloseSocket() + { + try + { + if (m_Handler != null) + { + if (m_Handler.Connected) + { + m_Handler.Shutdown(SocketShutdown.Both); + } + m_Handler.Close(); + } + m_Client?.Close(); + } + catch (Exception ex) + { + Console.WriteLine($"关闭客户端Socket异常:{ex.Message}"); + } + } + } + + public class IPInfo + { + public string m_strIPAddr; + public int m_nIPPort; + public string m_strIPAddr3D; + public int m_nIPPort3D; + public IPInfo() + { + m_strIPAddr = "127.0.0.1"; + m_nIPPort = 8000; + m_strIPAddr3D = "127.0.0.1"; + m_nIPPort3D = 8000; + } + } + + public class SocketEx + { + //网口Socket服务 + public delegate void SocketStringMessage(string str); + public delegate void SocketDictMessage(Dictionary dict); + + // 两个委托实例,分别处理字符串和字典 + public SocketStringMessage m_SockStrMsg = null; + public SocketDictMessage m_SockDictMsg = null; + + //定义服务器变量 + public TCPServer m_TcpServer = null; // new TCPServer(); + //定义客户端变量 + public TCPClient m_TcpClient = new TCPClient(); + //服务器或者客户端标志位:true为服务器,false微客户端 + public bool m_bTcpServer = false; + + //ip地址和端口 + public IPInfo m_IPInfo = new IPInfo(); + + //网口接收消息委托 + public delegate void SocketMessage(string str); + public SocketMessage m_SockMsg = null; + + //析构函数 + ~SocketEx() + { + CloseSocket(true); + } + + /// + /// 网口初始化 + /// + /// + /// bTCPServer: true为服务器;false为客户端 + /// + public bool InitSocket(SocketStringMessage strMsg, SocketDictMessage dictMsg, bool bTcpServer) + { + try + { + m_SockStrMsg = strMsg; + m_SockDictMsg = dictMsg; + m_bTcpServer = bTcpServer; + if (m_bTcpServer) + { + TCPServer.SocketMessage msg = new TCPServer.SocketMessage(RecvSockMsg); + m_TcpServer.InitServer(m_IPInfo.m_strIPAddr, m_IPInfo.m_nIPPort, msg); + } + else + { + TCPClient.SocketMessage msg = new TCPClient.SocketMessage(RecvSockMsg); + m_TcpClient.InitClient(m_IPInfo.m_strIPAddr, m_IPInfo.m_nIPPort, msg); + } + } + catch (Exception ex) + { + string str = ex.ToString(); + return false; + } + return true; + } + + public bool InitSocket(SocketMessage sockMsg, bool bTcpServer) + { + m_SockMsg = sockMsg; + return InitSocket(null, null, bTcpServer); + } + + //关闭网口 + public void CloseSocket(bool bTcpServer) + { + try + { + if (bTcpServer) + m_TcpServer.CloseSocket(); + else + m_TcpClient.CloseSocket(); + } + catch (Exception ex) + { + Console.WriteLine($"SocketEx关闭异常:{ex.Message}"); + } + } + + //接收网口信息 + private void RecvSockMsg(object obj) + { + if (obj == null) return; + + string rawData = obj.ToString().Trim(); + try + { + // 第一步:判断是否为JSON字典(以{开头、以}结尾) + if (rawData.StartsWith("{") && rawData.EndsWith("}")) + { + // 尝试反序列化为Dictionary + Dictionary dictData = JsonConvert.DeserializeObject>(rawData); + + // 优先调用字典回调 + m_SockDictMsg?.Invoke(dictData); + Console.WriteLine($"SocketEx 解析出JSON字典:{string.Join("; ", dictData.Select(kv => $"{kv.Key}={kv.Value}"))}"); + + // 兼容旧版字符串回调(将字典转为可读字符串) + m_SockMsg?.Invoke($"JSON字典:{JsonConvert.SerializeObject(dictData, Formatting.None)}"); + m_SockStrMsg?.Invoke($"JSON字典:{JsonConvert.SerializeObject(dictData, Formatting.None)}"); + } + else + { + // 普通字符串,直接传递 + m_SockStrMsg?.Invoke(rawData); + m_SockMsg?.Invoke(rawData); + Console.WriteLine($"SocketEx 接收普通字符串:{rawData}"); + } + } + catch (Exception ex) + { + // 反序列化失败(不是标准JSON字典),按普通字符串处理 + string errorMsg = $"数据解析失败:{ex.Message} | 原始数据:{rawData}"; + m_SockStrMsg?.Invoke(errorMsg); + m_SockMsg?.Invoke(errorMsg); + Console.WriteLine(errorMsg); + } + + } + + public void Send(Dictionary dict) + { + try + { + if (!m_bTcpServer) + { + m_TcpClient.Send(dict); + } + else + { + Console.WriteLine("服务器模式下不支持发送JSON字典,请切换为客户端模式"); + } + } + catch (Exception ex) + { + Console.WriteLine($"SocketEx发送JSON字典异常:{ex.Message}"); + } + } + + //发送数据 + public void Send(string str) + { + try + { + if (m_bTcpServer) + { + m_TcpServer.Send(str + "\r\n"); + } + else + { + m_TcpClient.Send(str + "\r\n"); + } + } + catch (Exception ex) + { + Console.WriteLine($"SocketEx发送异常:{ex.Message}"); + } + } + + //获取网口信息 + public string GetTCPInfo() + { + return m_bTcpServer ? m_TcpServer.m_strInfo : m_TcpClient.m_strInfo; + } + } +} diff --git a/JinYuan.VirtualDataLibrary/app.config b/JinYuan.VirtualDataLibrary/app.config new file mode 100644 index 0000000..1ee22f7 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/app.config @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JinYuan.VirtualDataLibrary/packages.config b/JinYuan.VirtualDataLibrary/packages.config new file mode 100644 index 0000000..8f8cd00 --- /dev/null +++ b/JinYuan.VirtualDataLibrary/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Language/2025_01_08_09_12.xlsx b/Language/2025_01_08_09_12.xlsx new file mode 100644 index 0000000..486bfe4 Binary files /dev/null and b/Language/2025_01_08_09_12.xlsx differ diff --git a/Language/Language.7z b/Language/Language.7z new file mode 100644 index 0000000..bb04309 Binary files /dev/null and b/Language/Language.7z differ diff --git a/Language/Language.csproj b/Language/Language.csproj new file mode 100644 index 0000000..f9fb8dd --- /dev/null +++ b/Language/Language.csproj @@ -0,0 +1,135 @@ + + + + + Debug + AnyCPU + {292A5C9C-7A82-4D25-A885-DDCEDC93F03C} + Library + Properties + Language + Language + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\AntdUI.1.8.4\lib\net48\AntdUI.dll + + + ..\packages\BouncyCastle.Cryptography.2.3.1\lib\net461\BouncyCastle.Cryptography.dll + + + ..\packages\Google.Protobuf.3.26.1\lib\net45\Google.Protobuf.dll + + + ..\packages\K4os.Compression.LZ4.1.3.8\lib\net462\K4os.Compression.LZ4.dll + + + ..\packages\K4os.Compression.LZ4.Streams.1.3.8\lib\net462\K4os.Compression.LZ4.Streams.dll + + + ..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + ..\packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll + + + + + ..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.IO.Pipelines.9.0.0\lib\net462\System.IO.Pipelines.dll + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + ..\packages\ZstdSharp.Port.0.8.4\lib\net462\ZstdSharp.dll + + + + + + True + True + Languages.resx + + + + + + + Designer + + + Designer + + + Designer + + + ResXFileCodeGenerator + Languages.Designer.cs + Designer + + + + + + + + + {1bb7ed33-d2cb-4cdd-ab39-f7f9ae948ca2} + JinYuan.ControlLib + + + + \ No newline at end of file diff --git a/Language/LanguageManager.cs b/Language/LanguageManager.cs new file mode 100644 index 0000000..11db312 --- /dev/null +++ b/Language/LanguageManager.cs @@ -0,0 +1,1119 @@ +using AntdUI; +using Controls; +using JinYuan.ControlLib; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Resources; +using System.Threading; +using System.Windows.Forms; + + +namespace Language +{ + /// + /// 全局语言管理器 UpperComputerSystem.Language.MsgResources + /// + public static class LanguageManager + { + public static ResourceManager rm = new ResourceManager("Language.Languages", typeof(LanguageManager).Assembly); + private static CultureInfo currentCulture = CultureInfo.CurrentUICulture; + public static event EventHandler LanguageChanged; + public static string LanguageCode = "zh";//默认中文 + + private static Dictionary translationCache = new Dictionary(); + + static LanguageManager() + { + // 在静态构造函数中加载保存的语言设置 + LoadSavedLanguage(); + } + + public static void ChangeLanguage(string languageCode) + { + LanguageCode = languageCode; + currentCulture = new CultureInfo(languageCode); + Thread.CurrentThread.CurrentUICulture = currentCulture; + translationCache.Clear(); + SaveLanguagePreference(languageCode); + LanguageChanged?.Invoke(null, EventArgs.Empty); + + } + + public static string GetString(string key) + { + if (translationCache.TryGetValue(key, out string cachedResult)) + { + return cachedResult; + } + + string result = rm.GetString(key, currentCulture); + if (result != null) + { + translationCache[key] = result; + } + return result ?? key; + } + + + // 新增:GetLocalizedString 方法,支持带参数的本地化字符串 + public static string GetLocalizedString(string key, params object[] args) + { + string value = GetString(key); + return args.Length > 0 ? string.Format(value, args) : value; + } + + // 新增:获取本地化的星期名称数组 + public static string[] WeekNames + { + get + { + return new string[] + { + GetString("Sunday"), + GetString("Monday"), + GetString("Tuesday"), + GetString("Wednesday"), + GetString("Thursday"), + GetString("Friday"), + GetString("Saturday") + }; + } + } + + + public static void LoadLanguageResource(string resourcePath) + { + ResourceManager newRm = new ResourceManager(resourcePath, typeof(LanguageManager).Assembly); + rm = newRm; + translationCache.Clear(); + LanguageChanged?.Invoke(null, EventArgs.Empty); + } + + // 新增:保存语言偏好 + private static void SaveLanguagePreference(string languageCode) + { + try + { + var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + var settings = configFile.AppSettings.Settings; + if (settings["PreferredLanguage"] == null) + { + settings.Add("PreferredLanguage", languageCode); + } + else + { + settings["PreferredLanguage"].Value = languageCode; + } + configFile.Save(ConfigurationSaveMode.Modified); + ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); + } + catch (ConfigurationErrorsException ex) + { + Console.WriteLine($"Error writing app settings: {ex.Message}"); + // 考虑记录错误或通知用户 + } + catch (IOException ex) + { + Console.WriteLine($"Error accessing configuration file: {ex.Message}"); + // 考虑记录错误或通知用户 + } + } + + // 新增:加载保存的语言设置 + private static void LoadSavedLanguage() + { + try + { + string savedLanguage = ConfigurationManager.AppSettings["PreferredLanguage"]; + if (!string.IsNullOrEmpty(savedLanguage)) + { + ChangeLanguage(savedLanguage); + } + } + catch (ConfigurationErrorsException ex) + { + Console.WriteLine($"Error reading app settings: {ex.Message}"); + // 考虑记录错误或使用默认语言 + } + } + + // 新增:获取当前语言代码 + public static string GetCurrentLanguage() + { + return currentCulture.Name; + } + + } + + /// + /// 窗口控件翻译 + /// + public class MultiLanguageForm : AntdUI.Window + { + public MultiLanguageForm() + { + LanguageManager.LanguageChanged += OnLanguageChanged; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + UpdateUILanguage(); + } + + protected virtual void OnLanguageChanged(object sender, EventArgs e) + { + UpdateUILanguage(); + } + + protected virtual void UpdateUILanguage() + { + UpdateControlsText(this); + } + + protected void UpdateControlsText(Control control) + { + UpdateControlProperties(control); + + foreach (Control childControl in control.Controls) + { + UpdateControlsText(childControl); + } + } + + + + protected void UpdateControlProperties(Control control) + { + string formName = this.Name; + string controlName = control.Name; + if (!string.IsNullOrEmpty(control.Name)) + { + // 更新 Text 属性 + UpdateProperty(control, "Text", formName, controlName, "_Text"); + if (control is NaviButton2 naviButton) + { + UpdateControlText(control, formName); + } + else if (control is TButton tButton) + { + UpdateControlText(control, formName); + } + + + // 处理特定类型的控件 + else if (control is AntdUI.Button antdButton) + { + UpdateProperty(antdButton, "Text", formName, controlName, "_Text"); + } + else if (control is AntdUI.Label label) + { + UpdateProperty(label, "Text", formName, controlName, "_Text"); + } + else if (control is AntdUI.Input antdInput) + { + UpdateProperty(antdInput, "PlaceholderText", formName, controlName, "_Placeholder"); + } + else if (control is AntdUI.Steps steps) + { + UpdateStepsTitle(steps, formName, controlName); + } + else if (control is StatusStrip status) + { + UpdateStatusStripItems(status, formName); + } + else if (control is AntdUI.PageHeader antdWindowBar) + { + UpdateProperty(antdWindowBar, "Text", formName, controlName, "_Text"); + } + else if (control is AntdUI.Table antdTable) + { + UpdateTableColumns(antdTable, formName, controlName); + } + + else if (control is TitleTime titleTime) + { + UpdateProperty(titleTime, "TitleName", formName, controlName, "_TitleName"); + } + else if (control is Title title) + { + UpdateProperty(title, "TitleName", formName, controlName, "_TitleName"); + } + else if (control is LongTitleStyle2 longTitleStyle) + { + UpdateProperty(longTitleStyle, "TitleName", formName, controlName, "_TitleName"); + } + + if (control is DataGridView dgv) + { + UpdateDataGridViewLanguage(dgv, formName); + } + + if (control is ListView listView) + { + UpdateListViewLanguage(listView, formName); + } + + if (control is UCElectricityMeterV) // 假设 EyMaterH1 是您自定义控件的类型 + { + LocalizeCustomControl(control, formName); + } + // 可以在这里添加更多特定控件类型的处理 + + // 更新控件的 ToolTipText 属性 + //else if (control is SidebarNavigation antdSidebarNavigation) + //{ + // UpdateSidebarNavigationItems(antdSidebarNavigation, formName); + //} + + //else if (control is CustomComboBox antdCustomComboBox) + //{ + // UpdateProperty(antdCustomComboBox, "WatermarkText", formName, controlName, "_WatermarkText"); + //} + + //else if (control is CustomGroupBox antdCustomGroupBox) + //{ + // UpdateProperty(antdCustomGroupBox, "Text", formName, controlName, "_Text"); + //} + // 添加 CustomDataGridView 的处理 + //else if (control is CustomDataGridView dataGridView) + //{ + // UpdateDataGridViewColumns(dataGridView, formName, controlName); + //} + } + } + + + protected void UpdateControlText(Control control, string formName) + { + string baseResourceKey = $"{formName}_{control.Name}"; + + // 尝试更新 Text 属性 + //string textKey = $"{baseResourceKey}_Text"; + //string translatedText = LanguageManager.GetString(textKey); + //if (translatedText != textKey) // 如果找到了翻译 + //{ + // control.Text = translatedText; + //} + + // 尝试更新 TitleName 属性 + string titleNameKey = $"{baseResourceKey}_TitleName"; + string translatedTitleName = LanguageManager.GetString(titleNameKey); + if (translatedTitleName != titleNameKey) // 如果找到了翻译 + { + + //control.Text = translatedText; + var titleNameProperty = control.GetType().GetProperty("TitleName"); + if (titleNameProperty != null && titleNameProperty.CanWrite) + { + titleNameProperty.SetValue(control, translatedTitleName); + } + } + } + + + /// + /// Winform 默认DataGridView控件 + /// + /// + /// + protected void UpdateDataGridViewLanguage(DataGridView dgv, string formName) + { + foreach (DataGridViewColumn column in dgv.Columns) + { + if (!string.IsNullOrEmpty(column.Name)) + { + string resourceKey = $"{formName}_{dgv.Name}_{column.Name}Header"; + string translatedHeader = LanguageManager.GetString(resourceKey); + if (translatedHeader != resourceKey) // 如果找到了翻译 + { + column.HeaderText = translatedHeader; + } + } + } + } + + + /// + /// 电表控件 + /// + /// + protected void LocalizeCustomControl(Control control, string formName) + { + Type controlType = control.GetType(); + PropertyInfo[] properties = controlType.GetProperties(); + + if (formName == "FrmMonitor") + { + foreach (PropertyInfo property in properties) + { + if (property.PropertyType == typeof(string) && property.Name.StartsWith("Text")) + { + string propertyName = property.Name; + string key = $"{formName}_{control.Name}_{propertyName}"; + string localizedText = LanguageManager.GetString(key); + + if (!string.IsNullOrEmpty(localizedText)) + { + property.SetValue(control, localizedText); + } + } + } + } + } + + protected void UpdateListViewLanguage(ListView listView, string formName) + { + //foreach (ColumnHeader column in listView.Columns) + //{ + // string key = $"{formName}_{listView.Name}_{column.Name}_Text"; + // string localizedText = LanguageManager.GetString(key); + // if (!string.IsNullOrEmpty(localizedText)) + // { + // column.Text = localizedText; + // } + //} + if (formName != "FrmMain") + { + for (int i = 0; i < listView.Columns.Count; i++) + { + string key = $"{formName}_{listView.Name}_Column{i}_Text"; + string localizedText = LanguageManager.GetString(key); + if (!string.IsNullOrEmpty(localizedText)) + { + listView.Columns[i].Text = localizedText; + } + } + } + } + + + /// + /// 更新 DataGridView 的列标题 + /// + private void UpdateDataGridViewColumns(CustomDataGridView dataGridView, string formName, string controlName) + { + try + { + foreach (DataGridViewColumn column in dataGridView.Columns) + { + // 构建语言键:窗体名_控件名_Column_列名 + //CommunicationEditForm_groupTable_Column_PlcNum + string languageKey = $"{formName}_{controlName}_Column_{column.Name}"; + + // 获取翻译后的列标题 + string translatedHeader = LanguageManager.GetString(languageKey); + + // 如果找到翻译,则更新列标题 + if (!string.IsNullOrEmpty(translatedHeader) && translatedHeader != languageKey) + { + column.HeaderText = translatedHeader; + } + } + + // 如果需要翻译行标题(RowHeaders) + if (dataGridView.RowHeadersVisible) + { + string rowHeaderKey = $"{formName}_{controlName}_RowHeader"; + string translatedRowHeader = LanguageManager.GetString(rowHeaderKey); + if (!string.IsNullOrEmpty(translatedRowHeader) && translatedRowHeader != rowHeaderKey) + { + dataGridView.RowHeadersDefaultCellStyle.Format = translatedRowHeader; + } + } + } + catch (Exception ex) + { + Debug.WriteLine($"Error updating DataGridView columns: {ex.Message}"); + } + } + + /// + /// + /// + /// + /// + /// + private void UpdateStepsTitle(AntdUI.Steps steps, string formName, string controlName) + { + if (steps.Items != null) + { + foreach (var item in steps.Items) + { + + ///格式 MainForm_mySteps_Item_Title = "姓名" + + string resourceKey = $"{formName}_{controlName}_{item.Name}_Title"; + string translatedTitle = LanguageManager.GetString(resourceKey); + if (translatedTitle != resourceKey) + { + item.Title = translatedTitle; + } + } + // 强制表格重新加载布局以应用新的标题 + steps.Invalidate(); + } + } + + + + /// + /// Updates the text and tooltips of status strip items based on the current language settings. + /// + /// The status strip control to update + /// The name of the form containing the status strip + public void UpdateStatusStripItems(StatusStrip statusStrip, string formName) + { + if (statusStrip == null || string.IsNullOrEmpty(formName)) + return; + + try + { + //FrmMain_StatusStrip_Status_Text = "就绪" + //FrmMain_StatusStrip_Progress_Text = "进度" + //FrmMain_StatusStrip_MenuButton_Text = "选项" + //FrmMain_StatusStrip_MenuButton_Option1_Text = "选项1" + //FrmMain_StatusStrip_MenuButton_Option2_Text = "选项2" + + foreach (ToolStripItem item in statusStrip.Items) + { + UpdateStatusStripItem(item, formName); + } + + // Force a redraw of the status strip + statusStrip.Invalidate(); + } + catch (Exception ex) + { + //Logger.LogError($"Error updating status strip: {ex.Message}", ex); + } + } + + /// + /// Updates text for a single status strip item + /// + private void UpdateStatusStripItem(ToolStripItem item, string formName) + { + if (item?.Name == null) return; + + // Update Text + string textResourceKey = BuildResourceKey(formName, item.Name.ToString(), "Text"); + string translatedText = LanguageManager.GetString(textResourceKey); + if (!string.Equals(translatedText, textResourceKey, StringComparison.Ordinal)) + { + item.Text = translatedText; + } + + // Handle nested items in dropdown buttons + if (item is ToolStripDropDownButton dropDown) + { + UpdateDropDownItems(dropDown, formName); + } + } + + /// + /// Updates text for dropdown items + /// + private void UpdateDropDownItems(ToolStripDropDownButton dropDown, string formName) + { + foreach (ToolStripItem dropDownItem in dropDown.DropDownItems) + { + if (dropDownItem?.Tag != null) + { + string itemResourceKey = BuildResourceKey(formName, + $"{dropDown.Tag}_{dropDownItem.Tag}", "Text"); + string translatedItemText = LanguageManager.GetString(itemResourceKey); + + if (!string.Equals(translatedItemText, itemResourceKey, + StringComparison.Ordinal)) + { + dropDownItem.Text = translatedItemText; + } + } + } + } + + /// + /// Builds the resource key for language lookup + /// + private string BuildResourceKey(string formName, string tag, string propertyName) + { + return $"{formName}_StatusStrip_{tag}_{propertyName}"; + } + + /// + /// Table控件 + /// + /// + /// + /// + private void UpdateTableColumns(AntdUI.Table table, string formName, string controlName) + { + if (table.Columns != null) + { + foreach (var column in table.Columns) + { + + ///格式 MainForm_myTable_ColumnName_Title = "姓名" + + string resourceKey = $"{formName}_{controlName}_{column.Key}_Title"; + string translatedTitle = LanguageManager.GetString(resourceKey); + if (translatedTitle != resourceKey) + { + column.Title = translatedTitle; + } + } + // 强制表格重新加载布局以应用新的标题 + table.LoadLayout(); + } + } + + + + /// + /// 侧边导航栏 + /// + /// + /// + private void UpdateSidebarNavigationItems(SidebarNavigation sidebarNavigation, string formName) + { + foreach (var item in sidebarNavigation.GetItems()) + { + //资源文件内部Key格式如下 + //FrmMain_SidebarItem_Home_Text = "Home" + //FrmMain_SidebarItem_Statistics_Text = "Statistics" + //FrmMain_SidebarItem_Search_Text = "Search" + //FrmMain_SidebarItem_Recipe_Text = "Recipe" + //FrmMain_SidebarItem_User_Text = "User" + //FrmMain_SidebarItem_Settings_Text = "Settings" + + string resourceKey = $"{formName}_SidebarItem_{item.Tag}_Text"; + string translatedText = LanguageManager.GetString(resourceKey); + if (translatedText != resourceKey) + { + item.Text = translatedText; + sidebarNavigation.UpdateButtonText(item.Tag, translatedText); + // 查找对应的按钮并更新工具提示 + var button = sidebarNavigation.Controls.OfType() + .FirstOrDefault(b => b.Tag == item); + if (button != null) + { + //sidebarNavigation.UpdateItemToolTip(button, translatedText); + } + } + } + // 强制 SidebarNavigation 重新绘制以显示更新后的文本 + sidebarNavigation.Invalidate(); + } + + + private void UpdateProperty(object control, string propertyName, string formName, string controlName, string suffix) + { + string resourceKey = $"{formName}_{controlName}{suffix}"; + string translatedValue = LanguageManager.GetString(resourceKey); + if (translatedValue != resourceKey) + { + var property = control.GetType().GetProperty(propertyName); + if (property != null && property.CanWrite) + { + property.SetValue(control, translatedValue); + } + } + } + + + protected override void Dispose(bool disposing) + { + if (disposing) + { + LanguageManager.LanguageChanged -= OnLanguageChanged; + } + base.Dispose(disposing); + } + } + + /// + /// UserControl控件翻译 + /// + public class MultiLanguageUserControl : UserControl + { + public MultiLanguageUserControl() + { + LanguageManager.LanguageChanged += OnLanguageChanged; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + UpdateUILanguage(); + } + + protected virtual void OnLanguageChanged(object sender, EventArgs e) + { + UpdateUILanguage(); + } + + protected virtual void UpdateUILanguage() + { + UpdateControlsText(this); + } + + protected void UpdateControlsText(Control control) + { + UpdateControlProperties(control); + + foreach (Control childControl in control.Controls) + { + UpdateControlsText(childControl); + } + + + } + + protected void UpdateControlProperties(Control control) + { + string userControlName = this.Name; + string controlName = control.Name; + + // 更新 Text 属性 + UpdateProperty(control, "Text", userControlName, controlName, "_Text"); + + // 处理特定类型的控件 + if (control is AntdUI.Button antdButton) + { + UpdateProperty(antdButton, "Text", userControlName, controlName, "_Text"); + } + else if (control is AntdUI.Label label) + { + + UpdateProperty(label, "Text", userControlName, controlName, "_Text"); + } + else if (control is AntdUI.Input antdInput) + { + UpdateProperty(antdInput, "PlaceholderText", userControlName, controlName, "_Placeholder"); + } + + else if (control is AntdUI.Tabs antdtabs) + { + UpdateTabsLanguage(antdtabs, userControlName); + } + else if (control is AntdUI.Table antdTable) + { + UpdateTableColumns(antdTable, userControlName, controlName); + } + + else if (control is SidebarNavigation antdSidebarNavigation) + { + UpdateProperty(antdSidebarNavigation, "Text", userControlName, controlName, "_Text"); + } + else if (control is CustomComboBox antdCustomComboBox) + { + UpdateProperty(antdCustomComboBox, "WatermarkText", userControlName, controlName, "_WatermarkText"); + } + else if (control is CustomGroupBox antdCustomGroupBox) + { + UpdateProperty(antdCustomGroupBox, "Text", userControlName, controlName, "_Text"); + } + + // 添加 CustomDataGridView 的处理 + else if (control is CustomDataGridView dataGridView) + { + UpdateDataGridViewColumns(dataGridView, userControlName, controlName); + } + // 可以在这里添加更多特定控件类型的处理 + } + + + /// + /// 更新 DataGridView 的列标题 + /// + private void UpdateDataGridViewColumns(CustomDataGridView dataGridView, string userControlName, string controlName) + { + try + { + foreach (DataGridViewColumn column in dataGridView.Columns) + { + // 构建语言键:窗体名_控件名_Column_列名 + string languageKey = $"{userControlName}_{controlName}_Column_{column.Name}"; + + // 获取翻译后的列标题 + string translatedHeader = LanguageManager.GetString(languageKey); + + // 如果找到翻译,则更新列标题 + if (!string.IsNullOrEmpty(translatedHeader) && translatedHeader != languageKey) + { + column.HeaderText = translatedHeader; + } + } + + // 如果需要翻译行标题(RowHeaders) + if (dataGridView.RowHeadersVisible) + { + string rowHeaderKey = $"{userControlName}_{controlName}_RowHeader"; + string translatedRowHeader = LanguageManager.GetString(rowHeaderKey); + if (!string.IsNullOrEmpty(translatedRowHeader) && translatedRowHeader != rowHeaderKey) + { + dataGridView.RowHeadersDefaultCellStyle.Format = translatedRowHeader; + } + } + } + catch (Exception ex) + { + Debug.WriteLine($"Error updating DataGridView columns: {ex.Message}"); + } + } + + /// + /// Table控件 + /// + /// + /// + /// + private void UpdateTableColumns(AntdUI.Table table, string formName, string controlName) + { + if (table.Columns != null) + { + foreach (var column in table.Columns) + { + + ///格式 MainForm_myTable_ColumnName_Title = "姓名" + + string resourceKey = $"{formName}_{controlName}_{column.Key}_Title"; + string translatedTitle = LanguageManager.GetString(resourceKey); + if (translatedTitle != resourceKey) + { + column.Title = translatedTitle; + } + } + // 强制表格重新加载布局以应用新的标题 + table.LoadLayout(); + } + } + + + /// + /// 遍历Tabs中所有TabPage的所有控件 + /// + /// 要遍历的Tabs控件 + /// 对每个控件执行的操作 + public static void ForEachControl(AntdUI.Tabs tabs, Action action) + { + if (tabs?.Pages == null) return; + + foreach (AntdUI.TabPage page in tabs.Pages) + { + // 遍历当前页面的所有控件 + ForEachControlRecursive(page, action); + } + } + + /// + /// 遍历指定TabPage中的所有控件(包括子控件) + /// + /// 要遍历的TabPage + /// 对每个控件执行的操作 + public static void ForEachControl(AntdUI.TabPage page, Action action) + { + ForEachControlRecursive(page, action); + } + + /// + /// 递归遍历控件树 + /// + private static void ForEachControlRecursive(Control control, Action action) + { + // 执行操作 + action(control); + + // 递归遍历子控件 + foreach (Control child in control.Controls) + { + ForEachControlRecursive(child, action); + } + } + + + + #region tabs + /// + /// 为Tabs控件及其所有子控件更新语言 + /// + /// 要更新的Tabs控件 + /// 窗体名称 + public static void UpdateLanguage(Tabs tabs, string formName) + { + if (tabs?.Pages == null) return; + + foreach (AntdUI.TabPage page in tabs.Pages) + { + // 更新TabPage标题 + UpdateControlLanguage(page, formName, tabs.Name, page.Name, "_Text"); + + // 递归更新所有子控件 + UpdateControlsLanguageRecursive(page.Controls, formName, tabs.Name, page.Name); + } + } + + /// + /// 递归更新控件树中所有控件的语言 + /// + private static void UpdateControlsLanguageRecursive(Control.ControlCollection controls, string formName, string tabsName, string pageName) + { + foreach (Control control in controls) + { + // 更新当前控件的文本 + UpdateControlLanguage(control, formName, tabsName, pageName, "_Text"); + + // 针对特定类型控件的特殊处理 + if (control is DataGridView grid) + { + UpdateDataGridViewLanguage(grid, formName, tabsName, pageName); + } + else if (control is AntdUI.Input input) + { + UpdateInPutLanguage(input, formName, tabsName, pageName); + } + else if (control is CustomComboBox combo) + { + UpdateComboBoxLanguage(combo, formName, tabsName, pageName); + } + else if (control is AntdUI.Table antdTable) + { + UpdateTableLanguage(antdTable, formName, tabsName, pageName); + } + // 可以添加其他特殊控件的处理... + + // 递归处理子控件 + if (control.Controls.Count > 0) + { + UpdateControlsLanguageRecursive(control.Controls, formName, tabsName, pageName); + } + } + } + + /// + /// 更新单个控件的语言 + /// + private static void UpdateControlLanguage(Control control, string formName, string tabsName, string pageName, string suffix) + { + // 格式: FormName_TabsName_PageName_ControlName_Suffix {pageName}_ {tabsName}_ + string resourceKey = $"{formName}_{tabsName}_{control.Name}{suffix}"; + string translatedText = LanguageManager.GetString(resourceKey); + + // 只在资源存在时更新 + if (translatedText != resourceKey) + { + control.Text = translatedText; + } + } + + private static void UpdateInPutLanguage(AntdUI.Input input, string formName, string tabsName, string pageName) + { + // 格式: FormName_TabsName_PageName_GridName_ColumnName_Title {pageName} + string resourceKey = $"{formName}_{tabsName}_{input.Name}_Placeholder"; + string translatedTitle = LanguageManager.GetString(resourceKey); + + if (translatedTitle != resourceKey) + { + input.PlaceholderText = translatedTitle; + } + } + + /// + /// 更新DataGridView的列标题语言 + /// + private static void UpdateDataGridViewLanguage(DataGridView grid, string formName, string tabsName, string pageName) + { + + foreach (DataGridViewColumn column in grid.Columns) + { + // 格式: FormName_TabsName_PageName_GridName_ColumnName_Title {pageName} + string resourceKey = $"{formName}_{tabsName}_{grid.Name}_{column.Name}_Title"; + string translatedTitle = LanguageManager.GetString(resourceKey); + + if (translatedTitle != resourceKey) + { + column.HeaderText = translatedTitle; + } + } + } + + private static void UpdateTableLanguage(AntdUI.Table table, string formName, string tabsName, string pageName) + { + foreach (var column in table.Columns) + { + // 格式: FormName_TabsName_PageName_GridName_ColumnName_Title {pageName} + //SettingControl_tabsSystemSet_configTable_PlcNum_Title + string resourceKey = $"{formName}_{tabsName}_{table.Name}_{column.Key}_Title"; + string translatedTitle = LanguageManager.GetString(resourceKey); + + if (translatedTitle != resourceKey) + { + column.Title = translatedTitle; + } + } + } + + /// + /// 更新ComboBox的项目语言 + /// + private static void UpdateComboBoxLanguage(CustomComboBox combo, string formName, string tabsName, string pageName) + { + // 如果ComboBox是数据绑定的,可能需要特殊处理 + for (int i = 0; i < combo.Items.Count; i++) + { + //{pageName}_ + string resourceKey = $"{formName}_{tabsName}_{combo.Name}_WatermarkText"; + string translatedItem = LanguageManager.GetString(resourceKey); + + if (translatedItem != resourceKey) + { + combo.WatermarkText = translatedItem; + } + } + } + + /// + /// 获取控件的完整资源键 + /// + public static string GetResourceKey(Control control, string formName, string tabsName, string pageName, string suffix) + { + return $"{formName}_{tabsName}_{pageName}_{control.Name}{suffix}"; + } + + + /// + /// 更新Tabs及其所有子控件的语言 + /// + /// Tabs控件 + /// 窗体名称 + public static void UpdateTabsLanguage(Tabs tabs, string formName) + { + if (tabs?.Pages == null) return; + + string tabsName = tabs.Name; + foreach (Control control in GetAllControls(tabs)) + { + // 构建资源键基础部分 + string baseKey = $"{formName}_{tabsName}_{control.Name}"; + string text; + + // 根据控件类型更新对应的文本属性 + switch (control) + { + case AntdUI.Input input: + text = LanguageManager.GetString($"{baseKey}_Placeholder"); + if (text != null) input.PlaceholderText = text; + break; + + case CustomComboBox combo: + text = LanguageManager.GetString($"{baseKey}_WatermarkText"); + if (text != null) combo.WatermarkText = text; + break; + + case DataGridView grid: + foreach (DataGridViewColumn column in grid.Columns) + { + text = LanguageManager.GetString($"{baseKey}_{column.Name}_Title"); + if (text != null) column.HeaderText = text; + } + break; + + case AntdUI.Table table: + foreach (var column in table.Columns) + { + text = LanguageManager.GetString($"{baseKey}_{column.Key}_Title"); + if (text != null) column.Title = text; + } + break; + + default: + // 普通控件处理Text属性 + text = LanguageManager.GetString($"{baseKey}_Text"); + if (text != null) control.Text = text; + break; + } + } + } + + /// + /// 获取控件及其所有子控件 + /// + private static IEnumerable GetAllControls(Tabs tabs) + { + var controls = new List(); + foreach (AntdUI.TabPage page in tabs.Pages) + { + controls.Add(page); // 添加TabPage本身 + controls.AddRange(GetChildControls(page)); + } + return controls; + } + + /// + /// 递归获取子控件 + /// + private static IEnumerable GetChildControls(Control control) + { + var controls = new List(); + foreach (Control child in control.Controls) + { + controls.Add(child); + controls.AddRange(GetChildControls(child)); + } + return controls; + } + #endregion + + + + private void UpdateProperty(object control, string propertyName, string userControlName, string controlName, string suffix) + { + string resourceKey = $"{userControlName}_{controlName}{suffix}"; + string translatedValue = LanguageManager.GetString(resourceKey); + if (translatedValue != resourceKey) + { + var property = control.GetType().GetProperty(propertyName); + if (property != null && property.CanWrite) + { + property.SetValue(control, translatedValue); + } + } + } + + + protected override void Dispose(bool disposing) + { + if (disposing) + { + LanguageManager.LanguageChanged -= OnLanguageChanged; + } + base.Dispose(disposing); + } + } + + public static class StringExtensions + { + /// + /// + /// + /// + /// + public static string Translated(this string key) + { + return LanguageManager.GetString(key); + } + + public static string Translated(this string key, params object[] args) + { + string translatedString = LanguageManager.GetString(key); + return args.Length > 0 ? string.Format(translatedString, args) : translatedString; + } + } +} \ No newline at end of file diff --git a/Language/Languages.Designer.cs b/Language/Languages.Designer.cs new file mode 100644 index 0000000..1ac9af6 --- /dev/null +++ b/Language/Languages.Designer.cs @@ -0,0 +1,5220 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Language { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 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 Languages { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Languages() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("Language.Languages", typeof(Languages).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 添加通信组 的本地化字符串。 + /// + internal static string CommunicationEditForm_BtnAdd_Text { + get { + return ResourceManager.GetString("CommunicationEditForm_BtnAdd_Text", resourceCulture); + } + } + + /// + /// 查找类似 操作 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_EditHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_EditHeader", resourceCulture); + } + } + + /// + /// 查找类似 组名 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_GroupNameHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_GroupNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 是否启用 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_IsActiveHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_IsActiveHeader", resourceCulture); + } + } + + /// + /// 查找类似 反馈PLC 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_IsFeedbackPlcHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_IsFeedbackPlcHeader", resourceCulture); + } + } + + /// + /// 查找类似 触发读取 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_IsTiggerReadHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_IsTiggerReadHeader", resourceCulture); + } + } + + /// + /// 查找类似 长度 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_LengthHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_LengthHeader", resourceCulture); + } + } + + /// + /// 查找类似 PLC编号 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_PlcNumHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_PlcNumHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_RemarkHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_RemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 起始地址 的本地化字符串。 + /// + internal static string CommunicationEditForm_groupTable_StartHeader { + get { + return ResourceManager.GetString("CommunicationEditForm_groupTable_StartHeader", resourceCulture); + } + } + + /// + /// 查找类似 通信组配置 的本地化字符串。 + /// + internal static string CommunicationEditForm_lblTitle_Text { + get { + return ResourceManager.GetString("CommunicationEditForm_lblTitle_Text", resourceCulture); + } + } + + /// + /// 查找类似 D40已复位0 的本地化字符串。 + /// + internal static string D40已复位0 { + get { + return ResourceManager.GetString("D40已复位0", resourceCulture); + } + } + + /// + /// 查找类似 报警信息 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_Alarm_AlarmLogALARMHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_Alarm_AlarmLogALARMHeader", resourceCulture); + } + } + + /// + /// 查找类似 报警类型 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_Alarm_AlarmLogAlarmTypeHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_Alarm_AlarmLogAlarmTypeHeader", resourceCulture); + } + } + + /// + /// 查找类似 日期时间 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_Alarm_AlarmLogDateTimeHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_Alarm_AlarmLogDateTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 日志信息 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_Log_LogDateInformationHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_Log_LogDateInformationHeader", resourceCulture); + } + } + + /// + /// 查找类似 日期时间 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_Log_LogDateTimeHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_Log_LogDateTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 日志类型 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_Log_LogDateTypeHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_Log_LogDateTypeHeader", resourceCulture); + } + } + + /// + /// 查找类似 日期时间 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_OPLog_OPLogDateTimeHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_OPLog_OPLogDateTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 操作信息 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_OPLog_OPLogOperationalMessageHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_OPLog_OPLogOperationalMessageHeader", resourceCulture); + } + } + + /// + /// 查找类似 操作类型 的本地化字符串。 + /// + internal static string FrmAlarmLog_dgv_OPLog_OPLogOperationTypeHeader { + get { + return ResourceManager.GetString("FrmAlarmLog_dgv_OPLog_OPLogOperationTypeHeader", resourceCulture); + } + } + + /// + /// 查找类似 操作日志 的本地化字符串。 + /// + internal static string FrmAlarmLog_lblOperationLog_Text { + get { + return ResourceManager.GetString("FrmAlarmLog_lblOperationLog_Text", resourceCulture); + } + } + + /// + /// 查找类似 系统报警 的本地化字符串。 + /// + internal static string FrmAlarmLog_lblSystemAlarm_Text { + get { + return ResourceManager.GetString("FrmAlarmLog_lblSystemAlarm_Text", resourceCulture); + } + } + + /// + /// 查找类似 系统日志 的本地化字符串。 + /// + internal static string FrmAlarmLog_lblSystemLog_Text { + get { + return ResourceManager.GetString("FrmAlarmLog_lblSystemLog_Text", resourceCulture); + } + } + + /// + /// 查找类似 Pp 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe27_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe27_Text", resourceCulture); + } + } + + /// + /// 查找类似 Cp 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe28_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe28_Text", resourceCulture); + } + } + + /// + /// 查找类似 Ca 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe29_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe29_Text", resourceCulture); + } + } + + /// + /// 查找类似 PPK 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe30_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe30_Text", resourceCulture); + } + } + + /// + /// 查找类似 CPK 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe32_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe32_Text", resourceCulture); + } + } + + /// + /// 查找类似 Dev 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe33_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe33_Text", resourceCulture); + } + } + + /// + /// 查找类似 Mean 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe34_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe34_Text", resourceCulture); + } + } + + /// + /// 查找类似 SampleSize 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe35_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe35_Text", resourceCulture); + } + } + + /// + /// 查找类似 Groups 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe36_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe36_Text", resourceCulture); + } + } + + /// + /// 查找类似 Max 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe37_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe37_Text", resourceCulture); + } + } + + /// + /// 查找类似 Min 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe38_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe38_Text", resourceCulture); + } + } + + /// + /// 查找类似 Total 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe39_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe39_Text", resourceCulture); + } + } + + /// + /// 查找类似 平均值 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe40_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe40_Text", resourceCulture); + } + } + + /// + /// 查找类似 最大值 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe41_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe41_Text", resourceCulture); + } + } + + /// + /// 查找类似 最小值 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe42_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe42_Text", resourceCulture); + } + } + + /// + /// 查找类似 规格下限 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe49_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe49_Text", resourceCulture); + } + } + + /// + /// 查找类似 规格上限 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe50_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe50_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据组数 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe51_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe51_Text", resourceCulture); + } + } + + /// + /// 查找类似 样本子组大小 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe53_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe53_Text", resourceCulture); + } + } + + /// + /// 查找类似 目标值 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe54_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe54_Text", resourceCulture); + } + } + + /// + /// 查找类似 负3倍标准差 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe57_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe57_Text", resourceCulture); + } + } + + /// + /// 查找类似 标准差(组内) 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe58_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe58_Text", resourceCulture); + } + } + + /// + /// 查找类似 标准差(整体) 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe59_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe59_Text", resourceCulture); + } + } + + /// + /// 查找类似 正3倍标准差 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe63_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe63_Text", resourceCulture); + } + } + + /// + /// 查找类似 CPL 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe64_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe64_Text", resourceCulture); + } + } + + /// + /// 查找类似 CPU 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe65_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe65_Text", resourceCulture); + } + } + + /// + /// 查找类似 Cp 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe70_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe70_Text", resourceCulture); + } + } + + /// + /// 查找类似 Cpk 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe71_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe71_Text", resourceCulture); + } + } + + /// + /// 查找类似 Ca 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe74_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe74_Text", resourceCulture); + } + } + + /// + /// 查找类似 PPL 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe76_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe76_Text", resourceCulture); + } + } + + /// + /// 查找类似 Ppk 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe77_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe77_Text", resourceCulture); + } + } + + /// + /// 查找类似 PPU 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe78_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe78_Text", resourceCulture); + } + } + + /// + /// 查找类似 Pp 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabe79_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabe79_Text", resourceCulture); + } + } + + /// + /// 查找类似 CpkGrade 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabel1_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabel1_Text", resourceCulture); + } + } + + /// + /// 查找类似 样本总数 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabel2_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabel2_Text", resourceCulture); + } + } + + /// + /// 查找类似 PPM < LSL 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabel3_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabel3_Text", resourceCulture); + } + } + + /// + /// 查找类似 PPM Toatl 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabel4_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabel4_Text", resourceCulture); + } + } + + /// + /// 查找类似 PPM < USL 的本地化字符串。 + /// + internal static string FrmCpkCount_angleLabel5_Text { + get { + return ResourceManager.GetString("FrmCpkCount_angleLabel5_Text", resourceCulture); + } + } + + /// + /// 查找类似 清空数据 的本地化字符串。 + /// + internal static string FrmCpkCount_btClear_Text { + get { + return ResourceManager.GetString("FrmCpkCount_btClear_Text", resourceCulture); + } + } + + /// + /// 查找类似 计算CPK 的本地化字符串。 + /// + internal static string FrmCpkCount_btCPK_Text { + get { + return ResourceManager.GetString("FrmCpkCount_btCPK_Text", resourceCulture); + } + } + + /// + /// 查找类似 分析选项 的本地化字符串。 + /// + internal static string FrmCpkCount_btn_AnalysisOptions_Text { + get { + return ResourceManager.GetString("FrmCpkCount_btn_AnalysisOptions_Text", resourceCulture); + } + } + + /// + /// 查找类似 查 询 的本地化字符串。 + /// + internal static string FrmCpkCount_btSelect_Text { + get { + return ResourceManager.GetString("FrmCpkCount_btSelect_Text", resourceCulture); + } + } + + /// + /// 查找类似 生成虚拟数据 的本地化字符串。 + /// + internal static string FrmCpkCount_btTestData_Text { + get { + return ResourceManager.GetString("FrmCpkCount_btTestData_Text", resourceCulture); + } + } + + /// + /// 查找类似 常 量 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX1_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX1_Text", resourceCulture); + } + } + + /// + /// 查找类似 统 计 值 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX2_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX2_Text", resourceCulture); + } + } + + /// + /// 查找类似 工序能力(组内) 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX3_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX3_Text", resourceCulture); + } + } + + /// + /// 查找类似 其他值 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX4_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX4_Text", resourceCulture); + } + } + + /// + /// 查找类似 计 算 值 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX5_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX5_Text", resourceCulture); + } + } + + /// + /// 查找类似 实测性能 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX6_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX6_Text", resourceCulture); + } + } + + /// + /// 查找类似 工序能力(整体) 的本地化字符串。 + /// + internal static string FrmCpkCount_groupBoxEX7_Text { + get { + return ResourceManager.GetString("FrmCpkCount_groupBoxEX7_Text", resourceCulture); + } + } + + /// + /// 查找类似 查询选项 的本地化字符串。 + /// + internal static string FrmCpkCount_label1_Text { + get { + return ResourceManager.GetString("FrmCpkCount_label1_Text", resourceCulture); + } + } + + /// + /// 查找类似 查询时间区间 的本地化字符串。 + /// + internal static string FrmCpkCount_label2_Text { + get { + return ResourceManager.GetString("FrmCpkCount_label2_Text", resourceCulture); + } + } + + /// + /// 查找类似 XR控制图 的本地化字符串。 + /// + internal static string FrmCpkCount_tabPagePlus1_Text { + get { + return ResourceManager.GetString("FrmCpkCount_tabPagePlus1_Text", resourceCulture); + } + } + + /// + /// 查找类似 CPK分析图 的本地化字符串。 + /// + internal static string FrmCpkCount_tabPagePlus2_Text { + get { + return ResourceManager.GetString("FrmCpkCount_tabPagePlus2_Text", resourceCulture); + } + } + + /// + /// 查找类似 样本运行图 的本地化字符串。 + /// + internal static string FrmCpkCount_tabPagePlus3_Text { + get { + return ResourceManager.GetString("FrmCpkCount_tabPagePlus3_Text", resourceCulture); + } + } + + /// + /// 查找类似 均值运行图 的本地化字符串。 + /// + internal static string FrmCpkCount_tabPagePlus4_Text { + get { + return ResourceManager.GetString("FrmCpkCount_tabPagePlus4_Text", resourceCulture); + } + } + + /// + /// 查找类似 生产型号 的本地化字符串。 + /// + internal static string FrmDataMonitor_angleLabel1_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_angleLabel1_Text", resourceCulture); + } + } + + /// + /// 查找类似 物料编码 的本地化字符串。 + /// + internal static string FrmDataMonitor_angleLabel2_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_angleLabel2_Text", resourceCulture); + } + } + + /// + /// 查找类似 开始监控 的本地化字符串。 + /// + internal static string FrmDataMonitor_btSatrt_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_btSatrt_Text", resourceCulture); + } + } + + /// + /// 查找类似 停止监控 的本地化字符串。 + /// + internal static string FrmDataMonitor_btStop_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_btStop_Text", resourceCulture); + } + } + + /// + /// 查找类似 chart1 的本地化字符串。 + /// + internal static string FrmDataMonitor_chartPowerData1_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_chartPowerData1_Text", resourceCulture); + } + } + + /// + /// 查找类似 chart1 的本地化字符串。 + /// + internal static string FrmDataMonitor_chartPowerData2_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_chartPowerData2_Text", resourceCulture); + } + } + + /// + /// 查找类似 箱唛码 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutContainerCodeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutContainerCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 栈板码 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutPalletCodeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutPalletCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutRemarkHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutRemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 综合结果 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutResultHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutResultHeader", resourceCulture); + } + } + + /// + /// 查找类似 叠盘层数 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutStackingLayerHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutStackingLayerHeader", resourceCulture); + } + } + + /// + /// 查找类似 叠盘工位号 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutStackingNumHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutStackingNumHeader", resourceCulture); + } + } + + /// + /// 查找类似 测试时间 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutTestTimeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutTestTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 重量 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvBlankingData_OutWeightHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvBlankingData_OutWeightHeader", resourceCulture); + } + } + + /// + /// 查找类似 箱唛码 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvFeedingData_InContainerCodeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvFeedingData_InContainerCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 栈板码 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvFeedingData_InPalletCodeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvFeedingData_InPalletCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvFeedingData_InRemarkHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvFeedingData_InRemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 结果 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvFeedingData_InResultHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvFeedingData_InResultHeader", resourceCulture); + } + } + + /// + /// 查找类似 时间 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvFeedingData_InTestTimeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvFeedingData_InTestTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 箱唛码 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintContainerData_ContainerCodeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintContainerData_ContainerCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintContainerData_RemarkHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintContainerData_RemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 结果 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintContainerData_ResultHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintContainerData_ResultHeader", resourceCulture); + } + } + + /// + /// 查找类似 测试时间 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintContainerData_TestTimeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintContainerData_TestTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 栈板码 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintPalletData_PalletCodeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintPalletData_PalletCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintPalletData_printpalletRemarkHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintPalletData_printpalletRemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 结果 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintPalletData_printPalletResultHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintPalletData_printPalletResultHeader", resourceCulture); + } + } + + /// + /// 查找类似 时间 的本地化字符串。 + /// + internal static string FrmDataMonitor_dgvPrintPalletData_TestTimeHeader { + get { + return ResourceManager.GetString("FrmDataMonitor_dgvPrintPalletData_TestTimeHeader", resourceCulture); + } + } + + /// + /// 查找类似 日志记录 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX1_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX1_Text", resourceCulture); + } + } + + /// + /// 查找类似 参数 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX2_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX2_Text", resourceCulture); + } + } + + /// + /// 查找类似 组盘抽检工位 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX3_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX3_Text", resourceCulture); + } + } + + /// + /// 查找类似 包装箱进站 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX4_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX4_Text", resourceCulture); + } + } + + /// + /// 查找类似 包装箱出站 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX5_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX5_Text", resourceCulture); + } + } + + /// + /// 查找类似 卡板托盘绑定上传 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX6_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX6_Text", resourceCulture); + } + } + + /// + /// 查找类似 箱唛打印工位 的本地化字符串。 + /// + internal static string FrmDataMonitor_groupBoxEX7_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_groupBoxEX7_Text", resourceCulture); + } + } + + /// + /// 查找类似 参数项 的本地化字符串。 + /// + internal static string FrmDataMonitor_lVConfigRange_Column0_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_lVConfigRange_Column0_Text", resourceCulture); + } + } + + /// + /// 查找类似 最小值 的本地化字符串。 + /// + internal static string FrmDataMonitor_lVConfigRange_Column1_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_lVConfigRange_Column1_Text", resourceCulture); + } + } + + /// + /// 查找类似 最大值 的本地化字符串。 + /// + internal static string FrmDataMonitor_lVConfigRange_Column2_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_lVConfigRange_Column2_Text", resourceCulture); + } + } + + /// + /// 查找类似 单位 的本地化字符串。 + /// + internal static string FrmDataMonitor_lVConfigRange_Column3_Text { + get { + return ResourceManager.GetString("FrmDataMonitor_lVConfigRange_Column3_Text", resourceCulture); + } + } + + /// + /// 查找类似 新增通信组 的本地化字符串。 + /// + internal static string FrmGroupConfig_btn_Add_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_btn_Add_Text", resourceCulture); + } + } + + /// + /// 查找类似 删除通信组 的本地化字符串。 + /// + internal static string FrmGroupConfig_btn_Delete_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_btn_Delete_Text", resourceCulture); + } + } + + /// + /// 查找类似 修改通信组 的本地化字符串。 + /// + internal static string FrmGroupConfig_btn_Modify_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_btn_Modify_Text", resourceCulture); + } + } + + /// + /// 查找类似 是否需要反馈结果 的本地化字符串。 + /// + internal static string FrmGroupConfig_chk_IsFeedbackPlc_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_chk_IsFeedbackPlc_Text", resourceCulture); + } + } + + /// + /// 查找类似 是否启用 的本地化字符串。 + /// + internal static string FrmGroupConfig_ckb_IsEnable_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_ckb_IsEnable_Text", resourceCulture); + } + } + + /// + /// 查找类似 是否为触发读取 的本地化字符串。 + /// + internal static string FrmGroupConfig_ckb_IsTiggerRead_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_ckb_IsTiggerRead_Text", resourceCulture); + } + } + + /// + /// 查找类似 通信组名称 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_GroupNameHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_GroupNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 启用 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_IsActiveHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_IsActiveHeader", resourceCulture); + } + } + + /// + /// 查找类似 是否需要反馈结果 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_IsFeedbackPlcHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_IsFeedbackPlcHeader", resourceCulture); + } + } + + /// + /// 查找类似 是否为触发读取 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_IsTiggerReadHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_IsTiggerReadHeader", resourceCulture); + } + } + + /// + /// 查找类似 长度 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_LengthHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_LengthHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注说明 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_RemarkHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_RemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 起始地址 的本地化字符串。 + /// + internal static string FrmGroupConfig_dgv_Main_StartHeader { + get { + return ResourceManager.GetString("FrmGroupConfig_dgv_Main_StartHeader", resourceCulture); + } + } + + /// + /// 查找类似 通信组配置 的本地化字符串。 + /// + internal static string FrmGroupConfig_label1_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_label1_Text", resourceCulture); + } + } + + /// + /// 查找类似 通信组名称 的本地化字符串。 + /// + internal static string FrmGroupConfig_label2_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_label2_Text", resourceCulture); + } + } + + /// + /// 查找类似 起始地址 的本地化字符串。 + /// + internal static string FrmGroupConfig_label3_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_label3_Text", resourceCulture); + } + } + + /// + /// 查找类似 长度 的本地化字符串。 + /// + internal static string FrmGroupConfig_label4_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_label4_Text", resourceCulture); + } + } + + /// + /// 查找类似 备注说明 的本地化字符串。 + /// + internal static string FrmGroupConfig_label6_Text { + get { + return ResourceManager.GetString("FrmGroupConfig_label6_Text", resourceCulture); + } + } + + /// + /// 查找类似 导 出 Excel 的本地化字符串。 + /// + internal static string FrmHistory_btn_AlarmExport_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_AlarmExport_Text", resourceCulture); + } + } + + /// + /// 查找类似 时 间 查 询 的本地化字符串。 + /// + internal static string FrmHistory_btn_AlarmQuery_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_AlarmQuery_Text", resourceCulture); + } + } + + /// + /// 查找类似 导 出 的本地化字符串。 + /// + internal static string FrmHistory_btn_ClassExPort_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_ClassExPort_Text", resourceCulture); + } + } + + /// + /// 查找类似 查 询 的本地化字符串。 + /// + internal static string FrmHistory_btn_ClassQuery_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_ClassQuery_Text", resourceCulture); + } + } + + /// + /// 查找类似 导 出 的本地化字符串。 + /// + internal static string FrmHistory_btn_DaysExPort_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_DaysExPort_Text", resourceCulture); + } + } + + /// + /// 查找类似 查 询 的本地化字符串。 + /// + internal static string FrmHistory_btn_DaysQuery_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_DaysQuery_Text", resourceCulture); + } + } + + /// + /// 查找类似 导 出 Excel 的本地化字符串。 + /// + internal static string FrmHistory_btn_ExPort_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_ExPort_Text", resourceCulture); + } + } + + /// + /// 查找类似 导 出 的本地化字符串。 + /// + internal static string FrmHistory_btn_MonthExPort_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_MonthExPort_Text", resourceCulture); + } + } + + /// + /// 查找类似 查 询 的本地化字符串。 + /// + internal static string FrmHistory_btn_MonthQuery_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_MonthQuery_Text", resourceCulture); + } + } + + /// + /// 查找类似 查 询 的本地化字符串。 + /// + internal static string FrmHistory_btn_Query_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_Query_Text", resourceCulture); + } + } + + /// + /// 查找类似 补 传 的本地化字符串。 + /// + internal static string FrmHistory_btn_ReUpMes_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_ReUpMes_Text", resourceCulture); + } + } + + /// + /// 查找类似 导 出 的本地化字符串。 + /// + internal static string FrmHistory_btn_WeekExPort_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_WeekExPort_Text", resourceCulture); + } + } + + /// + /// 查找类似 查 询 的本地化字符串。 + /// + internal static string FrmHistory_btn_WeekQuery_Text { + get { + return ResourceManager.GetString("FrmHistory_btn_WeekQuery_Text", resourceCulture); + } + } + + /// + /// 查找类似 报警内容 的本地化字符串。 + /// + internal static string FrmHistory_dgv_AlarmData_AlarmContent { + get { + return ResourceManager.GetString("FrmHistory_dgv_AlarmData_AlarmContent", resourceCulture); + } + } + + /// + /// 查找类似 报警次数 的本地化字符串。 + /// + internal static string FrmHistory_dgv_AlarmData_AlarmCount { + get { + return ResourceManager.GetString("FrmHistory_dgv_AlarmData_AlarmCount", resourceCulture); + } + } + + /// + /// 查找类似 报警时间 的本地化字符串。 + /// + internal static string FrmHistory_dgv_AlarmData_AlarmTime { + get { + return ResourceManager.GetString("FrmHistory_dgv_AlarmData_AlarmTime", resourceCulture); + } + } + + /// + /// 查找类似 类别 的本地化字符串。 + /// + internal static string FrmHistory_dgv_AlarmData_Class { + get { + return ResourceManager.GetString("FrmHistory_dgv_AlarmData_Class", resourceCulture); + } + } + + /// + /// 查找类似 PLC地址 的本地化字符串。 + /// + internal static string FrmHistory_dgv_AlarmData_PLCAdress { + get { + return ResourceManager.GetString("FrmHistory_dgv_AlarmData_PLCAdress", resourceCulture); + } + } + + /// + /// 查找类似 电池条码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_BarCode { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_BarCode", resourceCulture); + } + } + + /// + /// 查找类似 底托卡板码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_CardBarcode { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_CardBarcode", resourceCulture); + } + } + + /// + /// 查找类似 通道编号 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_ChannelNo { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_ChannelNo", resourceCulture); + } + } + + /// + /// 查找类似 箱唛码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_ContainerCode { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_ContainerCode", resourceCulture); + } + } + + /// + /// 查找类似 标志 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_Flag { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_Flag", resourceCulture); + } + } + + /// + /// 查找类似 信息 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_Info { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_Info", resourceCulture); + } + } + + /// + /// 查找类似 托盘位置号 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_LocationNum { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_LocationNum", resourceCulture); + } + } + + /// + /// 查找类似 物料编码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_MaterialCode { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_MaterialCode", resourceCulture); + } + } + + /// + /// 查找类似 栈板码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_PalletCode { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_PalletCode", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_Remark { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_Remark", resourceCulture); + } + } + + /// + /// 查找类似 结果 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_Result { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_Result", resourceCulture); + } + } + + /// + /// 查找类似 RFID托杯码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_RFID { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_RFID", resourceCulture); + } + } + + /// + /// 查找类似 叠盘层数 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_StackingLayer { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_StackingLayer", resourceCulture); + } + } + + /// + /// 查找类似 叠盘工位号 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_StackingNum { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_StackingNum", resourceCulture); + } + } + + /// + /// 查找类似 参数名 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_tag_code { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_tag_code", resourceCulture); + } + } + + /// + /// 查找类似 参数值 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_tag_value { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_tag_value", resourceCulture); + } + } + + /// + /// 查找类似 测试时间 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_TestTime { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_TestTime", resourceCulture); + } + } + + /// + /// 查找类似 托盘码 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_VassoioID { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_VassoioID", resourceCulture); + } + } + + /// + /// 查找类似 重量 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_Weight { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_Weight", resourceCulture); + } + } + + /// + /// 查找类似 风设备编号 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_WindDeviceNum { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_WindDeviceNum", resourceCulture); + } + } + + /// + /// 查找类似 风速 的本地化字符串。 + /// + internal static string FrmHistory_dgv_Main_WindSpeed { + get { + return ResourceManager.GetString("FrmHistory_dgv_Main_WindSpeed", resourceCulture); + } + } + + /// + /// 查找类似 稼动率均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvClass_JiaDL { + get { + return ResourceManager.GetString("FrmHistory_dgvClass_JiaDL", resourceCulture); + } + } + + /// + /// 查找类似 PPM均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvClass_Ppm { + get { + return ResourceManager.GetString("FrmHistory_dgvClass_Ppm", resourceCulture); + } + } + + /// + /// 查找类似 良品率 的本地化字符串。 + /// + internal static string FrmHistory_dgvClass_Prod { + get { + return ResourceManager.GetString("FrmHistory_dgvClass_Prod", resourceCulture); + } + } + + /// + /// 查找类似 产品投入 的本地化字符串。 + /// + internal static string FrmHistory_dgvClass_ProdIn { + get { + return ResourceManager.GetString("FrmHistory_dgvClass_ProdIn", resourceCulture); + } + } + + /// + /// 查找类似 产品产出 的本地化字符串。 + /// + internal static string FrmHistory_dgvClass_ProdOut { + get { + return ResourceManager.GetString("FrmHistory_dgvClass_ProdOut", resourceCulture); + } + } + + /// + /// 查找类似 测试时间 的本地化字符串。 + /// + internal static string FrmHistory_dgvClass_TestTime { + get { + return ResourceManager.GetString("FrmHistory_dgvClass_TestTime", resourceCulture); + } + } + + /// + /// 查找类似 日期 的本地化字符串。 + /// + internal static string FrmHistory_dgvDays_Day { + get { + return ResourceManager.GetString("FrmHistory_dgvDays_Day", resourceCulture); + } + } + + /// + /// 查找类似 稼动率均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvDays_JiaDL { + get { + return ResourceManager.GetString("FrmHistory_dgvDays_JiaDL", resourceCulture); + } + } + + /// + /// 查找类似 PPM均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvDays_Ppm { + get { + return ResourceManager.GetString("FrmHistory_dgvDays_Ppm", resourceCulture); + } + } + + /// + /// 查找类似 良品率 的本地化字符串。 + /// + internal static string FrmHistory_dgvDays_Prod { + get { + return ResourceManager.GetString("FrmHistory_dgvDays_Prod", resourceCulture); + } + } + + /// + /// 查找类似 产品投入 的本地化字符串。 + /// + internal static string FrmHistory_dgvDays_ProdIn { + get { + return ResourceManager.GetString("FrmHistory_dgvDays_ProdIn", resourceCulture); + } + } + + /// + /// 查找类似 产品产出 的本地化字符串。 + /// + internal static string FrmHistory_dgvDays_ProdOut { + get { + return ResourceManager.GetString("FrmHistory_dgvDays_ProdOut", resourceCulture); + } + } + + /// + /// 查找类似 稼动率均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvMonth_JiaDL { + get { + return ResourceManager.GetString("FrmHistory_dgvMonth_JiaDL", resourceCulture); + } + } + + /// + /// 查找类似 月份 的本地化字符串。 + /// + internal static string FrmHistory_dgvMonth_Month { + get { + return ResourceManager.GetString("FrmHistory_dgvMonth_Month", resourceCulture); + } + } + + /// + /// 查找类似 PPM均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvMonth_Ppm { + get { + return ResourceManager.GetString("FrmHistory_dgvMonth_Ppm", resourceCulture); + } + } + + /// + /// 查找类似 良品率 的本地化字符串。 + /// + internal static string FrmHistory_dgvMonth_Prod { + get { + return ResourceManager.GetString("FrmHistory_dgvMonth_Prod", resourceCulture); + } + } + + /// + /// 查找类似 产品投入 的本地化字符串。 + /// + internal static string FrmHistory_dgvMonth_ProdIn { + get { + return ResourceManager.GetString("FrmHistory_dgvMonth_ProdIn", resourceCulture); + } + } + + /// + /// 查找类似 产品产出 的本地化字符串。 + /// + internal static string FrmHistory_dgvMonth_ProdOut { + get { + return ResourceManager.GetString("FrmHistory_dgvMonth_ProdOut", resourceCulture); + } + } + + /// + /// 查找类似 稼动率均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvWeek_JiaDL { + get { + return ResourceManager.GetString("FrmHistory_dgvWeek_JiaDL", resourceCulture); + } + } + + /// + /// 查找类似 PPM均值 的本地化字符串。 + /// + internal static string FrmHistory_dgvWeek_Ppm { + get { + return ResourceManager.GetString("FrmHistory_dgvWeek_Ppm", resourceCulture); + } + } + + /// + /// 查找类似 良品率 的本地化字符串。 + /// + internal static string FrmHistory_dgvWeek_Prod { + get { + return ResourceManager.GetString("FrmHistory_dgvWeek_Prod", resourceCulture); + } + } + + /// + /// 查找类似 累计投入 的本地化字符串。 + /// + internal static string FrmHistory_dgvWeek_ProdIn { + get { + return ResourceManager.GetString("FrmHistory_dgvWeek_ProdIn", resourceCulture); + } + } + + /// + /// 查找类似 累计产出 的本地化字符串。 + /// + internal static string FrmHistory_dgvWeek_ProdOut { + get { + return ResourceManager.GetString("FrmHistory_dgvWeek_ProdOut", resourceCulture); + } + } + + /// + /// 查找类似 周别 的本地化字符串。 + /// + internal static string FrmHistory_dgvWeek_Week { + get { + return ResourceManager.GetString("FrmHistory_dgvWeek_Week", resourceCulture); + } + } + + /// + /// 查找类似 班次 的本地化字符串。 + /// + internal static string FrmHistory_label11_Text { + get { + return ResourceManager.GetString("FrmHistory_label11_Text", resourceCulture); + } + } + + /// + /// 查找类似 电芯码 的本地化字符串。 + /// + internal static string FrmHistory_label13_Text { + get { + return ResourceManager.GetString("FrmHistory_label13_Text", resourceCulture); + } + } + + /// + /// 查找类似 RFID 的本地化字符串。 + /// + internal static string FrmHistory_label4_Text { + get { + return ResourceManager.GetString("FrmHistory_label4_Text", resourceCulture); + } + } + + /// + /// 查找类似 统计日期 的本地化字符串。 + /// + internal static string FrmHistory_label5_Text { + get { + return ResourceManager.GetString("FrmHistory_label5_Text", resourceCulture); + } + } + + /// + /// 查找类似 统计日期 的本地化字符串。 + /// + internal static string FrmHistory_label6_Text { + get { + return ResourceManager.GetString("FrmHistory_label6_Text", resourceCulture); + } + } + + /// + /// 查找类似 统计时间 的本地化字符串。 + /// + internal static string FrmHistory_label7_Text { + get { + return ResourceManager.GetString("FrmHistory_label7_Text", resourceCulture); + } + } + + /// + /// 查找类似 统计时间 的本地化字符串。 + /// + internal static string FrmHistory_label8_Text { + get { + return ResourceManager.GetString("FrmHistory_label8_Text", resourceCulture); + } + } + + /// + /// 查找类似 结束时间 的本地化字符串。 + /// + internal static string FrmHistory_lblAlarmEndTime_Text { + get { + return ResourceManager.GetString("FrmHistory_lblAlarmEndTime_Text", resourceCulture); + } + } + + /// + /// 查找类似 开始时间 的本地化字符串。 + /// + internal static string FrmHistory_lblAlarmStartTime_Text { + get { + return ResourceManager.GetString("FrmHistory_lblAlarmStartTime_Text", resourceCulture); + } + } + + /// + /// 查找类似 条码 的本地化字符串。 + /// + internal static string FrmHistory_lblBarcode_Text { + get { + return ResourceManager.GetString("FrmHistory_lblBarcode_Text", resourceCulture); + } + } + + /// + /// 查找类似 结束时间 的本地化字符串。 + /// + internal static string FrmHistory_lblEndtime_Text { + get { + return ResourceManager.GetString("FrmHistory_lblEndtime_Text", resourceCulture); + } + } + + /// + /// 查找类似 开始时间 的本地化字符串。 + /// + internal static string FrmHistory_lblStartTime_Text { + get { + return ResourceManager.GetString("FrmHistory_lblStartTime_Text", resourceCulture); + } + } + + /// + /// 查找类似 查询类型 的本地化字符串。 + /// + internal static string FrmHistory_lblType_Text { + get { + return ResourceManager.GetString("FrmHistory_lblType_Text", resourceCulture); + } + } + + /// + /// 查找类似 历史生产数据查询 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus1_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus1_Text", resourceCulture); + } + } + + /// + /// 查找类似 产能统计查询 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus2_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus2_Text", resourceCulture); + } + } + + /// + /// 查找类似 日志报警数据查询 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus3_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus3_Text", resourceCulture); + } + } + + /// + /// 查找类似 按班次统计 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus4_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus4_Text", resourceCulture); + } + } + + /// + /// 查找类似 按日统计 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus5_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus5_Text", resourceCulture); + } + } + + /// + /// 查找类似 按周统计 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus6_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus6_Text", resourceCulture); + } + } + + /// + /// 查找类似 按月统计 的本地化字符串。 + /// + internal static string FrmHistory_tabPagePlus7_Text { + get { + return ResourceManager.GetString("FrmHistory_tabPagePlus7_Text", resourceCulture); + } + } + + /// + /// 查找类似 登录 的本地化字符串。 + /// + internal static string FrmLogin_btn_Login_Text { + get { + return ResourceManager.GetString("FrmLogin_btn_Login_Text", resourceCulture); + } + } + + /// + /// 查找类似 亿纬动力 的本地化字符串。 + /// + internal static string FrmLogin_lblCompany_Text { + get { + return ResourceManager.GetString("FrmLogin_lblCompany_Text", resourceCulture); + } + } + + /// + /// 查找类似 亿纬动力 的本地化字符串。 + /// + internal static string FrmLoginMes_lblMesCompany_Text { + get { + return ResourceManager.GetString("FrmLoginMes_lblMesCompany_Text", resourceCulture); + } + } + + /// + /// 查找类似 启动 的本地化字符串。 + /// + internal static string FrmMain_btSatrt_Text { + get { + return ResourceManager.GetString("FrmMain_btSatrt_Text", resourceCulture); + } + } + + /// + /// 查找类似 57 工厂 的本地化字符串。 + /// + internal static string FrmMain_lblHeading_Text { + get { + return ResourceManager.GetString("FrmMain_lblHeading_Text", resourceCulture); + } + } + + /// + /// 查找类似 亿纬动力 的本地化字符串。 + /// + internal static string FrmMain_lblLogTitle_Text { + get { + return ResourceManager.GetString("FrmMain_lblLogTitle_Text", resourceCulture); + } + } + + /// + /// 查找类似 自动打标管理系统 的本地化字符串。 + /// + internal static string FrmMain_lblSubtitle_Text { + get { + return ResourceManager.GetString("FrmMain_lblSubtitle_Text", resourceCulture); + } + } + + /// + /// 查找类似 日志报警 的本地化字符串。 + /// + internal static string FrmMain_nav_AlarmLog_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_AlarmLog_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 数据分析 的本地化字符串。 + /// + internal static string FrmMain_nav_CPK_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_CPK_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 数据监控 的本地化字符串。 + /// + internal static string FrmMain_nav_DataMonitor_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_DataMonitor_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 数据追溯 的本地化字符串。 + /// + internal static string FrmMain_nav_HistotryData_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_HistotryData_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 集中监控 的本地化字符串。 + /// + internal static string FrmMain_nav_Monitor_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_Monitor_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 参数设置 的本地化字符串。 + /// + internal static string FrmMain_nav_SetSystem_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_SetSystem_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 系统设置 的本地化字符串。 + /// + internal static string FrmMain_nav_System_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_System_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 用户管理 的本地化字符串。 + /// + internal static string FrmMain_nav_UserInfo_TitleName { + get { + return ResourceManager.GetString("FrmMain_nav_UserInfo_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 关于 的本地化字符串。 + /// + internal static string FrmMain_关于_Text { + get { + return ResourceManager.GetString("FrmMain_关于_Text", resourceCulture); + } + } + + /// + /// 查找类似 显示主界面 的本地化字符串。 + /// + internal static string FrmMain_显示主界面_Text { + get { + return ResourceManager.GetString("FrmMain_显示主界面_Text", resourceCulture); + } + } + + /// + /// 查找类似 退出 的本地化字符串。 + /// + internal static string FrmMain_退出_Text { + get { + return ResourceManager.GetString("FrmMain_退出_Text", resourceCulture); + } + } + + /// + /// 查找类似 隐藏主界面 的本地化字符串。 + /// + internal static string FrmMain_隐藏主界面_Text { + get { + return ResourceManager.GetString("FrmMain_隐藏主界面_Text", resourceCulture); + } + } + + /// + /// 查找类似 非刷卡模式 的本地化字符串。 + /// + internal static string FrmMain_非刷卡模式ToolStripMenuItem_Text { + get { + return ResourceManager.GetString("FrmMain_非刷卡模式ToolStripMenuItem_Text", resourceCulture); + } + } + + /// + /// 查找类似 智能电表 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text", resourceCulture); + } + } + + /// + /// 查找类似 A相电压 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text1 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text1", resourceCulture); + } + } + + /// + /// 查找类似 总有功功率 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text10 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text10", resourceCulture); + } + } + + /// + /// 查找类似 总功率因素 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text11 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text11", resourceCulture); + } + } + + /// + /// 查找类似 电压变比 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text12 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text12", resourceCulture); + } + } + + /// + /// 查找类似 电流变比 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text13 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text13", resourceCulture); + } + } + + /// + /// 查找类似 累计电能 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text14 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text14", resourceCulture); + } + } + + /// + /// 查找类似 B相电压 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text2 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text2", resourceCulture); + } + } + + /// + /// 查找类似 C相电压 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text3 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text3", resourceCulture); + } + } + + /// + /// 查找类似 A相电流 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text4 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text4", resourceCulture); + } + } + + /// + /// 查找类似 B相电流 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text5 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text5", resourceCulture); + } + } + + /// + /// 查找类似 C相电流 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text6 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text6", resourceCulture); + } + } + + /// + /// 查找类似 A相功率 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text7 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text7", resourceCulture); + } + } + + /// + /// 查找类似 B相功率 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text8 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text8", resourceCulture); + } + } + + /// + /// 查找类似 C相功率 的本地化字符串。 + /// + internal static string FrmMonitor_EyMaterH1_Text9 { + get { + return ResourceManager.GetString("FrmMonitor_EyMaterH1_Text9", resourceCulture); + } + } + + /// + /// 查找类似 告警TOP10统计 的本地化字符串。 + /// + internal static string FrmMonitor_gpAlarmBox_Text { + get { + return ResourceManager.GetString("FrmMonitor_gpAlarmBox_Text", resourceCulture); + } + } + + /// + /// 查找类似 产能统计 的本地化字符串。 + /// + internal static string FrmMonitor_gpCapacityBox_Text { + get { + return ResourceManager.GetString("FrmMonitor_gpCapacityBox_Text", resourceCulture); + } + } + + /// + /// 查找类似 不良项统计 的本地化字符串。 + /// + internal static string FrmMonitor_gpNgBox_Text { + get { + return ResourceManager.GetString("FrmMonitor_gpNgBox_Text", resourceCulture); + } + } + + /// + /// 查找类似 OK数 的本地化字符串。 + /// + internal static string FrmMonitor_lblOkTotal_Text { + get { + return ResourceManager.GetString("FrmMonitor_lblOkTotal_Text", resourceCulture); + } + } + + /// + /// 查找类似 优率 的本地化字符串。 + /// + internal static string FrmMonitor_lblRate_Text { + get { + return ResourceManager.GetString("FrmMonitor_lblRate_Text", resourceCulture); + } + } + + /// + /// 查找类似 生产总数 的本地化字符串。 + /// + internal static string FrmMonitor_lblTotalQty_Text { + get { + return ResourceManager.GetString("FrmMonitor_lblTotalQty_Text", resourceCulture); + } + } + + /// + /// 查找类似 稼动率 的本地化字符串。 + /// + internal static string FrmMonitor_lblUtilizationRate_Text { + get { + return ResourceManager.GetString("FrmMonitor_lblUtilizationRate_Text", resourceCulture); + } + } + + /// + /// 查找类似 设备编号 的本地化字符串。 + /// + internal static string FrmMonitor_titleEqp_code_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_titleEqp_code_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 工厂代号 的本地化字符串。 + /// + internal static string FrmMonitor_titleFactory_code_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_titleFactory_code_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 线体编号 的本地化字符串。 + /// + internal static string FrmMonitor_titleLine_No_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_titleLine_No_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 生产型号 的本地化字符串。 + /// + internal static string FrmMonitor_titleModeName_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_titleModeName_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 开机时间 的本地化字符串。 + /// + internal static string FrmMonitor_titleRunTime_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_titleRunTime_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 运行时间 的本地化字符串。 + /// + internal static string FrmMonitor_titleStartTime_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_titleStartTime_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 智能电表(设备) 的本地化字符串。 + /// + internal static string FrmMonitor_ucElectricityMeterV1_TitleName { + get { + return ResourceManager.GetString("FrmMonitor_ucElectricityMeterV1_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 取消 的本地化字符串。 + /// + internal static string FrmMsgBoxOutWithAck_btn_Cancel_Text { + get { + return ResourceManager.GetString("FrmMsgBoxOutWithAck_btn_Cancel_Text", resourceCulture); + } + } + + /// + /// 查找类似 确定 的本地化字符串。 + /// + internal static string FrmMsgBoxOutWithAckbtn_Sure_Text { + get { + return ResourceManager.GetString("FrmMsgBoxOutWithAckbtn_Sure_Text", resourceCulture); + } + } + + /// + /// 查找类似 是否确认要退出系统? 的本地化字符串。 + /// + internal static string FrmMsgBoxOutWithAcklbl_Content_Text { + get { + return ResourceManager.GetString("FrmMsgBoxOutWithAcklbl_Content_Text", resourceCulture); + } + } + + /// + /// 查找类似 退出系统 的本地化字符串。 + /// + internal static string FrmMsgBoxOutWithAcklbl_Title_Text { + get { + return ResourceManager.GetString("FrmMsgBoxOutWithAcklbl_Title_Text", resourceCulture); + } + } + + /// + /// 查找类似 取消 的本地化字符串。 + /// + internal static string FrmMsgBoxWithAck_btn_Cancel_Text { + get { + return ResourceManager.GetString("FrmMsgBoxWithAck_btn_Cancel_Text", resourceCulture); + } + } + + /// + /// 查找类似 确定 的本地化字符串。 + /// + internal static string FrmMsgBoxWithAck_btn_Sure_Text { + get { + return ResourceManager.GetString("FrmMsgBoxWithAck_btn_Sure_Text", resourceCulture); + } + } + + /// + /// 查找类似 是否确认要退出系统? 的本地化字符串。 + /// + internal static string FrmMsgBoxWithAck_lbl_Content_Text { + get { + return ResourceManager.GetString("FrmMsgBoxWithAck_lbl_Content_Text", resourceCulture); + } + } + + /// + /// 查找类似 退出系统 的本地化字符串。 + /// + internal static string FrmMsgBoxWithAck_lbl_Title_Text { + get { + return ResourceManager.GetString("FrmMsgBoxWithAck_lbl_Title_Text", resourceCulture); + } + } + + /// + /// 查找类似 添加型号 的本地化字符串。 + /// + internal static string FrmRecipe_btn_Add_Text { + get { + return ResourceManager.GetString("FrmRecipe_btn_Add_Text", resourceCulture); + } + } + + /// + /// 查找类似 保存参数 的本地化字符串。 + /// + internal static string FrmRecipe_btn_Save_Text { + get { + return ResourceManager.GetString("FrmRecipe_btn_Save_Text", resourceCulture); + } + } + + /// + /// 查找类似 删除型号 的本地化字符串。 + /// + internal static string FrmRecipe_btnDelProductModel_Text { + get { + return ResourceManager.GetString("FrmRecipe_btnDelProductModel_Text", resourceCulture); + } + } + + /// + /// 查找类似 参数项名称 的本地化字符串。 + /// + internal static string FrmRecipe_dgvPara_CGNameHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvPara_CGNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 最大值 的本地化字符串。 + /// + internal static string FrmRecipe_dgvPara_ParaValueMaxHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvPara_ParaValueMaxHeader", resourceCulture); + } + } + + /// + /// 查找类似 最小值 的本地化字符串。 + /// + internal static string FrmRecipe_dgvPara_ParaValueMinHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvPara_ParaValueMinHeader", resourceCulture); + } + } + + /// + /// 查找类似 单位 的本地化字符串。 + /// + internal static string FrmRecipe_dgvPara_UintHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvPara_UintHeader", resourceCulture); + } + } + + /// + /// 查找类似 物料编码 的本地化字符串。 + /// + internal static string FrmRecipe_dgvProdModel_MaterialCodeHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvProdModel_MaterialCodeHeader", resourceCulture); + } + } + + /// + /// 查找类似 生产型号 的本地化字符串。 + /// + internal static string FrmRecipe_dgvProdModel_ModelNameHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvProdModel_ModelNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmRecipe_dgvProdModel_RemarkHeader { + get { + return ResourceManager.GetString("FrmRecipe_dgvProdModel_RemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 当前型号 的本地化字符串。 + /// + internal static string FrmRecipe_label1_Text { + get { + return ResourceManager.GetString("FrmRecipe_label1_Text", resourceCulture); + } + } + + /// + /// 查找类似 生产型号 的本地化字符串。 + /// + internal static string FrmRecipe_label2_Text { + get { + return ResourceManager.GetString("FrmRecipe_label2_Text", resourceCulture); + } + } + + /// + /// 查找类似 物料编码 的本地化字符串。 + /// + internal static string FrmRecipe_label4_Text { + get { + return ResourceManager.GetString("FrmRecipe_label4_Text", resourceCulture); + } + } + + /// + /// 查找类似 当前型号 的本地化字符串。 + /// + internal static string FrmRecipe_lb_Model_Text { + get { + return ResourceManager.GetString("FrmRecipe_lb_Model_Text", resourceCulture); + } + } + + /// + /// 查找类似 添加PLC 的本地化字符串。 + /// + internal static string FrmSystemSet_btAddPLC_Text { + get { + return ResourceManager.GetString("FrmSystemSet_btAddPLC_Text", resourceCulture); + } + } + + /// + /// 查找类似 取消设置 的本地化字符串。 + /// + internal static string FrmSystemSet_btn_Cancel_Text { + get { + return ResourceManager.GetString("FrmSystemSet_btn_Cancel_Text", resourceCulture); + } + } + + /// + /// 查找类似 通信组配置 的本地化字符串。 + /// + internal static string FrmSystemSet_btn_GroupConfig_Text { + get { + return ResourceManager.GetString("FrmSystemSet_btn_GroupConfig_Text", resourceCulture); + } + } + + /// + /// 查找类似 确定设置 的本地化字符串。 + /// + internal static string FrmSystemSet_btn_Sure_Text { + get { + return ResourceManager.GetString("FrmSystemSet_btn_Sure_Text", resourceCulture); + } + } + + /// + /// 查找类似 变量配置 的本地化字符串。 + /// + internal static string FrmSystemSet_btn_VarConfig_Text { + get { + return ResourceManager.GetString("FrmSystemSet_btn_VarConfig_Text", resourceCulture); + } + } + + /// + /// 查找类似 设置 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_CommConfigHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_CommConfigHeader", resourceCulture); + } + } + + /// + /// 查找类似 操作 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_EditHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_EditHeader", resourceCulture); + } + } + + /// + /// 查找类似 心跳地址 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_HeartBeatHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_HeartBeatHeader", resourceCulture); + } + } + + /// + /// 查找类似 IP地址 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_IPAddressHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_IPAddressHeader", resourceCulture); + } + } + + /// + /// 查找类似 激活状态 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_IsActiveHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_IsActiveHeader", resourceCulture); + } + } + + /// + /// 查找类似 心跳状态 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_IsHeartBeatHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_IsHeartBeatHeader", resourceCulture); + } + } + + /// + /// 查找类似 PLC编号 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_PlcNumHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_PlcNumHeader", resourceCulture); + } + } + + /// + /// 查找类似 PLC类型 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_PLCTypeHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_PLCTypeHeader", resourceCulture); + } + } + + /// + /// 查找类似 端口号 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_PortHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_PortHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string FrmSystemSet_dgvPlcConfigs_RemarkHeader { + get { + return ResourceManager.GetString("FrmSystemSet_dgvPlcConfigs_RemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 IP地址配置 的本地化字符串。 + /// + internal static string FrmSystemSet_label1_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label1_Text", resourceCulture); + } + } + + /// + /// 查找类似 获取MES参数 的本地化字符串。 + /// + internal static string FrmSystemSet_label10_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label10_Text", resourceCulture); + } + } + + /// + /// 查找类似 开启刷卡模式 的本地化字符串。 + /// + internal static string FrmSystemSet_label11_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label11_Text", resourceCulture); + } + } + + /// + /// 查找类似 PLC类型配置 的本地化字符串。 + /// + internal static string FrmSystemSet_label12_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label12_Text", resourceCulture); + } + } + + /// + /// 查找类似 设备编号 的本地化字符串。 + /// + internal static string FrmSystemSet_label13_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label13_Text", resourceCulture); + } + } + + /// + /// 查找类似 产线编号 的本地化字符串。 + /// + internal static string FrmSystemSet_label14_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label14_Text", resourceCulture); + } + } + + /// + /// 查找类似 工厂代码 的本地化字符串。 + /// + internal static string FrmSystemSet_label15_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label15_Text", resourceCulture); + } + } + + /// + /// 查找类似 自动切换监控界面时间 的本地化字符串。 + /// + internal static string FrmSystemSet_label16_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label16_Text", resourceCulture); + } + } + + /// + /// 查找类似 无操作自动切换监控界面 的本地化字符串。 + /// + internal static string FrmSystemSet_label17_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label17_Text", resourceCulture); + } + } + + /// + /// 查找类似 端口号配置 的本地化字符串。 + /// + internal static string FrmSystemSet_label2_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label2_Text", resourceCulture); + } + } + + /// + /// 查找类似 无操作自动锁屏 的本地化字符串。 + /// + internal static string FrmSystemSet_label3_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label3_Text", resourceCulture); + } + } + + /// + /// 查找类似 自动锁屏时间 的本地化字符串。 + /// + internal static string FrmSystemSet_label4_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label4_Text", resourceCulture); + } + } + + /// + /// 查找类似 焊机功率曲线显示数量 的本地化字符串。 + /// + internal static string FrmSystemSet_label5_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label5_Text", resourceCulture); + } + } + + /// + /// 查找类似 软件自动登录 的本地化字符串。 + /// + internal static string FrmSystemSet_label6_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label6_Text", resourceCulture); + } + } + + /// + /// 查找类似 开机自动启动 的本地化字符串。 + /// + internal static string FrmSystemSet_label7_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label7_Text", resourceCulture); + } + } + + /// + /// 查找类似 线程耗时日志保存 的本地化字符串。 + /// + internal static string FrmSystemSet_label8_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label8_Text", resourceCulture); + } + } + + /// + /// 查找类似 MES/非MES模式切换 的本地化字符串。 + /// + internal static string FrmSystemSet_label9_Text { + get { + return ResourceManager.GetString("FrmSystemSet_label9_Text", resourceCulture); + } + } + + /// + /// 查找类似 风速仪 的本地化字符串。 + /// + internal static string FrmSystemSet_lblAnemometer_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblAnemometer_Text", resourceCulture); + } + } + + /// + /// 查找类似 调试模式 的本地化字符串。 + /// + internal static string FrmSystemSet_lblDebugMode_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblDebugMode_Text", resourceCulture); + } + } + + /// + /// 查找类似 设备报警 的本地化字符串。 + /// + internal static string FrmSystemSet_lblDeviceAlarm_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblDeviceAlarm_Text", resourceCulture); + } + } + + /// + /// 查找类似 设备参数设定值变更 的本地化字符串。 + /// + internal static string FrmSystemSet_lblDeviceParamChange_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblDeviceParamChange_Text", resourceCulture); + } + } + + /// + /// 查找类似 设备参数设定值请求 的本地化字符串。 + /// + internal static string FrmSystemSet_lblDeviceParamRequest_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblDeviceParamRequest_Text", resourceCulture); + } + } + + /// + /// 查找类似 设备状态 的本地化字符串。 + /// + internal static string FrmSystemSet_lblDeviceStatus_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblDeviceStatus_Text", resourceCulture); + } + } + + /// + /// 查找类似 员工权限校验 的本地化字符串。 + /// + internal static string FrmSystemSet_lblEmployeeAuthCheck_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblEmployeeAuthCheck_Text", resourceCulture); + } + } + + /// + /// 查找类似 电表能耗 的本地化字符串。 + /// + internal static string FrmSystemSet_lblEnergyConsumption_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblEnergyConsumption_Text", resourceCulture); + } + } + + /// + /// 查找类似 获取Token 的本地化字符串。 + /// + internal static string FrmSystemSet_lblGetToken_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblGetToken_Text", resourceCulture); + } + } + + /// + /// 查找类似 原材料投入信息 的本地化字符串。 + /// + internal static string FrmSystemSet_lblMaterialInputInfo_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblMaterialInputInfo_Text", resourceCulture); + } + } + + /// + /// 查找类似 产品进站 的本地化字符串。 + /// + internal static string FrmSystemSet_lblProductInStation_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblProductInStation_Text", resourceCulture); + } + } + + /// + /// 查找类似 产品出站 的本地化字符串。 + /// + internal static string FrmSystemSet_lblProductOutStation_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblProductOutStation_Text", resourceCulture); + } + } + + /// + /// 查找类似 产品加工过程数据 的本地化字符串。 + /// + internal static string FrmSystemSet_lblProductProcessParams_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblProductProcessParams_Text", resourceCulture); + } + } + + /// + /// 查找类似 产品加工结果数据 的本地化字符串。 + /// + internal static string FrmSystemSet_lblProductResultParams_Text { + get { + return ResourceManager.GetString("FrmSystemSet_lblProductResultParams_Text", resourceCulture); + } + } + + /// + /// 查找类似 PLC配置 的本地化字符串。 + /// + internal static string FrmSystemSet_title1_TitleName { + get { + return ResourceManager.GetString("FrmSystemSet_title1_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 MES设置 的本地化字符串。 + /// + internal static string FrmSystemSet_title3_TitleName { + get { + return ResourceManager.GetString("FrmSystemSet_title3_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 MES参数配置 的本地化字符串。 + /// + internal static string FrmSystemSet_title4_TitleName { + get { + return ResourceManager.GetString("FrmSystemSet_title4_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 MES配置 的本地化字符串。 + /// + internal static string FrmSystemSet_titleMesConfig_TitleName { + get { + return ResourceManager.GetString("FrmSystemSet_titleMesConfig_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 PLC配置 的本地化字符串。 + /// + internal static string FrmSystemSet_titlePlcConfig_TitleName { + get { + return ResourceManager.GetString("FrmSystemSet_titlePlcConfig_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 系统设置 的本地化字符串。 + /// + internal static string FrmSystemSet_titleSystemConfig_TitleName { + get { + return ResourceManager.GetString("FrmSystemSet_titleSystemConfig_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 127.0.0.1 的本地化字符串。 + /// + internal static string FrmSystemSet_txt_IP_Text { + get { + return ResourceManager.GetString("FrmSystemSet_txt_IP_Text", resourceCulture); + } + } + + /// + /// 查找类似 9600 的本地化字符串。 + /// + internal static string FrmSystemSet_txt_Prot_Text { + get { + return ResourceManager.GetString("FrmSystemSet_txt_Prot_Text", resourceCulture); + } + } + + /// + /// 查找类似 添加用户 的本地化字符串。 + /// + internal static string FrmUserManage_btn_Add_Text { + get { + return ResourceManager.GetString("FrmUserManage_btn_Add_Text", resourceCulture); + } + } + + /// + /// 查找类似 清空信息 的本地化字符串。 + /// + internal static string FrmUserManage_btn_Clear_Text { + get { + return ResourceManager.GetString("FrmUserManage_btn_Clear_Text", resourceCulture); + } + } + + /// + /// 查找类似 删除用户 的本地化字符串。 + /// + internal static string FrmUserManage_btn_Delete_Text { + get { + return ResourceManager.GetString("FrmUserManage_btn_Delete_Text", resourceCulture); + } + } + + /// + /// 查找类似 修改用户 的本地化字符串。 + /// + internal static string FrmUserManage_btn_Modify_Text { + get { + return ResourceManager.GetString("FrmUserManage_btn_Modify_Text", resourceCulture); + } + } + + /// + /// 查找类似 全选/不选 的本地化字符串。 + /// + internal static string FrmUserManage_btn_SelectAll_Text { + get { + return ResourceManager.GetString("FrmUserManage_btn_SelectAll_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据分析 的本地化字符串。 + /// + internal static string FrmUserManage_chk_CPKData_Text { + get { + return ResourceManager.GetString("FrmUserManage_chk_CPKData_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据追溯 的本地化字符串。 + /// + internal static string FrmUserManage_chk_HistorySelect_Text { + get { + return ResourceManager.GetString("FrmUserManage_chk_HistorySelect_Text", resourceCulture); + } + } + + /// + /// 查找类似 参数设置 的本地化字符串。 + /// + internal static string FrmUserManage_chk_Paramset_Text { + get { + return ResourceManager.GetString("FrmUserManage_chk_Paramset_Text", resourceCulture); + } + } + + /// + /// 查找类似 日志报警 的本地化字符串。 + /// + internal static string FrmUserManage_chk_SystemLog_Text { + get { + return ResourceManager.GetString("FrmUserManage_chk_SystemLog_Text", resourceCulture); + } + } + + /// + /// 查找类似 系统设置 的本地化字符串。 + /// + internal static string FrmUserManage_chk_SystemSet_Text { + get { + return ResourceManager.GetString("FrmUserManage_chk_SystemSet_Text", resourceCulture); + } + } + + /// + /// 查找类似 用户管理 的本地化字符串。 + /// + internal static string FrmUserManage_chk_UserManage_Text { + get { + return ResourceManager.GetString("FrmUserManage_chk_UserManage_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据分析 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_CpkDataHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_CpkDataHeader", resourceCulture); + } + } + + /// + /// 查找类似 数据追溯 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_HistoryDataHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_HistoryDataHeader", resourceCulture); + } + } + + /// + /// 查找类似 用户权限 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_LoginLevelHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_LoginLevelHeader", resourceCulture); + } + } + + /// + /// 查找类似 用户名 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_LoginNameHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_LoginNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 用户密码 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_LoginPwdHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_LoginPwdHeader", resourceCulture); + } + } + + /// + /// 查找类似 IC卡号 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_LoginUidHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_LoginUidHeader", resourceCulture); + } + } + + /// + /// 查找类似 参数设置 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_ParamSetHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_ParamSetHeader", resourceCulture); + } + } + + /// + /// 查找类似 日志报警 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_SystemLogHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_SystemLogHeader", resourceCulture); + } + } + + /// + /// 查找类似 系统设置 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_SystemSetHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_SystemSetHeader", resourceCulture); + } + } + + /// + /// 查找类似 用户管理 的本地化字符串。 + /// + internal static string FrmUserManage_dgv_Main_UserManageHeader { + get { + return ResourceManager.GetString("FrmUserManage_dgv_Main_UserManageHeader", resourceCulture); + } + } + + /// + /// 查找类似 IC卡号 的本地化字符串。 + /// + internal static string FrmUserManage_lblICCard_Text { + get { + return ResourceManager.GetString("FrmUserManage_lblICCard_Text", resourceCulture); + } + } + + /// + /// 查找类似 确认密码 的本地化字符串。 + /// + internal static string FrmUserManage_lblPwd_Text { + get { + return ResourceManager.GetString("FrmUserManage_lblPwd_Text", resourceCulture); + } + } + + /// + /// 查找类似 用户信息 的本地化字符串。 + /// + internal static string FrmUserManage_lblUserInfo_Text { + get { + return ResourceManager.GetString("FrmUserManage_lblUserInfo_Text", resourceCulture); + } + } + + /// + /// 查找类似 用户权限 的本地化字符串。 + /// + internal static string FrmUserManage_lblUserIssion_Text { + get { + return ResourceManager.GetString("FrmUserManage_lblUserIssion_Text", resourceCulture); + } + } + + /// + /// 查找类似 用户密码 的本地化字符串。 + /// + internal static string FrmUserManage_lblUserPwd_Text { + get { + return ResourceManager.GetString("FrmUserManage_lblUserPwd_Text", resourceCulture); + } + } + + /// + /// 查找类似 用户信息 的本地化字符串。 + /// + internal static string FrmUserManage_longTitleStyle21_TitleName { + get { + return ResourceManager.GetString("FrmUserManage_longTitleStyle21_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 权限配置 的本地化字符串。 + /// + internal static string FrmUserManage_longTitleStyle22_TitleName { + get { + return ResourceManager.GetString("FrmUserManage_longTitleStyle22_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 用户操作 的本地化字符串。 + /// + internal static string FrmUserManage_longTitleStyle23_TitleName { + get { + return ResourceManager.GetString("FrmUserManage_longTitleStyle23_TitleName", resourceCulture); + } + } + + /// + /// 查找类似 起始索引 的本地化字符串。 + /// + internal static string FrmVariableConfig_dgv_Main_StartHeader { + get { + return ResourceManager.GetString("FrmVariableConfig_dgv_Main_StartHeader", resourceCulture); + } + } + + /// + /// 查找类似 变量地址 的本地化字符串。 + /// + internal static string FrmVariableConfig_dgv_Main_VarAddressHeader { + get { + return ResourceManager.GetString("FrmVariableConfig_dgv_Main_VarAddressHeader", resourceCulture); + } + } + + /// + /// 查找类似 变量名称 的本地化字符串。 + /// + internal static string FrmVariableConfig_dgv_Main_VarNameHeader { + get { + return ResourceManager.GetString("FrmVariableConfig_dgv_Main_VarNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 变量配置 的本地化字符串。 + /// + internal static string FrmVariableConfig_label1_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label1_Text", resourceCulture); + } + } + + /// + /// 查找类似 变量地址 的本地化字符串。 + /// + internal static string FrmVariableConfig_label10_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label10_Text", resourceCulture); + } + } + + /// + /// 查找类似 通信组名称 的本地化字符串。 + /// + internal static string FrmVariableConfig_label2_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label2_Text", resourceCulture); + } + } + + /// + /// 查找类似 起始索引 的本地化字符串。 + /// + internal static string FrmVariableConfig_label3_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label3_Text", resourceCulture); + } + } + + /// + /// 查找类似 位偏移/长度 的本地化字符串。 + /// + internal static string FrmVariableConfig_label4_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label4_Text", resourceCulture); + } + } + + /// + /// 查找类似 变量名称 的本地化字符串。 + /// + internal static string FrmVariableConfig_label5_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label5_Text", resourceCulture); + } + } + + /// + /// 查找类似 备注说明 的本地化字符串。 + /// + internal static string FrmVariableConfig_label6_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label6_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据类型 的本地化字符串。 + /// + internal static string FrmVariableConfig_label7_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label7_Text", resourceCulture); + } + } + + /// + /// 查找类似 线性系数 的本地化字符串。 + /// + internal static string FrmVariableConfig_label8_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label8_Text", resourceCulture); + } + } + + /// + /// 查找类似 偏移量 的本地化字符串。 + /// + internal static string FrmVariableConfig_label9_Text { + get { + return ResourceManager.GetString("FrmVariableConfig_label9_Text", resourceCulture); + } + } + + /// + /// 查找类似 HMI手动弹窗状态已上传成功,代码 的本地化字符串。 + /// + internal static string HMI手动弹窗状态已上传成功_代码 { + get { + return ResourceManager.GetString("HMI手动弹窗状态已上传成功,代码", resourceCulture); + } + } + + /// + /// 查找类似 HMI手动弹窗结束状态已上传成功,代码 的本地化字符串。 + /// + internal static string HMI手动弹窗结束状态已上传成功_代码 { + get { + return ResourceManager.GetString("HMI手动弹窗结束状态已上传成功,代码", resourceCulture); + } + } + + /// + /// 查找类似 MES停机 的本地化字符串。 + /// + internal static string MES停机 { + get { + return ResourceManager.GetString("MES停机", resourceCulture); + } + } + + /// + /// 查找类似 MES参数设置成功 的本地化字符串。 + /// + internal static string MES参数设置成功 { + get { + return ResourceManager.GetString("MES参数设置成功", resourceCulture); + } + } + + /// + /// 查找类似 MES未登录 的本地化字符串。 + /// + internal static string MES未登录 { + get { + return ResourceManager.GetString("MES未登录", resourceCulture); + } + } + + /// + /// 查找类似 MES用户已注销 的本地化字符串。 + /// + internal static string MES用户已注销 { + get { + return ResourceManager.GetString("MES用户已注销", resourceCulture); + } + } + + /// + /// 查找类似 OCV测试结果NG 的本地化字符串。 + /// + internal static string OCV测试结果NG { + get { + return ResourceManager.GetString("OCV测试结果NG", resourceCulture); + } + } + + /// + /// 查找类似 PC写入PLC时间异常 的本地化字符串。 + /// + internal static string PC写入PLC时间异常 { + get { + return ResourceManager.GetString("PC写入PLC时间异常", resourceCulture); + } + } + + /// + /// 查找类似 添加变量 的本地化字符串。 + /// + internal static string VariableEditForm_BtnAdd_Text { + get { + return ResourceManager.GetString("VariableEditForm_BtnAdd_Text", resourceCulture); + } + } + + /// + /// 查找类似 变量配置 的本地化字符串。 + /// + internal static string VariableEditForm_lblTitle_Text { + get { + return ResourceManager.GetString("VariableEditForm_lblTitle_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据类型 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_DataTypeHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_DataTypeHeader", resourceCulture); + } + } + + /// + /// 查找类似 操作 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_EditHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_EditHeader", resourceCulture); + } + } + + /// + /// 查找类似 组名 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_GroupNameHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_GroupNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 长度偏移 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_OffsetOrLengthHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_OffsetOrLengthHeader", resourceCulture); + } + } + + /// + /// 查找类似 PLC编号 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_PlcNumHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_PlcNumHeader", resourceCulture); + } + } + + /// + /// 查找类似 备注 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_RemarkHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_RemarkHeader", resourceCulture); + } + } + + /// + /// 查找类似 起始地址 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_StartHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_StartHeader", resourceCulture); + } + } + + /// + /// 查找类似 变量地址 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_VarAddressHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_VarAddressHeader", resourceCulture); + } + } + + /// + /// 查找类似 变量名称 的本地化字符串。 + /// + internal static string VariableEditForm_variableTable_VarNameHeader { + get { + return ResourceManager.GetString("VariableEditForm_variableTable_VarNameHeader", resourceCulture); + } + } + + /// + /// 查找类似 上限 的本地化字符串。 + /// + internal static string 上限 { + get { + return ResourceManager.GetString("上限", resourceCulture); + } + } + + /// + /// 查找类似 下限 的本地化字符串。 + /// + internal static string 下限 { + get { + return ResourceManager.GetString("下限", resourceCulture); + } + } + + /// + /// 查找类似 不支持的数据类型 的本地化字符串。 + /// + internal static string 不支持的数据类型 { + get { + return ResourceManager.GetString("不支持的数据类型", resourceCulture); + } + } + + /// + /// 查找类似 产出 的本地化字符串。 + /// + internal static string 产出 { + get { + return ResourceManager.GetString("产出", resourceCulture); + } + } + + /// + /// 查找类似 优率 的本地化字符串。 + /// + internal static string 优率 { + get { + return ResourceManager.GetString("优率", resourceCulture); + } + } + + /// + /// 查找类似 信息 的本地化字符串。 + /// + internal static string 信息 { + get { + return ResourceManager.GetString("信息", resourceCulture); + } + } + + /// + /// 查找类似 修改 的本地化字符串。 + /// + internal static string 修改 { + get { + return ResourceManager.GetString("修改", resourceCulture); + } + } + + /// + /// 查找类似 修改MES/非MES模式切换 的本地化字符串。 + /// + internal static string 修改MES_非MES模式切换 { + get { + return ResourceManager.GetString("修改MES/非MES模式切换", resourceCulture); + } + } + + /// + /// 查找类似 修改切换监控界面间隔时间 的本地化字符串。 + /// + internal static string 修改切换监控界面间隔时间 { + get { + return ResourceManager.GetString("修改切换监控界面间隔时间", resourceCulture); + } + } + + /// + /// 查找类似 修改刷卡模式 的本地化字符串。 + /// + internal static string 修改刷卡模式 { + get { + return ResourceManager.GetString("修改刷卡模式", resourceCulture); + } + } + + /// + /// 查找类似 修改无操作自动切换监控界面方式 的本地化字符串。 + /// + internal static string 修改无操作自动切换监控界面方式 { + get { + return ResourceManager.GetString("修改无操作自动切换监控界面方式", resourceCulture); + } + } + + /// + /// 查找类似 修改无操作自动锁屏方式 的本地化字符串。 + /// + internal static string 修改无操作自动锁屏方式 { + get { + return ResourceManager.GetString("修改无操作自动锁屏方式", resourceCulture); + } + } + + /// + /// 查找类似 修改曲线显示数量 的本地化字符串。 + /// + internal static string 修改曲线显示数量 { + get { + return ResourceManager.GetString("修改曲线显示数量", resourceCulture); + } + } + + /// + /// 查找类似 修改线程耗时日志保存 的本地化字符串。 + /// + internal static string 修改线程耗时日志保存 { + get { + return ResourceManager.GetString("修改线程耗时日志保存", resourceCulture); + } + } + + /// + /// 查找类似 修改获取MES参数 的本地化字符串。 + /// + internal static string 修改获取MES参数 { + get { + return ResourceManager.GetString("修改获取MES参数", resourceCulture); + } + } + + /// + /// 查找类似 修改调试模式 的本地化字符串。 + /// + internal static string 修改调试模式 { + get { + return ResourceManager.GetString("修改调试模式", resourceCulture); + } + } + + /// + /// 查找类似 修改软件自动启动方式 的本地化字符串。 + /// + internal static string 修改软件自动启动方式 { + get { + return ResourceManager.GetString("修改软件自动启动方式", resourceCulture); + } + } + + /// + /// 查找类似 修改软件自动登录方式 的本地化字符串。 + /// + internal static string 修改软件自动登录方式 { + get { + return ResourceManager.GetString("修改软件自动登录方式", resourceCulture); + } + } + + /// + /// 查找类似 修改锁屏间隔时间 的本地化字符串。 + /// + internal static string 修改锁屏间隔时间 { + get { + return ResourceManager.GetString("修改锁屏间隔时间", resourceCulture); + } + } + + /// + /// 查找类似 停止与PLC连接 的本地化字符串。 + /// + internal static string 停止与PLC连接 { + get { + return ResourceManager.GetString("停止与PLC连接", resourceCulture); + } + } + + /// + /// 查找类似 先停止运行再切换MES 的本地化字符串。 + /// + internal static string 先停止运行再切换MES { + get { + return ResourceManager.GetString("先停止运行再切换MES", resourceCulture); + } + } + + /// + /// 查找类似 全天 的本地化字符串。 + /// + internal static string 全天 { + get { + return ResourceManager.GetString("全天", resourceCulture); + } + } + + /// + /// 查找类似 关闭MES模式成功 的本地化字符串。 + /// + internal static string 关闭MES模式成功 { + get { + return ResourceManager.GetString("关闭MES模式成功", resourceCulture); + } + } + + /// + /// 查找类似 其它非计划停机 的本地化字符串。 + /// + internal static string 其它非计划停机 { + get { + return ResourceManager.GetString("其它非计划停机", resourceCulture); + } + } + + /// + /// 查找类似 出站 的本地化字符串。 + /// + internal static string 出站 { + get { + return ResourceManager.GetString("出站", resourceCulture); + } + } + + /// + /// 查找类似 出站A工位发送给PLC 的本地化字符串。 + /// + internal static string 出站A工位发送给PLC { + get { + return ResourceManager.GetString("出站A工位发送给PLC", resourceCulture); + } + } + + /// + /// 查找类似 出站B工位发送给PLC 的本地化字符串。 + /// + internal static string 出站B工位发送给PLC { + get { + return ResourceManager.GetString("出站B工位发送给PLC", resourceCulture); + } + } + + /// + /// 查找类似 出站C工位发送给PLC 的本地化字符串。 + /// + internal static string 出站C工位发送给PLC { + get { + return ResourceManager.GetString("出站C工位发送给PLC", resourceCulture); + } + } + + /// + /// 查找类似 出站失败 的本地化字符串。 + /// + internal static string 出站失败 { + get { + return ResourceManager.GetString("出站失败", resourceCulture); + } + } + + /// + /// 查找类似 切换刷卡模式成功 的本地化字符串。 + /// + internal static string 切换刷卡模式成功 { + get { + return ResourceManager.GetString("切换刷卡模式成功", resourceCulture); + } + } + + /// + /// 查找类似 创建临时文件失败 的本地化字符串。 + /// + internal static string 创建临时文件失败 { + get { + return ResourceManager.GetString("创建临时文件失败", resourceCulture); + } + } + + /// + /// 查找类似 删除 的本地化字符串。 + /// + internal static string 删除 { + get { + return ResourceManager.GetString("删除", resourceCulture); + } + } + + /// + /// 查找类似 删除当前复投条码 的本地化字符串。 + /// + internal static string 删除当前复投条码 { + get { + return ResourceManager.GetString("删除当前复投条码", resourceCulture); + } + } + + /// + /// 查找类似 删除成功 的本地化字符串。 + /// + internal static string 删除成功 { + get { + return ResourceManager.GetString("删除成功", resourceCulture); + } + } + + /// + /// 查找类似 功率值 的本地化字符串。 + /// + internal static string 功率值 { + get { + return ResourceManager.GetString("功率值", resourceCulture); + } + } + + /// + /// 查找类似 功能待开发中! 的本地化字符串。 + /// + internal static string 功能待开发中_ { + get { + return ResourceManager.GetString("功能待开发中!", resourceCulture); + } + } + + /// + /// 查找类似 包装箱出站 的本地化字符串。 + /// + internal static string 包装箱出站 { + get { + return ResourceManager.GetString("包装箱出站", resourceCulture); + } + } + + /// + /// 查找类似 包装箱进站 的本地化字符串。 + /// + internal static string 包装箱进站 { + get { + return ResourceManager.GetString("包装箱进站", resourceCulture); + } + } + + /// + /// 查找类似 卷芯进站共耗时 的本地化字符串。 + /// + internal static string 卷芯进站共耗时 { + get { + return ResourceManager.GetString("卷芯进站共耗时", resourceCulture); + } + } + + /// + /// 查找类似 历史报警 的本地化字符串。 + /// + internal static string 历史报警 { + get { + return ResourceManager.GetString("历史报警", resourceCulture); + } + } + + /// + /// 查找类似 历史数据 的本地化字符串。 + /// + internal static string 历史数据 { + get { + return ResourceManager.GetString("历史数据", resourceCulture); + } + } + + /// + /// 查找类似 变量 的本地化字符串。 + /// + internal static string 变量 { + get { + return ResourceManager.GetString("变量", resourceCulture); + } + } + + /// + /// 查找类似 变量名不能为空 的本地化字符串。 + /// + internal static string 变量名不能为空 { + get { + return ResourceManager.GetString("变量名不能为空", resourceCulture); + } + } + + /// + /// 查找类似 变量名已存在 的本地化字符串。 + /// + internal static string 变量名已存在 { + get { + return ResourceManager.GetString("变量名已存在", resourceCulture); + } + } + + /// + /// 查找类似 变量地址格式不正确 的本地化字符串。 + /// + internal static string 变量地址格式不正确 { + get { + return ResourceManager.GetString("变量地址格式不正确", resourceCulture); + } + } + + /// + /// 查找类似 各不良项 的本地化字符串。 + /// + internal static string 各不良项 { + get { + return ResourceManager.GetString("各不良项", resourceCulture); + } + } + + /// + /// 查找类似 启动开始监控 的本地化字符串。 + /// + internal static string 启动开始监控 { + get { + return ResourceManager.GetString("启动开始监控", resourceCulture); + } + } + + /// + /// 查找类似 启动开始监控失败 的本地化字符串。 + /// + internal static string 启动开始监控失败 { + get { + return ResourceManager.GetString("启动开始监控失败", resourceCulture); + } + } + + /// + /// 查找类似 启用 的本地化字符串。 + /// + internal static string 启用 { + get { + return ResourceManager.GetString("启用", resourceCulture); + } + } + + /// + /// 查找类似 告警TOP10 的本地化字符串。 + /// + internal static string 告警TOP10 { + get { + return ResourceManager.GetString("告警TOP10", resourceCulture); + } + } + + /// + /// 查找类似 告警查询 的本地化字符串。 + /// + internal static string 告警查询 { + get { + return ResourceManager.GetString("告警查询", resourceCulture); + } + } + + /// + /// 查找类似 品质异常 的本地化字符串。 + /// + internal static string 品质异常 { + get { + return ResourceManager.GetString("品质异常", resourceCulture); + } + } + + /// + /// 查找类似 品质检查 的本地化字符串。 + /// + internal static string 品质检查 { + get { + return ResourceManager.GetString("品质检查", resourceCulture); + } + } + + /// + /// 查找类似 图表初始化异常 的本地化字符串。 + /// + internal static string 图表初始化异常 { + get { + return ResourceManager.GetString("图表初始化异常", resourceCulture); + } + } + + /// + /// 查找类似 地址范围超出限制,结束地址不能超过32767 的本地化字符串。 + /// + internal static string 地址范围超出限制_结束地址不能超过32767 { + get { + return ResourceManager.GetString("地址范围超出限制,结束地址不能超过32767", resourceCulture); + } + } + + /// + /// 查找类似 型号选择 的本地化字符串。 + /// + internal static string 型号选择 { + get { + return ResourceManager.GetString("型号选择", resourceCulture); + } + } + + /// + /// 查找类似 夜班 的本地化字符串。 + /// + internal static string 夜班 { + get { + return ResourceManager.GetString("夜班", resourceCulture); + } + } + + /// + /// 查找类似 定时刷新异常 的本地化字符串。 + /// + internal static string 定时刷新异常 { + get { + return ResourceManager.GetString("定时刷新异常", resourceCulture); + } + } + + /// + /// 查找类似 导出失败 的本地化字符串。 + /// + internal static string 导出失败 { + get { + return ResourceManager.GetString("导出失败", resourceCulture); + } + } + + /// + /// 查找类似 导出成功! 的本地化字符串。 + /// + internal static string 导出成功_ { + get { + return ResourceManager.GetString("导出成功!", resourceCulture); + } + } + + /// + /// 查找类似 导出报表失败 的本地化字符串。 + /// + internal static string 导出报表失败 { + get { + return ResourceManager.GetString("导出报表失败", resourceCulture); + } + } + + /// + /// 查找类似 工程变更 的本地化字符串。 + /// + internal static string 工程变更 { + get { + return ResourceManager.GetString("工程变更", resourceCulture); + } + } + + /// + /// 查找类似 已断开与PLC 的本地化字符串。 + /// + internal static string 已断开与PLC { + get { + return ResourceManager.GetString("已断开与PLC", resourceCulture); + } + } + + /// + /// 查找类似 开始时间不能大于结束时间 的本地化字符串。 + /// + internal static string 开始时间不能大于结束时间 { + get { + return ResourceManager.GetString("开始时间不能大于结束时间", resourceCulture); + } + } + + /// + /// 查找类似 当前已登录 的本地化字符串。 + /// + internal static string 当前已登录 { + get { + return ResourceManager.GetString("当前已登录", resourceCulture); + } + } + + /// + /// 查找类似 当前无报警 的本地化字符串。 + /// + internal static string 当前无报警 { + get { + return ResourceManager.GetString("当前无报警", resourceCulture); + } + } + + /// + /// 查找类似 当前用户已注销 的本地化字符串。 + /// + internal static string 当前用户已注销 { + get { + return ResourceManager.GetString("当前用户已注销", resourceCulture); + } + } + + /// + /// 查找类似 待料 的本地化字符串。 + /// + internal static string 待料 { + get { + return ResourceManager.GetString("待料", resourceCulture); + } + } + + /// + /// 查找类似 成功 的本地化字符串。 + /// + internal static string 成功 { + get { + return ResourceManager.GetString("成功", resourceCulture); + } + } + + /// + /// 查找类似 成功连接PLC 的本地化字符串。 + /// + internal static string 成功连接PLC { + get { + return ResourceManager.GetString("成功连接PLC", resourceCulture); + } + } + + /// + /// 查找类似 打开报表记录 的本地化字符串。 + /// + internal static string 打开报表记录 { + get { + return ResourceManager.GetString("打开报表记录", resourceCulture); + } + } + + /// + /// 查找类似 打开报警记录 的本地化字符串。 + /// + internal static string 打开报警记录 { + get { + return ResourceManager.GetString("打开报警记录", resourceCulture); + } + } + + /// + /// 查找类似 投入 的本地化字符串。 + /// + internal static string 投入 { + get { + return ResourceManager.GetString("投入", resourceCulture); + } + } + + /// + /// 查找类似 报警查询 的本地化字符串。 + /// + internal static string 报警查询 { + get { + return ResourceManager.GetString("报警查询", resourceCulture); + } + } + + /// + /// 查找类似 报警项 的本地化字符串。 + /// + internal static string 报警项 { + get { + return ResourceManager.GetString("报警项", resourceCulture); + } + } + + /// + /// 查找类似 提示 的本地化字符串。 + /// + internal static string 提示 { + get { + return ResourceManager.GetString("提示", resourceCulture); + } + } + + /// + /// 查找类似 操作日志 的本地化字符串。 + /// + internal static string 操作日志 { + get { + return ResourceManager.GetString("操作日志", resourceCulture); + } + } + + /// + /// 查找类似 数值 的本地化字符串。 + /// + internal static string 数值 { + get { + return ResourceManager.GetString("数值", resourceCulture); + } + } + + /// + /// 查找类似 数据分析 的本地化字符串。 + /// + internal static string 数据分析 { + get { + return ResourceManager.GetString("数据分析", resourceCulture); + } + } + + /// + /// 查找类似 数据报表导出 的本地化字符串。 + /// + internal static string 数据报表导出 { + get { + return ResourceManager.GetString("数据报表导出", resourceCulture); + } + } + + /// + /// 查找类似 新变量 的本地化字符串。 + /// + internal static string 新变量 { + get { + return ResourceManager.GetString("新变量", resourceCulture); + } + } + + /// + /// 查找类似 新建变量成功 的本地化字符串。 + /// + internal static string 新建变量成功 { + get { + return ResourceManager.GetString("新建变量成功", resourceCulture); + } + } + + /// + /// 查找类似 无PLC配置信息 的本地化字符串。 + /// + internal static string 无PLC配置信息 { + get { + return ResourceManager.GetString("无PLC配置信息", resourceCulture); + } + } + + /// + /// 查找类似 无效的组名 的本地化字符串。 + /// + internal static string 无效的组名 { + get { + return ResourceManager.GetString("无效的组名", resourceCulture); + } + } + + /// + /// 查找类似 无效的起始地址 的本地化字符串。 + /// + internal static string 无效的起始地址 { + get { + return ResourceManager.GetString("无效的起始地址", resourceCulture); + } + } + + /// + /// 查找类似 时间 的本地化字符串。 + /// + internal static string 时间 { + get { + return ResourceManager.GetString("时间", resourceCulture); + } + } + + /// + /// 查找类似 星期一 的本地化字符串。 + /// + internal static string 星期一 { + get { + return ResourceManager.GetString("星期一", resourceCulture); + } + } + + /// + /// 查找类似 星期三 的本地化字符串。 + /// + internal static string 星期三 { + get { + return ResourceManager.GetString("星期三", resourceCulture); + } + } + + /// + /// 查找类似 星期二 的本地化字符串。 + /// + internal static string 星期二 { + get { + return ResourceManager.GetString("星期二", resourceCulture); + } + } + + /// + /// 查找类似 星期五 的本地化字符串。 + /// + internal static string 星期五 { + get { + return ResourceManager.GetString("星期五", resourceCulture); + } + } + + /// + /// 查找类似 星期六 的本地化字符串。 + /// + internal static string 星期六 { + get { + return ResourceManager.GetString("星期六", resourceCulture); + } + } + + /// + /// 查找类似 星期四 的本地化字符串。 + /// + internal static string 星期四 { + get { + return ResourceManager.GetString("星期四", resourceCulture); + } + } + + /// + /// 查找类似 星期日 的本地化字符串。 + /// + internal static string 星期日 { + get { + return ResourceManager.GetString("星期日", resourceCulture); + } + } + + /// + /// 查找类似 是否切换刷卡模式 的本地化字符串。 + /// + internal static string 是否切换刷卡模式 { + get { + return ResourceManager.GetString("是否切换刷卡模式", resourceCulture); + } + } + + /// + /// 查找类似 是否确定要退出系统 的本地化字符串。 + /// + internal static string 是否确定要退出系统 { + get { + return ResourceManager.GetString("是否确定要退出系统", resourceCulture); + } + } + + /// + /// 查找类似 更新12小时数据异常 的本地化字符串。 + /// + internal static string 更新12小时数据异常 { + get { + return ResourceManager.GetString("更新12小时数据异常", resourceCulture); + } + } + + /// + /// 查找类似 更新不良图表异常 的本地化字符串。 + /// + internal static string 更新不良图表异常 { + get { + return ResourceManager.GetString("更新不良图表异常", resourceCulture); + } + } + + /// + /// 查找类似 更新报警图表异常 的本地化字符串。 + /// + internal static string 更新报警图表异常 { + get { + return ResourceManager.GetString("更新报警图表异常", resourceCulture); + } + } + + /// + /// 查找类似 更新效率控件异常 的本地化字符串。 + /// + internal static string 更新效率控件异常 { + get { + return ResourceManager.GetString("更新效率控件异常", resourceCulture); + } + } + + /// + /// 查找类似 更新时间显示异常 的本地化字符串。 + /// + internal static string 更新时间显示异常 { + get { + return ResourceManager.GetString("更新时间显示异常", resourceCulture); + } + } + + /// + /// 查找类似 更新能源显示异常 的本地化字符串。 + /// + internal static string 更新能源显示异常 { + get { + return ResourceManager.GetString("更新能源显示异常", resourceCulture); + } + } + + /// + /// 查找类似 未登录 的本地化字符串。 + /// + internal static string 未登录 { + get { + return ResourceManager.GetString("未登录", resourceCulture); + } + } + + /// + /// 查找类似 权限 的本地化字符串。 + /// + internal static string 权限 { + get { + return ResourceManager.GetString("权限", resourceCulture); + } + } + + /// + /// 查找类似 权限不足 的本地化字符串。 + /// + internal static string 权限不足 { + get { + return ResourceManager.GetString("权限不足", resourceCulture); + } + } + + /// + /// 查找类似 来料不良 的本地化字符串。 + /// + internal static string 来料不良 { + get { + return ResourceManager.GetString("来料不良", resourceCulture); + } + } + + /// + /// 查找类似 查询时间不能超过7天 的本地化字符串。 + /// + internal static string 查询时间不能超过7天 { + get { + return ResourceManager.GetString("查询时间不能超过7天", resourceCulture); + } + } + + /// + /// 查找类似 查询范围不能超过1天 的本地化字符串。 + /// + internal static string 查询范围不能超过1天 { + get { + return ResourceManager.GetString("查询范围不能超过1天", resourceCulture); + } + } + + /// + /// 查找类似 栈板信息 的本地化字符串。 + /// + internal static string 栈板信息 { + get { + return ResourceManager.GetString("栈板信息", resourceCulture); + } + } + + /// + /// 查找类似 次数 的本地化字符串。 + /// + internal static string 次数 { + get { + return ResourceManager.GetString("次数", resourceCulture); + } + } + + /// + /// 查找类似 没有可用的地址空间 的本地化字符串。 + /// + internal static string 没有可用的地址空间 { + get { + return ResourceManager.GetString("没有可用的地址空间", resourceCulture); + } + } + + /// + /// 查找类似 没有找到足够大的地址空间 的本地化字符串。 + /// + internal static string 没有找到足够大的地址空间 { + get { + return ResourceManager.GetString("没有找到足够大的地址空间", resourceCulture); + } + } + + /// + /// 查找类似 清洁点检 的本地化字符串。 + /// + internal static string 清洁点检 { + get { + return ResourceManager.GetString("清洁点检", resourceCulture); + } + } + + /// + /// 查找类似 环境不满足 的本地化字符串。 + /// + internal static string 环境不满足 { + get { + return ResourceManager.GetString("环境不满足", resourceCulture); + } + } + + /// + /// 查找类似 用户查询失败 的本地化字符串。 + /// + internal static string 用户查询失败 { + get { + return ResourceManager.GetString("用户查询失败", resourceCulture); + } + } + + /// + /// 查找类似 电芯OCV检测A有料标志为0 的本地化字符串。 + /// + internal static string 电芯OCV检测A有料标志为0 { + get { + return ResourceManager.GetString("电芯OCV检测A有料标志为0", resourceCulture); + } + } + + /// + /// 查找类似 电芯OCV检测B有料标志为0 的本地化字符串。 + /// + internal static string 电芯OCV检测B有料标志为0 { + get { + return ResourceManager.GetString("电芯OCV检测B有料标志为0", resourceCulture); + } + } + + /// + /// 查找类似 电芯出站A共耗时 的本地化字符串。 + /// + internal static string 电芯出站A共耗时 { + get { + return ResourceManager.GetString("电芯出站A共耗时", resourceCulture); + } + } + + /// + /// 查找类似 电芯出站B共耗时 的本地化字符串。 + /// + internal static string 电芯出站B共耗时 { + get { + return ResourceManager.GetString("电芯出站B共耗时", resourceCulture); + } + } + + /// + /// 查找类似 电芯出站C共耗时 的本地化字符串。 + /// + internal static string 电芯出站C共耗时 { + get { + return ResourceManager.GetString("电芯出站C共耗时", resourceCulture); + } + } + + /// + /// 查找类似 电芯码不良 的本地化字符串。 + /// + internal static string 电芯码不良 { + get { + return ResourceManager.GetString("电芯码不良", resourceCulture); + } + } + + /// + /// 查找类似 登录成功,登录用户 的本地化字符串。 + /// + internal static string 登录成功_登录用户 { + get { + return ResourceManager.GetString("登录成功,登录用户", resourceCulture); + } + } + + /// + /// 查找类似 登录提示 的本地化字符串。 + /// + internal static string 登录提示 { + get { + return ResourceManager.GetString("登录提示", resourceCulture); + } + } + + /// + /// 查找类似 登录用户或密码错误!!! 的本地化字符串。 + /// + internal static string 登录用户或密码错误 { + get { + return ResourceManager.GetString("登录用户或密码错误", resourceCulture); + } + } + + /// + /// 查找类似 登录系统 的本地化字符串。 + /// + internal static string 登录系统 { + get { + return ResourceManager.GetString("登录系统", resourceCulture); + } + } + + /// + /// 查找类似 白班 的本地化字符串。 + /// + internal static string 白班 { + get { + return ResourceManager.GetString("白班", resourceCulture); + } + } + + /// + /// 查找类似 确认保存 的本地化字符串。 + /// + internal static string 确认保存 { + get { + return ResourceManager.GetString("确认保存", resourceCulture); + } + } + + /// + /// 查找类似 禁用 的本地化字符串。 + /// + internal static string 禁用 { + get { + return ResourceManager.GetString("禁用", resourceCulture); + } + } + + /// + /// 查找类似 窗体加载异常 的本地化字符串。 + /// + internal static string 窗体加载异常 { + get { + return ResourceManager.GetString("窗体加载异常", resourceCulture); + } + } + + /// + /// 查找类似 箱唛信息 的本地化字符串。 + /// + internal static string 箱唛信息 { + get { + return ResourceManager.GetString("箱唛信息", resourceCulture); + } + } + + /// + /// 查找类似 箱唛标签打印 的本地化字符串。 + /// + internal static string 箱唛标签打印 { + get { + return ResourceManager.GetString("箱唛标签打印", resourceCulture); + } + } + + /// + /// 查找类似 箱唛码与栈板码绑定关系 的本地化字符串。 + /// + internal static string 箱唛码与栈板码绑定关系 { + get { + return ResourceManager.GetString("箱唛码与栈板码绑定关系", resourceCulture); + } + } + + /// + /// 查找类似 系统日志 的本地化字符串。 + /// + internal static string 系统日志 { + get { + return ResourceManager.GetString("系统日志", resourceCulture); + } + } + + /// + /// 查找类似 组名不能为空 的本地化字符串。 + /// + internal static string 组名不能为空 { + get { + return ResourceManager.GetString("组名不能为空", resourceCulture); + } + } + + /// + /// 查找类似 结果数据上传失败 的本地化字符串。 + /// + internal static string 结果数据上传失败 { + get { + return ResourceManager.GetString("结果数据上传失败", resourceCulture); + } + } + + /// + /// 查找类似 良品 的本地化字符串。 + /// + internal static string 良品 { + get { + return ResourceManager.GetString("良品", resourceCulture); + } + } + + /// + /// 查找类似 获取参数失败 的本地化字符串。 + /// + internal static string 获取参数失败 { + get { + return ResourceManager.GetString("获取参数失败", resourceCulture); + } + } + + /// + /// 查找类似 触发了手动HMI弹窗功能 的本地化字符串。 + /// + internal static string 触发了手动HMI弹窗功能 { + get { + return ResourceManager.GetString("触发了手动HMI弹窗功能", resourceCulture); + } + } + + /// + /// 查找类似 设备故障 的本地化字符串。 + /// + internal static string 设备故障 { + get { + return ResourceManager.GetString("设备故障", resourceCulture); + } + } + + /// + /// 查找类似 设备转型 的本地化字符串。 + /// + internal static string 设备转型 { + get { + return ResourceManager.GetString("设备转型", resourceCulture); + } + } + + /// + /// 查找类似 请填写登录密码 的本地化字符串。 + /// + internal static string 请填写登录密码 { + get { + return ResourceManager.GetString("请填写登录密码", resourceCulture); + } + } + + /// + /// 查找类似 请填写登录用户名 的本地化字符串。 + /// + internal static string 请填写登录用户名 { + get { + return ResourceManager.GetString("请填写登录用户名", resourceCulture); + } + } + + /// + /// 查找类似 请检查配置文件 的本地化字符串。 + /// + internal static string 请检查配置文件 { + get { + return ResourceManager.GetString("请检查配置文件", resourceCulture); + } + } + + /// + /// 查找类似 起始地址格式不正确 的本地化字符串。 + /// + internal static string 起始地址格式不正确 { + get { + return ResourceManager.GetString("起始地址格式不正确", resourceCulture); + } + } + + /// + /// 查找类似 进站 的本地化字符串。 + /// + internal static string 进站 { + get { + return ResourceManager.GetString("进站", resourceCulture); + } + } + + /// + /// 查找类似 进站A工位发送给PLC 的本地化字符串。 + /// + internal static string 进站A工位发送给PLC { + get { + return ResourceManager.GetString("进站A工位发送给PLC", resourceCulture); + } + } + + /// + /// 查找类似 进站B工位发送给PLC 的本地化字符串。 + /// + internal static string 进站B工位发送给PLC { + get { + return ResourceManager.GetString("进站B工位发送给PLC", resourceCulture); + } + } + + /// + /// 查找类似 进站C工位发送给PLC 的本地化字符串。 + /// + internal static string 进站C工位发送给PLC { + get { + return ResourceManager.GetString("进站C工位发送给PLC", resourceCulture); + } + } + + /// + /// 查找类似 进站上料工位A有料标志为0 的本地化字符串。 + /// + internal static string 进站上料工位A有料标志为0 { + get { + return ResourceManager.GetString("进站上料工位A有料标志为0", resourceCulture); + } + } + + /// + /// 查找类似 进站上料工位B有料标志为0 的本地化字符串。 + /// + internal static string 进站上料工位B有料标志为0 { + get { + return ResourceManager.GetString("进站上料工位B有料标志为0", resourceCulture); + } + } + + /// + /// 查找类似 进站失败 的本地化字符串。 + /// + internal static string 进站失败 { + get { + return ResourceManager.GetString("进站失败", resourceCulture); + } + } + + /// + /// 查找类似 连接PLC 的本地化字符串。 + /// + internal static string 连接PLC { + get { + return ResourceManager.GetString("连接PLC", resourceCulture); + } + } + + /// + /// 查找类似 连接PLC中 的本地化字符串。 + /// + internal static string 连接PLC中 { + get { + return ResourceManager.GetString("连接PLC中", resourceCulture); + } + } + + /// + /// 查找类似 连接PLC失败 的本地化字符串。 + /// + internal static string 连接PLC失败 { + get { + return ResourceManager.GetString("连接PLC失败", resourceCulture); + } + } + + /// + /// 查找类似 连接PLC时发生异常 的本地化字符串。 + /// + internal static string 连接PLC时发生异常 { + get { + return ResourceManager.GetString("连接PLC时发生异常", resourceCulture); + } + } + + /// + /// 查找类似 退出成功 的本地化字符串。 + /// + internal static string 退出成功 { + get { + return ResourceManager.GetString("退出成功", resourceCulture); + } + } + + /// + /// 查找类似 退出用户 的本地化字符串。 + /// + internal static string 退出用户 { + get { + return ResourceManager.GetString("退出用户", resourceCulture); + } + } + + /// + /// 查找类似 退出系统 的本地化字符串。 + /// + internal static string 退出系统 { + get { + return ResourceManager.GetString("退出系统", resourceCulture); + } + } + + /// + /// 查找类似 通信组 的本地化字符串。 + /// + internal static string 通信组 { + get { + return ResourceManager.GetString("通信组", resourceCulture); + } + } + + /// + /// 查找类似 通道号 的本地化字符串。 + /// + internal static string 通道号 { + get { + return ResourceManager.GetString("通道号", resourceCulture); + } + } + + /// + /// 查找类似 配件,物料更换 的本地化字符串。 + /// + internal static string 配件_物料更换 { + get { + return ResourceManager.GetString("配件,物料更换", resourceCulture); + } + } + + /// + /// 查找类似 配置保存成功 的本地化字符串。 + /// + internal static string 配置保存成功 { + get { + return ResourceManager.GetString("配置保存成功", resourceCulture); + } + } + + /// + /// 查找类似 配置文件加载完成 的本地化字符串。 + /// + internal static string 配置文件加载完成 { + get { + return ResourceManager.GetString("配置文件加载完成", resourceCulture); + } + } + + /// + /// 查找类似 错误 的本地化字符串。 + /// + internal static string 错误 { + get { + return ResourceManager.GetString("错误", resourceCulture); + } + } + + /// + /// 查找类似 错误提示 的本地化字符串。 + /// + internal static string 错误提示 { + get { + return ResourceManager.GetString("错误提示", resourceCulture); + } + } + + /// + /// 查找类似 长度必须大于0 的本地化字符串。 + /// + internal static string 长度必须大于0 { + get { + return ResourceManager.GetString("长度必须大于0", resourceCulture); + } + } + + /// + /// 查找类似 长度必须是大于0的数字 的本地化字符串。 + /// + internal static string 长度必须是大于0的数字 { + get { + return ResourceManager.GetString("长度必须是大于0的数字", resourceCulture); + } + } + + /// + /// 查找类似 验证错误 的本地化字符串。 + /// + internal static string 验证错误 { + get { + return ResourceManager.GetString("验证错误", resourceCulture); + } + } + + /// + /// 查找类似 默认组 的本地化字符串。 + /// + internal static string 默认组 { + get { + return ResourceManager.GetString("默认组", resourceCulture); + } + } + } +} diff --git a/Language/Languages.en.resx b/Language/Languages.en.resx new file mode 100644 index 0000000..25ea7b0 --- /dev/null +++ b/Language/Languages.en.resx @@ -0,0 +1,2257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Tip + + + Failed to connect to PLC, please check PLC connection configuration, network + + + Delete variable + + + rising vote + + + Falling Edge Alarm + + + Offset Number + + + Falling Edge + + + Communication Group + + + Data Type + + + Modify a variable + + + Bit Offset/Length + + + Rising Edge Alarm + + + New Variation + + + D40 has been reset 0 + + + Alarm information Normal + + + Media type + + + Date and Time + + + Log information + + + Date and Time + + + Log Types + + + Date and Time + + + Operation information + + + Operation Type + + + The operation log + + + System Alarm + + + system log + + + PP + + + CP + + + Ca + + + PPK + + + CPK + + + Dev + + + Mean + + + SampleSize + + + Groups + + + Max + + + Min + + + Total + + + Average Value + + + Max + + + Min + + + Lower limit of specification + + + Upper limit of specification + + + Number of data groups + + + Sample Subgroup Size + + + target value + + + Negative 3x standard deviation + + + Standard deviation (within group) + + + Standard deviation (overall) + + + Positive 3x SD + + + CPL + + + CPU + + + CP + + + CPK + + + Ca + + + PPL + + + Ppk + + + PPU + + + PP + + + CpkGrade + + + Total number of samples + + + Ppm < LSL + + + Ppm Toatl + + + Ppm < USL + + + Clear data + + + Calculate CPK + + + Analytics options + + + Query + + + Generate dummy data + + + Magnitude + + + Stats + + + Process capability (within the group) + + + Other values + + + Calculated value + + + Measured performance + + + Process capability (overall) + + + Query options + + + Query time interval + + + XR Control Chart + + + CPK Analysis Chart + + + Sample run diagram + + + Mean Run Chart + + + Model + + + Material code + + + Start monitoring + + + Stop monitoring + + + chart1 + + + chart1 + + + Remark + + + Comprehensive result + + + Time + + + Pallet barcode + + + Weight + + + Remarks + + + Results + + + Pallet barcode + + + Time + + + Container barcode + + + Container barcode + + + Remarks + + + Results + + + Time + + + Pallet barcode + + + Remarks + + + Results + + + Time + + + Logging + + + Parameters + + + Assembly inspection workstation + + + Container Inbound + + + Container Outbound + + + Cardboard tray binding and uploading + + + Cardboard printing workstation + + + Parameter + + + Min + + + Max + + + Units + + + New Distribution Group + + + Delete Distribution Group + + + Modify Distribution Group + + + Whether feedback is required or not + + + whether to enable + + + Is it a triggered read + + + Distribution group name + + + ON + + + Whether feedback is required or not + + + Is it a triggered read + + + Length + + + Remarks + + + Start Address + + + Distribution Group Configuration + + + Distribution group name + + + Start Address + + + Length + + + Remarks + + + Export Excel + + + Time query + + + Export + + + Query + + + Export + + + Query + + + Export Excel + + + guide + + + Query + + + Query + + + Re-upload + + + guide + + + Query + + + Average Operating Rate + + + Average Ppm + + + Production Yield Rate + + + ProdIn + + + ProdOut + + + TestTime + + + Day + + + Average Operating Rate + + + Average Ppm + + + Optimum Rate + + + ProdIn + + + ProdOut + + + Average Operating Rate + + + Month + + + Average Ppm + + + Production Yield Rate + + + Total ProdIn + + + Total ProdOut + + + Average Operating Rate + + + Average Ppm + + + Production Yield Rate + + + Total ProdIn + + + Total ProdOut + + + Week + + + AlarmContent + + + AlarmCount + + + AlarmTime + + + Class + + + PLCAdress + + + Battery barcode + + + Bottom support plate code + + + Number of plies + + + Pallet position number + + + Remark + + + Result + + + Number of stack layers + + + Stacking station number + + + TestTime + + + Pallet barcode + + + Container Code + + + Pallet Code + + + Weight + + + Parameter Name + + + Parameter Value + + + shifts + + + Steel Shell Code + + + RFID + + + Statistics date + + + Statistics date + + + Statistics Time + + + Statistics Time + + + End time + + + Start Time + + + Barcode + + + End time + + + Start Time + + + Type + + + Historical production data query + + + Capacity statistics query + + + Log alarm data query + + + Statistics by Shift + + + Daily statistics + + + Statistics by week + + + Monthly statistics + + + Yiwei Power + + + Login + + + Yiwei Power + + + Start + + + 57 Factory + + + Yiwei Power + + + Battery packaging data B collection system + + + Log Alarm + + + Data analysis + + + Data Monitoring + + + Data traceability + + + Centralized monitoring + + + Easy parameter setting + + + System Configuration + + + Managing Users + + + about + + + Show home screen + + + Exit + + + Hide Main Menu + + + Non-Swipe Mode + + + Smart Meter + + + UA + + + Total Power + + + Total Factor + + + Pt + + + Ct + + + Accumulated Power + + + UB + + + UC + + + IA + + + IB + + + IC + + + PowerA + + + PowerB + + + PowerC + + + Alarm Top10 Statistics + + + Capacity statistics + + + Bad item statistics + + + OK number + + + Superior Rate + + + Total Production + + + Utilization rate + + + Equipment No + + + The affiliated warehouse + + + Shipper + + + Model + + + Up time + + + Run time + + + Smart meter (device) + + + OK + + + Are you sure you want to exit the system? + + + Log out system + + + Cancel + + + Cancel + + + OK + + + Are you sure you want to exit the system? + + + Log out system + + + Delete model + + + Add model + + + Save the parameters + + + Parameter item name + + + Max + + + Min + + + Unit + + + Material code + + + Model + + + Remark + + + Current model + + + Model + + + Material code + + + Current model + + + Add PLC + + + Cancellation settings + + + Distribution Group Configuration + + + OK settings + + + Variable Configuration + + + Settings + + + rising vote + + + Heartbeat Address + + + IP Address + + + Active status + + + Heartbeat status + + + Modify a variable + + + PLC type + + + The port number + + + Remarks + + + Get MES parameters + + + Turn on swipe mode + + + PLC type configuration + + + Equipment No + + + Shipper + + + The affiliated warehouse + + + Automatically switch the monitoring interface time + + + No operation automatically switches the monitoring interface + + + Customer Material Number + + + Port number configuration + + + No operating automatic lock screen + + + Auto lock screen time + + + Number of welder power curve displays + + + Software automatically logs in + + + Automatically run KICOME when restarting my computer + + + Thread time-consuming log saving + + + MES/non-MES mode switching + + + Anemometer + + + The interface address for uploading and binding information of the bag-flipping equipment + + + debugging mode + + + Equipment alarm + + + Device parameter setpoint changed + + + Device parameter setpoint request + + + Equipment State + + + Employee Permissions Verification + + + Meter energy consumption + + + Incomplete VDA interface address when pulling the bag + + + Obtain Token + + + Raw material input information + + + Product inbound + + + Product outbound + + + Product Process Data + + + Product processing result data + + + PLC Configuration + + + MES Settings + + + MES parameter configuration + + + MES Configuration + + + PLC Configuration + + + System Configuration + + + 127.0.0.1 + + + 9600 + + + Add User + + + Empty message + + + Deleting a User + + + Modification User + + + Check/Uncheck all + + + Data analysis + + + Data traceability + + + Easy parameter setting + + + Log Alarm + + + System Configuration + + + Managing Users + + + Data analysis + + + Data traceability + + + user rights + + + Username + + + user password + + + IC Card No + + + Easy parameter setting + + + Log Alarm + + + System Configuration + + + Managing Users + + + IC Card No + + + Enter Password again + + + User Information + + + user rights + + + user password + + + User Information + + + Set Permission + + + User operation + + + Start Index + + + Variable address + + + Variable Name + + + Variable address + + + Variable Configuration + + + Distribution group name + + + Start Index + + + Bit Offset/Length + + + Variable Name + + + Remarks + + + Data Type + + + Linearity coefficient + + + Offset Number + + + IC Card No + + + HMI manual pop-up status has been uploaded successfully, code + + + The end state of the HMI manual pop-up window has been uploaded successfully, and the code + + + MES downtime + + + MES parameter setting successfully + + + MES is not logged in + + + MES login is successful, login user + + + MES user logged out + + + OCV test results NG + + + PC write PLC time failed! + + + PC write PLC time successed! + + + PC writes PLC time exception + + + Add variable + + + Variable Configuration + + + Data Type + + + rising vote + + + Falling Edge Alarm + + + Length offset + + + Modify a variable + + + Remarks + + + Start Address + + + Variable address + + + Variable Name + + + Upper limit + + + Lower limit + + + Unsupported data type + + + Creates + + + Product model cannot be empty + + + Product model cannot be empty! + + + Product model and parameter list cannot be empty + + + Superior Rate + + + Save the parameters + + + Failed to save task + + + Save successfully + + + Info + + + Modify + + + Modify MES/non-MES mode switching + + + Modify the interval between switch monitoring interfaces + + + Modify Swipe Mode + + + Modify a variable + + + Failed to modify variable + + + Modification User + + + Failed to modify user + + + Modify Distribution Group + + + Failed to modify distribution group: + + + Modify the mode of automatic switching monitoring interface without operation + + + Modify the unoperational automatic screen locking method + + + Modify the number of curve displays + + + Modify thread time-consuming log saving + + + Modify to get MES parameters + + + Modify the debugging mode + + + Modify the automatic startup method of the software + + + Modify the automatic login method of the software + + + Modify the lock screen interval + + + Stop connecting to PLC + + + Stop running before switching MES + + + Full Day + + + Successfully turning off mes mode + + + Other unplanned downtime + + + Outbound + + + Outbound A station is sent to PLC + + + Outbound B station is sent to PLC + + + Outbound C station is sent to PLC + + + OutBound failed + + + Switching swiping mode successfully + + + Failed creating temporary file + + + Delete it + + + Delete the current re-investment barcode + + + Delete succeeded + + + Failed creating temporary file + + + Delete it + + + Delete variable + + + Failed to delete variable + + + Delete model + + + Failed to delete + + + Delete succeeded + + + Remove Tip + + + Failed to delete user + + + Delete Distribution Group + + + Failed to delete the distribution group + + + Power value + + + Features to be developed! + + + The total time taken to enter the station + + + Failed to load system configuration + + + Successed to load system configuration + + + Figure 19 Historical alarm + + + Historical data + + + Parameter modified successfully + + + Easy parameter setting + + + Variables + + + Variable name cannot be empty + + + The variable name already exists + + + Variable name does not exist + + + Incorrectly formatted variable address + + + Each defective item + + + Start monitoring + + + Start to start monitoring failed + + + Unusual quality + + + Quality inspection + + + Chart initialization exception + + + Incorrect address format, should start with 'D' followed by a number + + + The address format is incorrect, it should be a pure number + + + The address range exceeds the limit, and the end address cannot exceed 32767 + + + The material code corresponding to the model cannot be empty + + + 型号选择 + + + OPS Night Shift + + + Timed refresh exception + + + Export report failed + + + Export report succeeded, whether to open it now + + + Export report succeeded, do you want to open it now? + + + Export alarm succeeded, do you want to open it now? + + + Engineering changes + + + Disconnected from PLC + + + Start loading configuration parameters... + + + The start time can not be greater than the end time + + + Currently in MES mode, please log in + + + Currently in MES mode, please log in! + + + Currently logged in + + + Currently logged in, do you want to switch the swipe mode + + + Currently logged in, do you want to switch the swipe mode!! + + + There are currently no alarms + + + You are not currently logged in, please log in first! + + + You are not currently logged in, please log in + + + You are not currently logged in, please log in! + + + Current user logged out + + + Insufficient privileges for current logged in user! + + + The current device is running. For inquiries, please press the stop button first! + + + To be expected + + + Success + + + Successfully connect PLC + + + Open report record + + + Open alarm log + + + Inputs + + + Alarm TOP10 + + + Alarm query + + + Alarm item + + + Prompt + + + The operation log + + + Value + + + Data analysis + + + Data Report Export + + + New Variable + + + New variable created successfully + + + No PLC configuration information + + + Invalid group name + + + Invalid start address + + + Time + + + Monday + + + Wednesday + + + Tuesday + + + Friday + + + Saturday + + + Thursday + + + Sunday + + + Do you want to save the modified configuration? + + + Whether to turn off MES mode + + + Whether to turn off MES mode! + + + whether delete + + + Are you sure you want to exit the system + + + Do you want to delete the model + + + Toggle Swipe Mode + + + Are you sure you want to exit the system + + + Updated 12-hour data anomalies + + + Update Bad Chart Anomalies + + + Update Alarm Chart Anomalies + + + Update Efficiency Control Exception + + + Update Time Display Unexpected + + + Update energy display anomalies + + + please sign in here + + + No data found, please test + + + Jurisdiction + + + Permission Denied + + + Poor incoming materials + + + Query failed: + + + Query failed + + + Query action + + + Query time cannot exceed 7 days + + + Query range cannot exceed 1 day + + + Times + + + No address space available + + + No group names available, please add groups in Group.xlsx first + + + Not enough address space found + + + Cleaning point inspection + + + Material code cannot be empty! + + + The environment is not satisfied + + + User query failed + + + Cell OCV detection A material mark is 0 + + + Cell OCV detection B material mark is 0 + + + Cell outbound A consumes a total time + + + Cell outbound B consumes a total time + + + Cell outbound C consumes a total time + + + Code error + + + Add variable + + + Failed to add variable + + + Add model + + + Add Failure: Modification already exists, add again + + + add failed + + + add success + + + Add User + + + Failed to add users + + + Delete variable + + + Failed to add distribution group: + + + Communication group added successfully + + + Material code cannot be empty + + + Material code cannot be empty! + + + User! + + + User name cannot be empty + + + msg.user_password_not_be_empty + + + User query failed + + + Users + + + Successful login, login user + + + Login Tips + + + Incorrect login user or password + + + log in system + + + Day Shift + + + Confirmation + + + Form loading exception + + + Confirmation password can not be empty + + + Manual input is prohibited, please use the brand scan to enter + + + system log + + + Remarks + + + Result data upload failed + + + + Alarm query + + + User query failed + + + Error prompt + + + Query failed: + + + PC writes PLC time exception + + + Form loading exception + + + Updated 12-hour data anomalies + + + Update Efficiency Control Exception + + + Update Time Display Unexpected + + + Update energy display anomalies + + + Update Alarm Chart Anomalies + + + Update Bad Chart Anomalies + + + Quit Successfully + + + Quit the user + + + Stop connecting to PLC + + + Modify the automatic login method of the software + + + Modify the automatic startup method of the software + + + Modify the unoperational automatic screen locking method + + + Modify the lock screen interval + + + Modify the mode of automatic switching monitoring interface without operation + + + Modify the debugging mode + + + Modify the interval between switch monitoring interfaces + + + Modify the number of curve displays + + + Modify Swipe Mode + + + Toggle Swipe Mode + + + Switching swiping mode successfully + + + Current user logged out + + + Prompt + + + Stop running before switching MES + + + Modify MES/non-MES mode switching + + + Successfully turning off mes mode + + + MES user logged out + + + Modify to get MES parameters + + + Modify thread time-consuming log saving + + + The configuration file is loaded + + + No PLC configuration information + + + Please check the profile + + + Failed to connect PLC + + + Successfully connect PLC + + + Anomalies occurred when connecting to PLC + + + Result data upload failed + + + Good products + + + Triggered the manual HMI pop-up window function + + + Failure of equipment + + + Equipment transformation + + + MES downtime + + + Accessories, material replacement + + + Poor incoming materials + + + To be expected + + + Cleaning point inspection + + + The environment is not satisfied + + + Other unplanned downtime + + + HMI manual pop-up status has been uploaded successfully, code + + + The end state of the HMI manual pop-up window has been uploaded successfully, and the code + + + Please sign in with your card first! + + + Please check the profile + + + Start address format is incorrect + + + InBound + + + Inbound A station is sent to PLC + + + Inbound B station is sent to PLC + + + Inbound C station is sent to PLC + + + Incoming loading station A material sign is 0 + + + Incoming loading station B material sign is 0 + + + InBound failed + + + This user name already exists + + + Please swipe your card to log in first + + + Please sign in with your card first! + + + Please fill in the password for login + + + Please fill in the login username + + + Оберіть модель + + + Please select a variable to modify + + + Please select a variable to delete + + + Start address format is incorrect + + + ARRIVALS + + + Connect PLC + + + Connect PLC + + + Failed to connect PLC + + + Failed to connect to PLC, please check PLC connection configuration, network + + + Anomalies occurred when connecting to PLC + + + Quit Successfully + + + Quit the user + + + Log out system + + + Select the production model you want to delete + + + Communication Group + + + Distribution group name does not exist! + + + Distribution group name cannot be empty! + + + Distribution group name already exists + + + Channel number + + + Accessories, material replacement + + + <strong>%s</strong> config saved successfully + + + The configuration file is loaded + + + Error + + + Error message + + + Length must be greater than 0 + + + Length must be a number greater than 0 + + + Item name + + + An error occurred while validating the configuration, please check if the input is correct + + + Verification Error + + + Default Group + + + Carton Inbound + + + Carton Outbound + + + Carton Mark Label Printing + + + Carton Mark Information + + + Binding Relationship between Carton Mark Code and Pallet Code + + + Pallet Information + + + Enable + + + Disable + + + Export succeeded! + + + Export failed + + \ No newline at end of file diff --git a/Language/Languages.hu.resx b/Language/Languages.hu.resx new file mode 100644 index 0000000..f29f645 --- /dev/null +++ b/Language/Languages.hu.resx @@ -0,0 +1,2091 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Változó törlése + + + Rising Edge + + + Leeső él riasztás + + + Eltolás + + + Falling Edge + + + Kommunikációs csoport + + + Adattípus + + + Változó módosítása + + + Biteltolás/hossz + + + Rising Edge Alarm + + + Változó hozzáadva + + + A D40 visszaállították 0 + + + Riasztási információk + + + Riasztás típusa + + + Dátum Idő + + + Naplózza az üzeneteket + + + Dátum Idő + + + Napló típusa + + + Dátum Idő + + + Működési információk + + + Művelet típusa + + + Műveleti napló + + + Rendszerriasztás + + + Rendszernapló + + + PP (egyértelműsítő lap) + + + CP + + + Ca + + + PPK + + + CPK + + + Dev + + + Mean + + + SampleSize + + + Csoportok + + + Max + + + Minimum + + + Összesen + + + Átlagos + + + Max + + + Min + + + Specifikáció Alsó határérték + + + Max Specs + + + Adatcsoportok száma + + + Minta alcsoport mérete + + + Célérték + + + Negatív 3x szórás + + + Szórás (csoporton belül) + + + Szórás (teljes) + + + Pozitív 3x SD + + + CPL + + + CPU + + + CP + + + CPK + + + Ca + + + PPL + + + Ppk + + + PPU + + + PP (egyértelműsítő lap) + + + CpkGrade + + + Minták száma összesen + + + Ppm < Lsl + + + Ppm Toatl + + + Ppm < USL + + + Üres adatok + + + Számítsa ki a CPK-t + + + Elemzési lehetőségek + + + Lekérdezés + + + Hozzon létre áladatokat + + + Állandó + + + Statisztikák + + + Folyamatképesség (a csoporton belül) + + + Egyéb érték + + + Kiszámított érték + + + Mért teljesítmény + + + Folyamatképesség (általános) + + + Lekérdezési lehetőségek + + + Lekérdezési időintervallum + + + XR vezérlési táblázat + + + CPK elemzési táblázat + + + Minta futtatási diagram + + + Átlagos futási diagram + + + Termelési modell + + + Anyagkód + + + Kezdje el a megfigyelést + + + Monitorozás leállítása + + + chart1 + + + chart1 + + + megjegyzés + + + Összesített eredmények + + + A rétegek száma a veremben + + + Rakodóállomás száma + + + Tesztidő + + + Paletta Kód + + + súly + + + Megjegyzés + + + Eredmény + + + Paletta Kód + + + Idő + + + Tároló Kód + + + Tároló Kód + + + Megjegyzés + + + Eredmény + + + Idő + + + Paletta Kód + + + Megjegyzés + + + Eredmény + + + Idő + + + Naplózás + + + Argumentumok + + + Szerelje össze a lemezes mintavételi ellenőrző állomást + + + Konteiner Behozatal + + + Konteiner Kihúzás + + + Raklap raklap kötés és feltöltés + + + Raklapnyomtató állomás + + + Paraméterelem + + + Min + + + Max + + + Egység + + + Új terjesztési csoport + + + Terjesztési csoport törlése + + + Terjesztési csoport módosítása + + + Visszajelzés szükséges-e vagy sem + + + Engedélyezve vagy sem + + + Ez egy kiváltott olvasás + + + Terjesztési csoport neve + + + Engedélyezve + + + Visszajelzés szükséges-e vagy sem + + + Ez egy kiváltott olvasás + + + Hossz + + + Hozzászólás leírása + + + Kezdő cím + + + Terjesztési csoport konfiguráció + + + Terjesztési csoport neve + + + Kezdő cím + + + Hossz + + + Hozzászólás leírása + + + Excel exportálása + + + Idő lekérdezés + + + Exportálás + + + Lekérdezés + + + Exportálás + + + Lekérdezés + + + Excel exportálása + + + Exportálás + + + Lekérdezés + + + Lekérdezés + + + Újra feltöltés + + + Exportálás + + + Lekérdezés + + + Átlagos Működési Arány + + + Átlagos Ppm + + + Termelési Hibaarány + + + Termelés Bevitel + + + Termelés Kibocsátás + + + Tesztidő + + + Nap + + + Átlagos Működési Arány + + + Átlagos Ppm + + + Optimális Arány + + + Termelés Bevitel + + + Termelés Kibocsátás + + + Átlagos Működési Arány + + + Hónap + + + Átlagos Ppm + + + Termelési Hibaarány + + + Termelés Bevitel Összesen + + + Termelés Kibocsátás Összesen + + + Átlagos Működési Arány + + + Átlagos Ppm + + + Termelési Értékelési Arány + + + Termelés Bevitel Összesen + + + Termelés Kibocsátás Összesen + + + Hét + + + Részegtartalom + + + Részegszám + + + Részegidő + + + Osztály + + + PLC-cím + + + Akkumulátor vonalkódja + + + Alsó kártya kódja + + + Rétegek száma + + + Raklap pozíció száma + + + megjegyzés + + + Összesített eredmények + + + A rétegek száma a veremben + + + Rakodóállomás száma + + + Tesztidő + + + Raklap vonalkód + + + Dobozcímkákód + + + Palettakód + + + Súly + + + Paraméter neve + + + Paraméter értéke + + + Shift + + + Acélhéj kód + + + RFID + + + Statisztikák dátuma + + + Statisztikák dátuma + + + Statisztikai idő + + + Statisztikai idő + + + Befejezés időpontja + + + Kezdés időpontja + + + Vonalkód + + + Befejezés időpontja + + + Kezdés időpontja + + + Lekérdezés típusa + + + Történelmi termelési adatok lekérdezése + + + + + + + + + Statisztika műszakonként + + + Statisztika napról napra + + + Heti statisztika + + + Havi statisztikák + + + Yiwei Power + + + Bejelentkezés + + + Yiwei Power + + + A program indulása + + + 57 Factory + + + Yiwei Power + + + Akkumulátor flip csomagadat B adatgyűjtő rendszer + + + Riasztás naplózása + + + Adatok + + + Adatfigyelés + + + Adatok nyomonkövethetősége + + + Központosított monitorozás + + + Paraméterbeállítások + + + Rendszerbeállítások + + + Felhasználókezelés + + + A program névjegye + + + Kezdőképernyő megjelenítése + + + Exit + + + Kezdőképernyő elrejtése + + + Non-Swipe Mode + + + Intelligens mérő + + + A fázis Feszültség + + + Teljes aktív teljesítmény + + + Teljes teljesítménytényező + + + Feszültségarány + + + Jelenlegi arány + + + Felhalmozott teljesítmény + + + B fázis feszültség + + + C fázisú feszültség + + + A fázis áram + + + B fázisú áram + + + C fázisú áram + + + Phase A Power + + + B fázisú tápellátás + + + C fázisú tápellátás + + + Riasztás Top10 Statisztika + + + Kapacitásstatisztikák + + + Hibás tételstatisztika + + + OK szám + + + Kiemelkedő ár + + + Teljes termelés + + + Elérhetőség + + + Eszköz száma + + + Raktár + + + Tulajdonos + + + Termelési modell + + + Bekapcsolási idő + + + Futásidő + + + Intelligens mérő (eszköz) + + + OK + + + Biztosan kilép a rendszerből? + + + Jelentkezzen ki a rendszerből + + + Mégsem + + + Mégsem + + + OK + + + Biztosan kilép a rendszerből? + + + Jelentkezzen ki a rendszerből + + + Modell törlése + + + Modell hozzáadása + + + Paraméterek mentve + + + Paraméterelem neve + + + Max + + + Min + + + Egység + + + Anyagkód + + + Termelési modell + + + Megjegyzés + + + Jelenlegi modell + + + Termelési modell + + + Anyagkód + + + Jelenlegi modell + + + Add hozzá a PLC-t + + + Nincs beállítva + + + Terjesztési csoport konfiguráció + + + Határozza meg a beállításokat + + + Változó konfiguráció + + + A lefoglalások megjelenítése + + + Rising Edge + + + Heartbeat Address + + + IP-cím + + + Aktív + + + Szívverés állapota + + + Változó módosítása + + + PLC típus + + + Kiszolgálóportok + + + Megjegyzés + + + Szerezze be a MES-paraméter + + + Pöccintési mód bekapcsolása + + + PLC típus konfiguráció + + + Eszköz száma + + + Tulajdonos + + + Raktár + + + Automatikusan kapcsolja át a felügyeleti interfész idejét + + + Nincs olyan művelet, amely automatikusan átkapcsolja a felügyeleti felületet + + + Ügyfél cikkszáma + + + Portszám konfiguráció + + + Nincs működő automatikus zárolási képernyő + + + Automatikus zárolási képernyőidő + + + Hegesztő teljesítménygörbe kijelzések száma + + + A szoftver automatikusan bejelentkezik + + + Automatikus indítás + + + Szál időigényes napló mentése + + + MES/nem MES üzemmód váltás + + + Anemométer + + + A flipping eszköz által feltöltött kötési információ interfészcíme + + + Hibakeresési mód + + + Berendezés riasztó + + + Eszközparaméter alapértéke módosítva + + + Eszközparaméter alapérték kérése + + + Eszköz állapota + + + Alkalmazotti engedélyek ellenőrzése + + + Mérőóra energiafogyasztása + + + Fordítsa meg a csomagot egy hiányos VDA interfészcím lekéréséhez + + + Jogkivonat lekérése + + + Nyersanyag bemeneti információ + + + Termék bejövő + + + Termék kimenő + + + Termékfolyamatadatok + + + A termék feldolgozási eredményadatai + + + PLC konfiguráció + + + MES-beállítások + + + MES paraméter konfiguráció + + + MES konfiguráció + + + PLC konfiguráció + + + Rendszerbeállítások + + + 127.0.0.1 + + + 9600 + + + Felhasználó hozzáadása + + + Üres üzenet + + + Felhasználó törlése + + + Felhasználó módosítása + + + Válassza ki/szüntesse meg az összes kiválasztását + + + Adatok + + + Adatok nyomonkövethetősége + + + Paraméterbeállítások + + + Riasztás naplózása + + + Rendszerbeállítások + + + Felhasználókezelés + + + Adatok + + + Adatok nyomonkövethetősége + + + Felhasználói jogosultságok + + + Felhasználónév + + + Felhasználói jelszó + + + IC-kártya száma + + + Paraméterbeállítások + + + Riasztás naplózása + + + Rendszerbeállítások + + + Felhasználókezelés + + + IC-kártya száma + + + Jelszó megerősítése + + + Felhasználói adatok + + + Felhasználói jogosultságok + + + Felhasználói jelszó + + + Felhasználói adatok + + + Engedélyek konfigurálása + + + Felhasználói művelet + + + Index indítása + + + Változó cím + + + Változó neve + + + Változó cím + + + Változó konfiguráció + + + Terjesztési csoport neve + + + Index indítása + + + Biteltolás/hossz + + + Változó neve + + + Hozzászólás leírása + + + Adattípus + + + Linearitási együttható + + + Eltolás + + + A HMI kézi előugró ablak állapotát sikeresen feltöltötték, kódot + + + A HMI kézi előugró ablak befejezési állapotát sikeresen feltöltötték, kód + + + MES leállás + + + Sikeresen beállították a MES paramétereket + + + A MES nincs bejelentkezve + + + A MES felhasználó kijelentkezett + + + OCV teszteredmények NG + + + PC írási PLC idő sikertelen! + + + A PC PLC-be írási ideje abnormális + + + Adjon hozzá változókat + + + Változó konfiguráció + + + Adattípus + + + Rising Edge + + + Leeső él riasztás + + + Hosszeltolás + + + Változó módosítása + + + Megjegyzés + + + Kezdő cím + + + Változó cím + + + Változó neve + + + Sapka + + + Alsó határ + + + Nem támogatott adattípus + + + Kimenet + + + A termékmodell nem lehet üres! + + + Kiemelkedő ár + + + Információ + + + Módosítás + + + Módosítsa a MES/nem MES módkapcsolást + + + Módosítsa a kapcsolási felügyeleti felület intervallumát + + + Módosítsa a kártyahúzási módot + + + Módosítsa a felügyeleti felület automatikus váltási módját művelet nélkül + + + Módosítsa az automatikus képernyőzárás módját művelet nélkül + + + Módosítsa a görbe megjelenítésének számát + + + Módosítsa a szál időigényes naplómentését + + + Módosítsa a MES paraméterek megszerzését + + + Módosítsa a hibakeresési módot + + + Módosítsa a szoftver automatikus indítási módját + + + A szoftver automatikus bejelentkezési módjának módosítása + + + Módosítsa a zárolási képernyő intervallumát + + + Hagyja le a PLC-hez való csatlakozást + + + Először állítsa le a futást, majd váltson MES-re + + + Egész nap + + + Sikeresen kikapcsolta a MES módot + + + Egyéb nem tervezett leállások + + + Indulás + + + Az A állomásból való kimenő elküldés a PLC-nek + + + A kimenő B állomás elküldje a PLC-nek + + + A kimenő C állomás elküldi a PLC-nek + + + Kibulás sikerült + + + Sikeresen váltott a kártya lehúzási módra + + + Ideiglenes fájl létrehozása sikertelen + + + Törlés + + + Törölje az aktuális átdolgozott vonalkódot + + + Sikeresen törölve + + + Teljesítményérték + + + Fejlesztendő funkciók! + + + Összes időt vesz igénybe a mag bejutása + + + Történelmi riasztás + + + Korábbi adatok + + + Változó + + + A változó neve nem lehet üres + + + A változó neve már létezik + + + Helytelenül formázott változócím + + + Minden egyes hibás tétel + + + Indítsd el a megfigyelést + + + Az indítási megfigyelés meghibásodott + + + Rendellenes minőség + + + Minőségellenőrzés + + + Diagraminicializációs kivétel + + + Helytelen címformátum, „D” betűvel kell kezdődnie, amelyet egy számnak kell követnie + + + A cím formátuma helytelen, tiszta számnak kell lennie + + + A címtartomány meghaladja a határértéket, a végcím pedig nem haladhatja meg a 32767-et + + + Modellválasztás + + + Éjszakai műszak + + + Ütemezett frissítési kivétel + + + Jelentés exportálása sikertelen + + + A jelentés exportálása sikeres volt, megnyitja most? + + + A riasztás exportálása sikeres volt, megnyitja most? + + + Mérnöki változások + + + A PLC-től lekapcsolva + + + Kezdjük a konfigurációs paraméterek betöltését... + + + A kezdési idő nem lehet hosszabb a befejezési időnél + + + Jelenleg MES módban van, kérjük, jelentkezzen be! + + + Jelenleg bejelentkezett + + + Jelenleg nincsenek riasztások + + + Jelenleg nincs bejelentkezve, kérjük, jelentkezzen be! + + + Az aktuális felhasználó kijelentkezett + + + Nincs elegendő jogosultság az aktuálisan bejelentkezett felhasználó számára! + + + Az anyagokra várva + + + Autocfg - sikeres művelet + + + Sikeres csatlakozás a PLC-hez + + + Jelentésrekord megnyitása + + + Riasztási napló megnyitása + + + Befektetés + + + Riasztási TOP10 + + + Riasztási lekérdezés + + + Riasztási elem + + + Tippek + + + Műveleti napló + + + Érték + + + Adatok + + + Adatjelentés exportálása + + + Új változó + + + Új változó sikeresen létrehozva + + + Nincs PLC konfigurációs információ + + + Érvénytelen csoportnév + + + Érvénytelen kezdő cím + + + Idő + + + H + + + Sze + + + Kedd + + + P + + + Szo + + + Cs + + + Szudán + + + Menti a módosított konfigurációt? + + + Akár válts-e a kártya lehúzási módra + + + Biztosan kilép a rendszerből + + + 12 órás adatkivételek frissítése + + + Frissítse rossz diagram kivételt + + + Frissítse a riasztási diagram kivételét + + + Frissítse a hatékonysági vezérlő kivétel + + + A frissítési idő megjelenítése abnormális + + + A frissített energia kijelző abnormális + + + Nincs bejelentkezve + + + Nem található adat, kérjük, tesztelje + + + Engedélyek + + + Nincs elegendő engedély + + + Rossz bejövő anyagok + + + A lekérdezés sikertelen volt: + + + A lekérdezési idő nem haladhatja meg a 7 napot + + + A lekérdezési tartomány nem haladhatja meg az 1 napot + + + Times + + + Nincs elérhető címterület + + + Nincs elérhető csoportnév, kérjük, először adjon hozzá csoportokat az Group.xlsx fájlban + + + Nem található elég hely a címben + + + Rossz cellakód + + + A bejelentkezés sikeres, bejelentkezett felhasználó + + + Bejelentkezési tippek + + + Rossz bejelentkező felhasználó vagy jelszó!!! + + + Jelentkezzen be a rendszerbe + + + Nappali műszak + + + Mentés megerősítése + + + Rendszernapló + + + Hozzászólás leírása + + + Jó termék + + + Nem sikerült megszerezni a paramétereket + + + Kérjük, először jelentkezzen be a kártyájával! + + + Kérjük, töltse ki a bejelentkezési jelszót + + + Kérjük, töltse ki a bejelentkezési felhasználónevét + + + A kezdő cím formátuma helytelen + + + Akna leállítása + + + A belépés sikerült + + + Kibulás sikerült + + + Csatlakoztassa a PLC-t + + + Connect PLC + + + Nem sikerült csatlakozni a PLC-hez, kérjük, ellenőrizze a PLC-kapcsolat konfigurációját, hálózatát + + + Jelentkezzen ki a rendszerből + + + Kommunikációs csoport + + + Konfiguráció mentése sikeres + + + Error + + + A hossznak 0-nál nagyobbnak kell lennie + + + A hossznak 0-nál nagyobb számnak kell lennie + + + Ellenőrzési hiba + + + Alapértelmezett csoport + + + Riasztási lekérdezés + + + A felhasználói lekérdezés sikertelen volt + + + Hibaüzenet + + + A lekérdezés sikertelen volt: + + + A PC PLC-be írási ideje abnormális + + + Az űrlap betöltési kivétel + + + 12 órás adatkivételek frissítése + + + Frissítse a hatékonysági vezérlő kivétel + + + A frissítési idő megjelenítése abnormális + + + A frissített energia kijelző abnormális + + + Frissítse a riasztási diagram kivételét + + + Frissítse rossz diagram kivételt + + + A kilépés sikeres + + + Felhasználó kilépése + + + Hagyja le a PLC-hez való csatlakozást + + + A szoftver automatikus bejelentkezési módjának módosítása + + + Módosítsa a szoftver automatikus indítási módját + + + Módosítsa az automatikus képernyőzárás módját művelet nélkül + + + Módosítsa a zárolási képernyő intervallumát + + + Módosítsa a felügyeleti felület automatikus váltási módját művelet nélkül + + + Módosítsa a hibakeresési módot + + + Módosítsa a kapcsolási felügyeleti felület intervallumát + + + Módosítsa a görbe megjelenítésének számát + + + Módosítsa a kártyahúzási módot + + + Akár válts-e a kártya lehúzási módra + + + Sikeresen váltott a kártya lehúzási módra + + + Az aktuális felhasználó kijelentkezett + + + Tippek + + + Először állítsa le a futást, majd váltson MES-re + + + Módosítsa a MES/nem MES módkapcsolást + + + Sikeresen kikapcsolta a MES módot + + + A MES felhasználó kijelentkezett + + + Módosítsa a MES paraméterek megszerzését + + + Módosítsa a szál időigényes naplómentését + + + A konfigurációs fájl betöltése befejeződött + + + Nincs PLC konfigurációs információ + + + Kérjük ellenőrizze a konfigurációs fájlt + + + Nem sikerült csatlakoztatni a PLC-hez + + + Sikeres csatlakozás a PLC-hez + + + A PLC csatlakoztatásakor kivétel történt + + + A manuális HMI előugró funkció elindult + + + Berendezés hibája + + + Berendezések átalakítása + + + MES leállás + + + Tartozékok, anyagcsere + + + Rossz bejövő anyagok + + + Az anyagokra várva + + + Tisztító ellenőrzés + + + Az anyagkód nem lehet üres! + + + A környezet nem elégedett + + + A felhasználói lekérdezés sikertelen volt + + + A HMI kézi előugró ablak állapotát sikeresen feltöltötték, kódot + + + A HMI kézi előugró ablak befejezési állapotát sikeresen feltöltötték, kód + + + Az akkumulátormag OCV érzékelés A anyagjelző 0 + + + Az akkumulátormag OCV érzékelés B anyagjelző 0 + + + Az akkumulátorcellák kilépésének összes ideje Az A állomásból + + + A B állomásból kilépő akkumulátorcellák összes időbe telik + + + Az akkumulátorcellák C kilépésének összes időbe telt ideje + + + Rossz cellakód + + + Jelentkezzen be a rendszerbe + + + Nappali műszak + + + Mentés megerősítése + + + Az űrlap betöltési kivétel + + + Rendszernapló + + + Hozzászólás leírása + + + Az eredmény adatfeltöltése sikertelen volt + + + Jó termék + + + A manuális HMI előugró funkció elindult + + + Berendezés hibája + + + Berendezések átalakítása + + + Kérjük, először jelentkezzen be a kártyájával! + + + Kérjük ellenőrizze a konfigurációs fájlt + + + A kezdő cím formátuma helytelen + + + Akna leállítása + + + A bejövő állomás és a PLC-nek küldeni + + + A B állomás bejövő állomása és a PLC-nek küldött + + + A bejövő C állomás elküldte a PLC-nek + + + Az A bejövő rakodóállomás anyagjelzője 0 + + + Az B bejövő rakodóállomás anyagjelzője 0 + + + A belépés sikerült + + + Csatlakoztassa a PLC-t + + + Connect PLC + + + Nem sikerült csatlakoztatni a PLC-hez + + + Nem sikerült csatlakozni a PLC-hez, kérjük, ellenőrizze a PLC-kapcsolat konfigurációját, hálózatát + + + A PLC csatlakoztatásakor kivétel történt + + + A kilépés sikeres + + + Felhasználó kilépése + + + Jelentkezzen ki a rendszerből + + + Kommunikációs csoport + + + A csatornaszám + + + Tartozékok, anyagcsere + + + Konfiguráció mentése sikeres + + + A konfigurációs fájl betöltése befejeződött + + + Error + + + Hibaüzenet + + + A hossznak 0-nál nagyobbnak kell lennie + + + A hossznak 0-nál nagyobb számnak kell lennie + + + Hiba történt a konfiguráció érvényesítése során, kérjük, ellenőrizze, hogy a bemenet helyes-e + + + Ellenőrzési hiba + + + Alapértelmezett csoport + + + Csomagoló Doboz Behozatal + + + Csomagoló Doboz Kihozatal + + + Csomagolási Jelvénycímke Nyomtatása + + + Csomagolási Jelvény Információ + + + A Csomagolási Jelvénykód és a Palettakód Kapcsolati Kapcsolata + + + Paletta Információ + + + Engedélyezés + + + Letiltás + + + Export sikeres! + + + Export sikertelen + + \ No newline at end of file diff --git a/Language/Languages.ms.resx b/Language/Languages.ms.resx new file mode 100644 index 0000000..b61994b --- /dev/null +++ b/Language/Languages.ms.resx @@ -0,0 +1,2349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tercuit cuit + + + Gagal menyambung ke PLC, sila semak konfigurasi sambungan PLC, rangkaian + + + Hapuskan Pemboleh Ubah + + + Rising Edge + + + Penggera Tepi Jatuh + + + Ofset + + + Pinggir Jatuh + + + Kumpulan Komunikasi + + + Jenis data + + + Ubahsuai Pembolehubah + + + Panjang + + + Penggera Rising Edge + + + Pemboleh ubah ditambah + + + D40 telah ditetapkan semula 0 + + + Maklumat penggera + + + Jenis penggera + + + Masa Tarikh + + + Log Mesej + + + Masa Tarikh + + + Jenis log + + + Masa Tarikh + + + Maklumat operasi + + + Jenis operasi + + + Log Operasi + + + Penggera Sistem + + + Log Sistem + + + Pp + + + CP + + + Ca + + + PPK + + + Bpk + + + Dev + + + Min + + + SampleSize + + + Kumpulan + + + Maks + + + Min + + + Jumlah + + + kepercayaan kepada tuhan + + + Maks + + + Min + + + Spesifikasi Had Bawah + + + Spesifikasi Maksimum + + + Bilangan kumpulan data + + + Saiz Subkumpulan Sampel + + + Nilai sasaran + + + Sisihan piawai 3x negatif + + + Sisihan piawai (dalam kumpulan) + + + keselurujan + + + Positif 3x SD + + + CPL + + + CPU + + + CP + + + Bpk + + + Ca + + + PPL + + + Ppk + + + PPU + + + Pp + + + CpkGrade + + + Jumlah sampel + + + Ppm < LSL + + + Ppm Toatl + + + Ppm < USL + + + Data kosong + + + Kira cpk + + + Pilihan Analisis + + + Pertanyaan + + + Jana data tiruan + + + Jumlah + + + Statistik + + + Keupayaan proses (dalam kumpulan) + + + Nilai lain + + + Nilai yang dikira + + + Prestasi diukur + + + keselurujan + + + Pilihan pertanyaan + + + Selang masa pertanyaan + + + Carta Kawalan XR + + + Carta Analisis CPK + + + Contoh rajah larian + + + Mean Run Chart + + + Model Pengeluaran + + + Kod Bahan + + + Mula memantau + + + Hentikan pemantauan + + + carta1 + + + carta1 + + + Kenyataan + + + Keputusan gabungan + + + Masa ujian + + + Kod Kontena + + + Kod palet + + + berat + + + Perhatian + + + hasil mahsul + + + Kod Palet + + + zaman + + + Kod Kontena + + + Kod Kontena + + + Perhatian + + + hasil mahsul + + + zaman + + + Kod Palet + + + Perhatian + + + hasil mahsul + + + zaman + + + Pembalakan + + + hujah-hujah + + + Pasang stesen pemeriksaan pensampelan plat + + + Pemasukan Kontena + + + Keluaran Kontena + + + Pengikatan dan muat naik palet palet + + + Stesen percetakan palet + + + Item parameter + + + Min + + + Maks + + + Unit + + + Kumpulan Pengedaran Baharu + + + Hapuskan Kumpulan Pengedaran + + + Ubah suai Kumpulan Pengedaran + + + Sama ada maklum balas diperlukan atau tidak + + + Didayakan atau tidak + + + Adakah ia bacaan yang dicetuskan + + + Nama kumpulan pengedaran + + + Dibenarkan + + + Sama ada maklum balas diperlukan atau tidak + + + Adakah ia bacaan yang dicetuskan + + + Panjang + + + Keterangan komen + + + Alamat permulaan + + + Konfigurasi Kumpulan Pengedaran + + + Nama kumpulan pengedaran + + + Alamat permulaan + + + Panjang + + + Keterangan komen + + + Eksport Excel + + + Pertanyaan masa + + + Eksport + + + Pertanyaan + + + Eksport + + + Pertanyaan + + + Eksport Excel + + + Eksport + + + Pertanyaan + + + Pertanyaan + + + Muat naik semula + + + Eksport + + + Pertanyaan + + + Purata Kadar Operasi + + + Purata Ppm + + + Kadar Hasil Baik + + + Produksi Masuk + + + Produksi Keluar + + + Masa Ujian + + + Hari + + + Purata Kadar Operasi + + + Purata Ppm + + + Kadar Optimum + + + Produksi Masuk + + + Produksi Keluar + + + Purata Kadar Operasi + + + Bulan + + + Purata Ppm + + + Kadar Hasil Baik + + + Jumlah Produksi Masuk + + + Jumlah Produksi Keluar + + + Purata Kadar Operasi + + + Purata Ppm + + + Kadar Hasil Produksi + + + Jumlah Produksi Masuk + + + Jumlah Produksi Keluar + + + Minggu + + + Kandungan Penggera + + + Jumlah Penggera + + + Masa Penggera + + + Kelas + + + Alamat PLC + + + Kod Bar + + + Kod palet asas + + + Nombor Saluran + + + Nombor lokasi palet + + + Kenyataan + + + Keputusan gabungan + + + Bilangan lapisan pada tindanan + + + Nombor Stesen Susun + + + Masa ujian + + + Kod palet + + + Kod Kotak + + + Kod Palet + + + Berat + + + Nama Parameter + + + Nilai Parameter + + + Shift + + + Kod Cangkerang Keluli + + + RFID + + + Tarikh statistik + + + Tarikh statistik + + + Masa statistik + + + Masa statistik + + + Masa tamat + + + Waktu Total + + + Kod bar + + + Masa tamat + + + Waktu Total + + + Jenis Pertanyaan + + + Pertanyaan data pengeluaran sejarah + + + Pertanyaan statistik kapasiti + + + Log pertanyaan data penggera + + + Statistik mengikut Shift + + + Statistik mengikut hari + + + Statistik mengikut minggu + + + Statistik Bulanan + + + Yiwei Power + + + Log masuk + + + Yiwei Power + + + Mula + + + 57 Kilang + + + Yiwei Power + + + Sistem pemerolehan data paket flip bateri B + + + Penggera Log + + + Wawasan + + + Pemantauan data + + + Kebolehkesanan data + + + Pemantauan berpusat + + + Tetapan Parameter + + + Tetapan Sistem + + + Pengurusan Pengguna + + + Penyampai + + + Tunjukkan skrin utama + + + Keluar + + + Sembunyikan Skrin Utama + + + Mod Bukan Leret + + + Meter pintar + + + Voltan Fasa A + + + Jumlah Kuasa Aktif + + + Jumlah faktor kuasa + + + Nisbah voltan + + + Nisbah Semasa + + + Kuasa Terkumpul + + + Voltan Fasa B + + + Voltan Fasa C + + + Arus Fasa A + + + Arus fasa B + + + Arus fasa C + + + Fasa A kuasa + + + Kuasa fasa B + + + Kuasa fasa C + + + Statistik Top10 Penggera + + + Statistik kapasiti + + + Statistik item buruk + + + Nombor OK + + + Kadar Unggul + + + Jumlah Pengeluaran + + + Ketersediaan + + + Nombor peranti + + + Kod Kilang + + + Nombor baris + + + Model Pengeluaran + + + Kuasa tepat pada masanya + + + Masa lampau + + + Meter pintar (peranti) + + + berkenan (bahasa istana) + + + Adakah anda pasti mahu keluar dari sistem? + + + Log keluar dari sistem + + + Dibatalkan + + + Dibatalkan + + + berkenan (bahasa istana) + + + Adakah anda pasti mahu keluar dari sistem? + + + Log keluar dari sistem + + + Hapuskan model + + + Tambah model + + + Parameter disimpan + + + Nama item parameter + + + Maks + + + Min + + + Unit + + + Kod Bahan + + + Model Pengeluaran + + + Perhatian + + + Model semasa + + + Model Pengeluaran + + + Kod Bahan + + + Model semasa + + + Tambah PLC + + + Nyahtetap + + + Konfigurasi Kumpulan Pengedaran + + + Tentukan tetapan + + + Konfigurasi Pemboleh Ubah + + + setubuh + + + Rising Edge + + + Alamat Denyutan Jantung + + + Alamat IP + + + Aktif + + + Status degupan jantung + + + Ubahsuai Pembolehubah + + + Jenis PLC + + + Nombor port + + + Perhatian + + + Dapatkan parameter mes + + + Hidupkan mod leret + + + Konfigurasi jenis PLC + + + Nombor peranti + + + Nombor baris + + + Kod Kilang + + + Tukar masa antara muka pemantauan secara automatik + + + Tiada operasi yang menukar antara muka pemantauan secara automatik + + + Konfigurasi alamat IP + + + Konfigurasi nombor port + + + Tiada skrin kunci automatik yang beroperasi + + + Masa skrin kunci automatik + + + Bilangan paparan lengkung kuasa pengimpal + + + Perisian log masuk secara automatik + + + Mulakan secara automatik + + + Penjimatan log yang memakan masa benang + + + Mod mes/bukan mes bertukar + + + Anemometer + + + Alamat antaramuka untuk memuat naik maklumat pengikatan peranti membuka beg + + + Mod Nyahpepijat + + + Penggera peralatan + + + Titik tetapan parameter peranti berubah + + + Permintaan setpoint parameter peranti + + + Status peranti + + + Pengesahan Kebenaran Pekerja + + + Penggunaan tenaga meter + + + Terbalikkan paket untuk menarik alamat antara muka VDA yang tidak lengkap + + + Dapatkan Token + + + Maklumat input bahan mentah + + + Produk masuk + + + Produk keluar + + + Data Proses Produk + + + Data hasil pemprosesan produk + + + Konfigurasi PLC + + + Tetapan mes + + + Konfigurasi parameter mes + + + Konfigurasi mes + + + Konfigurasi PLC + + + Tetapan Sistem + + + 127.0.0.1 + + + 9600 + + + Tambah pengguna + + + Mesej kosong + + + Hapuskan pengguna + + + Ubah suai pengguna + + + Pilih/nyahpilih semua + + + Wawasan + + + Kebolehkesanan data + + + Tetapan Parameter + + + Penggera Log + + + Tetapan Sistem + + + Pengurusan Pengguna + + + Wawasan + + + Kebolehkesanan data + + + Kebenaran Pengguna + + + & Simpan Imej Sebagai + + + Kata laluan pengguna + + + Nombor kad IC + + + Tetapan Parameter + + + Penggera Log + + + Tetapan Sistem + + + Pengurusan Pengguna + + + Nombor kad IC + + + Sahkan Kata Laluan + + + Maklumat Pengguna + + + Kebenaran Pengguna + + + Kata laluan pengguna + + + Maklumat Pengguna + + + Konfigurasi Kebenaran + + + Tindakan pengguna + + + Indeks Mula + + + Alamat boleh ubah + + + Nama pemboleh ubah + + + Alamat boleh ubah + + + Konfigurasi Pemboleh Ubah + + + Nama kumpulan pengedaran + + + Indeks Mula + + + Panjang + + + Nama pemboleh ubah + + + Keterangan komen + + + Jenis data + + + Pekali linear + + + Ofset + + + Nombor kad IC + + + Mes tidak log masuk + + + Log masuk MES berjaya, log masuk pengguna + + + Status pop timbul manual HMI telah berjaya dimuat naik, kod + + + Status akhir tetingkap pop timbul manual HMI telah berjaya dimuat naik, kod + + + MES Downtime + + + Tetapan parameter MES berjaya + + + Mes tidak log masuk + + + Pengguna MES telah log keluar + + + Keputusan ujian OCV NG + + + Masa PC tulis PLC gagal! + + + PC menulis masa PLC yang tidak normal + + + Tambah pemboleh ubah + + + Konfigurasi Pemboleh Ubah + + + Jenis data + + + Rising Edge + + + Penggera Tepi Jatuh + + + Ofset panjang + + + Ubahsuai Pembolehubah + + + Perhatian + + + Alamat permulaan + + + Alamat boleh ubah + + + Nama pemboleh ubah + + + Cap + + + Had bawah + + + Jenis data tidak disokong + + + Kedua-dua kata laluan tidak sepadan + + + Output + + + Model produk tidak boleh kosong + + + Model produk tidak boleh kosong! + + + Model produk dan senarai parameter tidak boleh kosong + + + Kadar Unggul + + + Parameter disimpan + + + Gagal menyimpan + + + Berjaya disimpan + + + Maklumat + + + ubah suai + + + Ubah suai pensuisan mod MES/bukan MES + + + Ubah suai selang antara muka pemantauan suis + + + Ubah suai mod leret kad + + + Ubah suai mod antara muka pemantauan penukaran automatik tanpa operasi + + + Ubah suai kaedah kunci skrin automatik tanpa operasi + + + Ubah suai kuantiti paparan lengkung + + + Ubah suai penyimpanan log memakan masa benang + + + Ubah suai dan dapatkan parameter MES + + + Ubah suai mod penyahpepijatan + + + Ubah suai mod permulaan automatik perisian + + + Ubah suai kaedah log masuk automatik perisian + + + Ubah suai selang skrin kunci + + + Hentikan sambungan dengan PLC + + + Hentikan berjalan dahulu dan kemudian tukar kepada MES + + + Sepanjang hari + + + Matikan mod MES berjaya + + + Lain-lain downtime yang tidak dirancang + + + Keluar + + + Stesen keluar A dihantar ke PLC + + + Stesen keluar B dihantar ke PLC + + + Stesen keluar C dihantar ke PLC + + + Keluar gagal + + + Berjaya menukar mod leret kad + + + Gagal mencipta fail sementara + + + tadahkan + + + Padamkan kod bar yang diubah suai semasa + + + Berjaya dihapuskan + + + Nilai kuasa + + + Ubah Suai Variabel + + + Gagal mengubahsuai pemboleh ubah + + + Ubah suai pengguna + + + Gagal mengubah suai pengguna + + + Ubah suai Kumpulan Pengedaran + + + Gagal mengubah suai kumpulan pengedaran: + + + Berhenti berlari sebelum bertukar mes + + + Sepanjang hari + + + Keluar + + + Gagal mencipta fail sementara + + + tadahkan + + + Hapuskan Pemboleh Ubah + + + Gagal menghapuskan pemboleh ubah + + + Hapuskan model + + + Gagal dihapuskan: + + + Berjaya dihapuskan + + + Nilai kuasa + + + Hapuskan petunjuk + + + Gagal menghapuskan pengguna + + + Hapuskan Kumpulan Pengedaran + + + Gagal menghapuskan kumpulan pengedaran + + + Ciri-ciri yang akan dibangunkan! + + + Jumlah masa untuk menggulung teras memasuki stesen + + + Gagal memuatkan konfigurasi sistem + + + Konfigurasi sistem berjaya dimuatkan + + + Penggera sejarah + + + Data sejarah + + + Parameter berjaya diubah suai + + + Tetapan Parameter + + + ubah + + + Nama pemboleh ubah tidak boleh kosong + + + Nama pemboleh ubah sudah wujud + + + Nama pemboleh ubah tidak wujud + + + Nama pemboleh ubah tidak boleh kosong + + + Nama pemboleh ubah sudah wujud + + + Alamat pemboleh ubah yang diformat dengan salah + + + Setiap item yang rosak + + + Mulakan mulakan pemantauan + + + Gagal memulakan pemantauan permulaan + + + Kualiti yang tidak normal + + + Pemeriksaan kualiti + + + Pengecualian permulaan carta + + + Format alamat yang salah, harus bermula dengan 'D' diikuti dengan nombor + + + Format alamat tidak betul, ia sepatutnya nombor tulen + + + Julat alamat melebihi had, dan alamat akhir tidak boleh melebihi 32767 + + + Kod bahan yang sepadan dengan model tidak boleh kosong + + + Pemilihan model + + + syif malam + + + Pengecualian penyegaran berjadual + + + Eksport laporan gagal + + + Eksport laporan berjaya, sama ada untuk membukanya sekarang + + + Eksport laporan berjaya, adakah anda mahu membukanya sekarang? + + + Penggera eksport berjaya, adakah anda mahu membukanya sekarang? + + + Perubahan kejuruteraan + + + Terputus dari PLC + + + Mula memuatkan parameter konfigurasi… + + + Masa mula tidak boleh lebih besar daripada masa tamat + + + Pada masa ini dalam mod mes, sila log masuk + + + Buat masa ini dalam mod mes, sila log masuk! + + + Kini log masuk + + + Sedang log masuk, adakah anda ingin menukar mod leret + + + Sedang log masuk, adakah anda ingin menukar mod leret!! + + + Tiada penggera pada masa ini + + + Anda belum log masuk. Sila log masuk sebelum meneruskan + + + Anda belum log masuk buat masa ini, sila log masuk terlebih dahulu! + + + Anda belum log masuk, sila log masuk + + + Anda belum log masuk, sila log masuk! + + + Pengguna semasa telah log keluar + + + Kebenaran pengguna log masuk semasa tidak mencukupi + + + Keistimewaan tidak mencukupi untuk pengguna log masuk semasa! + + + Peranti semasa sedang berjalan. Untuk pertanyaan, sila tekan butang berhenti terlebih dahulu! + + + Menunggu bahan + + + berjaya + + + Berjaya menyambung ke PLC + + + Buka rekod laporan + + + Buka log penggera + + + Melabur + + + Hubungi polis TOP10 + + + Pertanyaan penggera + + + Item penggera + + + Petunjuk + + + Log Operasi + + + Nilai + + + Wawasan + + + Eksport Laporan Data + + + Pemboleh Ubah Baharu + + + Pemboleh ubah baharu berjaya dicipta + + + Tiada maklumat konfigurasi PLC + + + Nama kumpulan tidak sah + + + Alamat mula tidak sah + + + zaman + + + Sakit perut + + + Ke tandas + + + Selasa + + + Friday + + + Sabtu + + + Khamis + + + Ahad + + + Adakah anda ingin menyimpan konfigurasi yang diubah suai? + + + Sama ada untuk mematikan mod mes + + + Sama ada untuk mematikan mod mes! + + + Hapus atau tidak + + + Adakah anda pasti mahu keluar dari sistem + + + Adakah anda mahu menghapuskan model + + + Sama ada untuk menukar mod leret kad + + + Adakah anda pasti mahu keluar dari sistem + + + Kemas kini pengecualian data selama 12 jam + + + Kemas kini pengecualian carta yang buruk + + + Kemas kini pengecualian carta penggera + + + Kemas kini pengecualian kawalan kecekapan + + + Paparan masa kemas kini tidak normal + + + Kemas kini paparan tenaga tidak normal + + + Tidak log masuk + + + Tiada data ditemui, sila uji + + + Kebenaran + + + Kebenaran tidak mencukupi + + + Bahan masuk yang lemah + + + Pertanyaan gagal: + + + Tindakan pertanyaan + + + Masa pertanyaan tidak boleh melebihi 7 hari + + + Julat pertanyaan tidak boleh melebihi 1 hari + + + Pengeksponenan + + + Ruang alamat tidak tersedia + + + Tiada nama kumpulan yang tersedia, sila tambah kumpulan dalam Group.xlsx terlebih dahulu + + + Ruang alamat tidak mencukupi ditemui + + + Tambah pemboleh ubah + + + Gagal menambah pemboleh ubah + + + Tambah model + + + Tambah Kegagalan: Pengubahsuaian sudah wujud, tambah lagi + + + Gagal ditambah + + + Berjaya ditambah + + + Tambah pengguna + + + Gagal menambah pengguna: + + + Hapuskan Pemboleh Ubah + + + Gagal menambah kumpulan pengedaran: + + + Kumpulan komunikasi berjaya ditambah + + + Kod bahan tidak boleh kosong + + + Pemeriksaan pembersihan + + + Kod bahan tidak boleh kosong! + + + pengguna + + + Nama pengguna tidak boleh kosong + + + Kata laluan pengguna tidak boleh kosong + + + Persekitaran tidak memuaskan + + + Pertanyaan pengguna gagal + + + Pengesanan OCV sel bateri A mempunyai tanda bahan 0 + + + Pengesanan OCV sel bateri B mempunyai tanda bahan 0 + + + Jumlah masa untuk sel bateri keluar A + + + Jumlah masa untuk sel bateri keluar B + + + Jumlah masa untuk sel bateri keluar C + + + Kod sel bateri yang rosak + + + Log masuk berjaya, log masuk pengguna + + + Petua Log Masuk + + + Pengguna log masuk atau kata laluan salah!!! + + + Log masuk ke sistem + + + Shif hari + + + Sahkan Simpan + + + Pengecualian pemuatan borang + + + Sahkan kata laluan tidak boleh kosong + + + Input manual dilarang, sila gunakan imbasan jenama untuk masuk + + + Log Sistem + + + Keterangan komen + + + Nama pengguna sudah wujud + + + Sila leret kad anda untuk log masuk terlebih dahulu + + + Sila log masuk dengan kad anda terlebih dahulu! + + + Produk yang baik + + + Gagal mendapatkan parameter + + + Sila log masuk dengan kad anda terlebih dahulu! + + + Sila isikan kata laluan log masuk + + + Sila isikan nama pengguna log masuk + + + Format alamat mula tidak betul + + + Pit stop + + + Masuk gagal + + + Keluar gagal + + + Sambungkan PLC + + + Connect PLC + + + Gagal menyambung ke PLC, sila semak konfigurasi sambungan PLC, rangkaian + + + Log keluar dari sistem + + + Kumpulan Komunikasi + + + Sila pilih model produk + + + Sila pilih pemboleh ubah untuk diubah suai + + + Konfigurasi berjaya disimpan + + + kekasaran + + + Panjang mesti lebih besar daripada 0 + + + Panjang mesti nombor yang lebih besar daripada sifar + + + Ralat pengesahan + + + Kumpulan lalai + + + Kod Bahan + + + Kod RFID Cawan + + + Kelajuan Angin + + + Nombor Alat Angin + + + Maklumat + + + Tanda + + + Pertanyaan penggera + + + Pertanyaan pengguna gagal + + + Peringatan ralat + + + Pertanyaan gagal: + + + PC menulis masa PLC yang tidak normal + + + Pengecualian pemuatan borang + + + Kemas kini pengecualian data selama 12 jam + + + Kemas kini pengecualian kawalan kecekapan + + + Paparan masa kemas kini tidak normal + + + Kemas kini paparan tenaga tidak normal + + + Kemas kini pengecualian carta penggera + + + Kemas kini pengecualian carta yang buruk + + + Keluar berjaya + + + Keluar daripada pengguna + + + Hentikan sambungan dengan PLC + + + Ubah suai kaedah log masuk automatik perisian + + + Ubah suai mod permulaan automatik perisian + + + Ubah suai kaedah kunci skrin automatik tanpa operasi + + + Ubah suai selang skrin kunci + + + Ubah suai mod antara muka pemantauan penukaran automatik tanpa operasi + + + Ubah suai mod penyahpepijatan + + + Ubah suai selang antara muka pemantauan suis + + + Ubah suai kuantiti paparan lengkung + + + Ubah suai mod leret kad + + + Sama ada untuk menukar mod leret kad + + + Berjaya menukar mod leret kad + + + Pengguna semasa telah log keluar + + + Petunjuk + + + Hentikan berjalan dahulu dan kemudian tukar kepada MES + + + Ubah suai pensuisan mod MES/bukan MES + + + Matikan mod MES berjaya + + + Pengguna MES telah log keluar + + + Ubah suai dan dapatkan parameter MES + + + Ubah suai penyimpanan log memakan masa benang + + + Pemuatan fail konfigurasi selesai + + + Tiada maklumat konfigurasi PLC + + + Sila semak profil + + + Gagal menyambung ke PLC + + + Berjaya menyambung ke PLC + + + Pengecualian berlaku semasa menyambung ke PLC + + + Sila pilih pemboleh ubah untuk dihapuskan + + + Akibatnya, muat naik data gagal + + + Produk yang baik + + + Fungsi pop timbul HMI manual dicetuskan + + + Kegagalan peralatan + + + Transformasi peralatan + + + Sila log masuk dengan kad anda terlebih dahulu! + + + Sila semak profil + + + Format alamat mula tidak betul + + + Pit stop + + + MES Downtime + + + Aksesori, penggantian bahan + + + Bahan masuk yang lemah + + + Menunggu bahan + + + Pemeriksaan pembersihan + + + Persekitaran tidak memuaskan + + + Lain-lain downtime yang tidak dirancang + + + Status pop timbul manual HMI telah berjaya dimuat naik, kod + + + Status akhir tetingkap pop timbul manual HMI telah berjaya dimuat naik, kod + + + Sila log masuk dengan kad anda terlebih dahulu! + + + Sila semak profil + + + Format alamat mula tidak betul + + + Pit stop + + + Masuk ke stesen A dan hantar ke PLC + + + Masuk ke stesen B dan hantar ke PLC + + + Masuk ke stesen C dan hantar ke PLC + + + Stesen pemuatan masuk A mempunyai tanda bahan 0 + + + Stesen pemuatan masuk B mempunyai tanda bahan 0 + + + Masuk gagal + + + Sambungkan PLC + + + Connect PLC + + + Gagal menyambung ke PLC + + + Gagal menyambung ke PLC, sila semak konfigurasi sambungan PLC, rangkaian + + + Pengecualian berlaku semasa menyambung ke PLC + + + Keluar berjaya + + + Keluar daripada pengguna + + + Log keluar dari sistem + + + Pilih model pengeluaran yang anda ingin hapuskan + + + Kumpulan Komunikasi + + + Nama kumpulan pengedaran tidak wujud! + + + Nama kumpulan pengedaran tidak boleh kosong! + + + Nama kumpulan pengedaran sudah wujud + + + Nombor saluran + + + Aksesori, penggantian bahan + + + Konfigurasi berjaya disimpan + + + Pemuatan fail konfigurasi selesai + + + kekasaran + + + Peringatan ralat + + + Panjang mesti lebih besar daripada 0 + + + Panjang mesti nombor yang lebih besar daripada sifar + + + Nama item + + + Ralat berlaku semasa mengesahkan konfigurasi, sila semak sama ada input adalah betul + + + Ralat pengesahan + + + Kumpulan lalai + + + Kotak Pembungkusan Masuk + + + Kotak Pembungkusan Keluar + + + Pencetakan Label Mark Kotak + + + Maklumat Mark Kotak + + + Hubungan Pengikatan Kode Mark Kotak dan Kode Palet + + + Maklumat Palet + + + Mengaktifkan + + + Melumpuhkan + + + Pengeksportan berjaya! + + + Pengeksportan gagal + + \ No newline at end of file diff --git a/Language/Languages.resx b/Language/Languages.resx new file mode 100644 index 0000000..ad6c42f --- /dev/null +++ b/Language/Languages.resx @@ -0,0 +1,2103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 添加通信组 + + + 操作 + + + 组名 + + + 是否启用 + + + 反馈PLC + + + 触发读取 + + + 长度 + + + PLC编号 + + + 备注 + + + 起始地址 + + + 通信组配置 + + + D40已复位0 + + + 报警信息 + + + 报警类型 + + + 日期时间 + + + 日志信息 + + + 日期时间 + + + 日志类型 + + + 日期时间 + + + 操作信息 + + + 操作类型 + + + 操作日志 + + + 系统报警 + + + 系统日志 + + + Pp + + + Cp + + + Ca + + + PPK + + + CPK + + + Dev + + + Mean + + + SampleSize + + + Groups + + + Max + + + Min + + + Total + + + 平均值 + + + 最大值 + + + 最小值 + + + 规格下限 + + + 规格上限 + + + 数据组数 + + + 样本子组大小 + + + 目标值 + + + 负3倍标准差 + + + 标准差(组内) + + + 标准差(整体) + + + 正3倍标准差 + + + CPL + + + CPU + + + Cp + + + Cpk + + + Ca + + + PPL + + + Ppk + + + PPU + + + Pp + + + CpkGrade + + + 样本总数 + + + PPM < LSL + + + PPM Toatl + + + PPM < USL + + + 清空数据 + + + 计算CPK + + + 分析选项 + + + 查 询 + + + 生成虚拟数据 + + + 常 量 + + + 统 计 值 + + + 工序能力(组内) + + + 其他值 + + + 计 算 值 + + + 实测性能 + + + 工序能力(整体) + + + 查询选项 + + + 查询时间区间 + + + XR控制图 + + + CPK分析图 + + + 样本运行图 + + + 均值运行图 + + + 生产型号 + + + 物料编码 + + + 开始监控 + + + 停止监控 + + + chart1 + + + chart1 + + + 备注 + + + 综合结果 + + + 叠盘层数 + + + 叠盘工位号 + + + 测试时间 + + + 箱唛码 + + + 栈板码 + + + 重量 + + + 栈板码 + + + 备注 + + + 结果 + + + 时间 + + + 箱唛码 + + + 箱唛码 + + + 备注 + + + 结果 + + + 测试时间 + + + 栈板码 + + + 备注 + + + 结果 + + + 时间 + + + 日志记录 + + + 参数 + + + 组盘抽检工位 + + + 包装箱进站 + + + 包装箱出站 + + + 卡板托盘绑定上传 + + + 箱唛打印工位 + + + 参数项 + + + 最小值 + + + 最大值 + + + 单位 + + + 新增通信组 + + + 删除通信组 + + + 修改通信组 + + + 是否需要反馈结果 + + + 是否启用 + + + 是否为触发读取 + + + 通信组名称 + + + 启用 + + + 是否需要反馈结果 + + + 是否为触发读取 + + + 长度 + + + 备注说明 + + + 起始地址 + + + 通信组配置 + + + 通信组名称 + + + 起始地址 + + + 长度 + + + 备注说明 + + + 导 出 Excel + + + 时 间 查 询 + + + 导 出 + + + 查 询 + + + 导 出 + + + 查 询 + + + 导 出 Excel + + + 导 出 + + + 查 询 + + + 查 询 + + + 补 传 + + + 导 出 + + + 查 询 + + + 稼动率均值 + + + PPM均值 + + + 良品率 + + + 产品投入 + + + 产品产出 + + + 测试时间 + + + 日期 + + + 稼动率均值 + + + PPM均值 + + + 良品率 + + + 产品投入 + + + 产品产出 + + + 稼动率均值 + + + 月份 + + + PPM均值 + + + 良品率 + + + 产品投入 + + + 产品产出 + + + 稼动率均值 + + + PPM均值 + + + 良品率 + + + 累计投入 + + + 累计产出 + + + 周别 + + + 报警内容 + + + 报警次数 + + + 报警时间 + + + 类别 + + + PLC地址 + + + 电池条码 + + + 底托卡板码 + + + 通道编号 + + + 托盘位置号 + + + 备注 + + + 结果 + + + 叠盘层数 + + + 叠盘工位号 + + + 测试时间 + + + 托盘码 + + + 箱唛码 + + + 栈板码 + + + 重量 + + + 参数名 + + + 参数值 + + + 班次 + + + 电芯码 + + + RFID + + + 统计日期 + + + 统计日期 + + + 统计时间 + + + 统计时间 + + + 结束时间 + + + 开始时间 + + + 条码 + + + 结束时间 + + + 开始时间 + + + 查询类型 + + + 历史生产数据查询 + + + 产能统计查询 + + + 日志报警数据查询 + + + 按班次统计 + + + 按日统计 + + + 按周统计 + + + 按月统计 + + + 亿纬动力 + + + 登录 + + + 亿纬动力 + + + 启动 + + + 57 工厂 + + + 亿纬动力 + + + 自动打标管理系统 + + + 日志报警 + + + 数据分析 + + + 数据监控 + + + 数据追溯 + + + 集中监控 + + + 参数设置 + + + 系统设置 + + + 用户管理 + + + 关于 + + + 显示主界面 + + + 退出 + + + 隐藏主界面 + + + 非刷卡模式 + + + 智能电表 + + + A相电压 + + + 总有功功率 + + + 总功率因素 + + + 电压变比 + + + 电流变比 + + + 累计电能 + + + B相电压 + + + C相电压 + + + A相电流 + + + B相电流 + + + C相电流 + + + A相功率 + + + B相功率 + + + C相功率 + + + 告警TOP10统计 + + + 产能统计 + + + 不良项统计 + + + OK数 + + + 优率 + + + 生产总数 + + + 稼动率 + + + 设备编号 + + + 工厂代号 + + + 线体编号 + + + 生产型号 + + + 开机时间 + + + 运行时间 + + + 智能电表(设备) + + + 确定 + + + 是否确认要退出系统? + + + 退出系统 + + + 取消 + + + 取消 + + + 确定 + + + 是否确认要退出系统? + + + 退出系统 + + + 删除型号 + + + 添加型号 + + + 保存参数 + + + 参数项名称 + + + 最大值 + + + 最小值 + + + 单位 + + + 物料编码 + + + 生产型号 + + + 备注 + + + 当前型号 + + + 生产型号 + + + 物料编码 + + + 当前型号 + + + 添加PLC + + + 取消设置 + + + 通信组配置 + + + 确定设置 + + + 变量配置 + + + 设置 + + + 操作 + + + 心跳地址 + + + IP地址 + + + 激活状态 + + + 心跳状态 + + + PLC编号 + + + PLC类型 + + + 端口号 + + + 备注 + + + 获取MES参数 + + + 开启刷卡模式 + + + PLC类型配置 + + + 设备编号 + + + 产线编号 + + + 工厂代码 + + + 自动切换监控界面时间 + + + 无操作自动切换监控界面 + + + IP地址配置 + + + 端口号配置 + + + 无操作自动锁屏 + + + 自动锁屏时间 + + + 焊机功率曲线显示数量 + + + 软件自动登录 + + + 开机自动启动 + + + 线程耗时日志保存 + + + MES/非MES模式切换 + + + 风速仪 + + + 调试模式 + + + 设备报警 + + + 设备参数设定值变更 + + + 设备参数设定值请求 + + + 设备状态 + + + 员工权限校验 + + + 电表能耗 + + + 获取Token + + + 原材料投入信息 + + + 产品进站 + + + 产品出站 + + + 产品加工过程数据 + + + 产品加工结果数据 + + + PLC配置 + + + MES设置 + + + MES参数配置 + + + MES配置 + + + PLC配置 + + + 系统设置 + + + 127.0.0.1 + + + 9600 + + + 添加用户 + + + 清空信息 + + + 删除用户 + + + 修改用户 + + + 全选/不选 + + + 数据分析 + + + 数据追溯 + + + 参数设置 + + + 日志报警 + + + 系统设置 + + + 用户管理 + + + 数据分析 + + + 数据追溯 + + + 用户权限 + + + 用户名 + + + 用户密码 + + + IC卡号 + + + 参数设置 + + + 日志报警 + + + 系统设置 + + + 用户管理 + + + IC卡号 + + + 确认密码 + + + 用户信息 + + + 用户权限 + + + 用户密码 + + + 用户信息 + + + 权限配置 + + + 用户操作 + + + 起始索引 + + + 变量地址 + + + 变量名称 + + + 变量地址 + + + 变量配置 + + + 通信组名称 + + + 起始索引 + + + 位偏移/长度 + + + 变量名称 + + + 备注说明 + + + 数据类型 + + + 线性系数 + + + 偏移量 + + + HMI手动弹窗状态已上传成功,代码 + + + HMI手动弹窗结束状态已上传成功,代码 + + + MES停机 + + + MES参数设置成功 + + + MES未登录 + + + MES用户已注销 + + + OCV测试结果NG + + + PC写入PLC时间失败! + + + PC写入PLC时间异常 + + + 添加变量 + + + 变量配置 + + + 数据类型 + + + 操作 + + + 组名 + + + 长度偏移 + + + PLC编号 + + + 备注 + + + 起始地址 + + + 变量地址 + + + 变量名称 + + + 上限 + + + 下限 + + + 不支持的数据类型 + + + 产出 + + + 产品型号不能为空! + + + 优率 + + + 信息 + + + 修改 + + + 修改MES/非MES模式切换 + + + 修改切换监控界面间隔时间 + + + 修改刷卡模式 + + + 修改无操作自动切换监控界面方式 + + + 修改无操作自动锁屏方式 + + + 修改曲线显示数量 + + + 修改线程耗时日志保存 + + + 修改获取MES参数 + + + 修改调试模式 + + + 修改软件自动启动方式 + + + 修改软件自动登录方式 + + + 修改锁屏间隔时间 + + + 停止与PLC连接 + + + 先停止运行再切换MES + + + 全天 + + + 关闭MES模式成功 + + + 其它非计划停机 + + + 出站 + + + 出站A工位发送给PLC + + + 出站B工位发送给PLC + + + 出站C工位发送给PLC + + + 切换刷卡模式成功 + + + 创建临时文件失败 + + + 删除 + + + 删除当前复投条码 + + + 删除成功 + + + 功率值 + + + 功能待开发中! + + + 卷芯进站共耗时 + + + 历史报警 + + + 历史数据 + + + 变量 + + + 变量名不能为空 + + + 变量名已存在 + + + 变量地址格式不正确 + + + 各不良项 + + + 启动开始监控 + + + 启动开始监控失败 + + + 品质异常 + + + 品质检查 + + + 图表初始化异常 + + + 地址格式不正确,应以'D'开头后跟数字 + + + 地址格式不正确,应是纯数字 + + + 地址范围超出限制,结束地址不能超过32767 + + + 型号选择 + + + 夜班 + + + 定时刷新异常 + + + 导出报表失败 + + + 导出报表成功,是否立即打开? + + + 导出报警成功,是否立即打开? + + + 工程变更 + + + 已断开与PLC + + + 开始加载配置参数…… + + + 开始时间不能大于结束时间 + + + 当前为MES模式,请登录! + + + 当前已登录 + + + 当前无报警 + + + 当前未登录,请登录! + + + 当前用户已注销 + + + 当前登录用户权限不足! + + + 待料 + + + 成功 + + + 成功连接PLC + + + 打开报表记录 + + + 打开报警记录 + + + 投入 + + + 告警TOP10 + + + 报警查询 + + + 报警项 + + + 提示 + + + 操作日志 + + + 数值 + + + 数据分析 + + + 数据报表导出 + + + 新变量 + + + 新建变量成功 + + + 无PLC配置信息 + + + 无效的组名 + + + 无效的起始地址 + + + 时间 + + + 星期一 + + + 星期三 + + + 星期二 + + + 星期五 + + + 星期六 + + + 星期四 + + + 星期日 + + + 是否保存修改的配置? + + + 是否切换刷卡模式 + + + 是否确定要退出系统 + + + 更新12小时数据异常 + + + 更新不良图表异常 + + + 更新报警图表异常 + + + 更新效率控件异常 + + + 更新时间显示异常 + + + 更新能源显示异常 + + + 未登录 + + + 未能查到数据,请检测 + + + 权限 + + + 权限不足 + + + 来料不良 + + + 查询失败: + + + 查询时间不能超过7天 + + + 查询范围不能超过1天 + + + 次数 + + + 没有可用的地址空间 + + + 没有可用的组名,请先在Group.xlsx中添加组 + + + 没有找到足够大的地址空间 + + + 电芯码不良 + + + 登录成功,登录用户 + + + 登录提示 + + + 登录用户或密码错误!!! + + + 登录系统 + + + 白班 + + + 确认保存 + + + 系统日志 + + + 组名不能为空 + + + 良品 + + + 获取参数失败 + + + 请先刷卡登录! + + + 请填写登录密码 + + + 请填写登录用户名 + + + 起始地址格式不正确 + + + 进站 + + + 进站失败 + + + 出站失败 + + + 连接PLC + + + 连接PLC中 + + + 连接PLC失败,请检查PLC连接配置,网络 + + + 退出系统 + + + 通信组 + + + 配置保存成功 + + + 错误 + + + 长度必须大于0 + + + 长度必须是大于0的数字 + + + 验证错误 + + + 默认组 + + + 物料编码 + + + RFID托杯码 + + + 风速 + + + 风设备编号 + + + 信息 + + + 标志 + + + 告警查询 + + + 用户查询失败 + + + 错误提示 + + + 查询失败: + + + PC写入PLC时间异常 + + + 窗体加载异常 + + + 更新12小时数据异常 + + + 更新效率控件异常 + + + 更新时间显示异常 + + + 更新能源显示异常 + + + 更新报警图表异常 + + + 更新不良图表异常 + + + 退出成功 + + + 退出用户 + + + 停止与PLC连接 + + + 修改软件自动登录方式 + + + 修改软件自动启动方式 + + + 修改无操作自动锁屏方式 + + + 修改锁屏间隔时间 + + + 修改无操作自动切换监控界面方式 + + + 修改调试模式 + + + 修改切换监控界面间隔时间 + + + 修改曲线显示数量 + + + 修改刷卡模式 + + + 是否切换刷卡模式 + + + 切换刷卡模式成功 + + + 当前用户已注销 + + + 提示 + + + 先停止运行再切换MES + + + 修改MES/非MES模式切换 + + + 关闭MES模式成功 + + + MES用户已注销 + + + 修改获取MES参数 + + + 修改线程耗时日志保存 + + + 配置文件加载完成 + + + 无PLC配置信息 + + + 请检查配置文件 + + + 连接PLC失败 + + + 成功连接PLC + + + 连接PLC时发生异常 + + + 触发了手动HMI弹窗功能 + + + 设备故障 + + + 设备转型 + + + MES停机 + + + 配件,物料更换 + + + 来料不良 + + + 待料 + + + 清洁点检 + + + 物料编码不能为空! + + + 环境不满足 + + + 其它非计划停机 + + + HMI手动弹窗状态已上传成功,代码 + + + HMI手动弹窗结束状态已上传成功,代码 + + + 用户查询失败 + + + 电芯OCV检测A有料标志为0 + + + 电芯OCV检测B有料标志为0 + + + 电芯出站A共耗时 + + + 电芯出站B共耗时 + + + 电芯出站C共耗时 + + + 电芯码不良 + + + 登录系统 + + + 白班 + + + 确认保存 + + + 窗体加载异常 + + + 系统日志 + + + 组名不能为空 + + + 结果数据上传失败 + + + 良品 + + + 触发了手动HMI弹窗功能 + + + 设备故障 + + + 设备转型 + + + 请先刷卡登录! + + + 请检查配置文件 + + + 起始地址格式不正确 + + + 进站 + + + 进站A工位发送给PLC + + + 进站B工位发送给PLC + + + 进站C工位发送给PLC + + + 进站上料工位A有料标志为0 + + + 进站上料工位B有料标志为0 + + + 连接PLC + + + 连接PLC中 + + + 连接PLC失败 + + + 连接PLC失败,请检查PLC连接配置,网络 + + + 连接PLC时发生异常 + + + 退出成功 + + + 退出用户 + + + 退出系统 + + + 通信组 + + + 通道号 + + + 配件,物料更换 + + + 配置保存成功 + + + 配置文件加载完成 + + + 错误 + + + 错误提示 + + + 长度必须大于0 + + + 长度必须是大于0的数字 + + + 验证配置时发生错误,请检查输入是否正确 + + + 验证错误 + + + 默认组 + + + 包装箱进站 + + + 包装箱出站 + + + 箱唛标签打印 + + + 箱唛信息 + + + 箱唛码与栈板码绑定关系 + + + 栈板信息 + + + 启用 + + + 禁用 + + + 导出成功! + + + 导出失败 + + \ No newline at end of file diff --git a/Language/LocalLanguage.cs b/Language/LocalLanguage.cs new file mode 100644 index 0000000..8e95d1a --- /dev/null +++ b/Language/LocalLanguage.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Language +{ + public class LocalLanguage + { + private static Dictionary> _languageData; + + static LocalLanguage() + { + InitializeLanguageData(); + } + + private static void InitializeLanguageData() + { + _languageData = new Dictionary> + { + // 中文语言包 + ["zh"] = new Dictionary + { + ["MessageTips1"] = "软件已经启动,请在后台确认。", + ["MessageTips2"] = "正在初始化日志系统...", + ["MessageTips3"] = "正在设置异常处理...", + ["MessageTips4"] = "正在读取配置...", + ["MessageTips5"] = "初始化完成", + ["MessageTips6"] = "致命错误", + ["MessageTips7"] = "程序出现大异常,请联系 【金源自动化软件设计部】。\r\n异常信息: {0}\r\n异常堆栈:{1}", + ["MessageTips8"] = "加载语言设置时出错: {0}", + ["MessageTips9"] = "语言加载错误", + + + + // ... 可以继续添加更多中文键值对 + }, + + // 英文语言包 + ["en"] = new Dictionary + { + ["MessageTips1"] = "The software has been started, please confirm in the background.", + ["MessageTips2"] = "Initializing the logging system", + ["MessageTips3"] = "Setting up exception handling", + ["MessageTips4"] = "Reading configuration", + ["MessageTips5"] = "Initialization completed", + ["MessageTips6"] = "fatal error", + ["MessageTips7"] = "The program has encountered a major exception. Please contact the Jinyuan Automation Software Design Department.\r\nAbnormal information: {0}\r\nException Stack:{1}", + ["MessageTips8"] = "Error loading language settings: {0}", + ["MessageTips9"] = "Language loading error", + // ... 可以继续添加更多英文键值对 + }, + + // 日文语言包 + ["ja"] = new Dictionary + { + ["MessageTips1"] = "ソフトウェアが起動しました。バックグラウンドで確認してください。", + ["MessageTips2"] = "ログシステムを初期化しています...", + ["MessageTips3"] = "例外処理を設定しています...", + ["MessageTips4"] = "構成を読み込み中...", + ["MessageTips5"] = "初期化完了", + ["MessageTips6"] = "致命的なエラー", + ["MessageTips7"] = "プログラムに大きな異常が発生した場合は、【金源自動化ソフトウェア設計部】に連絡してください。日本語の\r\n例外情報: {0}\r\n例外スタック:{1}", + ["MessageTips8"] = "言語設定のロードエラー: {0}", + ["MessageTips9"] = "言語ロードエラー", + + // ... 可以继续添加更多日文键值对 + }, + + // 马来语言包 + ["ms"] = new Dictionary + { + ["MessageTips1"] = "Perisian telah dimulakan, sila sahkan di latar belakang.", + ["MessageTips2"] = "Memulakan sistem log", + ["MessageTips3"] = "Menetapkan pengendalian pengecualian", + ["MessageTips4"] = "Membaca konfigurasi", + ["MessageTips5"] = "Pemulaan selesai", + ["MessageTips6"] = "Ralat Fatal", + ["MessageTips7"] = "Program telah menghadapi pengecualian utama. Sila hubungi Jabatan Ralat Perisian Automatisasi Jinyuan.\r\nMaklumat tidak normal: {0}\r\nStack Kecualian:{1}", + ["MessageTips8"] = "Ralat memuatkan tetapan bahasa: {0}", + ["MessageTips9"] = "Ralat memuatkan bahasa", + + + }, + + // 匈牙利语言包 + ["hu"] = new Dictionary + { + ["MessageTips1"] = "A szoftver elindult, kérjük, erősítse meg a háttérben.", + ["MessageTips2"] = "A naplózási rendszer indítása", + ["MessageTips3"] = "Kivételek kezelésének beállítása", + ["MessageTips4"] = "Olvasási beállítások", + ["MessageTips5"] = "Inicializálás befejezve", + ["MessageTips6"] = "Halálos hiba", + ["MessageTips7"] = "A program jelentős kivétellel szembesült. Kérjük, lépjen kapcsolatba a Jinyuan Automation Software Design Osztállyal. \r\nKóros információk: {0}\r\nKivételek stack:{1}", + ["MessageTips8"] = "Hiba történt a nyelvbeállítások betöltésével: {0}", + ["MessageTips9"] = "Nyelvbetöltési hiba", + + + }, + + // 越南语言包 + ["vi"] = new Dictionary + { + ["MessageTips1"] = "Phần mềm đã được khởi chạy, hãy xác nhận trong nền.", + ["MessageTips2"] = "Đang khởi chạy hệ thống nhật ký...", + ["MessageTips3"] = "Thiết lập xử lý ngoại lệ...", + ["MessageTips4"] = "Đang đọc cấu hình...", + ["MessageTips5"] = "Khởi tạo xong", + ["MessageTips6"] = "Lỗi nghiêm trọng", + ["MessageTips7"] = "Chương trình xuất hiện đại dị thường, xin liên hệ 【 Kim Nguyên tự động hóa phần mềm thiết kế bộ 】.\r\nThông tin ngoại lệ: {0}\r\nNgăn xếp ngoại lệ:{1}", + ["MessageTips8"] = "Gặp lỗi khi tải cài đặt ngôn ngữ: {0}", + ["MessageTips9"] = "Lỗi tải ngôn ngữ", + + + } + // 可以继续添加更多语言... + }; + } + + /// + /// 获取当前语言的文本 + /// + /// 文本键值 + /// 对应语言的文本,如果未找到则返回键值本身 + public static string GetText(string key, string _currentLanguage) + { + if (_languageData.ContainsKey(_currentLanguage) && + _languageData[_currentLanguage].ContainsKey(key)) + { + return _languageData[_currentLanguage][key]; + } + return key; // 如果找不到对应的文本,返回键值本身 + } + + /// + /// 获取带变量的文本 + /// + /// 文本键值 + /// 要替换的变量值 + /// 替换变量后的文本 + public static string GetText(string key, string _currentLanguage, params object[] args) + { + try + { + if (_languageData.ContainsKey(_currentLanguage) && + _languageData[_currentLanguage].ContainsKey(key)) + { + string format = _languageData[_currentLanguage][key]; + if (args != null && args.Length > 0) + { + return string.Format(format, args); + } + return format; + } + return key; + } + catch (FormatException ex) + { + // 记录错误:格式字符串与参数不匹配 + Debug.WriteLine($"Language format error - Key: {key}, Error: {ex.Message}"); + return key; + } + } + } +} diff --git a/Language/MsgResources.Designer.cs b/Language/MsgResources.Designer.cs new file mode 100644 index 0000000..dcd6ea6 --- /dev/null +++ b/Language/MsgResources.Designer.cs @@ -0,0 +1,675 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace UpperComputerSystem.Language { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 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 MsgResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal MsgResources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("UpperComputerSystem.Language.MsgResources", typeof(MsgResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 条码 的本地化字符串。 + /// + internal static string Barcode { + get { + return ResourceManager.GetString("Barcode", resourceCulture); + } + } + + /// + /// 查找类似 通道 {0} 的本地化字符串。 + /// + internal static string Channel { + get { + return ResourceManager.GetString("Channel", resourceCulture); + } + } + + /// + /// 查找类似 开始联机 的本地化字符串。 + /// + internal static string FrmMain_btnToggle_Text { + get { + return ResourceManager.GetString("FrmMain_btnToggle_Text", resourceCulture); + } + } + + /// + /// 查找类似 主页 的本地化字符串。 + /// + internal static string FrmMain_SidebarItem_Home_Text { + get { + return ResourceManager.GetString("FrmMain_SidebarItem_Home_Text", resourceCulture); + } + } + + /// + /// 查找类似 配方 的本地化字符串。 + /// + internal static string FrmMain_SidebarItem_Recipe_Text { + get { + return ResourceManager.GetString("FrmMain_SidebarItem_Recipe_Text", resourceCulture); + } + } + + /// + /// 查找类似 查询 的本地化字符串。 + /// + internal static string FrmMain_SidebarItem_Search_Text { + get { + return ResourceManager.GetString("FrmMain_SidebarItem_Search_Text", resourceCulture); + } + } + + /// + /// 查找类似 设置 的本地化字符串。 + /// + internal static string FrmMain_SidebarItem_Settings_Text { + get { + return ResourceManager.GetString("FrmMain_SidebarItem_Settings_Text", resourceCulture); + } + } + + /// + /// 查找类似 统计 的本地化字符串。 + /// + internal static string FrmMain_SidebarItem_Statistics_Text { + get { + return ResourceManager.GetString("FrmMain_SidebarItem_Statistics_Text", resourceCulture); + } + } + + /// + /// 查找类似 用户 的本地化字符串。 + /// + internal static string FrmMain_SidebarItem_User_Text { + get { + return ResourceManager.GetString("FrmMain_SidebarItem_User_Text", resourceCulture); + } + } + + /// + /// 查找类似 亿纬锂能 | 锂电池翻包设备 的本地化字符串。 + /// + internal static string FrmMain_windowBar_Text { + get { + return ResourceManager.GetString("FrmMain_windowBar_Text", resourceCulture); + } + } + + /// + /// 查找类似 停止流程 的本地化字符串。 + /// + internal static string HomeControl_bt_EndProcess_Text { + get { + return ResourceManager.GetString("HomeControl_bt_EndProcess_Text", resourceCulture); + } + } + + /// + /// 查找类似 日志记录 的本地化字符串。 + /// + internal static string HomeControl_gbLog_Text { + get { + return ResourceManager.GetString("HomeControl_gbLog_Text", resourceCulture); + } + } + + /// + /// 查找类似 工艺参数 的本地化字符串。 + /// + internal static string HomeControl_gpGongYiParam_Text { + get { + return ResourceManager.GetString("HomeControl_gpGongYiParam_Text", resourceCulture); + } + } + + /// + /// 查找类似 数据列表 的本地化字符串。 + /// + internal static string HomeControl_gpHistoryData_Text { + get { + return ResourceManager.GetString("HomeControl_gpHistoryData_Text", resourceCulture); + } + } + + /// + /// 查找类似 绝缘测试实时数据 的本地化字符串。 + /// + internal static string HomeControl_gpInsulationData_Text { + get { + return ResourceManager.GetString("HomeControl_gpInsulationData_Text", resourceCulture); + } + } + + /// + /// 查找类似 上料实时条码 的本地化字符串。 + /// + internal static string HomeControl_gpIntBarcode_Text { + get { + return ResourceManager.GetString("HomeControl_gpIntBarcode_Text", resourceCulture); + } + } + + /// + /// 查找类似 OCV实时检测数据 的本地化字符串。 + /// + internal static string HomeControl_gpOcvData_Text { + get { + return ResourceManager.GetString("HomeControl_gpOcvData_Text", resourceCulture); + } + } + + /// + /// 查找类似 下料实时条码 的本地化字符串。 + /// + internal static string HomeControl_gpOutBarcode_Text { + get { + return ResourceManager.GetString("HomeControl_gpOutBarcode_Text", resourceCulture); + } + } + + /// + /// 查找类似 不满足8个电芯使用 的本地化字符串。 + /// + internal static string HomeControl_lblInTip_Text { + get { + return ResourceManager.GetString("HomeControl_lblInTip_Text", resourceCulture); + } + } + + /// + /// 查找类似 目检1结果 的本地化字符串。 + /// + internal static string HomeControl_lblMuJian1_Text { + get { + return ResourceManager.GetString("HomeControl_lblMuJian1_Text", resourceCulture); + } + } + + /// + /// 查找类似 目检2结果 的本地化字符串。 + /// + internal static string HomeControl_lblMuJian2_Text { + get { + return ResourceManager.GetString("HomeControl_lblMuJian2_Text", resourceCulture); + } + } + + /// + /// 查找类似 下料绝缘测试结果 的本地化字符串。 + /// + internal static string HomeControl_lbOutJueyuanRes_Text { + get { + return ResourceManager.GetString("HomeControl_lbOutJueyuanRes_Text", resourceCulture); + } + } + + /// + /// 查找类似 最大值 的本地化字符串。 + /// + internal static string HomeControl_tableConfigRange_ParaValueMax_Title { + get { + return ResourceManager.GetString("HomeControl_tableConfigRange_ParaValueMax_Title", resourceCulture); + } + } + + /// + /// 查找类似 最大值 的本地化字符串。 + /// + internal static string HomeControl_tableConfigRange_ParaValueMin_Title { + get { + return ResourceManager.GetString("HomeControl_tableConfigRange_ParaValueMin_Title", resourceCulture); + } + } + + /// + /// 查找类似 参数项 的本地化字符串。 + /// + internal static string HomeControl_tableConfigRange_Remark_Title { + get { + return ResourceManager.GetString("HomeControl_tableConfigRange_Remark_Title", resourceCulture); + } + } + + /// + /// 查找类似 单位 的本地化字符串。 + /// + internal static string HomeControl_tableConfigRange_Uint_Title { + get { + return ResourceManager.GetString("HomeControl_tableConfigRange_Uint_Title", resourceCulture); + } + } + + /// + /// 查找类似 进站条码1 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode1_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode1_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码2 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode2_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode2_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码3 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode3_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode3_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码4 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode4_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode4_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码5 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode5_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode5_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码6 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode6_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode6_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码7 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode7_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode7_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 进站条码8 的本地化字符串。 + /// + internal static string HomeControl_txtInBarcode8_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtInBarcode8_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码1 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode1_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode1_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码2 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode2_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode2_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码3 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode3_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode3_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码4 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode4_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode4_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码5 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode5_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode5_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码6 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode6_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode6_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码7 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode7_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode7_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 出站条码8 的本地化字符串。 + /// + internal static string HomeControl_txtOutBarcode8_Placeholder { + get { + return ResourceManager.GetString("HomeControl_txtOutBarcode8_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 登录 的本地化字符串。 + /// + internal static string LoginForm_BtnLogin_Text { + get { + return ResourceManager.GetString("LoginForm_BtnLogin_Text", resourceCulture); + } + } + + /// + /// 查找类似 电芯测试系统 的本地化字符串。 + /// + internal static string LoginForm_lbWelcome_Text { + get { + return ResourceManager.GetString("LoginForm_lbWelcome_Text", resourceCulture); + } + } + + /// + /// 查找类似 请输入密码 的本地化字符串。 + /// + internal static string LoginForm_txtPassword_Placeholder { + get { + return ResourceManager.GetString("LoginForm_txtPassword_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 请输入用户名 的本地化字符串。 + /// + internal static string LoginForm_txtUsername_Placeholder { + get { + return ResourceManager.GetString("LoginForm_txtUsername_Placeholder", resourceCulture); + } + } + + /// + /// 查找类似 登录系统 的本地化字符串。 + /// + internal static string LoginForm_windowBar1_Text { + get { + return ResourceManager.GetString("LoginForm_windowBar1_Text", resourceCulture); + } + } + + /// + /// 查找类似 内阻 的本地化字符串。 + /// + internal static string Resistance { + get { + return ResourceManager.GetString("Resistance", resourceCulture); + } + } + + /// + /// 查找类似 电压 的本地化字符串。 + /// + internal static string Voltage { + get { + return ResourceManager.GetString("Voltage", resourceCulture); + } + } + + /// + /// 查找类似 主页 的本地化字符串。 + /// + internal static string 主页 { + get { + return ResourceManager.GetString("主页", resourceCulture); + } + } + + /// + /// 查找类似 内阻 的本地化字符串。 + /// + internal static string 内阻 { + get { + return ResourceManager.GetString("内阻", resourceCulture); + } + } + + /// + /// 查找类似 出站条码 的本地化字符串。 + /// + internal static string 出站条码 { + get { + return ResourceManager.GetString("出站条码", resourceCulture); + } + } + + /// + /// 查找类似 单位 的本地化字符串。 + /// + internal static string 单位 { + get { + return ResourceManager.GetString("单位", resourceCulture); + } + } + + /// + /// 查找类似 参数项 的本地化字符串。 + /// + internal static string 参数项 { + get { + return ResourceManager.GetString("参数项", resourceCulture); + } + } + + /// + /// 查找类似 已注销登录 的本地化字符串。 + /// + internal static string 已注销登录 { + get { + return ResourceManager.GetString("已注销登录", resourceCulture); + } + } + + /// + /// 查找类似 最大值 的本地化字符串。 + /// + internal static string 最大值 { + get { + return ResourceManager.GetString("最大值", resourceCulture); + } + } + + /// + /// 查找类似 最小值 的本地化字符串。 + /// + internal static string 最小值 { + get { + return ResourceManager.GetString("最小值", resourceCulture); + } + } + + /// + /// 查找类似 查询 的本地化字符串。 + /// + internal static string 查询 { + get { + return ResourceManager.GetString("查询", resourceCulture); + } + } + + /// + /// 查找类似 用户 的本地化字符串。 + /// + internal static string 用户 { + get { + return ResourceManager.GetString("用户", resourceCulture); + } + } + + /// + /// 查找类似 电压 的本地化字符串。 + /// + internal static string 电压 { + get { + return ResourceManager.GetString("电压", resourceCulture); + } + } + + /// + /// 查找类似 目检结果 的本地化字符串。 + /// + internal static string 目检结果 { + get { + return ResourceManager.GetString("目检结果", resourceCulture); + } + } + + /// + /// 查找类似 绝缘电阻 的本地化字符串。 + /// + internal static string 绝缘电阻 { + get { + return ResourceManager.GetString("绝缘电阻", resourceCulture); + } + } + + /// + /// 查找类似 统计 的本地化字符串。 + /// + internal static string 统计 { + get { + return ResourceManager.GetString("统计", resourceCulture); + } + } + + /// + /// 查找类似 综合结果 的本地化字符串。 + /// + internal static string 综合结果 { + get { + return ResourceManager.GetString("综合结果", resourceCulture); + } + } + + /// + /// 查找类似 设置 的本地化字符串。 + /// + internal static string 设置 { + get { + return ResourceManager.GetString("设置", resourceCulture); + } + } + + /// + /// 查找类似 进站条码 的本地化字符串。 + /// + internal static string 进站条码 { + get { + return ResourceManager.GetString("进站条码", resourceCulture); + } + } + + /// + /// 查找类似 通道 的本地化字符串。 + /// + internal static string 通道 { + get { + return ResourceManager.GetString("通道", resourceCulture); + } + } + + /// + /// 查找类似 配方 的本地化字符串。 + /// + internal static string 配方 { + get { + return ResourceManager.GetString("配方", resourceCulture); + } + } + } +} diff --git a/Language/Properties/AssemblyInfo.cs b/Language/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..922ede0 --- /dev/null +++ b/Language/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Language")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Language")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("292a5c9c-7a82-4d25-a885-ddcedc93f03c")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Language/Resources/DataGridColumnAttribute.cs b/Language/Resources/DataGridColumnAttribute.cs new file mode 100644 index 0000000..dd9ce09 --- /dev/null +++ b/Language/Resources/DataGridColumnAttribute.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JinYuan.Models.HelperAttribute +{ + /// + /// 数据表格列映射特性(支持字段/属性) + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] + public sealed class DataGridColumnAttribute : Attribute + { + /// + /// 目标列名(默认使用成员名) + /// + public string ColumnName { get; set; } + + /// + /// 列数据类型(默认使用成员类型) + /// + public Type ColumnType { get; set; } + + public DataGridColumnAttribute() { } + public DataGridColumnAttribute(string columnName) => ColumnName = columnName; + } +} diff --git a/Language/app.config b/Language/app.config new file mode 100644 index 0000000..957095e --- /dev/null +++ b/Language/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Language/packages.config b/Language/packages.config new file mode 100644 index 0000000..f0422d8 --- /dev/null +++ b/Language/packages.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LargeSquareOne/App.config b/LargeSquareOne/App.config new file mode 100644 index 0000000..ec429af --- /dev/null +++ b/LargeSquareOne/App.config @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LargeSquareOne/Assts/Fonts/75049.png b/LargeSquareOne/Assts/Fonts/75049.png new file mode 100644 index 0000000..c076caa Binary files /dev/null and b/LargeSquareOne/Assts/Fonts/75049.png differ diff --git a/LargeSquareOne/Assts/Fonts/FZY4JW.ttf b/LargeSquareOne/Assts/Fonts/FZY4JW.ttf new file mode 100644 index 0000000..eb485a8 Binary files /dev/null and b/LargeSquareOne/Assts/Fonts/FZY4JW.ttf differ diff --git a/LargeSquareOne/Assts/Fonts/Zen圓体-Regular.ttf b/LargeSquareOne/Assts/Fonts/Zen圓体-Regular.ttf new file mode 100644 index 0000000..27860e7 Binary files /dev/null and b/LargeSquareOne/Assts/Fonts/Zen圓体-Regular.ttf differ diff --git a/LargeSquareOne/Assts/Fonts/taolichunfeng.ttf b/LargeSquareOne/Assts/Fonts/taolichunfeng.ttf new file mode 100644 index 0000000..73e6014 Binary files /dev/null and b/LargeSquareOne/Assts/Fonts/taolichunfeng.ttf differ diff --git a/LargeSquareOne/Assts/Fonts/zaozigongfangjinzhuti.ttf b/LargeSquareOne/Assts/Fonts/zaozigongfangjinzhuti.ttf new file mode 100644 index 0000000..4c5fbc1 Binary files /dev/null and b/LargeSquareOne/Assts/Fonts/zaozigongfangjinzhuti.ttf differ diff --git a/LargeSquareOne/Assts/Image/BackGround.png b/LargeSquareOne/Assts/Image/BackGround.png new file mode 100644 index 0000000..04d2375 Binary files /dev/null and b/LargeSquareOne/Assts/Image/BackGround.png differ diff --git a/LargeSquareOne/Assts/Image/Main.jpg b/LargeSquareOne/Assts/Image/Main.jpg new file mode 100644 index 0000000..bc2f65e Binary files /dev/null and b/LargeSquareOne/Assts/Image/Main.jpg differ diff --git a/LargeSquareOne/Assts/Image/电池.ico b/LargeSquareOne/Assts/Image/电池.ico new file mode 100644 index 0000000..2750edc Binary files /dev/null and b/LargeSquareOne/Assts/Image/电池.ico differ diff --git a/LargeSquareOne/CommunicationEditForm.Designer.cs b/LargeSquareOne/CommunicationEditForm.Designer.cs new file mode 100644 index 0000000..5843090 --- /dev/null +++ b/LargeSquareOne/CommunicationEditForm.Designer.cs @@ -0,0 +1,200 @@ +namespace LargeSquareOne +{ + partial class CommunicationEditForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + this.panelExt1 = new JinYuan.ControlLib.PanelExt(); + this.groupTable = new System.Windows.Forms.DataGridView(); + this.topPanel = new System.Windows.Forms.Panel(); + this.BtnAdd = new System.Windows.Forms.Button(); + this.btn_Close = new System.Windows.Forms.Button(); + this.lblTitle = new System.Windows.Forms.Label(); + this.panelExt1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.groupTable)).BeginInit(); + this.topPanel.SuspendLayout(); + this.SuspendLayout(); + // + // panelExt1 + // + this.panelExt1.BackColor = System.Drawing.Color.Transparent; + this.panelExt1.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(79)))), ((int)(((byte)(150))))); + this.panelExt1.BordeWidth = 2; + this.panelExt1.BottomGap = 0; + this.panelExt1.Controls.Add(this.groupTable); + this.panelExt1.Controls.Add(this.topPanel); + this.panelExt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt1.LeftGap = 0; + this.panelExt1.Location = new System.Drawing.Point(0, 0); + this.panelExt1.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.panelExt1.Name = "panelExt1"; + this.panelExt1.RightGap = 0; + this.panelExt1.Size = new System.Drawing.Size(990, 509); + this.panelExt1.TabIndex = 0; + this.panelExt1.TopGap = 0; + // + // groupTable + // + this.groupTable.AllowUserToAddRows = false; + this.groupTable.AllowUserToDeleteRows = false; + this.groupTable.AllowUserToResizeRows = false; + this.groupTable.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupTable.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.groupTable.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.groupTable.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.groupTable.ColumnHeadersHeight = 45; + this.groupTable.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.groupTable.DefaultCellStyle = dataGridViewCellStyle2; + this.groupTable.EnableHeadersVisualStyles = false; + this.groupTable.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.groupTable.Location = new System.Drawing.Point(15, 44); + this.groupTable.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.groupTable.Name = "groupTable"; + this.groupTable.ReadOnly = true; + this.groupTable.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.groupTable.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.groupTable.RowHeadersVisible = false; + this.groupTable.RowHeadersWidth = 55; + this.groupTable.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.groupTable.RowTemplate.Height = 40; + this.groupTable.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.groupTable.Size = new System.Drawing.Size(940, 432); + this.groupTable.TabIndex = 15; + // + // topPanel + // + this.topPanel.Controls.Add(this.BtnAdd); + this.topPanel.Controls.Add(this.btn_Close); + this.topPanel.Controls.Add(this.lblTitle); + this.topPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.topPanel.Location = new System.Drawing.Point(0, 0); + this.topPanel.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.topPanel.Name = "topPanel"; + this.topPanel.Size = new System.Drawing.Size(990, 39); + this.topPanel.TabIndex = 0; + this.topPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.topPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // BtnAdd + // + this.BtnAdd.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.BtnAdd.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnAdd.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.BtnAdd.ForeColor = System.Drawing.Color.White; + this.BtnAdd.Location = new System.Drawing.Point(797, 6); + this.BtnAdd.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.BtnAdd.Name = "BtnAdd"; + this.BtnAdd.Size = new System.Drawing.Size(84, 29); + this.BtnAdd.TabIndex = 49; + this.BtnAdd.Text = "添加通信组"; + this.BtnAdd.UseVisualStyleBackColor = false; + this.BtnAdd.Click += new System.EventHandler(this.BtnAdd_Click); + // + // btn_Close + // + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(29)))), ((int)(((byte)(84))))); + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(951, 6); + this.btn_Close.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(26, 26); + this.btn_Close.TabIndex = 1; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = true; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.ForeColor = System.Drawing.Color.White; + this.lblTitle.Location = new System.Drawing.Point(12, 14); + this.lblTitle.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(90, 21); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "通信组配置"; + // + // CommunicationEditForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(990, 509); + this.Controls.Add(this.panelExt1); + this.Font = new System.Drawing.Font("微软雅黑", 12F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); + this.Name = "CommunicationEditForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmGroupConfig"; + this.panelExt1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.groupTable)).EndInit(); + this.topPanel.ResumeLayout(false); + this.topPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private JinYuan.ControlLib.PanelExt panelExt1; + private System.Windows.Forms.Panel topPanel; + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.DataGridView groupTable; + private System.Windows.Forms.Button BtnAdd; + } +} \ No newline at end of file diff --git a/LargeSquareOne/CommunicationEditForm.cs b/LargeSquareOne/CommunicationEditForm.cs new file mode 100644 index 0000000..71e4503 --- /dev/null +++ b/LargeSquareOne/CommunicationEditForm.cs @@ -0,0 +1,717 @@ +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using MiniExcelLibs; +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class CommunicationEditForm : MultiLanguageForm + { + + private string groupPath = CommonMethods.groupConfigPath; //Application.StartupPath + $"\\Config\\Group_{CommonMethods.sysConfig.StationNo}.xlsx"; + private List TotalGroups = new List(); + private PlcGroupConfig editingConfig; + private int PlcNum; + + public CommunicationEditForm(int plcNum) + { + PlcNum = plcNum; + InitializeComponent(); + this.groupTable.AutoGenerateColumns = false; + + InitializeDataGridView(); + + TotalGroups = GetALLGroups(); + LoadGroups(); + + } + + + /// + /// 初始化DataGridView + /// + private void InitializeDataGridView() + { + groupTable.AutoGenerateColumns = false; + groupTable.AllowUserToAddRows = false; + groupTable.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + groupTable.MultiSelect = false; + groupTable.ReadOnly = false; + + // 添加列 + groupTable.Columns.AddRange(new DataGridViewColumn[] + { + new DataGridViewTextBoxColumn + { + Name = "PlcNum", + HeaderText = "PLC编号", + Width = 120, + ReadOnly = true, + DataPropertyName = "PlcNum", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewTextBoxColumn + { + Name = "GroupName", + HeaderText = "组名", + Width = 120, + DataPropertyName = "GroupName", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewTextBoxColumn + { + Name = "Start", + HeaderText = "起始地址", + Width = 150, + DataPropertyName = "Start", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewTextBoxColumn + { + Name = "Length", + HeaderText = "长度", + Width = 120, + DataPropertyName = "Length", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewCheckBoxColumn + { + Name = "IsTiggerRead", + HeaderText = "触发读取", + Width = 150, + DataPropertyName = "IsTiggerRead", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewCheckBoxColumn + { + Name = "IsFeedbackPlc", + HeaderText = "反馈PLC", + Width = 150, + DataPropertyName = "IsFeedbackPlc", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewCheckBoxColumn + { + Name = "IsActive", + HeaderText = "是否启用", + Width = 150, + DataPropertyName = "IsActive", + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewTextBoxColumn + { + Name = "Remark", + HeaderText = "备注", + Width = 150, + DataPropertyName = "Remark", + Visible=false, + DefaultCellStyle = new DataGridViewCellStyle(){Alignment=DataGridViewContentAlignment.MiddleCenter}, + }, + new DataGridViewButtonColumn + { + Name = "Edit", + HeaderText = "操作", + Width = 100, + Text = "修改".Translated(), + UseColumnTextForButtonValue = true + }, + new DataGridViewButtonColumn + { + Name = "Delete", + HeaderText = "", + Width = 100, + Text = "删除".Translated(), + UseColumnTextForButtonValue = true + } + }); + + // 添加事件处理 + groupTable.CellBeginEdit += DataGridView_CellBeginEdit; + groupTable.CellEndEdit += DataGridView_CellEndEdit; + groupTable.CellContentClick += DataGridView_CellContentClick; + } + + /// + /// 加载数据到表格 + /// + private void LoadGroups() + { + var plcGroups = TotalGroups.Where(g => g.PlcNum == PlcNum).ToList(); + groupTable.DataSource = null; + groupTable.DataSource = plcGroups; + } + + + /// + /// 获取所有通信组 + /// + /// + private List GetALLGroups() + { + try + { + return MiniExcel.Query(groupPath).ToList(); + } + catch (Exception) + { + + return new List(); + } + + } + + /// + /// 单元格开始编辑 + /// + private void DataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) + { + if (e.RowIndex < 0) return; + + editingConfig = TotalGroups[e.RowIndex]; + + // 禁止编辑PLC编号和组名列 + if (groupTable.Columns[e.ColumnIndex].Name == "PlcNum") + { + e.Cancel = true; + } + } + + /// + /// 单元格结束编辑 + /// + private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0 || e.RowIndex >= TotalGroups.Count) return; + + var config = TotalGroups[e.RowIndex]; + var value = groupTable[e.ColumnIndex, e.RowIndex].Value; + + try + { + UpdateConfigValue(config, e.ColumnIndex, value); + } + catch (Exception ex) + { + ShowError($"更新数据失败: {ex.Message}"); + } + } + + /// + /// 更新配置值 + /// + private void UpdateConfigValue(PlcGroupConfig config, int columnIndex, object value) + { + switch (groupTable.Columns[columnIndex].Name) + { + case "GroupName": + if (string.IsNullOrWhiteSpace(value?.ToString())) + { + throw new Exception("组名不能为空".Translated()); + } + config.GroupName = value.ToString(); + break; + + case "Start": + if (!ValidateAddressFormat(value?.ToString())) + { + throw new Exception("起始地址格式不正确".Translated()); + } + config.Start = value.ToString(); + break; + + case "Length": + if (!int.TryParse(value?.ToString(), out int length) || length <= 0) + { + throw new Exception("长度必须是大于0的数字".Translated()); + } + config.Length = length; + break; + + case "IsTiggerRead": + config.IsTiggerRead = value != null && (bool)value; + break; + + case "IsFeedbackPlc": + config.IsFeedbackPlc = value != null && (bool)value; + break; + + case "IsActive": + config.IsActive = value != null && (bool)value; + break; + + case "Remark": + config.Remark = value?.ToString() ?? string.Empty; + break; + } + } + + /// + /// 单元格点击事件 + /// + private void DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) return; + + // 获取当前行显示的数据 + var currentRow = groupTable.Rows[e.RowIndex]; + var config = (PlcGroupConfig)currentRow.DataBoundItem; + + // 找到在 TotalGroups 中的真实索引 + var realIndex = TotalGroups.FindIndex(g => + g.PlcNum == config.PlcNum && + g.GroupName == config.GroupName && + g.Start == config.Start); + + // 编辑按钮 + if (groupTable.Columns[e.ColumnIndex] is DataGridViewButtonColumn && + groupTable.Columns[e.ColumnIndex].Name == "Edit") + { + // 传递真实的索引,而不是显示的行索引 + HandleEdit(config, realIndex); + } + // 删除按钮 + else if (groupTable.Columns[e.ColumnIndex] is DataGridViewButtonColumn && + groupTable.Columns[e.ColumnIndex].Name == "Delete") + { + HandleDelete(config); + } + } + + /// + /// 处理编辑操作 + /// + private void HandleEdit(PlcGroupConfig config, int rowIndex) + { + try + { + var result = MessageBox.Show("是否保存修改的配置?".Translated(), "确认保存".Translated(), MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (result != DialogResult.Yes) return; + + if (!ValidateConfigAll(config)) return; + + // 更新TotalGroups中的配置 + TotalGroups[rowIndex] = config; + + // 保存到Excel + SaveToExcel(TotalGroups); + + // 重新加载显示 + LoadGroups(); + + ShowSuccess("配置保存成功".Translated()); + } + catch (Exception ex) + { + ShowError($"保存失败: {ex.Message}"); + } + } + + /// + /// 处理删除操作 + /// + private void HandleDelete(PlcGroupConfig config) + { + var result = MessageBox.Show($"确定要删除该通信组吗?\n PLC编号[{config.PlcNum}] 组名: [{config.GroupName}]", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + try + { + TotalGroups.Remove(config); + SaveToExcel(TotalGroups); + LoadGroups(); + ShowSuccess("删除成功".Translated()); + } + catch (Exception ex) + { + ShowError($"删除失败: {ex.Message}"); + } + } + } + + + /// + /// 保存配置到Excel文件 + /// + private void SaveToExcel(List configs) + { + try + { + // 创建临时文件路径 + string tempFilePath = Path.Combine( + Path.GetDirectoryName(groupPath), + $"temp_{Path.GetFileName(groupPath)}"); + + // 先保存到临时文件 + MiniExcel.SaveAs(tempFilePath, configs); + + // 检查临时文件是否创建成功 + if (!File.Exists(tempFilePath)) + { + throw new Exception("创建临时文件失败".Translated()); + } + + try + { + // 如果原文件存在,先删除 + if (File.Exists(groupPath)) + { + File.Delete(groupPath); + } + + // 将临时文件重命名为目标文件 + File.Move(tempFilePath, groupPath); + } + finally + { + // 确保临时文件被删除 + if (File.Exists(tempFilePath)) + { + File.Delete(tempFilePath); + } + } + } + catch (Exception ex) + { + throw new Exception($"保存Excel文件时发生错误: {ex.Message}", ex); + } + } + + + + /// + /// 验证单行配置 + /// + private bool ValidateConfigAll(PlcGroupConfig config) + { + try + { + // 基本字段验证 + if (string.IsNullOrWhiteSpace(config.GroupName)) + { + ShowError("组名不能为空".Translated()); + return false; + } + + if (string.IsNullOrWhiteSpace(config.Start)) + { + ShowError("起始地址不能为空".Translated()); + return false; + } + + if (config.Length <= 0) + { + ShowError("长度必须大于0".Translated()); + return false; + } + + // 地址格式验证 + if (!ValidateAddressFormat(config.Start)) + { + ShowError("起始地址格式不正确,应以'D'开头后跟数字".Translated()); + return false; + } + // 打印调试信息 + Console.WriteLine($"当前要添加的配置 - PLC号: {config.PlcNum}, 组名: {config.GroupName}"); + + //// 打印所有的配置 + //Console.WriteLine("\n所有配置信息:"); + //foreach (var g in TotalGroups) + //{ + // Console.WriteLine($"PLC号: {g.PlcNum}, 组名: {g.GroupName}"); + //} + + // 筛选同PLC的配置(不包括当前正在添加的配置) + var groupsInSamePLC = TotalGroups.Where(g => + g.PlcNum == config.PlcNum && // 筛选 PLC1 的配置 + g != config // 这个条件是需要的,因为可能当前配置已经在集合中 + ).ToList(); + + + // 3. 只在同一个PLC内检查地址是否冲突 + if (groupsInSamePLC.Any(g => g.GroupName.Equals(config.GroupName, StringComparison.OrdinalIgnoreCase))) + { + ShowError($"在PLC {config.PlcNum} 中,组名 {config.GroupName} 已被使用"); + return false; + } + //Console.WriteLine("\n筛选后的配置:"); + //foreach (var g in groupsInSamePLC) + //{ + // Console.WriteLine($"PLC号: {g.PlcNum}, 组名: {g.GroupName}"); + //} + + // 3. 只在同一个PLC内检查地址是否冲突 + if (groupsInSamePLC.Any(g => g.Start.Equals(config.Start, StringComparison.OrdinalIgnoreCase))) + { + ShowError($"在PLC {config.PlcNum} 中,起始地址 {config.Start} 已被使用"); + return false; + } + + // 地址范围验证 + int startAddress = int.Parse(config.Start.Substring(1)); + int endAddress = startAddress + config.Length - 1; + + if (endAddress > 32675) + { + ShowError($"地址范围超出限制,结束地址不能超过D32675".Translated()); + return false; + } + + // 检查地址范围冲突 + foreach (var other in groupsInSamePLC) + { + int otherStart = int.Parse(other.Start.Substring(1)); + int otherEnd = otherStart + other.Length - 1; + + if (!(endAddress < otherStart || startAddress > otherEnd)) + { + ShowError($"地址范围与组 \"{other.GroupName}\" 冲突"); + return false; + } + } + + return true; + } + catch (Exception ex) + { + ShowError($"验证配置时发生错误: {ex.Message}"); + return false; + } + } + + // 地址格式验证 + private bool ValidateAddressFormat(string address) + { + if (string.IsNullOrWhiteSpace(address)) return false; + + // 检查是否以D开头(不区分大小写) + if (!address.StartsWith("D", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + // 检查后面是否为有效数字 + string numberPart = address.Substring(1); + if (!int.TryParse(numberPart, out int addressNum)) + { + return false; + } + + // 检查地址范围(根据实际需求调整范围) + if (addressNum < 0 || addressNum > 9999) + { + return false; + } + + return true; + } + + #region 添加新通信组 + /// + /// 添加新通信组 + /// + /// + /// + private void BtnAdd_Click(object sender, EventArgs e) + { + try + { + // 创建新组配置 + var newGroup = new PlcGroupConfig + { + PlcNum = PlcNum, // 使用当前PlcNum而不是CurrentPLCConfig.PlcNum + GroupName = GenerateNewGroupName(), + Start = FindNextAvailableAddress(), + Length = 100, + IsTiggerRead = true, + IsFeedbackPlc = true, + IsActive = true, + Remark = "" + }; + + // 验证新配置 + if (!ValidateConfigAll(newGroup)) + { + return; + } + + // 添加到总配置列表 + TotalGroups.Add(newGroup); + + // 保存到Excel文件 + SaveToExcel(TotalGroups); + + // 重新加载显示 + LoadGroups(); + + ShowSuccess("新建通信组成功".Translated()); + } + catch (Exception ex) + { + ShowError($"添加通信组失败: {ex.Message}"); + } + } + + /// + /// 生成新的组名 + /// + private string GenerateNewGroupName() + { + int index = 1; + string baseName = "新建组".Translated(); + string newName = baseName; + + // 查找可用的组名 + while (TotalGroups.Any(g => g.PlcNum == PlcNum && g.GroupName.Equals(newName, StringComparison.OrdinalIgnoreCase))) + { + index++; + newName = $"{baseName}{index}"; + } + + return newName; + } + + /// + /// 查找下一个可用的地址 + /// + private string FindNextAvailableAddress() + { + // 获取当前PLC的所有组 + var plcGroups = TotalGroups.Where(g => g.PlcNum == PlcNum && g.IsActive).ToList(); + + if (!plcGroups.Any()) + { + return "D0"; // 如果没有现有组,从D0开始 + } + + // 找到最大的结束地址 + int maxEndAddress = plcGroups.Max(g => + { + int startAddr = int.Parse(g.Start.Substring(1)); + return startAddr + g.Length; + }); + + // 确保地址不超过最大限制(32675) + if (maxEndAddress >= 32675) + { + throw new Exception("没有可用的地址空间".Translated()); + } + + // 返回下一个可用地址 + return $"D{maxEndAddress}"; + } + + /// + /// 查找地址间隔 + /// + private string FindAddressGap(int requiredLength = 100) + { + // 获取当前PLC的所有组,并按起始地址排序 + var plcGroups = TotalGroups + .Where(g => g.PlcNum == PlcNum) + .Select(g => new + { + Start = int.Parse(g.Start.Substring(1)), + End = int.Parse(g.Start.Substring(1)) + g.Length - 1 + }) + .OrderBy(g => g.Start) + .ToList(); + + // 如果没有组,返回起始地址 + if (!plcGroups.Any()) + { + return "D0"; + } + + // 检查第一个组之前是否有足够空间 + if (plcGroups.First().Start >= requiredLength) + { + return "D0"; + } + + // 检查组之间的间隔 + for (int i = 0; i < plcGroups.Count - 1; i++) + { + int gapStart = plcGroups[i].End + 1; + int gapEnd = plcGroups[i + 1].Start - 1; + + if (gapEnd - gapStart + 1 >= requiredLength) + { + return $"D{gapStart}"; + } + } + + // 检查最后一个组之后是否有足够空间 + int lastEnd = plcGroups.Last().End; + if (lastEnd + requiredLength <= 32675) + { + return $"D{lastEnd + 1}"; + } + + throw new Exception("没有找到足够大的地址空间".Translated()); + } + + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + + #endregion + + + + // 错误提示 + private void ShowError(string message) + { + MessageBox.Show(message, "验证错误".Translated(), MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + // 成功提示 + private void ShowSuccess(string message) + { + MessageBox.Show(message, "成功".Translated(), MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + + + + + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + + } +} diff --git a/LargeSquareOne/CommunicationEditForm.resx b/LargeSquareOne/CommunicationEditForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/CommunicationEditForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/Config/Configure.xml b/LargeSquareOne/Config/Configure.xml new file mode 100644 index 0000000..db3a520 --- /dev/null +++ b/LargeSquareOne/Config/Configure.xml @@ -0,0 +1,167 @@ + + + + + False + + False + + 3 + + False + + 1 + + 1 + + False + + False + + False + + False + + False + + True + + 0 + + 2025-09-01 16:10:57 + + True + + + + 57M + + PW-571 + + 571VIE01 + 571VIE01 + + 8889205-04 + + PLT43F030000001 + + 1,2 + + 20:30:00 + + D:\APILog + + 192.168.2.108 + + 10.100.111.81 + + 80 + + e36ef900320d442f850913e2ebc1d7a1 + + 8279ce76217245f48c0cc495c09124a3 + + https://wms-eu.evebattery.com/openapi/oauth/token + + O2 + + http://10.54.50.1:8082/core/api/public/equipment/base/user/login/verify + + http://10.54.50.1:8082/core/api/public/param/setting/request + + http://10.54.50.1:8082/core/api/public/param/setting/change + http://10.54.50.1:8082/core/api/public/equip/auto/cartonquery + http://10.54.50.1:8082/core/api/public/equip/auto/palletquery + + http://10.54.50.1:8082/core/api/public/equipment/alarm/currency + + http://10.54.50.1:8082/core/api/public/eve/pm/eqm/run/status/operation + + http://10.54.50.1:8082/core/api/public/eve/pm/energy/consumption/collection/submit + + https://iot.eveportal.com:9470/eve_api/ems/iot/upload_device_collect_data + http://10.100.111.81/core/api/public/equip/auto/customer/bind + + + false + D:\\BTW\\新箱唛V1.0.btw + D:\\BTW\\新栈板V1.0.btw + ZDesigner ZT610-600dpi ZPL_02 + + + + 1030 + + 0 + + 360 + + 358 + + 0 + + 0 + + 0 + + 0 + + 0 + + 0 + + + + 25 + + FSY-2A-001 + + FSY-2A-002 + + FSY-2A-003 + + FSY-2A-004 + + FSY-2A-005 + + FSY-2A-006 + + FSY-2A-007 + + FSY-2A-008 + + FSY-2A-009 + + FSY-2A-010 + + FSY-2A-011 + + FSY-2A-012 + + FSY-2A-013 + + FSY-2A-014 + + FSY-2A-015 + + FSY-2A-016 + + FSY-2A-017 + + FSY-2A-018 + + FSY-2A-019 + + FSY-2A-020 + + FSY-2A-021 + + FSY-2A-022 + + FSY-2A-023 + + FSY-2A-024 + + FSY-2A-025 + + \ No newline at end of file diff --git a/LargeSquareOne/Config/Device-bak.xlsx b/LargeSquareOne/Config/Device-bak.xlsx new file mode 100644 index 0000000..1be276e Binary files /dev/null and b/LargeSquareOne/Config/Device-bak.xlsx differ diff --git a/LargeSquareOne/Config/Device.xlsx b/LargeSquareOne/Config/Device.xlsx new file mode 100644 index 0000000..1427a4a Binary files /dev/null and b/LargeSquareOne/Config/Device.xlsx differ diff --git a/LargeSquareOne/Config/Group-bak.xlsx b/LargeSquareOne/Config/Group-bak.xlsx new file mode 100644 index 0000000..7bac49c Binary files /dev/null and b/LargeSquareOne/Config/Group-bak.xlsx differ diff --git a/LargeSquareOne/Config/Group.xlsx b/LargeSquareOne/Config/Group.xlsx new file mode 100644 index 0000000..6bd9d13 Binary files /dev/null and b/LargeSquareOne/Config/Group.xlsx differ diff --git a/LargeSquareOne/Config/Variable-bak.xlsx b/LargeSquareOne/Config/Variable-bak.xlsx new file mode 100644 index 0000000..39c3d72 Binary files /dev/null and b/LargeSquareOne/Config/Variable-bak.xlsx differ diff --git a/LargeSquareOne/Config/Variable.xlsx b/LargeSquareOne/Config/Variable.xlsx new file mode 100644 index 0000000..c3bea81 Binary files /dev/null and b/LargeSquareOne/Config/Variable.xlsx differ diff --git a/LargeSquareOne/CustomMessageBox.Designer.cs b/LargeSquareOne/CustomMessageBox.Designer.cs new file mode 100644 index 0000000..5d29f4f --- /dev/null +++ b/LargeSquareOne/CustomMessageBox.Designer.cs @@ -0,0 +1,208 @@ + +namespace LargeSquareOne +{ + partial class CustomMessageBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.panel3 = new System.Windows.Forms.Panel(); + this.btStop = new HML.ButtonPlus(); + this.btSatrt = new HML.ButtonPlus(); + this.panel2 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.lblMessage = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + this.panel4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.panel3.SuspendLayout(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Controls.Add(this.panel4); + this.panel1.Controls.Add(this.panel3); + this.panel1.Controls.Add(this.panel2); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(652, 428); + this.panel1.TabIndex = 0; + // + // panel4 + // + this.panel4.Controls.Add(this.dataGridView1); + this.panel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel4.Location = new System.Drawing.Point(0, 53); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(652, 319); + this.panel4.TabIndex = 4; + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToDeleteRows = false; + this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells; + this.dataGridView1.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.DisplayedCells; + this.dataGridView1.BackgroundColor = System.Drawing.Color.White; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Black; + 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; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.Black; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.ControlLightLight; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle2; + this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView1.Location = new System.Drawing.Point(0, 0); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.ReadOnly = true; + this.dataGridView1.RowTemplate.DefaultCellStyle.BackColor = System.Drawing.Color.White; + this.dataGridView1.RowTemplate.DefaultCellStyle.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dataGridView1.RowTemplate.DefaultCellStyle.ForeColor = System.Drawing.Color.Black; + this.dataGridView1.RowTemplate.Height = 23; + this.dataGridView1.Size = new System.Drawing.Size(652, 319); + this.dataGridView1.TabIndex = 0; + this.dataGridView1.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dataGridView1_RowPostPaint); + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.Silver; + this.panel3.Controls.Add(this.btStop); + this.panel3.Controls.Add(this.btSatrt); + this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel3.Location = new System.Drawing.Point(0, 372); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(652, 56); + this.panel3.TabIndex = 3; + // + // btStop + // + this.btStop.BackNormalColor = System.Drawing.Color.Red; + this.btStop.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btStop.Location = new System.Drawing.Point(390, 4); + this.btStop.Name = "btStop"; + this.btStop.Size = new System.Drawing.Size(101, 49); + this.btStop.TabIndex = 15; + this.btStop.Text = "取 消"; + this.btStop.Click += new System.EventHandler(this.btnNo_Click); + // + // btSatrt + // + this.btSatrt.BackNormalColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0))))); + this.btSatrt.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btSatrt.Location = new System.Drawing.Point(134, 4); + this.btSatrt.Name = "btSatrt"; + this.btSatrt.Size = new System.Drawing.Size(101, 49); + this.btSatrt.TabIndex = 14; + this.btSatrt.Text = "确 定"; + this.btSatrt.Click += new System.EventHandler(this.btnOK_Click); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(34)))), ((int)(((byte)(40)))), ((int)(((byte)(49))))); + this.panel2.Controls.Add(this.pictureBox1); + this.panel2.Controls.Add(this.lblMessage); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(0, 0); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(652, 53); + this.panel2.TabIndex = 0; + // + // pictureBox1 + // + this.pictureBox1.Image = global::LargeSquareOne.Properties.Resources.黄色_警告; + this.pictureBox1.Location = new System.Drawing.Point(7, 6); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(45, 37); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 1; + this.pictureBox1.TabStop = false; + // + // lblMessage + // + this.lblMessage.AutoSize = true; + this.lblMessage.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblMessage.ForeColor = System.Drawing.Color.Red; + this.lblMessage.Location = new System.Drawing.Point(58, 14); + this.lblMessage.Name = "lblMessage"; + this.lblMessage.Size = new System.Drawing.Size(43, 20); + this.lblMessage.TabIndex = 0; + this.lblMessage.Text = "提示"; + // + // CustomMessageBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(652, 428); + this.Controls.Add(this.panel1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CustomMessageBox"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.TopMost = true; + this.Load += new System.EventHandler(this.CustomMessageBox_Load); + this.panel1.ResumeLayout(false); + this.panel4.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.panel3.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lblMessage; + + private System.Windows.Forms.PictureBox pictureBox1; + private HML.ButtonPlus btStop; + private HML.ButtonPlus btSatrt; + } +} \ No newline at end of file diff --git a/LargeSquareOne/CustomMessageBox.cs b/LargeSquareOne/CustomMessageBox.cs new file mode 100644 index 0000000..c4752db --- /dev/null +++ b/LargeSquareOne/CustomMessageBox.cs @@ -0,0 +1,71 @@ +using Language; +using System; +using System.Data; +using System.Drawing; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class CustomMessageBox : MultiLanguageForm + { + DataTable dataTable = new DataTable(); + string strLblMessage = ""; + + public CustomMessageBox(DataTable _dataTable, string _strLblMessage) + { + InitializeComponent(); + + + dataTable = _dataTable; + strLblMessage = _strLblMessage; + } + + private void CustomMessageBox_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = dataTable; + lblMessage.Text = strLblMessage; + } + + //public void SetMessage(DataTable dataTable,string strLblMessage) + //{ + // dataGridView1.DataSource = dataTable; + // lblMessage.Text = strLblMessage; + //} + + private void btnOK_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + + } + private void btnNo_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.No; + this.Close(); + } + + private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //自动编号,与数据无关 + Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, + e.RowBounds.Location.Y, + dataGridView1.RowHeadersWidth - 4, + e.RowBounds.Height); + TextRenderer.DrawText(e.Graphics, + (e.RowIndex + 1).ToString(), + dataGridView1.RowHeadersDefaultCellStyle.Font, + rectangle, + dataGridView1.RowHeadersDefaultCellStyle.ForeColor, + TextFormatFlags.VerticalCenter | TextFormatFlags.Right); + } + + //public static void Show(DataTable dataTable, string message, string title) + //{ + // CustomMessageBox messageBox = new CustomMessageBox(dataTable, message); + // messageBox.SetMessage(dataTable,message); + // messageBox.Text = title; + // messageBox.ShowDialog(); + //} + + + } +} diff --git a/LargeSquareOne/CustomMessageBox.resx b/LargeSquareOne/CustomMessageBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/CustomMessageBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmAlarmLog.Designer.cs b/LargeSquareOne/FrmAlarmLog.Designer.cs new file mode 100644 index 0000000..9c8f93c --- /dev/null +++ b/LargeSquareOne/FrmAlarmLog.Designer.cs @@ -0,0 +1,369 @@ +namespace LargeSquareOne +{ + partial class FrmAlarmLog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = 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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); + this.dgv_OPLog = new System.Windows.Forms.DataGridView(); + this.OPLogDateTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OPLogOperationType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OPLogOperationalMessage = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dgv_Log = new System.Windows.Forms.DataGridView(); + this.LogDateTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.LogDateType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.LogDateInformation = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.lblSystemLog = new System.Windows.Forms.Label(); + this.lblOperationLog = new System.Windows.Forms.Label(); + this.dgv_Alarm = new System.Windows.Forms.DataGridView(); + this.AlarmLogDateTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmLogAlarmType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.AlarmLogALARM = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.lblSystemAlarm = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_OPLog)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Log)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Alarm)).BeginInit(); + this.SuspendLayout(); + // + // dgv_OPLog + // + this.dgv_OPLog.AllowUserToAddRows = false; + this.dgv_OPLog.AllowUserToDeleteRows = false; + this.dgv_OPLog.AllowUserToResizeColumns = false; + this.dgv_OPLog.AllowUserToResizeRows = false; + this.dgv_OPLog.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgv_OPLog.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv_OPLog.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_OPLog.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgv_OPLog.ColumnHeadersHeight = 30; + this.dgv_OPLog.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgv_OPLog.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.OPLogDateTime, + this.OPLogOperationType, + this.OPLogOperationalMessage}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_OPLog.DefaultCellStyle = dataGridViewCellStyle2; + this.dgv_OPLog.EnableHeadersVisualStyles = false; + this.dgv_OPLog.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_OPLog.Location = new System.Drawing.Point(22, 282); + this.dgv_OPLog.MultiSelect = false; + this.dgv_OPLog.Name = "dgv_OPLog"; + this.dgv_OPLog.ReadOnly = true; + this.dgv_OPLog.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_OPLog.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgv_OPLog.RowHeadersWidth = 120; + this.dgv_OPLog.RowTemplate.Height = 23; + this.dgv_OPLog.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_OPLog.Size = new System.Drawing.Size(1827, 266); + this.dgv_OPLog.TabIndex = 6; + this.dgv_OPLog.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Log_RowPostPaint); + // + // OPLogDateTime + // + this.OPLogDateTime.HeaderText = "日期时间"; + this.OPLogDateTime.Name = "OPLogDateTime"; + this.OPLogDateTime.ReadOnly = true; + this.OPLogDateTime.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.OPLogDateTime.Width = 200; + // + // OPLogOperationType + // + this.OPLogOperationType.HeaderText = "操作类型"; + this.OPLogOperationType.Name = "OPLogOperationType"; + this.OPLogOperationType.ReadOnly = true; + this.OPLogOperationType.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.OPLogOperationType.Width = 200; + // + // OPLogOperationalMessage + // + this.OPLogOperationalMessage.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.OPLogOperationalMessage.HeaderText = "操作信息"; + this.OPLogOperationalMessage.Name = "OPLogOperationalMessage"; + this.OPLogOperationalMessage.ReadOnly = true; + this.OPLogOperationalMessage.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // dgv_Log + // + this.dgv_Log.AllowUserToAddRows = false; + this.dgv_Log.AllowUserToDeleteRows = false; + this.dgv_Log.AllowUserToResizeColumns = false; + this.dgv_Log.AllowUserToResizeRows = false; + this.dgv_Log.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgv_Log.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv_Log.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle4.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle4.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Log.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + this.dgv_Log.ColumnHeadersHeight = 30; + this.dgv_Log.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgv_Log.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.LogDateTime, + this.LogDateType, + this.LogDateInformation}); + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle5.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle5.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Log.DefaultCellStyle = dataGridViewCellStyle5; + this.dgv_Log.EnableHeadersVisualStyles = false; + this.dgv_Log.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_Log.Location = new System.Drawing.Point(22, 14); + this.dgv_Log.MultiSelect = false; + this.dgv_Log.Name = "dgv_Log"; + this.dgv_Log.ReadOnly = true; + this.dgv_Log.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle6.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle6.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Log.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.dgv_Log.RowHeadersWidth = 120; + this.dgv_Log.RowTemplate.Height = 23; + this.dgv_Log.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_Log.Size = new System.Drawing.Size(1827, 266); + this.dgv_Log.TabIndex = 7; + this.dgv_Log.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Log_RowPostPaint); + // + // LogDateTime + // + this.LogDateTime.HeaderText = "日期时间"; + this.LogDateTime.Name = "LogDateTime"; + this.LogDateTime.ReadOnly = true; + this.LogDateTime.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.LogDateTime.Width = 200; + // + // LogDateType + // + this.LogDateType.HeaderText = "日志类型"; + this.LogDateType.Name = "LogDateType"; + this.LogDateType.ReadOnly = true; + this.LogDateType.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.LogDateType.Width = 200; + // + // LogDateInformation + // + this.LogDateInformation.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.LogDateInformation.HeaderText = "日志信息"; + this.LogDateInformation.Name = "LogDateInformation"; + this.LogDateInformation.ReadOnly = true; + this.LogDateInformation.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // lblSystemLog + // + this.lblSystemLog.BackColor = System.Drawing.Color.Transparent; + this.lblSystemLog.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblSystemLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(246)))), ((int)(((byte)(255))))); + this.lblSystemLog.Location = new System.Drawing.Point(43, 19); + this.lblSystemLog.Name = "lblSystemLog"; + this.lblSystemLog.Size = new System.Drawing.Size(75, 23); + this.lblSystemLog.TabIndex = 11; + this.lblSystemLog.Text = "系统日志"; + // + // lblOperationLog + // + this.lblOperationLog.BackColor = System.Drawing.Color.Transparent; + this.lblOperationLog.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblOperationLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(246)))), ((int)(((byte)(255))))); + this.lblOperationLog.Location = new System.Drawing.Point(42, 287); + this.lblOperationLog.Name = "lblOperationLog"; + this.lblOperationLog.Size = new System.Drawing.Size(89, 19); + this.lblOperationLog.TabIndex = 10; + this.lblOperationLog.Text = "操作日志"; + // + // dgv_Alarm + // + this.dgv_Alarm.AllowUserToAddRows = false; + this.dgv_Alarm.AllowUserToDeleteRows = false; + this.dgv_Alarm.AllowUserToResizeColumns = false; + this.dgv_Alarm.AllowUserToResizeRows = false; + this.dgv_Alarm.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgv_Alarm.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv_Alarm.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle7.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle7.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Alarm.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; + this.dgv_Alarm.ColumnHeadersHeight = 30; + this.dgv_Alarm.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgv_Alarm.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.AlarmLogDateTime, + this.AlarmLogAlarmType, + this.AlarmLogALARM}); + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle8.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle8.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Alarm.DefaultCellStyle = dataGridViewCellStyle8; + this.dgv_Alarm.EnableHeadersVisualStyles = false; + this.dgv_Alarm.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_Alarm.Location = new System.Drawing.Point(22, 550); + this.dgv_Alarm.MultiSelect = false; + this.dgv_Alarm.Name = "dgv_Alarm"; + this.dgv_Alarm.ReadOnly = true; + this.dgv_Alarm.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle9.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle9.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle9.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle9.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Alarm.RowHeadersDefaultCellStyle = dataGridViewCellStyle9; + this.dgv_Alarm.RowHeadersWidth = 120; + this.dgv_Alarm.RowTemplate.Height = 23; + this.dgv_Alarm.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_Alarm.Size = new System.Drawing.Size(1827, 266); + this.dgv_Alarm.TabIndex = 5; + this.dgv_Alarm.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Log_RowPostPaint); + // + // AlarmLogDateTime + // + this.AlarmLogDateTime.HeaderText = "日期时间"; + this.AlarmLogDateTime.Name = "AlarmLogDateTime"; + this.AlarmLogDateTime.ReadOnly = true; + this.AlarmLogDateTime.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.AlarmLogDateTime.Width = 200; + // + // AlarmLogAlarmType + // + this.AlarmLogAlarmType.HeaderText = "报警类型"; + this.AlarmLogAlarmType.Name = "AlarmLogAlarmType"; + this.AlarmLogAlarmType.ReadOnly = true; + this.AlarmLogAlarmType.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.AlarmLogAlarmType.Width = 200; + // + // AlarmLogALARM + // + this.AlarmLogALARM.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.AlarmLogALARM.HeaderText = "报警信息"; + this.AlarmLogALARM.Name = "AlarmLogALARM"; + this.AlarmLogALARM.ReadOnly = true; + this.AlarmLogALARM.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // lblSystemAlarm + // + this.lblSystemAlarm.BackColor = System.Drawing.Color.Transparent; + this.lblSystemAlarm.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblSystemAlarm.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(246)))), ((int)(((byte)(255))))); + this.lblSystemAlarm.Location = new System.Drawing.Point(43, 555); + this.lblSystemAlarm.Name = "lblSystemAlarm"; + this.lblSystemAlarm.Size = new System.Drawing.Size(89, 19); + this.lblSystemAlarm.TabIndex = 9; + this.lblSystemAlarm.Text = "系统报警"; + // + // FrmAlarmLog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(1874, 835); + this.Controls.Add(this.lblOperationLog); + this.Controls.Add(this.lblSystemAlarm); + this.Controls.Add(this.dgv_Alarm); + this.Controls.Add(this.dgv_OPLog); + this.Controls.Add(this.lblSystemLog); + this.Controls.Add(this.dgv_Log); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "FrmAlarmLog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "日志报警"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + ((System.ComponentModel.ISupportInitialize)(this.dgv_OPLog)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Log)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Alarm)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dgv_OPLog; + private System.Windows.Forms.DataGridView dgv_Log; + private System.Windows.Forms.Label lblSystemLog; + private System.Windows.Forms.Label lblOperationLog; + private System.Windows.Forms.DataGridView dgv_Alarm; + private System.Windows.Forms.Label lblSystemAlarm; + private System.Windows.Forms.DataGridViewTextBoxColumn OPLogDateTime; + private System.Windows.Forms.DataGridViewTextBoxColumn OPLogOperationType; + private System.Windows.Forms.DataGridViewTextBoxColumn OPLogOperationalMessage; + private System.Windows.Forms.DataGridViewTextBoxColumn LogDateTime; + private System.Windows.Forms.DataGridViewTextBoxColumn LogDateType; + private System.Windows.Forms.DataGridViewTextBoxColumn LogDateInformation; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmLogDateTime; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmLogAlarmType; + private System.Windows.Forms.DataGridViewTextBoxColumn AlarmLogALARM; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmAlarmLog.cs b/LargeSquareOne/FrmAlarmLog.cs new file mode 100644 index 0000000..7372d86 --- /dev/null +++ b/LargeSquareOne/FrmAlarmLog.cs @@ -0,0 +1,189 @@ +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using System; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmAlarmLog : MultiLanguageForm + { + public FrmAlarmLog() + { + InitializeComponent(); + } + + private string CurrentTime + { + get { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } + } + + /// + /// 通用的添加系统日志 + /// + /// + /// + public async void AddLog(bool isError, string info) + { + if (dgv_Log.InvokeRequired) + { + this.dgv_Log.Invoke(new Action(AddLog), isError, info); + } + else + { + + int rowCount = this.dgv_Log.Rows.Add(); + this.dgv_Log.Rows[rowCount].Cells[0].Value = CurrentTime; + this.dgv_Log.Rows[rowCount].Cells[1].Value = isError ? "错误".Translated() : "信息".Translated(); + this.dgv_Log.Rows[rowCount].Cells[2].Value = info; + // 设置最新行为活动行 (当前行) + this.dgv_Log.CurrentCell = this.dgv_Log.Rows[this.dgv_Log.Rows.Count - 1].Cells[0]; + + //dgv清理 + if (this.dgv_Log.RowCount > 300) + { + //this.dgv_Log.Rows.RemoveAt(0); + this.dgv_Log.Rows.Clear(); + GC.Collect(); + } + } + + //存储到数据库 + await CommonMethods.db.AddReturnBoolAsync(new SysLog() + { + InsertTime = CurrentTime, + LogType = "系统日志".Translated(), + Note = info, + AlarmType = isError ? "错误".Translated() : "信息".Translated(), + Operater = CommonMethods.currentAdmin.LoginName + }); + } + + /// + /// 通用的添加操作日志 + /// + /// + /// + public async void AddOPLog(bool isError, string info) + { + if (this.dgv_OPLog.InvokeRequired) + { + this.dgv_OPLog.Invoke(new Action(AddOPLog), isError, info); + } + else + { + int rowCount = this.dgv_OPLog.Rows.Add(); + this.dgv_OPLog.Rows[rowCount].Cells[0].Value = CurrentTime; + this.dgv_OPLog.Rows[rowCount].Cells[1].Value = isError ? "错误".Translated() : "信息".Translated(); + this.dgv_OPLog.Rows[rowCount].Cells[2].Value = info; + // 设置最新行为活动行 (当前行) + this.dgv_OPLog.CurrentCell = this.dgv_OPLog.Rows[this.dgv_OPLog.Rows.Count - 1].Cells[0]; + + //dgv清理 + if (this.dgv_OPLog.RowCount > 300) + { + //this.dgv_OPLog.Rows.RemoveAt(0); + this.dgv_OPLog.Rows.Clear(); + GC.Collect(); + } + } + + //存储到数据库 + + await CommonMethods.db.AddReturnBoolAsync(new SysLog() + { + InsertTime = CurrentTime, + LogType = "操作日志".Translated(), + Note = info, + AlarmType = isError ? "错误".Translated() : "信息".Translated(), + Operater = CommonMethods.currentAdmin.LoginName + }); + + + } + + /// + /// 通用的添加报警信息 + /// + /// sh + /// + public async void AddAlarm(SysLog sysLog) + { + if (this.dgv_Alarm.InvokeRequired) + { + this.dgv_Alarm.Invoke(new Action(AddAlarm), sysLog); + } + else + { + int rowCount = this.dgv_Alarm.Rows.Add(); + this.dgv_Alarm.Rows[rowCount].Cells[0].Value = sysLog.InsertTime; + this.dgv_Alarm.Rows[rowCount].Cells[1].Value = sysLog.AlarmType; + this.dgv_Alarm.Rows[rowCount].Cells[2].Value = sysLog.Note; + // 设置最新行为活动行 (当前行) + this.dgv_Alarm.CurrentCell = this.dgv_Alarm.Rows[this.dgv_Alarm.Rows.Count - 1].Cells[0]; + } + + //dgv清理 + if (this.dgv_Alarm.RowCount > 300) + { + //this.dgv_Alarm.Rows.RemoveAt(0); + this.dgv_Alarm.Rows.Clear(); + GC.Collect(); + } + + //存储到数据库 + await CommonMethods.db.AddReturnBoolAsync(sysLog); + + } + + /// + /// 通用的添加并显示报警信息 + /// + /// sh + /// + public void ShowAlarm(string info) + { + if (this.dgv_Alarm.InvokeRequired) + { + this.dgv_Alarm.Invoke(new Action(ShowAlarm), info); + } + else + { + int rowCount = this.dgv_Alarm.Rows.Add(); + this.dgv_Alarm.Rows[rowCount].Cells[0].Value = CurrentTime; + this.dgv_Alarm.Rows[rowCount].Cells[1].Value = "停机报警"; + this.dgv_Alarm.Rows[rowCount].Cells[2].Value = info; + // 设置最新行为活动行 (当前行) + this.dgv_Alarm.CurrentCell = this.dgv_Alarm.Rows[this.dgv_Alarm.Rows.Count - 1].Cells[0]; + + + //dgv清理 + if (this.dgv_Alarm.RowCount > 300) + { + //this.dgv_Alarm.Rows.RemoveAt(0); + this.dgv_Alarm.Rows.Clear(); + GC.Collect(); + } + } + } + + private void dgv_Log_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + DataGridViewHelper.DgvRowPostPaint((DataGridView)sender, e); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + #endregion + + } +} diff --git a/LargeSquareOne/FrmAlarmLog.resx b/LargeSquareOne/FrmAlarmLog.resx new file mode 100644 index 0000000..0203ec6 --- /dev/null +++ b/LargeSquareOne/FrmAlarmLog.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/LargeSquareOne/FrmCpkCount.Designer.cs b/LargeSquareOne/FrmCpkCount.Designer.cs new file mode 100644 index 0000000..ce59b86 --- /dev/null +++ b/LargeSquareOne/FrmCpkCount.Designer.cs @@ -0,0 +1,450 @@ +namespace LargeSquareOne +{ + partial class FrmCpkCount + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + SeeSharpTools.JY.GUI.StripChartXSeries stripChartXSeries1 = new SeeSharpTools.JY.GUI.StripChartXSeries(); + SeeSharpTools.JY.GUI.StripChartXSeries stripChartXSeries2 = new SeeSharpTools.JY.GUI.StripChartXSeries(); + JinYuan.Models.CPKModel cpkModel1 = new JinYuan.Models.CPKModel(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.btn_Add = new System.Windows.Forms.Button(); + this.stripChartX2 = new SeeSharpTools.JY.GUI.StripChartX(); + this.stripChartX3 = new SeeSharpTools.JY.GUI.StripChartX(); + this.trw1 = new LargeSquareOne.trw(); + this.chartControl = new System.Windows.Forms.DataVisualization.Charting.Chart(); + ((System.ComponentModel.ISupportInitialize)(this.chartControl)).BeginInit(); + this.SuspendLayout(); + // + // btn_Add + // + this.btn_Add.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Add.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Add.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Add.ForeColor = System.Drawing.Color.White; + this.btn_Add.Location = new System.Drawing.Point(7, 44); + this.btn_Add.Name = "btn_Add"; + this.btn_Add.Size = new System.Drawing.Size(101, 36); + this.btn_Add.TabIndex = 13; + this.btn_Add.Text = "查 询"; + this.btn_Add.UseVisualStyleBackColor = false; + this.btn_Add.Click += new System.EventHandler(this.btn_Add_Click); + // + // stripChartX2 + // + this.stripChartX2.AxisX.AutoScale = false; + this.stripChartX2.AxisX.AutoZoomReset = false; + this.stripChartX2.AxisX.Color = System.Drawing.Color.Black; + this.stripChartX2.AxisX.InitWithScaleView = false; + this.stripChartX2.AxisX.IsLogarithmic = false; + this.stripChartX2.AxisX.LabelAngle = 0; + this.stripChartX2.AxisX.LabelEnabled = true; + this.stripChartX2.AxisX.LabelFormat = null; + this.stripChartX2.AxisX.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisX.MajorGridCount = 6; + this.stripChartX2.AxisX.MajorGridEnabled = true; + this.stripChartX2.AxisX.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX2.AxisX.Maximum = 1000D; + this.stripChartX2.AxisX.Minimum = 0D; + this.stripChartX2.AxisX.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisX.MinorGridEnabled = false; + this.stripChartX2.AxisX.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX2.AxisX.TickWidth = 1F; + this.stripChartX2.AxisX.Title = ""; + this.stripChartX2.AxisX.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX2.AxisX.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX2.AxisX.ViewMaximum = 1000D; + this.stripChartX2.AxisX.ViewMinimum = 0D; + this.stripChartX2.AxisX2.AutoScale = false; + this.stripChartX2.AxisX2.AutoZoomReset = false; + this.stripChartX2.AxisX2.Color = System.Drawing.Color.Black; + this.stripChartX2.AxisX2.InitWithScaleView = false; + this.stripChartX2.AxisX2.IsLogarithmic = false; + this.stripChartX2.AxisX2.LabelAngle = 0; + this.stripChartX2.AxisX2.LabelEnabled = true; + this.stripChartX2.AxisX2.LabelFormat = null; + this.stripChartX2.AxisX2.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisX2.MajorGridCount = 6; + this.stripChartX2.AxisX2.MajorGridEnabled = true; + this.stripChartX2.AxisX2.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX2.AxisX2.Maximum = 1000D; + this.stripChartX2.AxisX2.Minimum = 0D; + this.stripChartX2.AxisX2.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisX2.MinorGridEnabled = false; + this.stripChartX2.AxisX2.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX2.AxisX2.TickWidth = 1F; + this.stripChartX2.AxisX2.Title = ""; + this.stripChartX2.AxisX2.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX2.AxisX2.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX2.AxisX2.ViewMaximum = 1000D; + this.stripChartX2.AxisX2.ViewMinimum = 0D; + this.stripChartX2.AxisY.AutoScale = true; + this.stripChartX2.AxisY.AutoZoomReset = false; + this.stripChartX2.AxisY.Color = System.Drawing.Color.Black; + this.stripChartX2.AxisY.InitWithScaleView = false; + this.stripChartX2.AxisY.IsLogarithmic = false; + this.stripChartX2.AxisY.LabelAngle = 0; + this.stripChartX2.AxisY.LabelEnabled = true; + this.stripChartX2.AxisY.LabelFormat = null; + this.stripChartX2.AxisY.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisY.MajorGridCount = 6; + this.stripChartX2.AxisY.MajorGridEnabled = true; + this.stripChartX2.AxisY.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX2.AxisY.Maximum = 3.5D; + this.stripChartX2.AxisY.Minimum = 0.5D; + this.stripChartX2.AxisY.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisY.MinorGridEnabled = false; + this.stripChartX2.AxisY.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX2.AxisY.TickWidth = 1F; + this.stripChartX2.AxisY.Title = ""; + this.stripChartX2.AxisY.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX2.AxisY.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX2.AxisY.ViewMaximum = 3.5D; + this.stripChartX2.AxisY.ViewMinimum = 0.5D; + this.stripChartX2.AxisY2.AutoScale = true; + this.stripChartX2.AxisY2.AutoZoomReset = false; + this.stripChartX2.AxisY2.Color = System.Drawing.Color.Black; + this.stripChartX2.AxisY2.InitWithScaleView = false; + this.stripChartX2.AxisY2.IsLogarithmic = false; + this.stripChartX2.AxisY2.LabelAngle = 0; + this.stripChartX2.AxisY2.LabelEnabled = true; + this.stripChartX2.AxisY2.LabelFormat = null; + this.stripChartX2.AxisY2.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisY2.MajorGridCount = 6; + this.stripChartX2.AxisY2.MajorGridEnabled = true; + this.stripChartX2.AxisY2.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX2.AxisY2.Maximum = 3.5D; + this.stripChartX2.AxisY2.Minimum = 0.5D; + this.stripChartX2.AxisY2.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX2.AxisY2.MinorGridEnabled = false; + this.stripChartX2.AxisY2.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX2.AxisY2.TickWidth = 1F; + this.stripChartX2.AxisY2.Title = ""; + this.stripChartX2.AxisY2.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX2.AxisY2.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX2.AxisY2.ViewMaximum = 3.5D; + this.stripChartX2.AxisY2.ViewMinimum = 0.5D; + this.stripChartX2.BackColor = System.Drawing.Color.Transparent; + this.stripChartX2.ChartAreaBackColor = System.Drawing.Color.Empty; + this.stripChartX2.Direction = SeeSharpTools.JY.GUI.StripChartX.ScrollDirection.LeftToRight; + this.stripChartX2.DisplayPoints = 4000; + this.stripChartX2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.stripChartX2.ForeColor = System.Drawing.Color.White; + this.stripChartX2.GradientStyle = SeeSharpTools.JY.GUI.StripChartX.ChartGradientStyle.None; + this.stripChartX2.LegendBackColor = System.Drawing.Color.Transparent; + this.stripChartX2.LegendFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.stripChartX2.LegendForeColor = System.Drawing.Color.White; + this.stripChartX2.LegendVisible = true; + stripChartXSeries1.Color = System.Drawing.Color.Red; + stripChartXSeries1.Marker = SeeSharpTools.JY.GUI.StripChartXSeries.MarkerType.None; + stripChartXSeries1.Name = "Series1"; + stripChartXSeries1.Type = SeeSharpTools.JY.GUI.StripChartXSeries.LineType.FastLine; + stripChartXSeries1.Visible = true; + stripChartXSeries1.Width = SeeSharpTools.JY.GUI.StripChartXSeries.LineWidth.Thin; + stripChartXSeries1.XPlotAxis = SeeSharpTools.JY.GUI.StripChartXAxis.PlotAxis.Primary; + stripChartXSeries1.YPlotAxis = SeeSharpTools.JY.GUI.StripChartXAxis.PlotAxis.Primary; + this.stripChartX2.LineSeries.Add(stripChartXSeries1); + this.stripChartX2.Location = new System.Drawing.Point(550, 378); + this.stripChartX2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.stripChartX2.Miscellaneous.CheckInfinity = false; + this.stripChartX2.Miscellaneous.CheckNaN = false; + this.stripChartX2.Miscellaneous.CheckNegtiveOrZero = false; + this.stripChartX2.Miscellaneous.DirectionChartCount = 3; + this.stripChartX2.Miscellaneous.Fitting = SeeSharpTools.JY.GUI.StripChartX.FitType.Range; + this.stripChartX2.Miscellaneous.MaxSeriesCount = 32; + this.stripChartX2.Miscellaneous.MaxSeriesPointCount = 4000; + this.stripChartX2.Miscellaneous.SplitLayoutColumnInterval = 0F; + this.stripChartX2.Miscellaneous.SplitLayoutDirection = SeeSharpTools.JY.GUI.StripChartXUtility.LayoutDirection.LeftToRight; + this.stripChartX2.Miscellaneous.SplitLayoutRowInterval = 0F; + this.stripChartX2.Miscellaneous.SplitViewAutoLayout = true; + this.stripChartX2.Name = "stripChartX2"; + this.stripChartX2.NextTimeStamp = new System.DateTime(((long)(0))); + this.stripChartX2.ScrollType = SeeSharpTools.JY.GUI.StripChartX.StripScrollType.Cumulation; + this.stripChartX2.SeriesCount = 1; + this.stripChartX2.Size = new System.Drawing.Size(830, 157); + this.stripChartX2.SplitView = false; + this.stripChartX2.StartIndex = 0; + this.stripChartX2.TabIndex = 15; + this.stripChartX2.TimeInterval = System.TimeSpan.Parse("00:00:00"); + this.stripChartX2.TimeStampFormat = null; + this.stripChartX2.XCursor.AutoInterval = true; + this.stripChartX2.XCursor.Color = System.Drawing.Color.DeepSkyBlue; + this.stripChartX2.XCursor.Interval = 0.001D; + this.stripChartX2.XCursor.Mode = SeeSharpTools.JY.GUI.StripChartXCursor.CursorMode.Zoom; + this.stripChartX2.XCursor.SelectionColor = System.Drawing.Color.LightGray; + this.stripChartX2.XCursor.Value = double.NaN; + this.stripChartX2.XDataType = SeeSharpTools.JY.GUI.StripChartX.XAxisDataType.Index; + this.stripChartX2.YCursor.AutoInterval = true; + this.stripChartX2.YCursor.Color = System.Drawing.Color.DeepSkyBlue; + this.stripChartX2.YCursor.Interval = 0.001D; + this.stripChartX2.YCursor.Mode = SeeSharpTools.JY.GUI.StripChartXCursor.CursorMode.Disabled; + this.stripChartX2.YCursor.SelectionColor = System.Drawing.Color.LightGray; + this.stripChartX2.YCursor.Value = double.NaN; + // + // stripChartX3 + // + this.stripChartX3.AxisX.AutoScale = false; + this.stripChartX3.AxisX.AutoZoomReset = false; + this.stripChartX3.AxisX.Color = System.Drawing.Color.Black; + this.stripChartX3.AxisX.InitWithScaleView = false; + this.stripChartX3.AxisX.IsLogarithmic = false; + this.stripChartX3.AxisX.LabelAngle = 0; + this.stripChartX3.AxisX.LabelEnabled = true; + this.stripChartX3.AxisX.LabelFormat = null; + this.stripChartX3.AxisX.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisX.MajorGridCount = 6; + this.stripChartX3.AxisX.MajorGridEnabled = true; + this.stripChartX3.AxisX.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX3.AxisX.Maximum = 1000D; + this.stripChartX3.AxisX.Minimum = 0D; + this.stripChartX3.AxisX.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisX.MinorGridEnabled = false; + this.stripChartX3.AxisX.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX3.AxisX.TickWidth = 1F; + this.stripChartX3.AxisX.Title = ""; + this.stripChartX3.AxisX.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX3.AxisX.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX3.AxisX.ViewMaximum = 1000D; + this.stripChartX3.AxisX.ViewMinimum = 0D; + this.stripChartX3.AxisX2.AutoScale = false; + this.stripChartX3.AxisX2.AutoZoomReset = false; + this.stripChartX3.AxisX2.Color = System.Drawing.Color.Black; + this.stripChartX3.AxisX2.InitWithScaleView = false; + this.stripChartX3.AxisX2.IsLogarithmic = false; + this.stripChartX3.AxisX2.LabelAngle = 0; + this.stripChartX3.AxisX2.LabelEnabled = true; + this.stripChartX3.AxisX2.LabelFormat = null; + this.stripChartX3.AxisX2.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisX2.MajorGridCount = 6; + this.stripChartX3.AxisX2.MajorGridEnabled = true; + this.stripChartX3.AxisX2.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX3.AxisX2.Maximum = 1000D; + this.stripChartX3.AxisX2.Minimum = 0D; + this.stripChartX3.AxisX2.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisX2.MinorGridEnabled = false; + this.stripChartX3.AxisX2.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX3.AxisX2.TickWidth = 1F; + this.stripChartX3.AxisX2.Title = ""; + this.stripChartX3.AxisX2.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX3.AxisX2.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX3.AxisX2.ViewMaximum = 1000D; + this.stripChartX3.AxisX2.ViewMinimum = 0D; + this.stripChartX3.AxisY.AutoScale = true; + this.stripChartX3.AxisY.AutoZoomReset = false; + this.stripChartX3.AxisY.Color = System.Drawing.Color.Black; + this.stripChartX3.AxisY.InitWithScaleView = false; + this.stripChartX3.AxisY.IsLogarithmic = false; + this.stripChartX3.AxisY.LabelAngle = 0; + this.stripChartX3.AxisY.LabelEnabled = true; + this.stripChartX3.AxisY.LabelFormat = null; + this.stripChartX3.AxisY.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisY.MajorGridCount = 6; + this.stripChartX3.AxisY.MajorGridEnabled = true; + this.stripChartX3.AxisY.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX3.AxisY.Maximum = 3.5D; + this.stripChartX3.AxisY.Minimum = 0.5D; + this.stripChartX3.AxisY.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisY.MinorGridEnabled = false; + this.stripChartX3.AxisY.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX3.AxisY.TickWidth = 1F; + this.stripChartX3.AxisY.Title = ""; + this.stripChartX3.AxisY.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX3.AxisY.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX3.AxisY.ViewMaximum = 3.5D; + this.stripChartX3.AxisY.ViewMinimum = 0.5D; + this.stripChartX3.AxisY2.AutoScale = true; + this.stripChartX3.AxisY2.AutoZoomReset = false; + this.stripChartX3.AxisY2.Color = System.Drawing.Color.Black; + this.stripChartX3.AxisY2.InitWithScaleView = false; + this.stripChartX3.AxisY2.IsLogarithmic = false; + this.stripChartX3.AxisY2.LabelAngle = 0; + this.stripChartX3.AxisY2.LabelEnabled = true; + this.stripChartX3.AxisY2.LabelFormat = null; + this.stripChartX3.AxisY2.MajorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisY2.MajorGridCount = 6; + this.stripChartX3.AxisY2.MajorGridEnabled = true; + this.stripChartX3.AxisY2.MajorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.Dash; + this.stripChartX3.AxisY2.Maximum = 3.5D; + this.stripChartX3.AxisY2.Minimum = 0.5D; + this.stripChartX3.AxisY2.MinorGridColor = System.Drawing.Color.Black; + this.stripChartX3.AxisY2.MinorGridEnabled = false; + this.stripChartX3.AxisY2.MinorGridType = SeeSharpTools.JY.GUI.StripChartXAxis.GridStyle.DashDot; + this.stripChartX3.AxisY2.TickWidth = 1F; + this.stripChartX3.AxisY2.Title = ""; + this.stripChartX3.AxisY2.TitleOrientation = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextOrientation.Auto; + this.stripChartX3.AxisY2.TitlePosition = SeeSharpTools.JY.GUI.StripChartXAxis.AxisTextPosition.Center; + this.stripChartX3.AxisY2.ViewMaximum = 3.5D; + this.stripChartX3.AxisY2.ViewMinimum = 0.5D; + this.stripChartX3.BackColor = System.Drawing.Color.Transparent; + this.stripChartX3.ChartAreaBackColor = System.Drawing.Color.Empty; + this.stripChartX3.Direction = SeeSharpTools.JY.GUI.StripChartX.ScrollDirection.LeftToRight; + this.stripChartX3.DisplayPoints = 4000; + this.stripChartX3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.stripChartX3.ForeColor = System.Drawing.Color.White; + this.stripChartX3.GradientStyle = SeeSharpTools.JY.GUI.StripChartX.ChartGradientStyle.None; + this.stripChartX3.LegendBackColor = System.Drawing.Color.Transparent; + this.stripChartX3.LegendFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.stripChartX3.LegendForeColor = System.Drawing.Color.White; + this.stripChartX3.LegendVisible = true; + stripChartXSeries2.Color = System.Drawing.Color.Red; + stripChartXSeries2.Marker = SeeSharpTools.JY.GUI.StripChartXSeries.MarkerType.None; + stripChartXSeries2.Name = "Series1"; + stripChartXSeries2.Type = SeeSharpTools.JY.GUI.StripChartXSeries.LineType.FastLine; + stripChartXSeries2.Visible = true; + stripChartXSeries2.Width = SeeSharpTools.JY.GUI.StripChartXSeries.LineWidth.Thin; + stripChartXSeries2.XPlotAxis = SeeSharpTools.JY.GUI.StripChartXAxis.PlotAxis.Primary; + stripChartXSeries2.YPlotAxis = SeeSharpTools.JY.GUI.StripChartXAxis.PlotAxis.Primary; + this.stripChartX3.LineSeries.Add(stripChartXSeries2); + this.stripChartX3.Location = new System.Drawing.Point(550, 543); + this.stripChartX3.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.stripChartX3.Miscellaneous.CheckInfinity = false; + this.stripChartX3.Miscellaneous.CheckNaN = false; + this.stripChartX3.Miscellaneous.CheckNegtiveOrZero = false; + this.stripChartX3.Miscellaneous.DirectionChartCount = 3; + this.stripChartX3.Miscellaneous.Fitting = SeeSharpTools.JY.GUI.StripChartX.FitType.Range; + this.stripChartX3.Miscellaneous.MaxSeriesCount = 32; + this.stripChartX3.Miscellaneous.MaxSeriesPointCount = 4000; + this.stripChartX3.Miscellaneous.SplitLayoutColumnInterval = 0F; + this.stripChartX3.Miscellaneous.SplitLayoutDirection = SeeSharpTools.JY.GUI.StripChartXUtility.LayoutDirection.LeftToRight; + this.stripChartX3.Miscellaneous.SplitLayoutRowInterval = 0F; + this.stripChartX3.Miscellaneous.SplitViewAutoLayout = true; + this.stripChartX3.Name = "stripChartX3"; + this.stripChartX3.NextTimeStamp = new System.DateTime(((long)(0))); + this.stripChartX3.ScrollType = SeeSharpTools.JY.GUI.StripChartX.StripScrollType.Cumulation; + this.stripChartX3.SeriesCount = 1; + this.stripChartX3.Size = new System.Drawing.Size(830, 180); + this.stripChartX3.SplitView = false; + this.stripChartX3.StartIndex = 0; + this.stripChartX3.TabIndex = 16; + this.stripChartX3.TimeInterval = System.TimeSpan.Parse("00:00:00"); + this.stripChartX3.TimeStampFormat = null; + this.stripChartX3.XCursor.AutoInterval = true; + this.stripChartX3.XCursor.Color = System.Drawing.Color.DeepSkyBlue; + this.stripChartX3.XCursor.Interval = 0.001D; + this.stripChartX3.XCursor.Mode = SeeSharpTools.JY.GUI.StripChartXCursor.CursorMode.Zoom; + this.stripChartX3.XCursor.SelectionColor = System.Drawing.Color.LightGray; + this.stripChartX3.XCursor.Value = double.NaN; + this.stripChartX3.XDataType = SeeSharpTools.JY.GUI.StripChartX.XAxisDataType.Index; + this.stripChartX3.YCursor.AutoInterval = true; + this.stripChartX3.YCursor.Color = System.Drawing.Color.DeepSkyBlue; + this.stripChartX3.YCursor.Interval = 0.001D; + this.stripChartX3.YCursor.Mode = SeeSharpTools.JY.GUI.StripChartXCursor.CursorMode.Disabled; + this.stripChartX3.YCursor.SelectionColor = System.Drawing.Color.LightGray; + this.stripChartX3.YCursor.Value = double.NaN; + // + // trw1 + // + this.trw1.BackColor = System.Drawing.Color.Transparent; + cpkModel1.CA = 0D; + cpkModel1.ChartType = null; + cpkModel1.GroupCP = 0D; + cpkModel1.GroupCPK = 0D; + cpkModel1.GroupCPL = 0D; + cpkModel1.GroupCPU = 0D; + cpkModel1.GroupPPM_LSL = 0D; + cpkModel1.GroupPPM_Total = 0D; + cpkModel1.GroupPPM_USL = 0D; + cpkModel1.GroupSTDEV = 0D; + cpkModel1.MaxValue = 0D; + cpkModel1.MeanVlaue = 0D; + cpkModel1.MeasuredPPM_LSL = 0D; + cpkModel1.MeasuredPPM_Total = 0D; + cpkModel1.MeasuredPPM_USL = 0D; + cpkModel1.MinValue = 0D; + cpkModel1.Neg3Sigma = 0D; + cpkModel1.Pos3Sigma = 0D; + cpkModel1.TotalNumber = 0; + cpkModel1.WholeCP = 0D; + cpkModel1.WholeCPK = 0D; + cpkModel1.WholeCPL = 0D; + cpkModel1.WholeCPU = 0D; + cpkModel1.WholePPM_LSL = 0D; + cpkModel1.WholePPM_Total = 0D; + cpkModel1.WholePPM_USL = 0D; + cpkModel1.WholeSTDEV = 0D; + this.trw1.CPKData = cpkModel1; + this.trw1.CpkPpkAcceptanceValue = 0D; + this.trw1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.trw1.Location = new System.Drawing.Point(5, 315); + this.trw1.LSLs = 0D; + this.trw1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.trw1.Name = "trw1"; + this.trw1.Size = new System.Drawing.Size(526, 415); + this.trw1.SubgroupSize = 5; + this.trw1.TabIndex = 17; + this.trw1.USLs = 0D; + // + // chartControl + // + chartArea1.Name = "ChartArea1"; + this.chartControl.ChartAreas.Add(chartArea1); + legend1.Name = "Legend1"; + this.chartControl.Legends.Add(legend1); + this.chartControl.Location = new System.Drawing.Point(571, 44); + this.chartControl.Name = "chartControl"; + series1.ChartArea = "ChartArea1"; + series1.Legend = "Legend1"; + series1.Name = "Series1"; + this.chartControl.Series.Add(series1); + this.chartControl.Size = new System.Drawing.Size(785, 289); + this.chartControl.TabIndex = 18; + this.chartControl.Text = "chart1"; + // + // FrmCpkCount + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::LargeSquareOne.Properties.Resources.BackGround; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(1392, 734); + this.Controls.Add(this.chartControl); + this.Controls.Add(this.trw1); + this.Controls.Add(this.stripChartX3); + this.Controls.Add(this.stripChartX2); + this.Controls.Add(this.btn_Add); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmCpkCount"; + this.Text = "数据分析"; + this.Load += new System.EventHandler(this.FrmCpkCount_Load); + ((System.ComponentModel.ISupportInitialize)(this.chartControl)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btn_Add; + private SeeSharpTools.JY.GUI.StripChartX stripChartX2; + private SeeSharpTools.JY.GUI.StripChartX stripChartX3; + private trw trw1; + private System.Windows.Forms.DataVisualization.Charting.Chart chartControl; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmCpkCount.cs b/LargeSquareOne/FrmCpkCount.cs new file mode 100644 index 0000000..c43ea0b --- /dev/null +++ b/LargeSquareOne/FrmCpkCount.cs @@ -0,0 +1,493 @@ +using JinYuan.Models; +using Language; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Markup; + +namespace LargeSquareOne +{ + public partial class FrmCpkCount : MultiLanguageForm + { + public FrmCpkCount() + { + InitializeComponent(); + } + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + + + private void FrmCpkCount_Load(object sender, EventArgs e) + { + + } + + private void btn_Add_Click(object sender, EventArgs e) + { + + List data = GetSPCData(); + // 计算Xbar和R + double xbar = CalculateXbar(data); + double r = CalculateR(data); + + // 计算控制限 + double uclXbar = CalculateUCLXbar(data.Count); + double lclXbar = CalculateLCLXbar(data.Count); + double uclR = CalculateUCLR(data.Count); + double lclR = CalculateLCLR(data.Count); + + + // 清空图表 + chartControl.Series.Clear(); + double xmaxValue = Math.Max(xbar, Math.Max(uclXbar, uclR)); + double xminValue = Math.Max(xbar, Math.Max(lclXbar, lclR)); + + chartControl.ChartAreas[0].AxisY.Maximum = xmaxValue + 2; + chartControl.ChartAreas[0].AxisY.Minimum = xminValue + 2; + + //double rmaxValue = Math.Max(r, uclR); + //double rminValue = Math.Max(r, lclR); + + //chartControl.ChartAreas[1].AxisY.Maximum = rmaxValue; + //chartControl.ChartAreas[1].AxisY.Minimum = rminValue; + + // 绘制Xbar-R控制图 + Series seriesXbar = new Series(); + seriesXbar.ChartType = SeriesChartType.Line; + seriesXbar.Name = "Xbar"; + + Series seriesR = new Series(); + seriesR.ChartType = SeriesChartType.Line; + seriesR.Name = "R"; + + + // 添加数据点和控制限 + chartControl.Series.Add(seriesXbar); + chartControl.Series.Add(seriesR); + + + for (int i = 0; i < data.Count; i++) + { + seriesXbar.Points.AddXY(i + 1, xbar); + seriesR.Points.AddXY(i + 1, r); + } + + + } + + + // 假设这是获取SPC数据的方法 + private List GetSPCData() + { + // 返回样本数据的List + // 根据需要修改为实际的获取方法 + return new List { 1.2, 1.3, 1.0, 2.5, 2.2, 2.8, 0.8, 0.9, 1.1 }; + } + + /// + /// 对样本进行分组 + /// + /// + /// + /// + private List> groupedData(List sampleData, int groupSize = 3) + { + List> groupedData = new List>(); + + for (int i = 0; i < sampleData.Count; i += groupSize) + { + List group = sampleData.Skip(i).Take(groupSize).ToList(); + groupedData.Add(group); + } + return groupedData; + } + + + + // 假设这是计算Xbar的方法 + private double CalculateXbar(List data) + { + // 根据输入的样本数据计算Xbar + // 根据需要修改为实际的计算方法 + double sum = 0; + foreach (var value in data) + { + sum += value; + } + return sum / data.Count; + } + + // 假设这是计算R的方法 + private double CalculateR(List data) + { + // 根据输入的样本数据计算R + // 根据需要修改为实际的计算方法 + double max = data[0]; + double min = data[0]; + + foreach (var value in data) + { + if (value > max) + max = value; + if (value < min) + min = value; + } + return max - min; + } + + #region 根据样本大小计算UCL(Xbar) + // 这是计算UCL(Xbar)的方法 + private double CalculateUCLXbar(int sampleSize) + { + // 根据样本大小计算UCL(Xbar) + // 根据需要修改为实际的计算方法 + double Xbar_bar = 0; // 所有样本均值的平均值 + double R_bar = 0; // 所有样本范围的平均值 + double A2 = 0; // 控制系数 + + // 根据样本大小确定控制系数A2 + if (sampleSize <= 25) + { + A2 = 0.577; + } + else if (sampleSize <= 100) + { + A2 = 0.425; + } + else if (sampleSize <= 500) + { + A2 = 0.372; + } + else + { + // 根据需要添加更多样本大小的控制系数A2 + } + + + //对样本进行分组 + List data = GetSPCData(); + + // 计算每个样本的均值和范围 + List sampleMeans = CalculateSampleMeans(groupedData(data)); + List sampleRanges = CalculateSampleRanges(groupedData(data)); + + // 计算所有样本均值的平均值和所有样本范围的平均值 + Xbar_bar = sampleMeans.Average(); + R_bar = sampleRanges.Average(); + + // 计算UCL(Xbar) + double UCL_Xbar = Xbar_bar + (A2 * R_bar); + + return UCL_Xbar; + } + + // 根据需要实现计算样本均值的方法 + private List CalculateSampleMeans(List> sampleData) + { + // 根据样本数据计算每个样本的均值,并返回一个包含所有样本均值的List + // 根据实际的计算方法进行修改 + List sampleMeans = new List(); + + foreach (var sample in sampleData) + { + double sum = 0; + int count = sample.Count; + + foreach (var value in sample) + { + sum += value; + } + + double mean = sum / count; + sampleMeans.Add(mean); + } + + return sampleMeans; + } + + // 根据需要实现计算样本范围的方法 + private List CalculateSampleRanges(List> sampleData) + { + // 根据样本数据计算每个样本的范围,并返回一个包含所有样本范围的List + // 根据实际的计算方法进行修改 + List sampleRanges = new List(); + + foreach (var sample in sampleData) + { + double min = sample.Min(); + double max = sample.Max(); + double range = max - min; + sampleRanges.Add(range); + } + + return sampleRanges; + } + #endregion + + #region 计算LCL(Xbar)的方法 + private double CalculateLCLXbar(int sampleSize) + { + // 根据样本大小计算LCL(Xbar) + // 根据需要修改为实际的计算方法 + + double Xbar_bar = 0; // 所有样本均值的平均值 + double R_bar = 0; // 所有样本范围的平均值 + double A2 = 0; // 控制系数 + + // 根据样本大小确定控制系数A2 + if (sampleSize <= 25) + { + A2 = 0.577; + } + else if (sampleSize <= 100) + { + A2 = 0.425; + } + else if (sampleSize <= 500) + { + A2 = 0.372; + } + else + { + // 根据需要添加更多样本大小的控制系数A2 + } + + //对样本进行分组 + List data = GetSPCData(); + + // 计算每个样本的均值和范围 + List sampleMeans = CalculateSampleMeans(groupedData(data)); + List sampleRanges = CalculateSampleRanges(groupedData(data)); + + // 计算所有样本均值的平均值和所有样本范围的平均值 + Xbar_bar = sampleMeans.Average(); + R_bar = sampleRanges.Average(); + + // 计算LCL(Xbar) + double LCL_Xbar = Xbar_bar - (A2 * R_bar); + + return LCL_Xbar; + } + + /// + /// 根据样本大小选择合适的A2值 + /// + /// + /// + private double GetA2(int sampleSize) + { + double A2 = 0; // 控制系数 + + // + if (sampleSize == 2) + { + A2 = 1.880; + } + else if (sampleSize == 3) + { + A2 = 1.023; + } + else if (sampleSize == 4) + { + A2 = 0.729; + } + else if (sampleSize == 5) + { + A2 = 0.577; + } + else if (sampleSize == 6) + { + A2 = 0.483; + } + else if (sampleSize > 6) + { + A2 = 3 / Math.Sqrt(sampleSize); + } + else + { + // 根据需要添加更多样本大小的A2值 + } + + return A2; + } + #endregion + + #region 计算UCL(R)的方法 + // 假设这是计算UCL(R)的方法 + private double CalculateUCLR(int sampleSize) + { + // 根据样本大小计算UCL(R) + // 根据需要修改为实际的计算方法 + double R_bar = 0; // 所有样本范围的平均值 + double D4 = 0; // 控制系数 + + // 根据样本大小确定控制系数D4 + D4 = GetD4(sampleSize); + + //对样本进行分组 + List data = GetSPCData(); + // 计算每个样本的范围 + List sampleRanges = CalculateSampleRanges(groupedData(data)); + + // 计算所有样本范围的平均值 + R_bar = sampleRanges.Average(); + + // 计算UCL(R) + double UCL_R = D4 * R_bar; + + return UCL_R; + } + + + #region 控制系数D4计算 + + //如果样本大小大于或等于2,但小于等于8,那么D4的值为2.282。 + //如果样本大小大于8,但小于等于10,那么D4的值为2.115。 + //如果样本大小大于10,但小于等于15,那么D4的值为2.004。 + //如果样本大小大于15,但小于等于20,那么D4的值为1.924。 + //如果样本大小大于20,但小于等于25,那么D4的值为1.864。 + //如果样本大小大于25,但小于等于30,那么D4的值为1.816。 + //对于更大的样本大小,您可以在SPC的相关文献或标准表中查找合适的D4的值。 + private double GetD4(int sampleSize) + { + double D4 = 0; // 控制系数 + + // 根据样本大小选择合适的D4值 + if (sampleSize >= 2 && sampleSize <= 8) + { + D4 = 2.282; + } + else if (sampleSize > 8 && sampleSize <= 10) + { + D4 = 2.115; + } + else if (sampleSize > 10 && sampleSize <= 15) + { + D4 = 2.004; + } + else if (sampleSize > 15 && sampleSize <= 20) + { + D4 = 1.924; + } + else if (sampleSize > 20 && sampleSize <= 25) + { + D4 = 1.864; + } + else if (sampleSize > 25 && sampleSize <= 30) + { + D4 = 1.816; + } + else + { + // 对于更大的样本大小,根据需要添加更多D4的值 + } + + return D4; + } + #endregion + + #endregion + + #region 计算LCL(R)的方法 + private double CalculateLCLR(int sampleSize) + { + // 根据样本大小计算LCL(R) + // 根据需要修改为实际的计算方法 + double R_bar = 0; // 所有样本范围的平均值 + double D3 = 0; // 控制系数 + + // 根据样本大小确定控制系数D3 + D3 = GetD3(sampleSize); + + //对样本进行分组 + List data = GetSPCData(); + // 计算每个样本的范围 + List sampleRanges = CalculateSampleRanges(groupedData(data)); + + // 计算所有样本范围的平均值 + R_bar = sampleRanges.Average(); + + // 计算LCL(R) + double LCL_R = D3 * R_bar; + + return LCL_R; + } + + /// + /// 根据样本大小选择合适的D3值 + /// + /// + /// + /// + ///如果样本大小大于或等于2,但小于等于6,那么D3的值为0。 + //如果样本大小为7,那么D3的值为0。 + //如果样本大小大于7,但小于等于8,那么D3的值为0.076。 + //如果样本大小大于8,但小于等于10,那么D3的值为0.136。 + //如果样本大小大于10,但小于等于12,那么D3的值为0.184。 + //如果样本大小大于12,但小于等于16,那么D3的值为0.223。 + //如果样本大小大于16,但小于等于20,那么D3的值为0.251。 + //如果样本大小大于20,但小于等于25,那么D3的值为0.277。 + //对于更大的样本大小,您可以在SPC的相关文献或标准表中查找合适的D3的值。 + private double GetD3(int sampleSize) + { + double D3 = 0; // 控制系数 + if (sampleSize >= 2 && sampleSize <= 6) + { + D3 = 0; + } + else if (sampleSize == 7) + { + D3 = 0; + } + else if (sampleSize > 7 && sampleSize <= 8) + { + D3 = 0.076; + } + else if (sampleSize > 8 && sampleSize <= 10) + { + D3 = 0.136; + } + else if (sampleSize > 10 && sampleSize <= 12) + { + D3 = 0.184; + } + else if (sampleSize > 12 && sampleSize <= 16) + { + D3 = 0.223; + } + else if (sampleSize > 16 && sampleSize <= 20) + { + D3 = 0.251; + } + else if (sampleSize > 20 && sampleSize <= 25) + { + D3 = 0.277; + } + else + { + // 对于更大的样本大小,根据需要添加更多D3的值 + } + + return D3; + } + #endregion + } +} diff --git a/LargeSquareOne/FrmCpkCount.resx b/LargeSquareOne/FrmCpkCount.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/FrmCpkCount.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmDataMonitor.Designer.cs b/LargeSquareOne/FrmDataMonitor.Designer.cs new file mode 100644 index 0000000..ed90ce2 --- /dev/null +++ b/LargeSquareOne/FrmDataMonitor.Designer.cs @@ -0,0 +1,943 @@ +namespace LargeSquareOne +{ + partial class FrmDataMonitor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmDataMonitor)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = 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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle10 = new System.Windows.Forms.DataGridViewCellStyle(); + this.imageList1 = new System.Windows.Forms.ImageList(this.components); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.groupBoxEX5 = new JinYuan.ControlLib.GroupBoxEX(); + this.dgvBlankingData = new System.Windows.Forms.DataGridView(); + this.OutChannelNo = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OutTestTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OutPalletCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OutWeight = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OutResult = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OutRemark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBoxEX4 = new JinYuan.ControlLib.GroupBoxEX(); + this.dgvFeedingData = new System.Windows.Forms.DataGridView(); + this.InTestTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.InContainerCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.InPalletCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.InResult = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.InRemark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBoxEX1 = new JinYuan.ControlLib.GroupBoxEX(); + this.groupBoxEX2 = new JinYuan.ControlLib.GroupBoxEX(); + this.lVConfigRange = new System.Windows.Forms.ListView(); + this.clParaName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.clMin = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.clMax = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cUint = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.rtb_Info = new System.Windows.Forms.RichTextBox(); + this.groupBoxEX7 = new JinYuan.ControlLib.GroupBoxEX(); + this.dgvPrintContainerData = new System.Windows.Forms.DataGridView(); + this.TestTime = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ContainerCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Result = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Remark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBoxEX8 = new JinYuan.ControlLib.GroupBoxEX(); + this.dgvPrintPalletData = new System.Windows.Forms.DataGridView(); + this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PalletCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.printPalletResult = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.printpalletRemark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBoxEX3 = new JinYuan.ControlLib.GroupBoxEX(); + this.lbl_palletcode = new System.Windows.Forms.Label(); + this.txt_palletcode = new System.Windows.Forms.TextBox(); + this.label_containercode = new System.Windows.Forms.Label(); + this.txt_containercode = new System.Windows.Forms.TextBox(); + this.btn_printpallet = new System.Windows.Forms.Button(); + this.btn_printContainer = new System.Windows.Forms.Button(); + this.groupBoxEX6 = new JinYuan.ControlLib.GroupBoxEX(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.tableLayoutPanel1.SuspendLayout(); + this.groupBoxEX5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvBlankingData)).BeginInit(); + this.groupBoxEX4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvFeedingData)).BeginInit(); + this.groupBoxEX1.SuspendLayout(); + this.groupBoxEX2.SuspendLayout(); + this.groupBoxEX7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPrintContainerData)).BeginInit(); + this.groupBoxEX8.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPrintPalletData)).BeginInit(); + this.groupBoxEX3.SuspendLayout(); + this.groupBoxEX6.SuspendLayout(); + this.SuspendLayout(); + // + // imageList1 + // + this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); + this.imageList1.TransparentColor = System.Drawing.Color.Transparent; + this.imageList1.Images.SetKeyName(0, "info.png"); + this.imageList1.Images.SetKeyName(1, "error.png"); + this.imageList1.Images.SetKeyName(2, "warning.png"); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.BackColor = System.Drawing.Color.Transparent; + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35.59887F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.40114F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 1252F)); + this.tableLayoutPanel1.Controls.Add(this.groupBoxEX5, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.groupBoxEX4, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.groupBoxEX1, 0, 0); + //this.tableLayoutPanel1.Controls.Add(this.groupBoxEX7, 1, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + //this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1942, 1022); + this.tableLayoutPanel1.TabIndex = 0; + // + // groupBoxEX5 + // + this.groupBoxEX5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tableLayoutPanel1.SetColumnSpan(this.groupBoxEX5, 2); + this.groupBoxEX5.Controls.Add(this.dgvBlankingData); + this.groupBoxEX5.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEX5.ForeColor = System.Drawing.Color.White; + this.groupBoxEX5.Location = new System.Drawing.Point(261, 686); + this.groupBoxEX5.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX5.Name = "groupBoxEX5"; + this.groupBoxEX5.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX5.Size = new System.Drawing.Size(1675, 330); + this.groupBoxEX5.TabIndex = 17; + this.groupBoxEX5.TabStop = false; + this.groupBoxEX5.Text = "包装箱出站"; + // + // dgvBlankingData + // + this.dgvBlankingData.AllowUserToAddRows = false; + this.dgvBlankingData.AllowUserToDeleteRows = false; + this.dgvBlankingData.AllowUserToResizeColumns = false; + this.dgvBlankingData.AllowUserToResizeRows = false; + this.dgvBlankingData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgvBlankingData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvBlankingData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvBlankingData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvBlankingData.ColumnHeadersHeight = 35; + this.dgvBlankingData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvBlankingData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.OutChannelNo, + this.OutTestTime, + this.OutPalletCode, + this.OutWeight, + this.OutResult, + this.OutRemark}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvBlankingData.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvBlankingData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvBlankingData.EnableHeadersVisualStyles = false; + this.dgvBlankingData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvBlankingData.Location = new System.Drawing.Point(6, 30); + this.dgvBlankingData.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.dgvBlankingData.MultiSelect = false; + this.dgvBlankingData.Name = "dgvBlankingData"; + this.dgvBlankingData.ReadOnly = true; + this.dgvBlankingData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvBlankingData.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvBlankingData.RowHeadersWidth = 50; + this.dgvBlankingData.RowTemplate.Height = 23; + this.dgvBlankingData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvBlankingData.Size = new System.Drawing.Size(1663, 294); + this.dgvBlankingData.TabIndex = 12; + // + // OutChannelNo + // + this.OutChannelNo.DataPropertyName = "ChannelNo"; + this.OutChannelNo.HeaderText = "通道"; + this.OutChannelNo.MinimumWidth = 6; + this.OutChannelNo.Name = "OutChannelNo"; + this.OutChannelNo.ReadOnly = true; + this.OutChannelNo.Width = 75; + // + // OutTestTime + // + this.OutTestTime.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.OutTestTime.DataPropertyName = "TestTime"; + this.OutTestTime.HeaderText = "时间"; + this.OutTestTime.MinimumWidth = 6; + this.OutTestTime.Name = "OutTestTime"; + this.OutTestTime.ReadOnly = true; + this.OutTestTime.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.OutTestTime.Width = 51; + // + // OutPalletCode + // + this.OutPalletCode.DataPropertyName = "PalletCode"; + this.OutPalletCode.HeaderText = "栈板码"; + this.OutPalletCode.MinimumWidth = 6; + this.OutPalletCode.Name = "OutPalletCode"; + this.OutPalletCode.ReadOnly = true; + this.OutPalletCode.Width = 180; + // + // OutWeight + // + this.OutWeight.DataPropertyName = "Weight"; + this.OutWeight.HeaderText = "重量"; + this.OutWeight.MinimumWidth = 6; + this.OutWeight.Name = "OutWeight"; + this.OutWeight.ReadOnly = true; + // + // OutResult + // + this.OutResult.DataPropertyName = "Result"; + this.OutResult.HeaderText = "综合结果"; + this.OutResult.MinimumWidth = 6; + this.OutResult.Name = "OutResult"; + this.OutResult.ReadOnly = true; + this.OutResult.Width = 80; + // + // OutRemark + // + this.OutRemark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.OutRemark.DataPropertyName = "Remark"; + this.OutRemark.HeaderText = "备注"; + this.OutRemark.MinimumWidth = 6; + this.OutRemark.Name = "OutRemark"; + this.OutRemark.ReadOnly = true; + this.OutRemark.Width = 74; + // + // groupBoxEX4 + // + this.groupBoxEX4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tableLayoutPanel1.SetColumnSpan(this.groupBoxEX4, 2); + this.groupBoxEX4.Controls.Add(this.dgvFeedingData); + this.groupBoxEX4.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEX4.ForeColor = System.Drawing.Color.White; + this.groupBoxEX4.Location = new System.Drawing.Point(261, 6); + this.groupBoxEX4.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX4.Name = "groupBoxEX4"; + this.groupBoxEX4.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX4.Size = new System.Drawing.Size(1675, 328); + this.groupBoxEX4.TabIndex = 15; + this.groupBoxEX4.TabStop = false; + this.groupBoxEX4.Text = "包装箱进站"; + // + // dgvFeedingData + // + this.dgvFeedingData.AllowUserToAddRows = false; + this.dgvFeedingData.AllowUserToDeleteRows = false; + this.dgvFeedingData.AllowUserToResizeColumns = false; + this.dgvFeedingData.AllowUserToResizeRows = false; + this.dgvFeedingData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgvFeedingData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvFeedingData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle4.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle4.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvFeedingData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + this.dgvFeedingData.ColumnHeadersHeight = 35; + this.dgvFeedingData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvFeedingData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.InTestTime, + this.InContainerCode, + this.InPalletCode, + this.InResult, + this.InRemark}); + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle5.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle5.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvFeedingData.DefaultCellStyle = dataGridViewCellStyle5; + this.dgvFeedingData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvFeedingData.EnableHeadersVisualStyles = false; + this.dgvFeedingData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvFeedingData.Location = new System.Drawing.Point(6, 30); + this.dgvFeedingData.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.dgvFeedingData.MultiSelect = false; + this.dgvFeedingData.Name = "dgvFeedingData"; + this.dgvFeedingData.ReadOnly = true; + this.dgvFeedingData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle6.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle6.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvFeedingData.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.dgvFeedingData.RowHeadersWidth = 45; + this.dgvFeedingData.RowTemplate.Height = 23; + this.dgvFeedingData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvFeedingData.Size = new System.Drawing.Size(1663, 292); + this.dgvFeedingData.TabIndex = 9; + // + // InTestTime + // + this.InTestTime.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.InTestTime.DataPropertyName = "TestTime"; + this.InTestTime.HeaderText = "时间"; + this.InTestTime.MinimumWidth = 6; + this.InTestTime.Name = "InTestTime"; + this.InTestTime.ReadOnly = true; + this.InTestTime.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.InTestTime.Width = 51; + // + // InContainerCode + // + this.InContainerCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.InContainerCode.DataPropertyName = "ContainerCode"; + this.InContainerCode.HeaderText = "箱唛码"; + this.InContainerCode.MinimumWidth = 6; + this.InContainerCode.Name = "InContainerCode"; + this.InContainerCode.ReadOnly = true; + this.InContainerCode.Width = 92; + // + // InPalletCode + // + this.InPalletCode.DataPropertyName = "PalletCode"; + this.InPalletCode.HeaderText = "栈板码"; + this.InPalletCode.MinimumWidth = 6; + this.InPalletCode.Name = "InPalletCode"; + this.InPalletCode.ReadOnly = true; + this.InPalletCode.Width = 125; + // + // InResult + // + this.InResult.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.InResult.DataPropertyName = "Result"; + this.InResult.HeaderText = "结果"; + this.InResult.MinimumWidth = 6; + this.InResult.Name = "InResult"; + this.InResult.ReadOnly = true; + this.InResult.Width = 74; + // + // InRemark + // + this.InRemark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.InRemark.DataPropertyName = "Remark"; + this.InRemark.HeaderText = "备注"; + this.InRemark.MinimumWidth = 6; + this.InRemark.Name = "InRemark"; + this.InRemark.ReadOnly = true; + this.InRemark.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.InRemark.Width = 51; + // + // groupBoxEX1 + // + this.groupBoxEX1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.groupBoxEX1.Controls.Add(this.groupBoxEX2); + this.groupBoxEX1.Controls.Add(this.rtb_Info); + this.groupBoxEX1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEX1.ForeColor = System.Drawing.Color.White; + this.groupBoxEX1.Location = new System.Drawing.Point(6, 6); + this.groupBoxEX1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX1.Name = "groupBoxEX1"; + this.groupBoxEX1.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.tableLayoutPanel1.SetRowSpan(this.groupBoxEX1, 3); + this.groupBoxEX1.Size = new System.Drawing.Size(243, 1010); + this.groupBoxEX1.TabIndex = 12; + this.groupBoxEX1.TabStop = false; + this.groupBoxEX1.Text = "日志记录"; + // + // groupBoxEX2 + // + this.groupBoxEX2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.groupBoxEX2.Controls.Add(this.lVConfigRange); + this.groupBoxEX2.ForeColor = System.Drawing.Color.White; + this.groupBoxEX2.Location = new System.Drawing.Point(11, 696); + this.groupBoxEX2.Margin = new System.Windows.Forms.Padding(2); + this.groupBoxEX2.Name = "groupBoxEX2"; + this.groupBoxEX2.Padding = new System.Windows.Forms.Padding(2); + this.groupBoxEX2.Size = new System.Drawing.Size(349, 114); + this.groupBoxEX2.TabIndex = 13; + this.groupBoxEX2.TabStop = false; + this.groupBoxEX2.Text = "参数"; + this.groupBoxEX2.Visible = false; + // + // lVConfigRange + // + this.lVConfigRange.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.lVConfigRange.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.lVConfigRange.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.clParaName, + this.clMin, + this.clMax, + this.cUint}); + this.lVConfigRange.Dock = System.Windows.Forms.DockStyle.Fill; + this.lVConfigRange.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lVConfigRange.ForeColor = System.Drawing.Color.White; + this.lVConfigRange.HideSelection = false; + this.lVConfigRange.Location = new System.Drawing.Point(2, 26); + this.lVConfigRange.Margin = new System.Windows.Forms.Padding(2); + this.lVConfigRange.Name = "lVConfigRange"; + this.lVConfigRange.OwnerDraw = true; + this.lVConfigRange.Size = new System.Drawing.Size(345, 86); + this.lVConfigRange.TabIndex = 2; + this.lVConfigRange.UseCompatibleStateImageBehavior = false; + this.lVConfigRange.View = System.Windows.Forms.View.Details; + this.lVConfigRange.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(this.lVConfigRange_DrawColumnHeader); + this.lVConfigRange.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.lVConfigRange_DrawItem); + this.lVConfigRange.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.lVConfigRange_DrawSubItem); + // + // clParaName + // + this.clParaName.Text = "参数项"; + this.clParaName.Width = 105; + // + // clMin + // + this.clMin.Text = "最小值"; + this.clMin.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.clMin.Width = 83; + // + // clMax + // + this.clMax.Text = "最大值"; + this.clMax.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.clMax.Width = 83; + // + // cUint + // + this.cUint.Text = "单位"; + this.cUint.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.cUint.Width = 42; + // + // rtb_Info + // + this.rtb_Info.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.rtb_Info.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.rtb_Info.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtb_Info.ForeColor = System.Drawing.Color.White; + this.rtb_Info.Location = new System.Drawing.Point(6, 30); + this.rtb_Info.Margin = new System.Windows.Forms.Padding(2); + this.rtb_Info.Name = "rtb_Info"; + this.rtb_Info.ReadOnly = true; + this.rtb_Info.Size = new System.Drawing.Size(231, 974); + this.rtb_Info.TabIndex = 1; + this.rtb_Info.Text = ""; + // + // groupBoxEX7 + // + this.groupBoxEX7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX7.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tableLayoutPanel1.SetColumnSpan(this.groupBoxEX7, 2); + this.groupBoxEX7.Controls.Add(this.dgvPrintContainerData); + this.groupBoxEX7.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEX7.ForeColor = System.Drawing.Color.White; + this.groupBoxEX7.Location = new System.Drawing.Point(261, 346); + this.groupBoxEX7.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX7.Name = "groupBoxEX7"; + this.groupBoxEX7.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.groupBoxEX7.Size = new System.Drawing.Size(1675, 328); + this.groupBoxEX7.TabIndex = 18; + this.groupBoxEX7.TabStop = false; + this.groupBoxEX7.Text = "箱唛标签打印"; + this.groupBoxEX7.Visible = false; + // + // dgvPrintContainerData + // + this.dgvPrintContainerData.AllowUserToAddRows = false; + this.dgvPrintContainerData.AllowUserToDeleteRows = false; + this.dgvPrintContainerData.AllowUserToResizeColumns = false; + this.dgvPrintContainerData.AllowUserToResizeRows = false; + this.dgvPrintContainerData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgvPrintContainerData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvPrintContainerData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle7.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle7.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPrintContainerData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; + this.dgvPrintContainerData.ColumnHeadersHeight = 35; + this.dgvPrintContainerData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvPrintContainerData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.TestTime, + this.ContainerCode, + this.Result, + this.Remark}); + this.dgvPrintContainerData.DefaultCellStyle = dataGridViewCellStyle5; + this.dgvPrintContainerData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvPrintContainerData.EnableHeadersVisualStyles = false; + this.dgvPrintContainerData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvPrintContainerData.Location = new System.Drawing.Point(6, 30); + this.dgvPrintContainerData.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.dgvPrintContainerData.MultiSelect = false; + this.dgvPrintContainerData.Name = "dgvPrintContainerData"; + this.dgvPrintContainerData.ReadOnly = true; + this.dgvPrintContainerData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + this.dgvPrintContainerData.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.dgvPrintContainerData.RowHeadersWidth = 50; + this.dgvPrintContainerData.RowTemplate.Height = 23; + this.dgvPrintContainerData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvPrintContainerData.Size = new System.Drawing.Size(1663, 292); + this.dgvPrintContainerData.TabIndex = 13; + this.dgvPrintContainerData.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvPrintContainerData_RowPostPaint); + this.dgvPrintContainerData.RowPrePaint += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(this.dgvPrintContainerData_RowPrePaint); + // + // TestTime + // + this.TestTime.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.TestTime.DataPropertyName = "TestTime"; + this.TestTime.HeaderText = "时间"; + this.TestTime.MinimumWidth = 6; + this.TestTime.Name = "TestTime"; + this.TestTime.ReadOnly = true; + this.TestTime.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.TestTime.Width = 51; + // + // ContainerCode + // + this.ContainerCode.DataPropertyName = "ContainerCode"; + this.ContainerCode.HeaderText = "箱唛码"; + this.ContainerCode.MinimumWidth = 6; + this.ContainerCode.Name = "ContainerCode"; + this.ContainerCode.ReadOnly = true; + this.ContainerCode.Width = 180; + // + // Result + // + this.Result.DataPropertyName = "Result"; + this.Result.HeaderText = "结果"; + this.Result.MinimumWidth = 6; + this.Result.Name = "Result"; + this.Result.ReadOnly = true; + this.Result.Width = 80; + // + // Remark + // + this.Remark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.Remark.DataPropertyName = "Remark"; + this.Remark.HeaderText = "备注"; + this.Remark.MinimumWidth = 6; + this.Remark.Name = "Remark"; + this.Remark.ReadOnly = true; + this.Remark.Width = 74; + // + // groupBoxEX8 + // + this.groupBoxEX8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX8.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.groupBoxEX8.Controls.Add(this.dgvPrintPalletData); + this.groupBoxEX8.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEX8.ForeColor = System.Drawing.Color.White; + this.groupBoxEX8.Location = new System.Drawing.Point(327, 537); + this.groupBoxEX8.Margin = new System.Windows.Forms.Padding(5); + this.groupBoxEX8.Name = "groupBoxEX8"; + this.groupBoxEX8.Padding = new System.Windows.Forms.Padding(5); + this.groupBoxEX8.Size = new System.Drawing.Size(1538, 258); + this.groupBoxEX8.TabIndex = 19; + this.groupBoxEX8.TabStop = false; + this.groupBoxEX8.Text = "栈板标签打印"; + this.groupBoxEX8.Visible = false; + // + // dgvPrintPalletData + // + this.dgvPrintPalletData.AllowUserToAddRows = false; + this.dgvPrintPalletData.AllowUserToDeleteRows = false; + this.dgvPrintPalletData.AllowUserToResizeColumns = false; + this.dgvPrintPalletData.AllowUserToResizeRows = false; + this.dgvPrintPalletData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.dgvPrintPalletData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvPrintPalletData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle8.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle8.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPrintPalletData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle8; + this.dgvPrintPalletData.ColumnHeadersHeight = 35; + this.dgvPrintPalletData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvPrintPalletData.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.dataGridViewTextBoxColumn1, + this.PalletCode, + this.printPalletResult, + this.printpalletRemark}); + dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle9.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle9.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle9.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle9.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPrintPalletData.DefaultCellStyle = dataGridViewCellStyle9; + this.dgvPrintPalletData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvPrintPalletData.EnableHeadersVisualStyles = false; + this.dgvPrintPalletData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvPrintPalletData.Location = new System.Drawing.Point(5, 23); + this.dgvPrintPalletData.Margin = new System.Windows.Forms.Padding(4); + this.dgvPrintPalletData.MultiSelect = false; + this.dgvPrintPalletData.Name = "dgvPrintPalletData"; + this.dgvPrintPalletData.ReadOnly = true; + this.dgvPrintPalletData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle10.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle10.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle10.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle10.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle10.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle10.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle10.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPrintPalletData.RowHeadersDefaultCellStyle = dataGridViewCellStyle10; + this.dgvPrintPalletData.RowHeadersWidth = 50; + this.dgvPrintPalletData.RowTemplate.Height = 23; + this.dgvPrintPalletData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvPrintPalletData.Size = new System.Drawing.Size(1528, 230); + this.dgvPrintPalletData.TabIndex = 13; + this.dgvPrintPalletData.Visible = false; + // + // dataGridViewTextBoxColumn1 + // + this.dataGridViewTextBoxColumn1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.dataGridViewTextBoxColumn1.DataPropertyName = "TestTime"; + this.dataGridViewTextBoxColumn1.HeaderText = "时间"; + this.dataGridViewTextBoxColumn1.MinimumWidth = 6; + this.dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; + this.dataGridViewTextBoxColumn1.ReadOnly = true; + this.dataGridViewTextBoxColumn1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.dataGridViewTextBoxColumn1.Width = 51; + // + // PalletCode + // + this.PalletCode.DataPropertyName = "PalletCode"; + this.PalletCode.HeaderText = "栈板码"; + this.PalletCode.MinimumWidth = 6; + this.PalletCode.Name = "PalletCode"; + this.PalletCode.ReadOnly = true; + this.PalletCode.Width = 180; + // + // printPalletResult + // + this.printPalletResult.DataPropertyName = "Result"; + this.printPalletResult.HeaderText = "结果"; + this.printPalletResult.MinimumWidth = 6; + this.printPalletResult.Name = "printPalletResult"; + this.printPalletResult.ReadOnly = true; + this.printPalletResult.Width = 80; + // + // printpalletRemark + // + this.printpalletRemark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.printpalletRemark.DataPropertyName = "Remark"; + this.printpalletRemark.HeaderText = "备注"; + this.printpalletRemark.MinimumWidth = 6; + this.printpalletRemark.Name = "printpalletRemark"; + this.printpalletRemark.ReadOnly = true; + this.printpalletRemark.Width = 74; + // + // groupBoxEX3 + // + this.groupBoxEX3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.groupBoxEX3.Controls.Add(this.lbl_palletcode); + this.groupBoxEX3.Controls.Add(this.txt_palletcode); + this.groupBoxEX3.Controls.Add(this.label_containercode); + this.groupBoxEX3.Controls.Add(this.txt_containercode); + this.groupBoxEX3.Controls.Add(this.btn_printpallet); + this.groupBoxEX3.Controls.Add(this.btn_printContainer); + this.groupBoxEX3.Controls.Add(this.groupBoxEX6); + this.groupBoxEX3.Controls.Add(this.richTextBox1); + this.groupBoxEX3.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEX3.ForeColor = System.Drawing.Color.White; + this.groupBoxEX3.Location = new System.Drawing.Point(2, 2); + this.groupBoxEX3.Margin = new System.Windows.Forms.Padding(2); + this.groupBoxEX3.Name = "groupBoxEX3"; + this.groupBoxEX3.Padding = new System.Windows.Forms.Padding(2); + this.groupBoxEX3.Size = new System.Drawing.Size(292, 465); + this.groupBoxEX3.TabIndex = 20; + this.groupBoxEX3.TabStop = false; + this.groupBoxEX3.Text = "补打标签"; + this.groupBoxEX3.Visible = false; + // + // lbl_palletcode + // + this.lbl_palletcode.AutoSize = true; + this.lbl_palletcode.Location = new System.Drawing.Point(21, 228); + this.lbl_palletcode.Name = "lbl_palletcode"; + this.lbl_palletcode.Size = new System.Drawing.Size(52, 15); + this.lbl_palletcode.TabIndex = 19; + this.lbl_palletcode.Text = "栈板码"; + // + // txt_palletcode + // + this.txt_palletcode.Location = new System.Drawing.Point(25, 269); + this.txt_palletcode.Name = "txt_palletcode"; + this.txt_palletcode.Size = new System.Drawing.Size(245, 25); + this.txt_palletcode.TabIndex = 18; + // + // label_containercode + // + this.label_containercode.AutoSize = true; + this.label_containercode.Location = new System.Drawing.Point(21, 69); + this.label_containercode.Name = "label_containercode"; + this.label_containercode.Size = new System.Drawing.Size(52, 15); + this.label_containercode.TabIndex = 17; + this.label_containercode.Text = "箱唛码"; + // + // txt_containercode + // + this.txt_containercode.Location = new System.Drawing.Point(25, 96); + this.txt_containercode.Name = "txt_containercode"; + this.txt_containercode.Size = new System.Drawing.Size(245, 25); + this.txt_containercode.TabIndex = 16; + // + // btn_printpallet + // + this.btn_printpallet.ForeColor = System.Drawing.Color.Black; + this.btn_printpallet.Location = new System.Drawing.Point(133, 317); + this.btn_printpallet.Name = "btn_printpallet"; + this.btn_printpallet.Size = new System.Drawing.Size(137, 31); + this.btn_printpallet.TabIndex = 15; + this.btn_printpallet.Text = "打印栈板标签"; + this.btn_printpallet.UseVisualStyleBackColor = true; + this.btn_printpallet.Visible = false; + // + // btn_printContainer + // + this.btn_printContainer.ForeColor = System.Drawing.Color.Black; + this.btn_printContainer.Location = new System.Drawing.Point(133, 145); + this.btn_printContainer.Name = "btn_printContainer"; + this.btn_printContainer.Size = new System.Drawing.Size(137, 31); + this.btn_printContainer.TabIndex = 14; + this.btn_printContainer.Text = "打印箱唛标签"; + this.btn_printContainer.UseVisualStyleBackColor = true; + this.btn_printContainer.Visible = false; + // + // groupBoxEX6 + // + this.groupBoxEX6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.groupBoxEX6.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.groupBoxEX6.Controls.Add(this.listView1); + this.groupBoxEX6.ForeColor = System.Drawing.Color.White; + this.groupBoxEX6.Location = new System.Drawing.Point(9, 557); + this.groupBoxEX6.Margin = new System.Windows.Forms.Padding(2); + this.groupBoxEX6.Name = "groupBoxEX6"; + this.groupBoxEX6.Padding = new System.Windows.Forms.Padding(2); + this.groupBoxEX6.Size = new System.Drawing.Size(279, 91); + this.groupBoxEX6.TabIndex = 13; + this.groupBoxEX6.TabStop = false; + this.groupBoxEX6.Text = "参数"; + this.groupBoxEX6.Visible = false; + // + // listView1 + // + this.listView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader4}); + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.listView1.ForeColor = System.Drawing.Color.White; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(2, 20); + this.listView1.Margin = new System.Windows.Forms.Padding(2); + this.listView1.Name = "listView1"; + this.listView1.OwnerDraw = true; + this.listView1.Size = new System.Drawing.Size(275, 69); + this.listView1.TabIndex = 2; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "参数项"; + this.columnHeader1.Width = 105; + // + // columnHeader2 + // + this.columnHeader2.Text = "最小值"; + this.columnHeader2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.columnHeader2.Width = 83; + // + // columnHeader3 + // + this.columnHeader3.Text = "最大值"; + this.columnHeader3.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.columnHeader3.Width = 83; + // + // columnHeader4 + // + this.columnHeader4.Text = "单位"; + this.columnHeader4.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.columnHeader4.Width = 42; + // + // richTextBox1 + // + this.richTextBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox1.ForeColor = System.Drawing.Color.White; + this.richTextBox1.Location = new System.Drawing.Point(2, 20); + this.richTextBox1.Margin = new System.Windows.Forms.Padding(2); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.ReadOnly = true; + this.richTextBox1.Size = new System.Drawing.Size(288, 443); + this.richTextBox1.TabIndex = 1; + this.richTextBox1.Text = ""; + // + // FrmDataMonitor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(1942, 1022); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.Name = "FrmDataMonitor"; + this.Text = "数据监控"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Load += new System.EventHandler(this.FrmDataMonitor_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.groupBoxEX5.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvBlankingData)).EndInit(); + this.groupBoxEX4.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvFeedingData)).EndInit(); + this.groupBoxEX1.ResumeLayout(false); + this.groupBoxEX2.ResumeLayout(false); + this.groupBoxEX7.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvPrintContainerData)).EndInit(); + this.groupBoxEX8.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvPrintPalletData)).EndInit(); + this.groupBoxEX3.ResumeLayout(false); + this.groupBoxEX3.PerformLayout(); + this.groupBoxEX6.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.ColumnHeader clMin; + private System.Windows.Forms.ColumnHeader clMax; + private System.Windows.Forms.ColumnHeader cUint; + private System.Windows.Forms.ListView lVConfigRange; + private System.Windows.Forms.ColumnHeader clParaName; + private System.Windows.Forms.ImageList imageList1; + private System.Windows.Forms.RichTextBox rtb_Info; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX1; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX2; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX4; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX5; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX7; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX8; + public System.Windows.Forms.DataGridView dgvPrintContainerData; + public System.Windows.Forms.DataGridView dgvPrintPalletData; + public System.Windows.Forms.DataGridView dgvFeedingData; + public System.Windows.Forms.DataGridView dgvBlankingData; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn7; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn9; + private System.Windows.Forms.DataGridViewTextBoxColumn OutChannelNo; + private System.Windows.Forms.DataGridViewTextBoxColumn OutTestTime; + private System.Windows.Forms.DataGridViewTextBoxColumn OutPalletCode; + private System.Windows.Forms.DataGridViewTextBoxColumn OutResult; + private System.Windows.Forms.DataGridViewTextBoxColumn OutWeight; + private System.Windows.Forms.DataGridViewTextBoxColumn OutRemark; + private System.Windows.Forms.DataGridViewTextBoxColumn InTestTime; + private System.Windows.Forms.DataGridViewTextBoxColumn InContainerCode; + private System.Windows.Forms.DataGridViewTextBoxColumn InPalletCode; + private System.Windows.Forms.DataGridViewTextBoxColumn InResult; + private System.Windows.Forms.DataGridViewTextBoxColumn InRemark; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; + private System.Windows.Forms.DataGridViewTextBoxColumn PalletCode; + private System.Windows.Forms.DataGridViewTextBoxColumn printPalletResult; + private System.Windows.Forms.DataGridViewTextBoxColumn printpalletRemark; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX3; + private JinYuan.ControlLib.GroupBoxEX groupBoxEX6; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.Label label_containercode; + private System.Windows.Forms.TextBox txt_containercode; + private System.Windows.Forms.Button btn_printpallet; + private System.Windows.Forms.Button btn_printContainer; + private System.Windows.Forms.Label lbl_palletcode; + private System.Windows.Forms.TextBox txt_palletcode; + private System.Windows.Forms.DataGridViewTextBoxColumn TestTime; + private System.Windows.Forms.DataGridViewTextBoxColumn ContainerCode; + private System.Windows.Forms.DataGridViewTextBoxColumn Result; + private System.Windows.Forms.DataGridViewTextBoxColumn Remark; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmDataMonitor.cs b/LargeSquareOne/FrmDataMonitor.cs new file mode 100644 index 0000000..43fb488 --- /dev/null +++ b/LargeSquareOne/FrmDataMonitor.cs @@ -0,0 +1,833 @@ +using JinYuan.ControlCenters; +using JinYuan.Helper; +using JinYuan.MES.Models; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using LargeSquareOne.ViewModel; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmDataMonitor : MultiLanguageForm + { + + private System.Threading.Timer m_RefreshTimer; + /// + /// 组盘数据显示 + /// + private BindingList listTA = new BindingList(); + /// + /// 组盘抽检数据显示 + /// + private BindingList listTC = new BindingList(); + /// + /// 叠盘数据绑定委托 + /// + /// + private BindingList listTB = new BindingList(); + /// + /// 底托卡板绑定数据显示 + /// + private BindingList listTD = new BindingList(); + /// + /// 底托卡板绑定数据显示 + /// + private BindingList listTE = new BindingList(); + public FrmDataMonitor() + { + InitializeComponent(); + + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + + this.dgvFeedingData.AutoGenerateColumns = false; + this.dgvFeedingData.DataSource = listTA; + this.dgvFeedingData.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; + this.dgvFeedingData.DoubleBufferedDataGirdView(true); + + this.dgvBlankingData.AutoGenerateColumns = false; + this.dgvBlankingData.DataSource = listTB; + this.dgvBlankingData.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; + this.dgvBlankingData.DoubleBufferedDataGirdView(true); + + this.dgvPrintContainerData.AutoGenerateColumns = false; + this.dgvPrintContainerData.DataSource = listTD; + this.dgvPrintContainerData.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; + this.dgvPrintContainerData.DoubleBufferedDataGirdView(true); + + this.dgvPrintPalletData.AutoGenerateColumns = false; + this.dgvPrintPalletData.DataSource = listTE; + this.dgvPrintPalletData.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; + this.dgvPrintPalletData.DoubleBufferedDataGirdView(true); + + this.lVConfigRange.DoubleBufferedListView(true); + this.FormClosing += (sender, e) => + { + + }; + } + + private void FrmDataMonitor_Load(object sender, EventArgs e) + { + dgvFeedingData.ClearSelection(); + dgvBlankingData.ClearSelection(); + dgvPrintContainerData.ClearSelection(); + dgvPrintPalletData.ClearSelection(); + + //表头动态渲染 + this.InitFrmDataMonitor(); + } + + private string CurrentTime + { + get { return DateTime.Now.ToString("HH:mm:ss"); } + } + + /// + /// 刷新参数 + /// + public void GetLocalParaData() + { + try + { + if (CommonMethods.paramlists != null) + { + System.Windows.Forms.ListViewItem listItem = null; + lVConfigRange.Items.Clear(); + int j = 0; + foreach (var ProductPara in CommonMethods.paramlists) //遍历list集合 + { + string strRemark = ProductPara.Remark; + string strName = ProductPara.ParaName; + listItem = new System.Windows.Forms.ListViewItem(CommonMethods.paramlists[j].Remark); + listItem.SubItems.Add("0"); + listItem.SubItems.Add("0"); + listItem.SubItems.Add("0"); + lVConfigRange.Items.Add(listItem); + lVConfigRange.Items[j].SubItems[1].Text = ProductPara.ParaValueMin; + lVConfigRange.Items[j].SubItems[2].Text = ProductPara.ParaValueMax; + lVConfigRange.Items[j].SubItems[3].Text = ProductPara.Uint; + switch (strName) + { + //case "OcvIr": //OCV内阻 + // CommonMethods.parRange.OcvIrMax = Convert.ToDecimal(ProductPara.ParaValueMax == "" ? "0" : ProductPara.ParaValueMax); + // CommonMethods.parRange.OcvIrMin = Convert.ToDecimal(ProductPara.ParaValueMin == "" ? "0" : ProductPara.ParaValueMin); + + // break; + //case "OcvVoltage": //OCV电压 + // CommonMethods.parRange.OcvVoltageMax = Convert.ToDecimal(ProductPara.ParaValueMax == "" ? "0" : ProductPara.ParaValueMax); + // CommonMethods.parRange.OcvVoltageMin = Convert.ToDecimal(ProductPara.ParaValueMin == "" ? "0" : ProductPara.ParaValueMin); + // break; + + //case "OcvTime": //OCV静置时间 + // CommonMethods.parRange.OcvTimeMax = Convert.ToDecimal(ProductPara.ParaValueMax == "" ? "0" : ProductPara.ParaValueMax); + // CommonMethods.parRange.OcvTimeMin = Convert.ToDecimal(ProductPara.ParaValueMin == "" ? "0" : ProductPara.ParaValueMin); + // break; + + + //case "CoefficientA"://常数A + // CommonMethods.parRange.CoefficientA = Convert.ToDecimal(ProductPara.ParaValueMin); + // break; + //case "ExponentB"://常数B + // CommonMethods.parRange.ExponentB = Convert.ToDecimal(ProductPara.ParaValueMin); + // break; + + + default: + break; + + } + j++; + } + } + } + catch (Exception ex) + { + + LogHelper.Instance.WriteEX("获取参数失败".Translated(), ex); + } + } + + + /// + /// 加载MES参数 + /// + public async Task<(bool Success, string msg)> GetMesParaDataAsync() + { + bool Success = false; // 操作结果 + string Message = ""; // 消息 + + try + { + bool isChangeParam = false; + var nowDate = DateTime.Now; + + string filePath = $@"{CommonMethods.strMesLogspath}\参数设定值请求\变更记录\{nowDate.Year}\{nowDate.Month}"; + string fileName = $@"{nowDate.Day}.csv"; + string fileTitle = "时间,机台,MES账户,更改参数名称,更改前参数值,更改后参数值"; + string fileContent = string.Empty; + + DataTable dt = new DataTable(); + dt.Columns.Add("MES账户"); + dt.Columns.Add("更改参数名称"); + dt.Columns.Add("更改前参数值"); + dt.Columns.Add("更改后参数值"); + + var (resultData, Mesage) = await CommonMethods.hbgMes.GetParamSetRequestAsync( + CommonMethods.mesConfig.DeviceParamChange, + CommonMethods.mesConfig.equipNum, + CommonMethods.mesConfig.siteCode, + CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.MaterialCode, + CommonMethods.mesConfig.mesUserName); + + //var resultData = JsonConvert.DeserializeObject(Data); + if (!resultData.success) + { + // 获取参数未成功 + Message = "获取MES参数不成功!"; + return (Success, Message); + } + + List NewParamlists = CommonMethods.paramlists; + for (int i = 0; i < resultData.total; i++) + { + List rows = resultData.rows; + for (int j = 0; j < rows.Count; j++) + { + var tagList = rows[j].tagList; + for (int k = 0; k < NewParamlists.Count; k++) + { + for (int n = 0; n < rows[j].tagList.Count; n++) + { + if (NewParamlists[k].ParaName == tagList[n].tagCode) + { + string strMin = "0"; + if (String.IsNullOrEmpty(tagList[n].minValue.Trim()) || tagList[n].minValue.Trim() == "null") + strMin = "0"; + else + strMin = tagList[n].minValue.Trim(); + if (NewParamlists[k].ParaValueMin != strMin) + { + fileContent += $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss")},{CommonMethods.mesConfig.equipNum}," + + $"{CommonMethods.mesConfig.mesUserName},{tagList[n].tagDescription}最小值,{NewParamlists[k].ParaValueMin},{strMin}\n"; + dt.Rows.Add(CommonMethods.mesConfig.mesUserName, $"{tagList[n].tagDescription}最小值", NewParamlists[k].ParaValueMin, strMin); + NewParamlists[k].ParaValueMin = strMin; + isChangeParam = true; + } + string strMax = "0"; + if (String.IsNullOrEmpty(tagList[n].maxValue.Trim()) || tagList[n].maxValue.Trim() == "null") + strMax = "0"; + else + strMax = tagList[n].maxValue.Trim(); + if (NewParamlists[k].ParaValueMax != tagList[n].maxValue) + { + fileContent += $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss")},{CommonMethods.mesConfig.equipNum}," + + $"{CommonMethods.mesConfig.mesUserName},{tagList[n].tagDescription}最大值,{NewParamlists[k].ParaValueMax},{strMax}\n"; + dt.Rows.Add(CommonMethods.mesConfig.mesUserName, $"{tagList[n].tagDescription}最大值", NewParamlists[k].ParaValueMax, strMax); + NewParamlists[k].ParaValueMax = strMax; + isChangeParam = true; + } + } + } + } + + if (isChangeParam) + { + CustomMessageBox customMessageBox = new CustomMessageBox(dt, $"当前MES下发参数与设备本地参数不一致,请确认是否使用MES下发参数"); + if (customMessageBox.ShowDialog() == DialogResult.OK) + { + // 写csv文件 + fileContent = fileContent.Substring(0, fileContent.Length - 1); + CSVHelper.WriterCSV(filePath, fileName, fileTitle, fileContent); + CommonMethods.paramlists = NewParamlists; + + int res = CommonMethods.db.Delete(it => it.ModelName == CommonMethods.paramlists[0].ModelName); + if (res > 0) + { + CommonMethods.db.AddReturnBool(CommonMethods.paramlists); + } + + Message = "变更成功并保存"; + Success = true; + } + else + { + Message = "取消变更,采用本地参数配置"; + } + LogHelper.Instance.WriteLog(Message); + } + } + } + + Success = true; // 操作成功 + Message = "参数获取成功"; + } + catch (Exception ex) + { + Message = "获取参数失败:" + ex.Message; + LogHelper.Instance.WriteEX("获取参数失败", ex); + } + + return (Success, Message); + } + + + #region 显示包装进站数据 + /// + /// 显示组盘数据 + /// + /// + /// + private readonly ConcurrentQueue> _dataQueue = new ConcurrentQueue>(); + private volatile bool _isUpdating = false; + private const int MAX_ROWS = 500; + + public void ShowFeedingData(List list) + { + if (list == null || list.Count == 0) return; + + try + { + _dataQueue.Enqueue(list); + if (!_isUpdating) + { + ProcessDataQueue(); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + private void ProcessDataQueue() + { + if (_isUpdating) return; + + try + { + _isUpdating = true; + + while (_dataQueue.TryDequeue(out var data)) + { + UpdateGrid(data); + } + } + finally + { + _isUpdating = false; + } + } + + private void UpdateGrid(List data) + { + if (!dgvFeedingData.IsHandleCreated) return; + + try + { + dgvFeedingData.BeginInvoke(new Action(() => + { + try + { + dgvFeedingData.SuspendLayout(); + + // 检查是否需要清理数据 + if (listTA.Count > MAX_ROWS) + { + listTA.Clear(); + GC.Collect(0, GCCollectionMode.Optimized); + } + + // 添加新数据 + foreach (var item in data) + { + listTA.Add(item); + } + + dgvFeedingData.DataSource = null; + dgvFeedingData.DataSource = listTA; + + // 更新显示 + int lastIndex = dgvFeedingData.Rows.Count - 1; + if (lastIndex >= 0) + { + + // 滚动到最新行 + dgvFeedingData.FirstDisplayedScrollingRowIndex = lastIndex; + dgvFeedingData.CurrentCell = dgvFeedingData.Rows[lastIndex].Cells[0]; + } + } + finally + { + dgvFeedingData.ResumeLayout(); + } + })); + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + + #endregion + + + + + + #region 显示包装出站数据 + /// + /// 显示包装出站 + /// + /// + public void ShowBlankingData(List list) + { + try + { + if (this.dgvBlankingData.InvokeRequired) + { + this.dgvBlankingData.Invoke(new Action>(ShowBlankingData), list); + } + else + { + if (list != null && list.Count > 0) + { + foreach (BGearEntity m in list) + { + listTB.Add(m); + } + if (listTB.Count >= 500) + { + listTB.Clear(); + GC.Collect(); + } + } + + // 设置最新行为活动行 (当前行) + int index = this.dgvBlankingData.Rows.Count - 1; + this.dgvBlankingData.CurrentCell = this.dgvBlankingData.Rows[index].Cells[0]; + + } + } + catch (Exception ex) + { + //ShowLog("显示上料出现" + ex.Message, 1); + } + } + + #endregion + + + + #region 显示栈板打印数据 + /// + /// 显示栈板打印数据 + /// + /// + public void ShowPrintPalletData(List list) + { + try + { + if (this.dgvPrintPalletData.InvokeRequired) + { + this.dgvPrintPalletData.Invoke(new Action>(ShowPrintPalletData), list); + } + else + { + if (list != null && list.Count > 0) + { + foreach (EGearEntity m in list) + { + listTE.Add(m); + } + if (listTE.Count >= 500) + { + listTE.Clear(); + GC.Collect(); + } + } + + // 设置最新行为活动行 (当前行) + int index = this.dgvPrintPalletData.Rows.Count - 1; + this.dgvPrintPalletData.CurrentCell = this.dgvPrintPalletData.Rows[index].Cells[0]; + } + } + catch (Exception ex) + { + //ShowLog("显示上料出现" + ex.Message, 1); + } + } + + #endregion + + #region 显示箱唛打印数据 + /// + /// 显示箱唛打印数据 + /// + /// + public void ShowPrintContainerData(List list) + { + try + { + if (this.dgvPrintContainerData.InvokeRequired) + { + this.dgvPrintContainerData.Invoke(new Action>(ShowPrintContainerData), list); + } + else + { + if (list != null && list.Count > 0) + { + foreach (DGearEntity m in list) + { + listTD.Add(m); + } + if (listTD.Count >= 500) + { + listTD.Clear(); + GC.Collect(); + } + } + + // 设置最新行为活动行 (当前行) + int index = this.dgvPrintContainerData.Rows.Count - 1; + this.dgvPrintContainerData.CurrentCell = this.dgvPrintContainerData.Rows[index].Cells[0]; + //for (int i = 0; i < list.Count; i++) + //{ + // this.dgvBlankingData.Rows[index - i].Cells[0].Value = index + 1 - i; + //} + } + } + catch (Exception ex) + { + //ShowLog("显示上料出现" + ex.Message, 1); + } + } + + #endregion + + #region 包装进站 + private void dgvFeedingData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgvFeedingData, e); + } + + private void dgvFeedingData_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) + { + //指定列字体颜色 + DataGridViewHelper.DgvRowPrePaint(this.dgvFeedingData, "InResult", sender, e); + } + #endregion + + + + #region 包装出站工位 + private void dgvBlankingData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgvBlankingData, e); + } + + private void dgvBlankingData_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) + { + //指定列字体颜色 + DataGridViewHelper.DgvRowPrePaint(this.dgvBlankingData, "OutResult", sender, e); + } + #endregion + + + + #region 箱唛打印工位 + private void dgvPrintContainerData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgvPrintContainerData, e); + } + + private void dgvPrintContainerData_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) + { + //指定列字体颜色 + DataGridViewHelper.DgvRowPrePaint(this.dgvPrintContainerData, "Result", sender, e); + } + #endregion + + #region 栈板打印工位 + private void dgvPrintPalletData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgvPrintPalletData, e); + } + + private void dgvPrintPalletData_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) + { + //指定列字体颜色 + DataGridViewHelper.DgvRowPrePaint(this.dgvPrintPalletData, "Result", sender, e); + } + #endregion + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + + + #endregion + + #region + StringFormat sf = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center };//字体水平位置居左,垂直居中 + private void lVConfigRange_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + Brush CustomizeBrushColor = new SolidBrush(Color.FromArgb(21, 77, 147));//自定义RGB + e.Graphics.FillRectangle(CustomizeBrushColor, e.Bounds); //设置背景颜色 + Font font = new Font("微软雅黑", 12, FontStyle.Bold); //设置字体大小 + e.Graphics.DrawString(e.Header.Text, font, Brushes.White, e.Bounds, sf); //设置字体颜色 + } + + private void lVConfigRange_DrawItem(object sender, DrawListViewItemEventArgs e) + { + e.DrawDefault = true; //采用系统默认方式绘制项 + } + + private void lVConfigRange_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + e.DrawDefault = true; //采用系统默认方式绘制项 + } + + #endregion + + #region ListView日志记录 + //public void AddDataMonitorLog(int level, string log) + //{ + // if (level > 2) + // { + // level = 2; + // } + // if (level < 0) + // { + // level = 0; + // } + // if (this.lst_Info.InvokeRequired) + // { + // this.lst_Info.Invoke(new Action(AddDataMonitorLog), level, log); + // } + // else + // { + // if (this.lst_Info.Items.Count > 1000) + // { + // this.lst_Info.Items.Clear(); + // } + // System.Windows.Forms.ListViewItem item = new System.Windows.Forms.ListViewItem(" " + CurrentTime, level); + // item.SubItems.Add(log); + + // this.lst_Info.Items.Add(item); + + // //让最新的日志显示在最下面 + // this.lst_Info.Items[this.lst_Info.Items.Count - 1].EnsureVisible(); + + + // } + //} + #endregion + + #region RichTextBox日志记录 + public void AddDataMonitorLog(int type, string info) + { + + if (this.rtb_Info.InvokeRequired) + { + this.rtb_Info.Invoke(new Action(AddDataMonitorLog), type, info); + + } + else + { + + if (rtb_Info.Lines.Length > 200) //每当显示的通知数超过200行时,清除前面的150行 + { + string[] strlines = new string[rtb_Info.Lines.Length - 150]; + Array.ConstrainedCopy(rtb_Info.Lines, 50, strlines, 0, strlines.Length); + rtb_Info.Lines = strlines; + GC.Collect(); + } + + rtb_Info.SelectionStart = rtb_Info.Text.Length; + rtb_Info.SelectionLength = info.Length; + + switch (type) + { + case 0: + rtb_Info.SelectionColor = Color.White; + break; + case 1: + rtb_Info.SelectionColor = Color.DarkOrange; + break; + case 2: + rtb_Info.SelectionColor = Color.Red; + break; + + } + + rtb_Info.AppendText(string.Format("时间:{0}-{1}\r\n", DateTime.Now.ToString("HH:mm:ss.fff"), info)); + + rtb_Info.SelectionStart = rtb_Info.Text.Length; + rtb_Info.SelectionLength = info.Length; + rtb_Info.Focus(); + } + } + + #endregion + + #region ListBox日志记录 + //public void AddDataMonitorLog(int level, string log) + //{ + // Color color = Color.White; + // if (level > 2) + // { + // color= Color.Red; + // level = 2; + // } + // if (level < 0) + // { + // color = Color.White; + // level = 0; + // } + // if (this.lis_Info.InvokeRequired) + // { + // this.lis_Info.Invoke(new Action(AddDataMonitorLog), level, log); + + // } + // else + // { + + // this.lis_Info.AddLog(log, color); + // this.lis_Info.SelectedIndex = this.lis_Info.Items.Count - 1; + // this.lis_Info.SelectedIndex = -1; + + // //System.Windows.Forms.ListViewItem item = new System.Windows.Forms.ListViewItem(" " + CurrentTime, level); + // //item.SubItems.Add(log); + + // //this.rtb_Info.Items.Add(item); + + // ////让最新的日志显示在最下面 + // //this.rtb_Info.Items[this.lst_Info.Items.Count - 1].EnsureVisible(); + // } + //} + #endregion + + //private async void btn_printpallet_Click(object sender, EventArgs e) + //{ + // string palletcode = this.txt_palletcode.Text.Trim(); + // // 输入验证 + // if (string.IsNullOrWhiteSpace(palletcode)) + // { + // MessageBox.Show("请输入有效的栈板码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + // this.txt_palletcode.Focus(); + // return; + // } + // try + // { + // // 禁用按钮防止重复点击 + // btn_printpallet.Enabled = false; + + // // 调用手动打印方法 + // short result = await ControlCenter.Instance.ManualPrintPalletAsync(palletcode); + + // // 显示结果 + // switch (result) + // { + // case 1: + // MessageBox.Show($"栈板码 {palletcode} 打印成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); + // // 清空输入框 + // this.txt_palletcode.Clear(); + // break; + // case 2: + // MessageBox.Show($"栈板码 {palletcode} 打印失败!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + // break; + // case 3: + // MessageBox.Show($"栈板码 {palletcode} 未查询到打印参数!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + // break; + // } + // } + // catch (Exception ex) + // { + // MessageBox.Show($"打印失败:{ex.Message}", "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); + // LogHelper.Instance.WriteError($"手动打印栈板异常:{ex}", "printLog"); + // } + // finally + // { + // // 恢复按钮 + // btn_printpallet.Enabled = true; + // this.txt_palletcode.Focus(); + // } + + //} + + //private async void btn_printContainer_Click(object sender, EventArgs e) + //{ + // string containercode = this.txt_containercode.Text.Trim(); + // // 输入验证 + // if (string.IsNullOrWhiteSpace(containercode)) + // { + // MessageBox.Show("请输入有效的箱唛码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + // this.txt_containercode.Focus(); + // return; + // } + + // try + // { + // // 禁用按钮防止重复点击 + // btn_printContainer.Enabled = false; + + // // 调用手动打印方法 + // short result = await ControlCenter.Instance.ManualPrintContainerAsync(containercode); + + // // 显示结果 + // switch (result) + // { + // case 1: + // MessageBox.Show($"箱唛码 {containercode} 打印成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); + // // 清空输入框 + // this.txt_containercode.Clear(); + // break; + // case 2: + // MessageBox.Show($"箱唛码 {containercode} 打印失败!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + // break; + // case 3: + // MessageBox.Show($"箱唛码 {containercode} 未查询到打印参数!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + // break; + // } + // } + // catch (Exception ex) + // { + // MessageBox.Show($"打印失败:{ex.Message}", "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); + // LogHelper.Instance.WriteError($"手动打印箱唛异常:{ex}", "printLog"); + // } + // finally + // { + // // 恢复按钮 + // btn_printContainer.Enabled = true; + // this.txt_containercode.Focus(); + // } + //} + } + +} diff --git a/LargeSquareOne/FrmDataMonitor.resx b/LargeSquareOne/FrmDataMonitor.resx new file mode 100644 index 0000000..698505a --- /dev/null +++ b/LargeSquareOne/FrmDataMonitor.resx @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 21 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABE + DQAAAk1TRnQBSQFMAgEBAwEAAdABAwHQAQMBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABEAMAAQEBAAEgBgABEC4AAxUBHQMkATQDBQEGKAADHQEpAl4BZwHwATUBNgHPAf8BNQE2Ac8B/wE1 + ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wNOAZagAAMTARkDZQHlA+YB/wPmAf8D5gH/A+YB/wPmAf8DRwGA + HAACUwFUAaoBNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2 + Ac8B/wE1ATYBzwH/ATUBNgHPAf8UAANgAdsBKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEp + AeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/AzUBVVAA + AzgBWwPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/xQAAmEBawHrATUBNgHPAf8BNQE2 + Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ + ATUBNgHPAf8BNQE2Ac8B/wwAAUYCRwGAASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHq + AfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ + ASkB6gH0Af9MAAM9AWgD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wwA + A0gBhAE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ + ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/CAADOwFjASkB6gH0 + Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wNdAcwEAAEpAeoB9AH/ASkB6gH0Af8BKQHq + AfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/0wAA+YB/wPmAf8D5gH/A+YB/wPmAf8DKgFABAADKgFA + A+YB/wPmAf8D5gH/A+YB/wNHAYAIAAE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/AxABFQE1 + ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/AlMBVAGqBAABNQE2Ac8B/wE1ATYBzwH/ATUBNgHP + Af8DTgGWCAABKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHq + AfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8DPwFtSAADOAFbA+YB/wPm + Af8D5gH/A+YB/wPmAf8D5gH/BAAD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8EAAMzAVEBNQE2Ac8B/wE1 + ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wgAATUBNgHPAf8BNQE2Ac8B/wJTAVQBqgQAAlMBVAGqATUBNgHP + Af8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8IAAM1AVUBKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHq + AfQB/wEpAeoB9AH/AyoBQAEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af9MAAPm + Af8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8EAAPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wMFAQYCXQFf + Ac4BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/CAACUwFUAaoEAAJTAVQBqgE1 + ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8MAAEpAeoB9AH/ASkB6gH0Af8BKQHq + AfQB/wEpAeoB9AH/ASkB6gH0Af8EAAEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/AygBPEwA + A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wQAA+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/AyQBNAJa + AW0B9QE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wgAAlMBVAGq + ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/DAADGQEjASkB6gH0 + Af8BKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8EAAEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wFhAmsB61AA + A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A1oBvwQAA+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/AxUBHQJe + AWQB4gE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8CUwFUAaoMAAE1ATYBzwH/ + ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/xAAA14B0gEpAeoB9AH/ASkB6gH0 + Af8BKQHqAfQB/wQAASkB6gH0Af8BKQHqAfQB/wEpAeoB9AH/AwkBC1AAA1oBvwPmAf8D5gH/A+YB/wPm + Af8D5gH/A0cBgANHAYAD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8EAANVAawBNQE2Ac8B/wE1ATYBzwH/ + ATUBNgHPAf8BNQE2Ac8B/wJTAVQBqgQAAlMBVAGqATUBNgHPAf8IAAE1ATYBzwH/ATUBNgHPAf8BNQE2 + Ac8B/wE1ATYBzwH/ATUBNgHPAf8UAAEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wQAASkB6gH0Af8BKQHq + AfQB/wFXAlkBuVQAAxABFQPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wNHAYAD5gH/A+YB/wPmAf8D5gH/ + A+YB/wNlAeUEAAMMAQ8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8CWgFqAfIEAAJTAVQBqgE1ATYBzwH/ + ATUBNgHPAf8BNQE2Ac8B/wQAAwwBEAE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wJeAWcB8BQAAVECUgGh + ASkB6gH0Af8BKQHqAfQB/wM6AWABKQHqAfQB/wEpAeoB9AH/XAADZQHlA+YB/wPmAf8D5gH/A+YB/wNv + AfEDKgFAA+YB/wPmAf8D5gH/A+YB/wPmAf8DEwEZCAACZQFvAfEBNQE2Ac8B/wE1ATYBzwH/ATUBNgHP + Af8CWgFqAfIBNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2 + Ac8B/wE1ATYBzwH/ATUBNgHPAf8DHQEpGAABKQHqAfQB/wEpAeoB9AH/ASkB6gH0Af8BKQHqAfQB/wNJ + AYhgAAPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8DOAFbEAABNQE2Ac8B/wE1 + ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHP + Af8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8CUwFUAaocAANAAXABKQHqAfQB/wEpAeoB9AH/ASkB6gH0 + Af9oAANlAeUD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/Az0BaBgAATUBNgHPAf8BNQE2Ac8B/wE1 + ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHP + Af8CYQFrAeskAANNAZIBXQJgAdRwAAMOARIDVgGyA+YB/wPmAf8D5gH/AzgBWyQAAmUBbwHxATUBNgHP + Af8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8BNQE2Ac8B/wE1ATYBzwH/ATUBNgHPAf8DSAGE4AADCgEN + AlIBVAGoAl4BZAHiAloBbQH1Al0BXwHOAzMBUZQAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB + BQABgBcAA/8BAAH+AT8B8AEPAv8CAAHwAQ8B4AEHAcABAQIAAeABBwHAAQMBgAEBAgABwAEDAYABAQGA + AYECAAHAAYEBgAEQAcABAQIAAYABgQEGASABwAEDAgACgAEDAUAB4AGDAgACgAEBAYAB4AGHAgACgAEB + AcAB8AGHAgABgAEBAQIBYAH4AY8CAAGAAQEBBAEgAfgBHwIAAcABAQGAAQAB/AEfAgAB4AEDAcABAQH8 + AT8CAAHwAQcB4AEDAf4BfwIAAfgBHwHwAQcC/wIAAv8B+AEfAv8CAAs= + + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 25 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmGroupConfig.Designer.cs b/LargeSquareOne/FrmGroupConfig.Designer.cs new file mode 100644 index 0000000..a0795ac --- /dev/null +++ b/LargeSquareOne/FrmGroupConfig.Designer.cs @@ -0,0 +1,474 @@ +namespace LargeSquareOne +{ + partial class FrmGroupConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + this.panelExt1 = new JinYuan.ControlLib.PanelExt(); + this.chk_IsFeedbackPlc = new System.Windows.Forms.CheckBox(); + this.txtStart = new System.Windows.Forms.TextBox(); + this.ckb_IsEnable = new System.Windows.Forms.CheckBox(); + this.ckb_IsTiggerRead = new System.Windows.Forms.CheckBox(); + this.dgv_Main = new System.Windows.Forms.DataGridView(); + this.GroupName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Start = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Length = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column1 = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.Column3 = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.Column2 = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.Remark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.btn_Modify = new System.Windows.Forms.Button(); + this.btn_Delete = new System.Windows.Forms.Button(); + this.btn_Add = new System.Windows.Forms.Button(); + this.txt_Remark = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.num_Length = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.txt_GroupName = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.topPanel = new System.Windows.Forms.Panel(); + this.btn_Close = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.panelExt1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.num_Length)).BeginInit(); + this.topPanel.SuspendLayout(); + this.SuspendLayout(); + // + // panelExt1 + // + this.panelExt1.BackColor = System.Drawing.Color.Transparent; + this.panelExt1.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(79)))), ((int)(((byte)(150))))); + this.panelExt1.BordeWidth = 2; + this.panelExt1.BottomGap = 0; + this.panelExt1.Controls.Add(this.chk_IsFeedbackPlc); + this.panelExt1.Controls.Add(this.txtStart); + this.panelExt1.Controls.Add(this.ckb_IsEnable); + this.panelExt1.Controls.Add(this.ckb_IsTiggerRead); + this.panelExt1.Controls.Add(this.dgv_Main); + this.panelExt1.Controls.Add(this.btn_Modify); + this.panelExt1.Controls.Add(this.btn_Delete); + this.panelExt1.Controls.Add(this.btn_Add); + this.panelExt1.Controls.Add(this.txt_Remark); + this.panelExt1.Controls.Add(this.label6); + this.panelExt1.Controls.Add(this.num_Length); + this.panelExt1.Controls.Add(this.label4); + this.panelExt1.Controls.Add(this.label3); + this.panelExt1.Controls.Add(this.txt_GroupName); + this.panelExt1.Controls.Add(this.label2); + this.panelExt1.Controls.Add(this.topPanel); + this.panelExt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt1.LeftGap = 0; + this.panelExt1.Location = new System.Drawing.Point(0, 0); + this.panelExt1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.panelExt1.Name = "panelExt1"; + this.panelExt1.RightGap = 0; + this.panelExt1.Size = new System.Drawing.Size(1054, 636); + this.panelExt1.TabIndex = 0; + this.panelExt1.TopGap = 0; + // + // chk_IsFeedbackPlc + // + this.chk_IsFeedbackPlc.AutoSize = true; + this.chk_IsFeedbackPlc.Checked = true; + this.chk_IsFeedbackPlc.CheckState = System.Windows.Forms.CheckState.Checked; + this.chk_IsFeedbackPlc.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.chk_IsFeedbackPlc.ForeColor = System.Drawing.Color.White; + this.chk_IsFeedbackPlc.Location = new System.Drawing.Point(777, 57); + this.chk_IsFeedbackPlc.Name = "chk_IsFeedbackPlc"; + this.chk_IsFeedbackPlc.Size = new System.Drawing.Size(157, 26); + this.chk_IsFeedbackPlc.TabIndex = 51; + this.chk_IsFeedbackPlc.Text = "是否需要反馈结果"; + this.chk_IsFeedbackPlc.UseVisualStyleBackColor = true; + // + // txtStart + // + this.txtStart.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txtStart.Location = new System.Drawing.Point(345, 56); + this.txtStart.Name = "txtStart"; + this.txtStart.Size = new System.Drawing.Size(96, 29); + this.txtStart.TabIndex = 50; + this.txtStart.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // ckb_IsEnable + // + this.ckb_IsEnable.AutoSize = true; + this.ckb_IsEnable.Checked = true; + this.ckb_IsEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.ckb_IsEnable.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.ckb_IsEnable.ForeColor = System.Drawing.Color.White; + this.ckb_IsEnable.Location = new System.Drawing.Point(949, 56); + this.ckb_IsEnable.Name = "ckb_IsEnable"; + this.ckb_IsEnable.Size = new System.Drawing.Size(93, 26); + this.ckb_IsEnable.TabIndex = 49; + this.ckb_IsEnable.Text = "是否启用"; + this.ckb_IsEnable.UseVisualStyleBackColor = true; + // + // ckb_IsTiggerRead + // + this.ckb_IsTiggerRead.AutoSize = true; + this.ckb_IsTiggerRead.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.ckb_IsTiggerRead.ForeColor = System.Drawing.Color.White; + this.ckb_IsTiggerRead.Location = new System.Drawing.Point(620, 57); + this.ckb_IsTiggerRead.Name = "ckb_IsTiggerRead"; + this.ckb_IsTiggerRead.Size = new System.Drawing.Size(141, 26); + this.ckb_IsTiggerRead.TabIndex = 48; + this.ckb_IsTiggerRead.Text = "是否为触发读取"; + this.ckb_IsTiggerRead.UseVisualStyleBackColor = true; + // + // dgv_Main + // + this.dgv_Main.AllowUserToAddRows = false; + this.dgv_Main.AllowUserToDeleteRows = false; + this.dgv_Main.AllowUserToResizeRows = false; + this.dgv_Main.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgv_Main.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.dgv_Main.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgv_Main.ColumnHeadersHeight = 45; + this.dgv_Main.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgv_Main.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.GroupName, + this.Start, + this.Length, + this.Column1, + this.Column3, + this.Column2, + this.Remark}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Main.DefaultCellStyle = dataGridViewCellStyle2; + this.dgv_Main.EnableHeadersVisualStyles = false; + this.dgv_Main.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_Main.Location = new System.Drawing.Point(19, 164); + this.dgv_Main.Name = "dgv_Main"; + this.dgv_Main.ReadOnly = true; + this.dgv_Main.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgv_Main.RowHeadersWidth = 55; + this.dgv_Main.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgv_Main.RowTemplate.Height = 40; + this.dgv_Main.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_Main.Size = new System.Drawing.Size(1021, 451); + this.dgv_Main.TabIndex = 15; + this.dgv_Main.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_Main_CellClick); + this.dgv_Main.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgv_Main_CellFormatting); + this.dgv_Main.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Main_RowPostPaint); + // + // GroupName + // + this.GroupName.DataPropertyName = "GroupName"; + this.GroupName.HeaderText = "通信组名称"; + this.GroupName.Name = "GroupName"; + this.GroupName.ReadOnly = true; + this.GroupName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.GroupName.Width = 140; + // + // Start + // + this.Start.DataPropertyName = "Start"; + this.Start.HeaderText = "起始地址"; + this.Start.Name = "Start"; + this.Start.ReadOnly = true; + this.Start.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.Start.Width = 120; + // + // Length + // + this.Length.DataPropertyName = "Length"; + this.Length.HeaderText = "长度"; + this.Length.Name = "Length"; + this.Length.ReadOnly = true; + this.Length.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // Column1 + // + this.Column1.DataPropertyName = "IsTiggerRead"; + this.Column1.HeaderText = "是否为触发读取"; + this.Column1.Name = "Column1"; + this.Column1.ReadOnly = true; + // + // Column3 + // + this.Column3.DataPropertyName = "IsFeedbackPlc"; + this.Column3.HeaderText = "是否需要反馈结果"; + this.Column3.Name = "Column3"; + this.Column3.ReadOnly = true; + this.Column3.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // Column2 + // + this.Column2.DataPropertyName = "IsActive"; + this.Column2.HeaderText = "启用"; + this.Column2.Name = "Column2"; + this.Column2.ReadOnly = true; + this.Column2.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // Remark + // + this.Remark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Remark.DataPropertyName = "Remark"; + this.Remark.HeaderText = "备注说明"; + this.Remark.Name = "Remark"; + this.Remark.ReadOnly = true; + this.Remark.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // btn_Modify + // + this.btn_Modify.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Modify.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Modify.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Modify.ForeColor = System.Drawing.Color.White; + this.btn_Modify.Location = new System.Drawing.Point(832, 104); + this.btn_Modify.Name = "btn_Modify"; + this.btn_Modify.Size = new System.Drawing.Size(102, 36); + this.btn_Modify.TabIndex = 14; + this.btn_Modify.Text = "修改通信组"; + this.btn_Modify.UseVisualStyleBackColor = false; + this.btn_Modify.Click += new System.EventHandler(this.btn_Modify_Click); + // + // btn_Delete + // + this.btn_Delete.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Delete.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Delete.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Delete.ForeColor = System.Drawing.Color.White; + this.btn_Delete.Location = new System.Drawing.Point(726, 104); + this.btn_Delete.Name = "btn_Delete"; + this.btn_Delete.Size = new System.Drawing.Size(101, 36); + this.btn_Delete.TabIndex = 13; + this.btn_Delete.Text = "删除通信组"; + this.btn_Delete.UseVisualStyleBackColor = false; + this.btn_Delete.Click += new System.EventHandler(this.btn_Delete_Click); + // + // btn_Add + // + this.btn_Add.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Add.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Add.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Add.ForeColor = System.Drawing.Color.White; + this.btn_Add.Location = new System.Drawing.Point(620, 104); + this.btn_Add.Name = "btn_Add"; + this.btn_Add.Size = new System.Drawing.Size(101, 36); + this.btn_Add.TabIndex = 12; + this.btn_Add.Text = "新增通信组"; + this.btn_Add.UseVisualStyleBackColor = false; + this.btn_Add.Click += new System.EventHandler(this.btn_Add_Click); + // + // txt_Remark + // + this.txt_Remark.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txt_Remark.Location = new System.Drawing.Point(111, 108); + this.txt_Remark.Name = "txt_Remark"; + this.txt_Remark.Size = new System.Drawing.Size(491, 29); + this.txt_Remark.TabIndex = 11; + this.txt_Remark.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.ForeColor = System.Drawing.Color.White; + this.label6.Location = new System.Drawing.Point(15, 113); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 21); + this.label6.TabIndex = 10; + this.label6.Text = "备注说明"; + // + // num_Length + // + this.num_Length.Location = new System.Drawing.Point(510, 55); + this.num_Length.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.num_Length.Name = "num_Length"; + this.num_Length.Size = new System.Drawing.Size(92, 29); + this.num_Length.TabIndex = 7; + this.num_Length.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.ForeColor = System.Drawing.Color.White; + this.label4.Location = new System.Drawing.Point(462, 60); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(42, 21); + this.label4.TabIndex = 6; + this.label4.Text = "长度"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(266, 60); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 21); + this.label3.TabIndex = 4; + this.label3.Text = "起始地址"; + // + // txt_GroupName + // + this.txt_GroupName.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txt_GroupName.Location = new System.Drawing.Point(111, 55); + this.txt_GroupName.Name = "txt_GroupName"; + this.txt_GroupName.Size = new System.Drawing.Size(125, 29); + this.txt_GroupName.TabIndex = 3; + this.txt_GroupName.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(15, 60); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(90, 21); + this.label2.TabIndex = 2; + this.label2.Text = "通信组名称"; + // + // topPanel + // + this.topPanel.Controls.Add(this.btn_Close); + this.topPanel.Controls.Add(this.label1); + this.topPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.topPanel.Location = new System.Drawing.Point(0, 0); + this.topPanel.Name = "topPanel"; + this.topPanel.Size = new System.Drawing.Size(1054, 49); + this.topPanel.TabIndex = 0; + this.topPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.topPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // btn_Close + // + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(29)))), ((int)(((byte)(84))))); + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(1008, 8); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 1; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = true; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(15, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(90, 21); + this.label1.TabIndex = 0; + this.label1.Text = "通信组配置"; + // + // FrmGroupConfig + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(1054, 636); + this.Controls.Add(this.panelExt1); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 12F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.Name = "FrmGroupConfig"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmGroupConfig"; + this.panelExt1.ResumeLayout(false); + this.panelExt1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.num_Length)).EndInit(); + this.topPanel.ResumeLayout(false); + this.topPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private JinYuan.ControlLib.PanelExt panelExt1; + private System.Windows.Forms.Panel topPanel; + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txt_Remark; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.NumericUpDown num_Length; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txt_GroupName; + private System.Windows.Forms.DataGridView dgv_Main; + private System.Windows.Forms.Button btn_Modify; + private System.Windows.Forms.Button btn_Delete; + private System.Windows.Forms.Button btn_Add; + private System.Windows.Forms.CheckBox ckb_IsTiggerRead; + private System.Windows.Forms.CheckBox ckb_IsEnable; + private System.Windows.Forms.TextBox txtStart; + private System.Windows.Forms.CheckBox chk_IsFeedbackPlc; + private System.Windows.Forms.DataGridViewTextBoxColumn GroupName; + private System.Windows.Forms.DataGridViewTextBoxColumn Start; + private System.Windows.Forms.DataGridViewTextBoxColumn Length; + private System.Windows.Forms.DataGridViewCheckBoxColumn Column1; + private System.Windows.Forms.DataGridViewCheckBoxColumn Column3; + private System.Windows.Forms.DataGridViewCheckBoxColumn Column2; + private System.Windows.Forms.DataGridViewTextBoxColumn Remark; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmGroupConfig.cs b/LargeSquareOne/FrmGroupConfig.cs new file mode 100644 index 0000000..9db2765 --- /dev/null +++ b/LargeSquareOne/FrmGroupConfig.cs @@ -0,0 +1,307 @@ +using JinYuan.Helper; +using JinYuan.Models; +using Language; +using MiniExcelLibs; +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.Web; +using System.Windows.Forms; +using System.Xml.Schema; + +namespace LargeSquareOne +{ + public partial class FrmGroupConfig : MultiLanguageForm + { + public FrmGroupConfig(PLCConfig plc) + { + InitializeComponent(); + + //this.cmb_StoreArea.DataSource = new string[] { "输入线圈", "输出线圈", "输入寄存器", "输出寄存器" }; + + this.dgv_Main.AutoGenerateColumns = false; + currentPlc = plc; + TotalGroups = GetALLGroups(); + RefreshGroup(); + } + + private string groupPath = Application.StartupPath + "\\Config\\Group.xlsx"; + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + private List TotalGroups = new List(); + private PLCConfig currentPlc; + + /// + /// 获取所有通信组 + /// + /// + private List GetALLGroups() + { + try + { + return MiniExcel.Query(groupPath).ToList(); + } + catch (Exception) + { + return new List(); + } + } + + /// + /// 更新通信组集合 + /// + private void RefreshGroup() + { + if (TotalGroups != null && TotalGroups.Count > 0) + { + this.dgv_Main.DataSource = null; + this.dgv_Main.DataSource = TotalGroups; + } + else + { + this.dgv_Main.DataSource = null; // 清空数据源 + } + } + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + /// + /// 判断组名称是否存在 + /// + /// + /// 存在返回true,不存在返回false + private bool IsGroupNameExits(string groupName) + { + return TotalGroups.Any(c => c.GroupName == groupName); + } + + #region 增删改通信组 + /// + /// 增加 + /// + /// + /// + private void btn_Add_Click(object sender, EventArgs e) + { + string groupName = this.txt_GroupName.Text.Trim(); + if (groupName.Length == 0) + { + new FrmMsgBoxOutWithAck(2, "通信组名称不能为空!", "添加通信组").Show(); + return; + } + + if (IsGroupNameExits(groupName)) + { + new FrmMsgBoxOutWithAck(2, "通信组名称已存在!", "添加通信组").Show(); + return; + } + + TotalGroups.Add(new Group() + { + GroupName = this.txt_GroupName.Text, + Start = this.txtStart.Text, + Length = Convert.ToUInt16(this.num_Length.Value), + IsTiggerRead = this.ckb_IsTiggerRead.Checked, + IsFeedbackPlc = this.chk_IsFeedbackPlc.Checked, + IsActive = this.ckb_IsEnable.Checked, + Remark = this.txt_Remark.Text.Trim() + }); + + try + { + MiniExcel.SaveAs(groupPath, TotalGroups, overwriteFile: true); + new FrmMsgBoxOutWithAck(1, "添加通信组成功", "添加通信组").Show(); + + //刷新数据 + RefreshGroup(); + } + catch (Exception ex) + { + new FrmMsgBoxOutWithAck(3, "添加通信组失败:" + ex.Message, "添加通信组").Show(); + } + } + + /// + /// 删除 + /// + /// + /// + private void btn_Delete_Click(object sender, EventArgs e) + { + string groupName = this.txt_GroupName.Text.Trim(); + + if (!IsGroupNameExits(groupName)) + { + new FrmMsgBoxOutWithAck(2, "通信组名称不存在!", "删除通信组").Show(); + return; + } + + TotalGroups.RemoveAll(c => c.GroupName == groupName); + try + { + MiniExcel.SaveAs(groupPath, TotalGroups, overwriteFile: true); + new FrmMsgBoxOutWithAck(1, "删除通信组成功", "删除通信组").Show(); + + // 清空输入框 + ClearInputControls(); + //刷新数据 + RefreshGroup(); + } + catch (Exception ex) + { + new FrmMsgBoxOutWithAck(3, "删除通信组失败:" + ex.Message, "删除通信组").Show(); + } + } + + /// + /// 修改 + /// + /// + /// + private void btn_Modify_Click(object sender, EventArgs e) + { + string groupName = this.txt_GroupName.Text.Trim(); + + if (!IsGroupNameExits(groupName)) + { + new FrmMsgBoxOutWithAck(2, "通信组名称不存在,无法修改!", "修改通信组").Show(); + return; + } + + // 添加空值检查 + var group = TotalGroups.Find(c => c.GroupName == groupName); + if (group == null) + { + new FrmMsgBoxOutWithAck(2, "未找到该通信组!", "修改通信组").Show(); + return; + } + + // 更新组信息 + group.Start = this.txtStart.Text; + group.Length = Convert.ToUInt16(this.num_Length.Value); + group.IsTiggerRead = this.ckb_IsTiggerRead.Checked; + group.IsFeedbackPlc = this.chk_IsFeedbackPlc.Checked; + group.IsActive = this.ckb_IsEnable.Checked; + group.Remark = this.txt_Remark.Text.Trim(); + + try + { + MiniExcel.SaveAs(groupPath, TotalGroups, overwriteFile: true); + new FrmMsgBoxOutWithAck(1, "修改通信组成功", "修改通信组").Show(); + + //刷新数据 + RefreshGroup(); + } + catch (Exception ex) + { + new FrmMsgBoxOutWithAck(3, "修改通信组失败:" + ex.Message, "修改通信组").Show(); + } + } + + /// + /// 清空输入控件内容 + /// + private void ClearInputControls() + { + txt_GroupName.Text = string.Empty; + txtStart.Text = string.Empty; + num_Length.Value = 0; + ckb_IsTiggerRead.Checked = false; + chk_IsFeedbackPlc.Checked = false; + ckb_IsEnable.Checked = false; + txt_Remark.Text = string.Empty; + } + + #endregion + + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + + /// + /// 行号 + /// + /// + /// + private void dgv_Main_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + DataGridViewHelper.DgvRowPostPaint((DataGridView)sender, e); + } + + /// + /// 默认为空显示特定字符 + /// + /// + /// + private void dgv_Main_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.ColumnIndex >= 0 && e.RowIndex >= 0) + { + object value = this.dgv_Main.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; + + if (value == null || string.IsNullOrWhiteSpace(value.ToString())) + { + e.Value = "---"; + } + } + } + + /// + /// 选中行显示 + /// + /// + /// + private void dgv_Main_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex >= 0 && e.RowIndex < TotalGroups.Count) + { + UpdateGroup(TotalGroups[e.RowIndex]); + } + } + + private void UpdateGroup(Group group) + { + if (group != null) + { + this.txt_GroupName.Text = group.GroupName; + this.txtStart.Text = group.Start; + this.num_Length.Value = group.Length; + this.ckb_IsTiggerRead.Checked = group.IsTiggerRead; + this.chk_IsFeedbackPlc.Checked = group.IsFeedbackPlc; + this.ckb_IsEnable.Checked = group.IsActive; + this.txt_Remark.Text = group.Remark; + } + } + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmGroupConfig.resx b/LargeSquareOne/FrmGroupConfig.resx new file mode 100644 index 0000000..63d8a27 --- /dev/null +++ b/LargeSquareOne/FrmGroupConfig.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/LargeSquareOne/FrmHelper.Designer.cs b/LargeSquareOne/FrmHelper.Designer.cs new file mode 100644 index 0000000..4698d5f --- /dev/null +++ b/LargeSquareOne/FrmHelper.Designer.cs @@ -0,0 +1,107 @@ +namespace LargeSquareOne +{ + partial class FrmHelper + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.lbl_TitleBar = new System.Windows.Forms.Label(); + this.btn_Close = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox3 + // + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.Image = global::LargeSquareOne.Properties.Resources.eve; + this.pictureBox3.Location = new System.Drawing.Point(-1, -2); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(153, 34); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 12; + this.pictureBox3.TabStop = false; + // + // lbl_TitleBar + // + this.lbl_TitleBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lbl_TitleBar.BackColor = System.Drawing.Color.Transparent; + this.lbl_TitleBar.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbl_TitleBar.ForeColor = System.Drawing.Color.White; + this.lbl_TitleBar.Location = new System.Drawing.Point(33, 107); + this.lbl_TitleBar.Name = "lbl_TitleBar"; + this.lbl_TitleBar.Size = new System.Drawing.Size(391, 29); + this.lbl_TitleBar.TabIndex = 13; + this.lbl_TitleBar.Text = "本系统由惠州金源精密自动化设备有限公司开发。"; + this.lbl_TitleBar.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btn_Close + // + this.btn_Close.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 14F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(413, 2); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 14; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = false; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // FrmHelper + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(448, 291); + this.Controls.Add(this.btn_Close); + this.Controls.Add(this.lbl_TitleBar); + this.Controls.Add(this.pictureBox3); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "FrmHelper"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "帮助"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.Label lbl_TitleBar; + private System.Windows.Forms.Button btn_Close; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmHelper.cs b/LargeSquareOne/FrmHelper.cs new file mode 100644 index 0000000..bc66dd5 --- /dev/null +++ b/LargeSquareOne/FrmHelper.cs @@ -0,0 +1,26 @@ +using Language; +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 LargeSquareOne +{ + public partial class FrmHelper : MultiLanguageForm + { + public FrmHelper() + { + InitializeComponent(); + } + + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/LargeSquareOne/FrmHelper.resx b/LargeSquareOne/FrmHelper.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/FrmHelper.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmHistory.Designer.cs b/LargeSquareOne/FrmHistory.Designer.cs new file mode 100644 index 0000000..308f99a --- /dev/null +++ b/LargeSquareOne/FrmHistory.Designer.cs @@ -0,0 +1,1380 @@ +namespace LargeSquareOne +{ + partial class FrmHistory + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = 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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle10 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle11 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle12 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle17 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle18 = new System.Windows.Forms.DataGridViewCellStyle(); + this.panelEnhanced1 = new JinYuan.ControlLib.PanelEnhanced(); + this.tabControlPlus1 = new HML.TabControlPlus(); + this.tabPagePlus1 = new HML.TabPagePlus(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.txtBarCodeORRfid = new System.Windows.Forms.TextBox(); + this.button2 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.lblStartTime = new System.Windows.Forms.Label(); + this.lblType = new System.Windows.Forms.Label(); + this.dtp_End = new System.Windows.Forms.DateTimePicker(); + this.btn_Query = new System.Windows.Forms.Button(); + this.cmb_SelectType = new System.Windows.Forms.ComboBox(); + this.btn_ExPort = new System.Windows.Forms.Button(); + this.dtp_Start = new System.Windows.Forms.DateTimePicker(); + this.lblEndtime = new System.Windows.Forms.Label(); + this.dgv_Main = new System.Windows.Forms.DataGridView(); + this.tabPagePlus2 = new HML.TabPagePlus(); + this.tabControlPlus2 = new HML.TabControlPlus(); + this.tabPagePlus4 = new HML.TabPagePlus(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.dgvClass = new System.Windows.Forms.DataGridView(); + this.panel1 = new System.Windows.Forms.Panel(); + this.cmbClass = new System.Windows.Forms.ComboBox(); + this.btn_ClassExPort = new System.Windows.Forms.Button(); + this.btn_ClassQuery = new System.Windows.Forms.Button(); + this.dtClass = new System.Windows.Forms.DateTimePicker(); + this.label5 = new System.Windows.Forms.Label(); + this.tabPagePlus5 = new HML.TabPagePlus(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.dgvDays = new System.Windows.Forms.DataGridView(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btn_DaysExPort = new System.Windows.Forms.Button(); + this.btn_DaysQuery = new System.Windows.Forms.Button(); + this.dtpDays = new System.Windows.Forms.DateTimePicker(); + this.label6 = new System.Windows.Forms.Label(); + this.tabPagePlus6 = new HML.TabPagePlus(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.dgvWeek = new System.Windows.Forms.DataGridView(); + this.panel3 = new System.Windows.Forms.Panel(); + this.btn_WeekExPort = new System.Windows.Forms.Button(); + this.btn_WeekQuery = new System.Windows.Forms.Button(); + this.dtpWeek = new System.Windows.Forms.DateTimePicker(); + this.label7 = new System.Windows.Forms.Label(); + this.tabPagePlus7 = new HML.TabPagePlus(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.dgvMonth = new System.Windows.Forms.DataGridView(); + this.panel4 = new System.Windows.Forms.Panel(); + this.cmbYears = new System.Windows.Forms.ComboBox(); + this.btn_MonthExPort = new System.Windows.Forms.Button(); + this.btn_MonthQuery = new System.Windows.Forms.Button(); + this.dtMonth = new System.Windows.Forms.DateTimePicker(); + this.label8 = new System.Windows.Forms.Label(); + this.tabPagePlus3 = new HML.TabPagePlus(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.btn_AlarmQuery = new System.Windows.Forms.Button(); + this.cmb_AlarmType = new System.Windows.Forms.ComboBox(); + this.btn_AlarmExport = new System.Windows.Forms.Button(); + this.dtp_AlarmTimeStart = new System.Windows.Forms.DateTimePicker(); + this.lblAlarmEndTime = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.dtp_AlarmTimeEnd = new System.Windows.Forms.DateTimePicker(); + this.lblAlarmStartTime = new System.Windows.Forms.Label(); + this.dgv_AlarmData = new System.Windows.Forms.DataGridView(); + this.panelEnhanced1.SuspendLayout(); + this.tabControlPlus1.SuspendLayout(); + this.tabPagePlus1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).BeginInit(); + this.tabPagePlus2.SuspendLayout(); + this.tabControlPlus2.SuspendLayout(); + this.tabPagePlus4.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvClass)).BeginInit(); + this.panel1.SuspendLayout(); + this.tabPagePlus5.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvDays)).BeginInit(); + this.panel2.SuspendLayout(); + this.tabPagePlus6.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvWeek)).BeginInit(); + this.panel3.SuspendLayout(); + this.tabPagePlus7.SuspendLayout(); + this.tableLayoutPanel4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvMonth)).BeginInit(); + this.panel4.SuspendLayout(); + this.tabPagePlus3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_AlarmData)).BeginInit(); + this.SuspendLayout(); + // + // panelEnhanced1 + // + this.panelEnhanced1.BackColor = System.Drawing.Color.Transparent; + this.panelEnhanced1.Controls.Add(this.tabControlPlus1); + this.panelEnhanced1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelEnhanced1.Location = new System.Drawing.Point(0, 0); + this.panelEnhanced1.Name = "panelEnhanced1"; + this.panelEnhanced1.Size = new System.Drawing.Size(1874, 818); + this.panelEnhanced1.TabIndex = 21; + // + // tabControlPlus1 + // + this.tabControlPlus1.ContentBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tabControlPlus1.Controls.Add(this.tabPagePlus1); + this.tabControlPlus1.Controls.Add(this.tabPagePlus2); + this.tabControlPlus1.Controls.Add(this.tabPagePlus3); + this.tabControlPlus1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControlPlus1.Location = new System.Drawing.Point(0, 0); + this.tabControlPlus1.Name = "tabControlPlus1"; + this.tabControlPlus1.Picker.ItemFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tabControlPlus1.Size = new System.Drawing.Size(1874, 818); + this.tabControlPlus1.TabBarBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabControlPlus1.TabIndex = 22; + this.tabControlPlus1.TabItemAutoWidth = true; + this.tabControlPlus1.TabItemBackEnterColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabControlPlus1.TabItemBackNormalColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabControlPlus1.TabItemBackSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.tabControlPlus1.TabItemFont = new System.Drawing.Font("Cambria", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tabControlPlus1.TabItemIcoSize = new System.Drawing.Size(32, 32); + this.tabControlPlus1.TabItemIcoVisible = true; + this.tabControlPlus1.TabItemSize = new System.Drawing.Size(150, 45); + // + // tabPagePlus1 + // + this.tabPagePlus1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabPagePlus1.Controls.Add(this.splitContainer1); + this.tabPagePlus1.Location = new System.Drawing.Point(1, 46); + this.tabPagePlus1.Name = "tabPagePlus1"; + this.tabPagePlus1.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus1.Size = new System.Drawing.Size(1872, 771); + this.tabPagePlus1.TabIndex = 0; + this.tabPagePlus1.TabItemIcoImage = global::LargeSquareOne.Properties.Resources.订单查询; + this.tabPagePlus1.Text = "历史生产数据查询"; + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.Color.Transparent; + this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(3, 3); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.txtBarCodeORRfid); + this.splitContainer1.Panel1.Controls.Add(this.button2); + this.splitContainer1.Panel1.Controls.Add(this.label1); + this.splitContainer1.Panel1.Controls.Add(this.button1); + this.splitContainer1.Panel1.Controls.Add(this.lblStartTime); + this.splitContainer1.Panel1.Controls.Add(this.lblType); + this.splitContainer1.Panel1.Controls.Add(this.dtp_End); + this.splitContainer1.Panel1.Controls.Add(this.btn_Query); + this.splitContainer1.Panel1.Controls.Add(this.cmb_SelectType); + this.splitContainer1.Panel1.Controls.Add(this.btn_ExPort); + this.splitContainer1.Panel1.Controls.Add(this.dtp_Start); + this.splitContainer1.Panel1.Controls.Add(this.lblEndtime); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.dgv_Main); + this.splitContainer1.Size = new System.Drawing.Size(1866, 765); + this.splitContainer1.SplitterDistance = 61; + this.splitContainer1.SplitterWidth = 5; + this.splitContainer1.TabIndex = 21; + // + // txtBarCodeORRfid + // + this.txtBarCodeORRfid.Location = new System.Drawing.Point(522, 27); + this.txtBarCodeORRfid.Name = "txtBarCodeORRfid"; + this.txtBarCodeORRfid.Size = new System.Drawing.Size(223, 26); + this.txtBarCodeORRfid.TabIndex = 23; + // + // button2 + // + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.button2.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button2.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.button2.ForeColor = System.Drawing.Color.White; + this.button2.Location = new System.Drawing.Point(1576, 8); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(140, 47); + this.button2.TabIndex = 26; + this.button2.Text = "打印数据发送测试"; + this.button2.UseVisualStyleBackColor = false; + this.button2.Visible = false; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(519, 4); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(82, 16); + this.label1.TabIndex = 22; + this.label1.Text = "RFID"; + // + // button1 + // + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.button1.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button1.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.button1.ForeColor = System.Drawing.Color.White; + this.button1.Location = new System.Drawing.Point(1421, 8); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(140, 47); + this.button1.TabIndex = 25; + this.button1.Text = "打印测试"; + this.button1.UseVisualStyleBackColor = false; + this.button1.Visible = false; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // lblStartTime + // + this.lblStartTime.AutoSize = true; + this.lblStartTime.BackColor = System.Drawing.Color.Transparent; + this.lblStartTime.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblStartTime.ForeColor = System.Drawing.Color.White; + this.lblStartTime.Location = new System.Drawing.Point(41, 4); + this.lblStartTime.Name = "lblStartTime"; + this.lblStartTime.Size = new System.Drawing.Size(67, 16); + this.lblStartTime.TabIndex = 12; + this.lblStartTime.Text = "开始时间"; + // + // lblType + // + this.lblType.AutoSize = true; + this.lblType.BackColor = System.Drawing.Color.Transparent; + this.lblType.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblType.ForeColor = System.Drawing.Color.White; + this.lblType.Location = new System.Drawing.Point(795, 4); + this.lblType.Name = "lblType"; + this.lblType.Size = new System.Drawing.Size(67, 16); + this.lblType.TabIndex = 10; + this.lblType.Text = "查询类型"; + // + // dtp_End + // + this.dtp_End.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtp_End.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtp_End.Font = new System.Drawing.Font("微软雅黑", 12F); + this.dtp_End.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtp_End.Location = new System.Drawing.Point(292, 27); + this.dtp_End.Name = "dtp_End"; + this.dtp_End.ShowUpDown = true; + this.dtp_End.Size = new System.Drawing.Size(181, 29); + this.dtp_End.TabIndex = 13; + // + // btn_Query + // + this.btn_Query.BackColor = System.Drawing.Color.Transparent; + this.btn_Query.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_Query.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Query.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Query.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_Query.ForeColor = System.Drawing.Color.White; + this.btn_Query.Location = new System.Drawing.Point(1094, 9); + this.btn_Query.Name = "btn_Query"; + this.btn_Query.Size = new System.Drawing.Size(140, 47); + this.btn_Query.TabIndex = 16; + this.btn_Query.Text = "查 询"; + this.btn_Query.UseVisualStyleBackColor = false; + this.btn_Query.Click += new System.EventHandler(this.btn_Query_Click); + // + // cmb_SelectType + // + this.cmb_SelectType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmb_SelectType.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.cmb_SelectType.FormattingEnabled = true; + this.cmb_SelectType.Location = new System.Drawing.Point(798, 27); + this.cmb_SelectType.Name = "cmb_SelectType"; + this.cmb_SelectType.Size = new System.Drawing.Size(192, 28); + this.cmb_SelectType.TabIndex = 15; + // + // btn_ExPort + // + this.btn_ExPort.BackColor = System.Drawing.Color.Transparent; + this.btn_ExPort.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_ExPort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_ExPort.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_ExPort.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_ExPort.ForeColor = System.Drawing.Color.White; + this.btn_ExPort.Location = new System.Drawing.Point(1264, 9); + this.btn_ExPort.Name = "btn_ExPort"; + this.btn_ExPort.Size = new System.Drawing.Size(140, 47); + this.btn_ExPort.TabIndex = 17; + this.btn_ExPort.Text = "导 出 Excel"; + this.btn_ExPort.UseVisualStyleBackColor = false; + this.btn_ExPort.Click += new System.EventHandler(this.btn_ExPort_Click); + // + // dtp_Start + // + this.dtp_Start.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtp_Start.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtp_Start.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtp_Start.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtp_Start.Location = new System.Drawing.Point(44, 27); + this.dtp_Start.Name = "dtp_Start"; + this.dtp_Start.ShowUpDown = true; + this.dtp_Start.Size = new System.Drawing.Size(180, 29); + this.dtp_Start.TabIndex = 14; + // + // lblEndtime + // + this.lblEndtime.AutoSize = true; + this.lblEndtime.BackColor = System.Drawing.Color.Transparent; + this.lblEndtime.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblEndtime.ForeColor = System.Drawing.Color.White; + this.lblEndtime.Location = new System.Drawing.Point(289, 4); + this.lblEndtime.Name = "lblEndtime"; + this.lblEndtime.Size = new System.Drawing.Size(67, 16); + this.lblEndtime.TabIndex = 11; + this.lblEndtime.Text = "结束时间"; + // + // dgv_Main + // + this.dgv_Main.AllowUserToAddRows = false; + this.dgv_Main.AllowUserToDeleteRows = false; + this.dgv_Main.AllowUserToResizeColumns = false; + this.dgv_Main.AllowUserToResizeRows = false; + this.dgv_Main.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgv_Main.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgv_Main.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv_Main.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgv_Main.ColumnHeadersHeight = 45; + this.dgv_Main.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Main.DefaultCellStyle = dataGridViewCellStyle2; + this.dgv_Main.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgv_Main.EnableHeadersVisualStyles = false; + this.dgv_Main.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_Main.Location = new System.Drawing.Point(0, 0); + this.dgv_Main.MultiSelect = false; + this.dgv_Main.Name = "dgv_Main"; + this.dgv_Main.ReadOnly = true; + this.dgv_Main.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgv_Main.RowHeadersWidth = 45; + this.dgv_Main.RowTemplate.Height = 23; + this.dgv_Main.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_Main.Size = new System.Drawing.Size(1864, 697); + this.dgv_Main.TabIndex = 5; + this.dgv_Main.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Main_RowPostPaint); + this.dgv_Main.Paint += new System.Windows.Forms.PaintEventHandler(this.dgv_Main_Paint); + // + // tabPagePlus2 + // + this.tabPagePlus2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.tabPagePlus2.Controls.Add(this.tabControlPlus2); + this.tabPagePlus2.Location = new System.Drawing.Point(1, 46); + this.tabPagePlus2.Name = "tabPagePlus2"; + this.tabPagePlus2.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus2.Size = new System.Drawing.Size(1872, 771); + this.tabPagePlus2.TabIndex = 1; + this.tabPagePlus2.TabItemIcoImage = global::LargeSquareOne.Properties.Resources.日志查询; + this.tabPagePlus2.Text = "产能统计查询"; + // + // tabControlPlus2 + // + this.tabControlPlus2.ContentBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tabControlPlus2.Controls.Add(this.tabPagePlus4); + this.tabControlPlus2.Controls.Add(this.tabPagePlus5); + this.tabControlPlus2.Controls.Add(this.tabPagePlus6); + this.tabControlPlus2.Controls.Add(this.tabPagePlus7); + this.tabControlPlus2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControlPlus2.Location = new System.Drawing.Point(3, 3); + this.tabControlPlus2.Name = "tabControlPlus2"; + this.tabControlPlus2.Picker.ItemFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tabControlPlus2.Size = new System.Drawing.Size(1866, 765); + this.tabControlPlus2.TabBarAlignment = HML.TabControlPlusTabBarAlignments.Left; + this.tabControlPlus2.TabBarBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabControlPlus2.TabIndex = 1; + this.tabControlPlus2.TabItemBackEnterColor = System.Drawing.Color.FromArgb(((int)(((byte)(160)))), ((int)(((byte)(110)))), ((int)(((byte)(200))))); + this.tabControlPlus2.TabItemBackNormalColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabControlPlus2.TabItemBackSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tabControlPlus2.TabItemFont = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tabControlPlus2.TipBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + // + // tabPagePlus4 + // + this.tabPagePlus4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabPagePlus4.Controls.Add(this.tableLayoutPanel1); + this.tabPagePlus4.Location = new System.Drawing.Point(101, 1); + this.tabPagePlus4.Name = "tabPagePlus4"; + this.tabPagePlus4.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus4.Size = new System.Drawing.Size(1764, 763); + this.tabPagePlus4.TabIndex = 0; + this.tabPagePlus4.Text = "按班次统计"; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.BackColor = System.Drawing.Color.Transparent; + this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset; + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.dgvClass, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 7.600596F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 92.39941F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1758, 757); + this.tableLayoutPanel1.TabIndex = 7; + // + // dgvClass + // + this.dgvClass.AllowUserToAddRows = false; + this.dgvClass.AllowUserToDeleteRows = false; + this.dgvClass.AllowUserToResizeColumns = false; + this.dgvClass.AllowUserToResizeRows = false; + this.dgvClass.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgvClass.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgvClass.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvClass.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle4.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle4.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvClass.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + this.dgvClass.ColumnHeadersHeight = 45; + this.dgvClass.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle5.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle5.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvClass.DefaultCellStyle = dataGridViewCellStyle5; + this.dgvClass.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvClass.EnableHeadersVisualStyles = false; + this.dgvClass.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvClass.Location = new System.Drawing.Point(5, 64); + this.dgvClass.MultiSelect = false; + this.dgvClass.Name = "dgvClass"; + this.dgvClass.ReadOnly = true; + this.dgvClass.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle6.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle6.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvClass.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.dgvClass.RowHeadersWidth = 45; + this.dgvClass.RowTemplate.Height = 23; + this.dgvClass.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvClass.Size = new System.Drawing.Size(1748, 688); + this.dgvClass.TabIndex = 8; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.panel1.Controls.Add(this.cmbClass); + this.panel1.Controls.Add(this.btn_ClassExPort); + this.panel1.Controls.Add(this.btn_ClassQuery); + this.panel1.Controls.Add(this.dtClass); + this.panel1.Controls.Add(this.label5); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(5, 5); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1748, 51); + this.panel1.TabIndex = 7; + // + // cmbClass + // + this.cmbClass.ForeColor = System.Drawing.Color.Black; + this.cmbClass.FormattingEnabled = true; + this.cmbClass.Location = new System.Drawing.Point(231, 22); + this.cmbClass.Name = "cmbClass"; + this.cmbClass.Size = new System.Drawing.Size(72, 28); + this.cmbClass.TabIndex = 55; + // + // btn_ClassExPort + // + this.btn_ClassExPort.BackColor = System.Drawing.Color.Transparent; + this.btn_ClassExPort.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_ClassExPort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_ClassExPort.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_ClassExPort.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_ClassExPort.ForeColor = System.Drawing.Color.White; + this.btn_ClassExPort.Location = new System.Drawing.Point(503, 19); + this.btn_ClassExPort.Name = "btn_ClassExPort"; + this.btn_ClassExPort.Size = new System.Drawing.Size(89, 32); + this.btn_ClassExPort.TabIndex = 18; + this.btn_ClassExPort.Text = "导 出"; + this.btn_ClassExPort.UseVisualStyleBackColor = false; + this.btn_ClassExPort.Click += new System.EventHandler(this.btn_ClassExPort_Click); + // + // btn_ClassQuery + // + this.btn_ClassQuery.BackColor = System.Drawing.Color.Transparent; + this.btn_ClassQuery.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_ClassQuery.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_ClassQuery.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_ClassQuery.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_ClassQuery.ForeColor = System.Drawing.Color.White; + this.btn_ClassQuery.Location = new System.Drawing.Point(355, 19); + this.btn_ClassQuery.Name = "btn_ClassQuery"; + this.btn_ClassQuery.Size = new System.Drawing.Size(89, 32); + this.btn_ClassQuery.TabIndex = 17; + this.btn_ClassQuery.Text = "查 询"; + this.btn_ClassQuery.UseVisualStyleBackColor = false; + this.btn_ClassQuery.Click += new System.EventHandler(this.btn_ClassQuery_Click); + // + // dtClass + // + this.dtClass.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtClass.CustomFormat = "yyyy/MM/dd"; + this.dtClass.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtClass.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtClass.Location = new System.Drawing.Point(42, 22); + this.dtClass.Name = "dtClass"; + this.dtClass.ShowUpDown = true; + this.dtClass.Size = new System.Drawing.Size(156, 29); + this.dtClass.TabIndex = 15; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.BackColor = System.Drawing.Color.Transparent; + this.label5.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label5.ForeColor = System.Drawing.Color.White; + this.label5.Location = new System.Drawing.Point(41, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 22); + this.label5.TabIndex = 13; + this.label5.Text = "统计日期"; + // + // tabPagePlus5 + // + this.tabPagePlus5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.tabPagePlus5.Controls.Add(this.tableLayoutPanel2); + this.tabPagePlus5.Location = new System.Drawing.Point(101, 1); + this.tabPagePlus5.Name = "tabPagePlus5"; + this.tabPagePlus5.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus5.Size = new System.Drawing.Size(1764, 763); + this.tabPagePlus5.TabIndex = 1; + this.tabPagePlus5.Text = "按日统计"; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset; + this.tableLayoutPanel2.ColumnCount = 1; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Controls.Add(this.dgvDays, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.panel2, 0, 0); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 8.46954F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 91.53046F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(1758, 757); + this.tableLayoutPanel2.TabIndex = 0; + // + // dgvDays + // + this.dgvDays.AllowUserToAddRows = false; + this.dgvDays.AllowUserToDeleteRows = false; + this.dgvDays.AllowUserToResizeColumns = false; + this.dgvDays.AllowUserToResizeRows = false; + this.dgvDays.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgvDays.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.dgvDays.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvDays.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle7.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle7.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvDays.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; + this.dgvDays.ColumnHeadersHeight = 45; + this.dgvDays.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle8.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle8.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvDays.DefaultCellStyle = dataGridViewCellStyle8; + this.dgvDays.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvDays.EnableHeadersVisualStyles = false; + this.dgvDays.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(146)))), ((int)(((byte)(235))))); + this.dgvDays.Location = new System.Drawing.Point(5, 70); + this.dgvDays.MultiSelect = false; + this.dgvDays.Name = "dgvDays"; + this.dgvDays.ReadOnly = true; + this.dgvDays.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle9.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle9.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle9.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle9.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvDays.RowHeadersDefaultCellStyle = dataGridViewCellStyle9; + this.dgvDays.RowHeadersWidth = 45; + this.dgvDays.RowTemplate.Height = 23; + this.dgvDays.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvDays.Size = new System.Drawing.Size(1748, 682); + this.dgvDays.TabIndex = 9; + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.panel2.Controls.Add(this.btn_DaysExPort); + this.panel2.Controls.Add(this.btn_DaysQuery); + this.panel2.Controls.Add(this.dtpDays); + this.panel2.Controls.Add(this.label6); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(5, 5); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1748, 57); + this.panel2.TabIndex = 8; + // + // btn_DaysExPort + // + this.btn_DaysExPort.BackColor = System.Drawing.Color.Transparent; + this.btn_DaysExPort.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_DaysExPort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_DaysExPort.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_DaysExPort.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_DaysExPort.ForeColor = System.Drawing.Color.White; + this.btn_DaysExPort.Location = new System.Drawing.Point(476, 12); + this.btn_DaysExPort.Name = "btn_DaysExPort"; + this.btn_DaysExPort.Size = new System.Drawing.Size(89, 32); + this.btn_DaysExPort.TabIndex = 18; + this.btn_DaysExPort.Text = "导 出"; + this.btn_DaysExPort.UseVisualStyleBackColor = false; + this.btn_DaysExPort.Click += new System.EventHandler(this.btn_DaysExPort_Click); + // + // btn_DaysQuery + // + this.btn_DaysQuery.BackColor = System.Drawing.Color.Transparent; + this.btn_DaysQuery.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_DaysQuery.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_DaysQuery.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_DaysQuery.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_DaysQuery.ForeColor = System.Drawing.Color.White; + this.btn_DaysQuery.Location = new System.Drawing.Point(327, 12); + this.btn_DaysQuery.Name = "btn_DaysQuery"; + this.btn_DaysQuery.Size = new System.Drawing.Size(89, 32); + this.btn_DaysQuery.TabIndex = 17; + this.btn_DaysQuery.Text = "查 询"; + this.btn_DaysQuery.UseVisualStyleBackColor = false; + this.btn_DaysQuery.Click += new System.EventHandler(this.btn_DaysQuery_Click); + // + // dtpDays + // + this.dtpDays.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtpDays.CustomFormat = "yyyy/MM/dd"; + this.dtpDays.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtpDays.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtpDays.Location = new System.Drawing.Point(106, 12); + this.dtpDays.Name = "dtpDays"; + this.dtpDays.ShowUpDown = true; + this.dtpDays.Size = new System.Drawing.Size(156, 29); + this.dtpDays.TabIndex = 15; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label6.ForeColor = System.Drawing.Color.White; + this.label6.Location = new System.Drawing.Point(10, 15); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 22); + this.label6.TabIndex = 13; + this.label6.Text = "统计日期"; + // + // tabPagePlus6 + // + this.tabPagePlus6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.tabPagePlus6.Controls.Add(this.tableLayoutPanel3); + this.tabPagePlus6.Location = new System.Drawing.Point(101, 1); + this.tabPagePlus6.Name = "tabPagePlus6"; + this.tabPagePlus6.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus6.Size = new System.Drawing.Size(1764, 763); + this.tabPagePlus6.TabIndex = 2; + this.tabPagePlus6.Text = "按周统计"; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset; + this.tableLayoutPanel3.ColumnCount = 1; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Controls.Add(this.dgvWeek, 0, 1); + this.tableLayoutPanel3.Controls.Add(this.panel3, 0, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 2; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 8.320951F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 91.67905F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(1758, 757); + this.tableLayoutPanel3.TabIndex = 0; + // + // dgvWeek + // + this.dgvWeek.AllowUserToAddRows = false; + this.dgvWeek.AllowUserToDeleteRows = false; + this.dgvWeek.AllowUserToResizeColumns = false; + this.dgvWeek.AllowUserToResizeRows = false; + this.dgvWeek.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgvWeek.BackgroundColor = System.Drawing.Color.Black; + this.dgvWeek.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvWeek.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle10.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle10.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle10.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle10.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle10.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle10.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle10.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvWeek.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle10; + this.dgvWeek.ColumnHeadersHeight = 45; + this.dgvWeek.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle11.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle11.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle11.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle11.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle11.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle11.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle11.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvWeek.DefaultCellStyle = dataGridViewCellStyle11; + this.dgvWeek.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvWeek.EnableHeadersVisualStyles = false; + this.dgvWeek.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + this.dgvWeek.Location = new System.Drawing.Point(5, 69); + this.dgvWeek.MultiSelect = false; + this.dgvWeek.Name = "dgvWeek"; + this.dgvWeek.ReadOnly = true; + this.dgvWeek.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle12.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle12.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle12.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle12.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle12.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle12.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle12.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvWeek.RowHeadersDefaultCellStyle = dataGridViewCellStyle12; + this.dgvWeek.RowHeadersWidth = 45; + this.dgvWeek.RowTemplate.Height = 23; + this.dgvWeek.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvWeek.Size = new System.Drawing.Size(1748, 683); + this.dgvWeek.TabIndex = 10; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.Black; + this.panel3.Controls.Add(this.btn_WeekExPort); + this.panel3.Controls.Add(this.btn_WeekQuery); + this.panel3.Controls.Add(this.dtpWeek); + this.panel3.Controls.Add(this.label7); + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Location = new System.Drawing.Point(5, 5); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(1748, 56); + this.panel3.TabIndex = 9; + // + // btn_WeekExPort + // + this.btn_WeekExPort.BackColor = System.Drawing.Color.Transparent; + this.btn_WeekExPort.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_WeekExPort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_WeekExPort.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_WeekExPort.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_WeekExPort.ForeColor = System.Drawing.Color.White; + this.btn_WeekExPort.Location = new System.Drawing.Point(496, 11); + this.btn_WeekExPort.Name = "btn_WeekExPort"; + this.btn_WeekExPort.Size = new System.Drawing.Size(89, 32); + this.btn_WeekExPort.TabIndex = 18; + this.btn_WeekExPort.Text = "导 出"; + this.btn_WeekExPort.UseVisualStyleBackColor = false; + this.btn_WeekExPort.Click += new System.EventHandler(this.btn_WeekExPort_Click); + // + // btn_WeekQuery + // + this.btn_WeekQuery.BackColor = System.Drawing.Color.Transparent; + this.btn_WeekQuery.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_WeekQuery.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_WeekQuery.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_WeekQuery.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_WeekQuery.ForeColor = System.Drawing.Color.White; + this.btn_WeekQuery.Location = new System.Drawing.Point(343, 11); + this.btn_WeekQuery.Name = "btn_WeekQuery"; + this.btn_WeekQuery.Size = new System.Drawing.Size(89, 32); + this.btn_WeekQuery.TabIndex = 17; + this.btn_WeekQuery.Text = "查 询"; + this.btn_WeekQuery.UseVisualStyleBackColor = false; + this.btn_WeekQuery.Click += new System.EventHandler(this.btn_WeekQuery_Click); + // + // dtpWeek + // + this.dtpWeek.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtpWeek.CustomFormat = "yyyy/MM/dd"; + this.dtpWeek.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtpWeek.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtpWeek.Location = new System.Drawing.Point(134, 10); + this.dtpWeek.Name = "dtpWeek"; + this.dtpWeek.ShowUpDown = true; + this.dtpWeek.Size = new System.Drawing.Size(156, 29); + this.dtpWeek.TabIndex = 15; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.BackColor = System.Drawing.Color.Transparent; + this.label7.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label7.ForeColor = System.Drawing.Color.White; + this.label7.Location = new System.Drawing.Point(30, 13); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(74, 22); + this.label7.TabIndex = 13; + this.label7.Text = "统计时间"; + // + // tabPagePlus7 + // + this.tabPagePlus7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.tabPagePlus7.Controls.Add(this.tableLayoutPanel4); + this.tabPagePlus7.Location = new System.Drawing.Point(101, 1); + this.tabPagePlus7.Name = "tabPagePlus7"; + this.tabPagePlus7.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus7.Size = new System.Drawing.Size(1764, 763); + this.tabPagePlus7.TabIndex = 3; + this.tabPagePlus7.Text = "按月统计"; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset; + this.tableLayoutPanel4.ColumnCount = 1; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.Controls.Add(this.dgvMonth, 0, 1); + this.tableLayoutPanel4.Controls.Add(this.panel4, 0, 0); + this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel4.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 2; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 7.558139F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 92.44186F)); + this.tableLayoutPanel4.Size = new System.Drawing.Size(1758, 757); + this.tableLayoutPanel4.TabIndex = 0; + // + // dgvMonth + // + this.dgvMonth.AllowUserToAddRows = false; + this.dgvMonth.AllowUserToDeleteRows = false; + this.dgvMonth.AllowUserToResizeColumns = false; + this.dgvMonth.AllowUserToResizeRows = false; + this.dgvMonth.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgvMonth.BackgroundColor = System.Drawing.Color.Black; + this.dgvMonth.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgvMonth.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle13.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle13.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle13.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle13.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle13.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle13.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle13.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvMonth.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle13; + this.dgvMonth.ColumnHeadersHeight = 45; + this.dgvMonth.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle14.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle14.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle14.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle14.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle14.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle14.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle14.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvMonth.DefaultCellStyle = dataGridViewCellStyle14; + this.dgvMonth.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvMonth.EnableHeadersVisualStyles = false; + this.dgvMonth.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(146)))), ((int)(((byte)(235))))); + this.dgvMonth.Location = new System.Drawing.Point(5, 63); + this.dgvMonth.MultiSelect = false; + this.dgvMonth.Name = "dgvMonth"; + this.dgvMonth.ReadOnly = true; + this.dgvMonth.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle15.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle15.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle15.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle15.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle15.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle15.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle15.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvMonth.RowHeadersDefaultCellStyle = dataGridViewCellStyle15; + this.dgvMonth.RowHeadersWidth = 45; + this.dgvMonth.RowTemplate.Height = 23; + this.dgvMonth.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvMonth.Size = new System.Drawing.Size(1748, 689); + this.dgvMonth.TabIndex = 11; + // + // panel4 + // + this.panel4.BackColor = System.Drawing.Color.Black; + this.panel4.Controls.Add(this.cmbYears); + this.panel4.Controls.Add(this.btn_MonthExPort); + this.panel4.Controls.Add(this.btn_MonthQuery); + this.panel4.Controls.Add(this.dtMonth); + this.panel4.Controls.Add(this.label8); + this.panel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel4.Location = new System.Drawing.Point(5, 5); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(1748, 50); + this.panel4.TabIndex = 10; + // + // cmbYears + // + this.cmbYears.FormattingEnabled = true; + this.cmbYears.Location = new System.Drawing.Point(530, 8); + this.cmbYears.Name = "cmbYears"; + this.cmbYears.Size = new System.Drawing.Size(59, 28); + this.cmbYears.TabIndex = 20; + this.cmbYears.Visible = false; + // + // btn_MonthExPort + // + this.btn_MonthExPort.BackColor = System.Drawing.Color.Transparent; + this.btn_MonthExPort.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_MonthExPort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_MonthExPort.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_MonthExPort.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_MonthExPort.ForeColor = System.Drawing.Color.White; + this.btn_MonthExPort.Location = new System.Drawing.Point(383, 9); + this.btn_MonthExPort.Name = "btn_MonthExPort"; + this.btn_MonthExPort.Size = new System.Drawing.Size(89, 32); + this.btn_MonthExPort.TabIndex = 19; + this.btn_MonthExPort.Text = "导 出"; + this.btn_MonthExPort.UseVisualStyleBackColor = false; + this.btn_MonthExPort.Click += new System.EventHandler(this.btn_MonthExPort_Click); + // + // btn_MonthQuery + // + this.btn_MonthQuery.BackColor = System.Drawing.Color.Transparent; + this.btn_MonthQuery.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_MonthQuery.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_MonthQuery.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_MonthQuery.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold); + this.btn_MonthQuery.ForeColor = System.Drawing.Color.White; + this.btn_MonthQuery.Location = new System.Drawing.Point(239, 8); + this.btn_MonthQuery.Name = "btn_MonthQuery"; + this.btn_MonthQuery.Size = new System.Drawing.Size(89, 32); + this.btn_MonthQuery.TabIndex = 18; + this.btn_MonthQuery.Text = "查 询"; + this.btn_MonthQuery.UseVisualStyleBackColor = false; + this.btn_MonthQuery.Click += new System.EventHandler(this.btn_MonthQuery_Click); + // + // dtMonth + // + this.dtMonth.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtMonth.CustomFormat = "yyyy/MM"; + this.dtMonth.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtMonth.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtMonth.Location = new System.Drawing.Point(123, 9); + this.dtMonth.Name = "dtMonth"; + this.dtMonth.ShowUpDown = true; + this.dtMonth.Size = new System.Drawing.Size(90, 29); + this.dtMonth.TabIndex = 16; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.BackColor = System.Drawing.Color.Transparent; + this.label8.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label8.ForeColor = System.Drawing.Color.White; + this.label8.Location = new System.Drawing.Point(28, 12); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(74, 22); + this.label8.TabIndex = 14; + this.label8.Text = "统计时间"; + // + // tabPagePlus3 + // + this.tabPagePlus3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabPagePlus3.Controls.Add(this.splitContainer2); + this.tabPagePlus3.Location = new System.Drawing.Point(1, 46); + this.tabPagePlus3.Name = "tabPagePlus3"; + this.tabPagePlus3.Size = new System.Drawing.Size(1872, 771); + this.tabPagePlus3.TabIndex = 2; + this.tabPagePlus3.TabItemIcoImage = global::LargeSquareOne.Properties.Resources.资源_6; + this.tabPagePlus3.Text = "日志报警数据查询"; + // + // splitContainer2 + // + this.splitContainer2.BackColor = System.Drawing.Color.Transparent; + this.splitContainer2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.btn_AlarmQuery); + this.splitContainer2.Panel1.Controls.Add(this.cmb_AlarmType); + this.splitContainer2.Panel1.Controls.Add(this.btn_AlarmExport); + this.splitContainer2.Panel1.Controls.Add(this.dtp_AlarmTimeStart); + this.splitContainer2.Panel1.Controls.Add(this.lblAlarmEndTime); + this.splitContainer2.Panel1.Controls.Add(this.label11); + this.splitContainer2.Panel1.Controls.Add(this.dtp_AlarmTimeEnd); + this.splitContainer2.Panel1.Controls.Add(this.lblAlarmStartTime); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.dgv_AlarmData); + this.splitContainer2.Size = new System.Drawing.Size(1872, 771); + this.splitContainer2.SplitterDistance = 68; + this.splitContainer2.SplitterWidth = 1; + this.splitContainer2.TabIndex = 22; + // + // btn_AlarmQuery + // + this.btn_AlarmQuery.BackColor = System.Drawing.Color.Transparent; + this.btn_AlarmQuery.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_AlarmQuery.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_AlarmQuery.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_AlarmQuery.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_AlarmQuery.ForeColor = System.Drawing.Color.White; + this.btn_AlarmQuery.Location = new System.Drawing.Point(920, 7); + this.btn_AlarmQuery.Name = "btn_AlarmQuery"; + this.btn_AlarmQuery.Size = new System.Drawing.Size(128, 57); + this.btn_AlarmQuery.TabIndex = 16; + this.btn_AlarmQuery.Text = "时 间 查 询"; + this.btn_AlarmQuery.UseVisualStyleBackColor = false; + this.btn_AlarmQuery.Click += new System.EventHandler(this.btn_AlarmQuery_Click); + // + // cmb_AlarmType + // + this.cmb_AlarmType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmb_AlarmType.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.cmb_AlarmType.FormattingEnabled = true; + this.cmb_AlarmType.Location = new System.Drawing.Point(41, 31); + this.cmb_AlarmType.Name = "cmb_AlarmType"; + this.cmb_AlarmType.Size = new System.Drawing.Size(123, 28); + this.cmb_AlarmType.TabIndex = 15; + this.cmb_AlarmType.SelectedIndexChanged += new System.EventHandler(this.cmb_AlarmType_SelectedIndexChanged); + // + // btn_AlarmExport + // + this.btn_AlarmExport.BackColor = System.Drawing.Color.Transparent; + this.btn_AlarmExport.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_AlarmExport.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_AlarmExport.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_AlarmExport.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_AlarmExport.ForeColor = System.Drawing.Color.White; + this.btn_AlarmExport.Location = new System.Drawing.Point(1141, 7); + this.btn_AlarmExport.Name = "btn_AlarmExport"; + this.btn_AlarmExport.Size = new System.Drawing.Size(128, 57); + this.btn_AlarmExport.TabIndex = 17; + this.btn_AlarmExport.Text = "导 出 Excel"; + this.btn_AlarmExport.UseVisualStyleBackColor = false; + this.btn_AlarmExport.Click += new System.EventHandler(this.btn_AlarmExport_Click); + // + // dtp_AlarmTimeStart + // + this.dtp_AlarmTimeStart.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtp_AlarmTimeStart.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtp_AlarmTimeStart.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtp_AlarmTimeStart.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtp_AlarmTimeStart.Location = new System.Drawing.Point(255, 31); + this.dtp_AlarmTimeStart.Name = "dtp_AlarmTimeStart"; + this.dtp_AlarmTimeStart.ShowUpDown = true; + this.dtp_AlarmTimeStart.Size = new System.Drawing.Size(178, 29); + this.dtp_AlarmTimeStart.TabIndex = 14; + // + // lblAlarmEndTime + // + this.lblAlarmEndTime.AutoSize = true; + this.lblAlarmEndTime.BackColor = System.Drawing.Color.Transparent; + this.lblAlarmEndTime.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblAlarmEndTime.ForeColor = System.Drawing.Color.White; + this.lblAlarmEndTime.Location = new System.Drawing.Point(573, 11); + this.lblAlarmEndTime.Name = "lblAlarmEndTime"; + this.lblAlarmEndTime.Size = new System.Drawing.Size(67, 16); + this.lblAlarmEndTime.TabIndex = 11; + this.lblAlarmEndTime.Text = "结束时间"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.BackColor = System.Drawing.Color.Transparent; + this.label11.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label11.ForeColor = System.Drawing.Color.White; + this.label11.Location = new System.Drawing.Point(38, 12); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(37, 16); + this.label11.TabIndex = 10; + this.label11.Text = "班次"; + // + // dtp_AlarmTimeEnd + // + this.dtp_AlarmTimeEnd.CalendarFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dtp_AlarmTimeEnd.CustomFormat = "yyyy-MM-dd HH:mm:ss"; + this.dtp_AlarmTimeEnd.Font = new System.Drawing.Font("微软雅黑", 12F); + this.dtp_AlarmTimeEnd.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dtp_AlarmTimeEnd.Location = new System.Drawing.Point(576, 31); + this.dtp_AlarmTimeEnd.Name = "dtp_AlarmTimeEnd"; + this.dtp_AlarmTimeEnd.ShowUpDown = true; + this.dtp_AlarmTimeEnd.Size = new System.Drawing.Size(174, 29); + this.dtp_AlarmTimeEnd.TabIndex = 13; + // + // lblAlarmStartTime + // + this.lblAlarmStartTime.AutoSize = true; + this.lblAlarmStartTime.BackColor = System.Drawing.Color.Transparent; + this.lblAlarmStartTime.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblAlarmStartTime.ForeColor = System.Drawing.Color.White; + this.lblAlarmStartTime.Location = new System.Drawing.Point(252, 12); + this.lblAlarmStartTime.Name = "lblAlarmStartTime"; + this.lblAlarmStartTime.Size = new System.Drawing.Size(67, 16); + this.lblAlarmStartTime.TabIndex = 12; + this.lblAlarmStartTime.Text = "开始时间"; + // + // dgv_AlarmData + // + this.dgv_AlarmData.AllowUserToAddRows = false; + this.dgv_AlarmData.AllowUserToDeleteRows = false; + this.dgv_AlarmData.AllowUserToResizeColumns = false; + this.dgv_AlarmData.AllowUserToResizeRows = false; + this.dgv_AlarmData.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells; + this.dgv_AlarmData.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgv_AlarmData.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv_AlarmData.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle16.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle16.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle16.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle16.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle16.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle16.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle16.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_AlarmData.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle16; + this.dgv_AlarmData.ColumnHeadersHeight = 45; + this.dgv_AlarmData.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle17.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle17.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle17.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle17.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle17.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle17.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle17.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_AlarmData.DefaultCellStyle = dataGridViewCellStyle17; + this.dgv_AlarmData.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgv_AlarmData.EnableHeadersVisualStyles = false; + this.dgv_AlarmData.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_AlarmData.Location = new System.Drawing.Point(0, 0); + this.dgv_AlarmData.MultiSelect = false; + this.dgv_AlarmData.Name = "dgv_AlarmData"; + this.dgv_AlarmData.ReadOnly = true; + this.dgv_AlarmData.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle18.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle18.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle18.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle18.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle18.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle18.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle18.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_AlarmData.RowHeadersDefaultCellStyle = dataGridViewCellStyle18; + this.dgv_AlarmData.RowHeadersWidth = 45; + this.dgv_AlarmData.RowTemplate.Height = 23; + this.dgv_AlarmData.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_AlarmData.Size = new System.Drawing.Size(1870, 700); + this.dgv_AlarmData.TabIndex = 5; + this.dgv_AlarmData.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_AlarmData_RowPostPaint); + // + // FrmHistory + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1874, 818); + this.Controls.Add(this.panelEnhanced1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmHistory"; + this.Text = "数据追溯"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.panelEnhanced1.ResumeLayout(false); + this.tabControlPlus1.ResumeLayout(false); + this.tabPagePlus1.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).EndInit(); + this.tabPagePlus2.ResumeLayout(false); + this.tabControlPlus2.ResumeLayout(false); + this.tabPagePlus4.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvClass)).EndInit(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.tabPagePlus5.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvDays)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.tabPagePlus6.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvWeek)).EndInit(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.tabPagePlus7.ResumeLayout(false); + this.tableLayoutPanel4.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvMonth)).EndInit(); + this.panel4.ResumeLayout(false); + this.panel4.PerformLayout(); + this.tabPagePlus3.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel1.PerformLayout(); + this.splitContainer2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgv_AlarmData)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btn_Query; + private System.Windows.Forms.Button btn_ExPort; + private System.Windows.Forms.DateTimePicker dtp_End; + private System.Windows.Forms.Label lblType; + private System.Windows.Forms.Label lblEndtime; + private System.Windows.Forms.DateTimePicker dtp_Start; + private System.Windows.Forms.Label lblStartTime; + private JinYuan.ControlLib.PanelEnhanced panelEnhanced1; + private System.Windows.Forms.SplitContainer splitContainer1; + private HML.TabControlPlus tabControlPlus1; + private HML.TabPagePlus tabPagePlus1; + private HML.TabPagePlus tabPagePlus2; + private HML.TabPagePlus tabPagePlus3; + private HML.TabControlPlus tabControlPlus2; + private HML.TabPagePlus tabPagePlus4; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button btn_ClassExPort; + private System.Windows.Forms.Button btn_ClassQuery; + private System.Windows.Forms.DateTimePicker dtClass; + private System.Windows.Forms.Label label5; + private HML.TabPagePlus tabPagePlus5; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btn_DaysExPort; + private System.Windows.Forms.Button btn_DaysQuery; + private System.Windows.Forms.DateTimePicker dtpDays; + private System.Windows.Forms.Label label6; + private HML.TabPagePlus tabPagePlus6; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Button btn_WeekExPort; + private System.Windows.Forms.Button btn_WeekQuery; + private System.Windows.Forms.DateTimePicker dtpWeek; + private System.Windows.Forms.Label label7; + private HML.TabPagePlus tabPagePlus7; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Button btn_MonthExPort; + private System.Windows.Forms.Button btn_MonthQuery; + private System.Windows.Forms.DateTimePicker dtMonth; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.Button btn_AlarmQuery; + private System.Windows.Forms.Button btn_AlarmExport; + private System.Windows.Forms.DateTimePicker dtp_AlarmTimeStart; + private System.Windows.Forms.Label lblAlarmEndTime; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.DateTimePicker dtp_AlarmTimeEnd; + private System.Windows.Forms.Label lblAlarmStartTime; + private System.Windows.Forms.TextBox txtBarCodeORRfid; + private System.Windows.Forms.Label label1; + public System.Windows.Forms.DataGridView dgv_Main; + public System.Windows.Forms.DataGridView dgvClass; + public System.Windows.Forms.DataGridView dgvDays; + public System.Windows.Forms.DataGridView dgvWeek; + public System.Windows.Forms.DataGridView dgvMonth; + public System.Windows.Forms.DataGridView dgv_AlarmData; + public System.Windows.Forms.ComboBox cmb_SelectType; + public System.Windows.Forms.ComboBox cmbYears; + public System.Windows.Forms.ComboBox cmb_AlarmType; + public System.Windows.Forms.ComboBox cmbClass; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmHistory.cs b/LargeSquareOne/FrmHistory.cs new file mode 100644 index 0000000..72fe048 --- /dev/null +++ b/LargeSquareOne/FrmHistory.cs @@ -0,0 +1,802 @@ +using Google.Protobuf.Collections; +using JinYuan.Helper; +using JinYuan.MES.Enums; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using MathNet.Numerics.LinearAlgebra.Factorization; +using MiniExcelLibs; +using PLCCommunication.Common.DataConvert; +using PrintSocket; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmHistory : MultiLanguageForm + { + public static FrmHistory _Form;// 单例模式 + + public FrmHistory() + { + InitializeComponent(); + + this.cmb_SelectType.Items.AddRange(new string[] { "包装箱进站".Translated(), /*"箱唛标签打印".Translated(),*/ "包装箱出站".Translated(),/*"栈板标签打印".Translated(),*/ "箱唛信息".Translated(), "栈板信息".Translated(), "箱唛码与栈板码绑定关系".Translated() }); + this.cmb_SelectType.SelectedIndex = 0; + + this.dtp_Start.Value = DateTime.Now.AddHours(-2.0f); + this.dtp_End.Value = DateTime.Now; + + this.cmb_AlarmType.Items.AddRange(new string[] { "全天".Translated(), "白班".Translated(), "夜班".Translated() }); + this.cmb_AlarmType.SelectedIndex = 0; + + this.cmbClass.Items.AddRange(new string[] { "白班".Translated(), "夜班".Translated() }); + this.cmbClass.SelectedIndex = 0; + + _Form = this; + } + + + + + /// + /// 查询 + /// + /// + /// + private void btn_Query_Click(object sender, EventArgs e) + { + string str = this.cmb_SelectType.Text; + + if (string.Compare(str, "包装箱进站".Translated()) == 0) + { + this.cmb_SelectType.SelectedIndex = 0; + } + //else if (string.Compare(str, "箱唛标签打印".Translated()) == 0) + //{ + // this.cmb_SelectType.SelectedIndex = 1; + //} + + else if (string.Compare(str, "包装箱出站".Translated()) == 0) + { + this.cmb_SelectType.SelectedIndex = 1; + } + else if (string.Compare(str, "箱唛信息".Translated()) == 0) + { + this.cmb_SelectType.SelectedIndex = 2; + } + else if (string.Compare(str, "栈板信息".Translated()) == 0) + { + this.cmb_SelectType.SelectedIndex = 3; + } + else if (string.Compare(str, "箱唛码与栈板码绑定关系".Translated()) == 0) + { + this.cmb_SelectType.SelectedIndex = 4; + } + //else if (string.Compare(str, "栈板标签打印".Translated()) == 0) + //{ + // this.cmb_SelectType.SelectedIndex = 6; + //} + string rfid = this.txtBarCodeORRfid.Text.Trim(); + //string barCode = this.txtSteelShellCode.Text.Trim(); + string start = this.dtp_Start.Text; + string end = this.dtp_End.Text; + int selectType = this.cmb_SelectType.SelectedIndex; + + Task> task1 = Task.Run(() => + { + return QueryProcess(selectType, rfid, "", start, end); + + }); + + var task2 = task1.ContinueWith(task => + { + this.BeginInvoke(new Action(() => + { + if (task.Result.IsSuccess) + { + + this.dgv_Main.DataSource = null; + + this.dgv_Main.DataSource = task.Result.Content; + } + else + { + new FrmMsgBoxOutWithAck(2, "查询失败:".Translated() + task.Result.Message, "错误提示".Translated()).Show(); + } + })); + }); + } + + + public List queryProcessListA; + public List queryProcessListB; + public List queryProcessListD; + public List queryProcessListE; + public List queryProcessListF; + public List queryProcessListG; + public List queryProcessListH; + + /// + /// DataTable-->List + /// 获取三语切换的DataTable.ColumnName + /// + /// + /// + /// + public DataTable GetHistoryOutData(int selectType, DataTable dataTable) + { + string selectTypeStr = ""; + //查询数据保存成List + switch (selectType) + { + case 0: + queryProcessListA = dataTable.ToList(); + selectTypeStr = "FrmHistory_dgv_Main_"; + break; + //case 1: + // queryProcessListD = dataTable.ToList(); + // selectTypeStr = "FrmHistory_dgv_Main_"; + // break; + case 1: + queryProcessListE = dataTable.ToList(); + selectTypeStr = "FrmHistory_dgv_Main_"; + break; + case 2: + queryProcessListB = dataTable.ToList(); + selectTypeStr = "FrmHistory_dgv_Main_"; + break; + case 3: + queryProcessListF = dataTable.ToList(); + selectTypeStr = "FrmHistory_dgv_Main_"; + break; + case 4: + queryProcessListG = dataTable.ToList(); + selectTypeStr = "FrmHistory_dgv_Main_"; + break; + case 5: + queryProcessListH = dataTable.ToList(); + selectTypeStr = "FrmHistory_dgv_Main_"; + break; + case 7: + selectTypeStr = "FrmHistory_dgvClass_"; + break; + case 8: + selectTypeStr = "FrmHistory_dgvDays_"; + break; + case 9: + selectTypeStr = "FrmHistory_dgvMonth_"; + break; + case 10: + selectTypeStr = "FrmHistory_dgvWeek_"; + break; + case 11: + selectTypeStr = "FrmHistory_dgv_AlarmData_"; + break; + } + + // 自定义获取新列名的方法 钩子函数 + Func GetNewColumnName = originalName => + { + // 这里可以根据具体需求实现自定义逻辑 + return LanguageManager.GetString($"{selectTypeStr + originalName}"); ; + }; + + // 使用自定义方法替换列名 + dataTable = dataTable.ReplaceColumnNamesWithCustomMethod(GetNewColumnName); + + return dataTable; + } + + private PLCCommunication.Common.DataConvert.DataResult QueryProcess(int selectType, string rfid, string barCode, string start, string end) + { + //判断时间 + DateTime startTime = Convert.ToDateTime(start); + DateTime endTime = Convert.ToDateTime(end); + if (startTime > endTime) + { + return DataResult.CreateFailResult("开始时间不能大于结束时间".Translated()); + } + TimeSpan timeSpan = endTime - startTime; + if (timeSpan.TotalDays > 7.0) + { + return DataResult.CreateFailResult("查询时间不能超过7天".Translated()); + } + + DataTable dataTable = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.SelectHostData(selectType, rfid, barCode, start, end)); + if (dataTable != null) + { + dataTable = GetHistoryOutData(selectType, dataTable); + return DataResult.CreateSuccessResult(dataTable); + } + else + { + return DataResult.CreateFailResult("未能查到数据,请检测".Translated()); + } + } + + private void btn_ExPort_Click(object sender, EventArgs e) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + + saveFileDialog.Filter = "XLSX文件(*.xlsx)|*.xlsx|所有文件|*.*"; + saveFileDialog.Title = "导出历史数据"; + saveFileDialog.FileName = "历史数据".Translated() + DateTime.Now.ToString("yyyyMMddHHmmss"); + saveFileDialog.DefaultExt = "xlsx"; + saveFileDialog.AddExtension = true; + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + + MiniExcel.SaveAs(saveFileDialog.FileName, this.dgv_Main.DataSource); + + if (new FrmMsgBoxWithAck("导出报表成功,是否立即打开?".Translated(), "打开报表记录".Translated()).ShowDialog() == DialogResult.OK) + { + Process.Start(saveFileDialog.FileName); + } + else + { + new FrmMsgBoxOutWithAck(2, "导出报表失败".Translated(), "数据报表导出".Translated()).ShowDialog(); + } + } + } + + + /// + /// 显示序列号 + /// + /// + /// + private void dgv_Main_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + DataGridViewHelper.DgvRowPostPaint((DataGridView)sender, e); + } + + /// + /// 给DataGridView绘制边框 + /// + /// + /// + private void dgv_Main_Paint(object sender, PaintEventArgs e) + { + DataGridViewHelper.DgvRowPaint((DataGridView)sender, e, Color.FromArgb(1, 146, 235)); + } + + /// + /// + /// + /// + /// + private void dgv_Main_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.RowIndex != -1 && e.ColumnIndex >= 5) + { + object value = this.dgv_Main.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; + + if (value == null || value?.ToString().Length == 0) + { + e.Value = "--"; + } + } + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + #endregion + + + #region 统计查询 + /// + /// 班次 + /// + private DataTable dtClasses = null; + /// + /// 日 + /// + private DataTable dtDays = null; + /// + /// 周 + /// + private DataTable dtWeeks = null; + /// + /// 月 + /// + private DataTable dtMonths = null; + + #region 1、按班次查询 + /// + /// 按班次查询 + /// + /// + /// + private void btn_ClassQuery_Click(object sender, EventArgs e) + { + dtClasses = null; + DateTime strDate = dtClass.Value; + int strClass = cmbClass.SelectedIndex; + dtClasses = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.GetStaticByShift(strDate, strClass, CommonMethods.ChangeClassTime)); + //if (dtClasses != null)//&& dtClasses.Rows.Count > 0 + //{ + // this.dgvClass.DataSource = null; + // this.dgvClass.DataSource = dtClasses; + //} + + if (dtClasses != null) + { + dtClasses = GetHistoryOutData(7, dtClasses); + this.dgvClass.DataSource = null; + this.dgvClass.DataSource = dtClasses; + } + } + + /// + /// 按班次导出 + /// + /// + /// + private void btn_ClassExPort_Click(object sender, EventArgs e) + { + if (dgvClass.Columns.Count <= 0) + { + MessageBox.Show("导出失败,无查询结果"); + return; + } + + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = $"产能统计_按班次统计_{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + saveFileDialog.Filter = "*|*.csv"; + if (saveFileDialog.ShowDialog() == DialogResult.Cancel) + return; + + string msg = ""; + if (CSVHelper.ExportDataTableToCSV(dtClasses, saveFileDialog.FileName, out msg)) + { + MessageBox.Show("导出成功!"); + } + } + #endregion + + # region 2、按日查询 + + /// + /// 按日查询 + /// + /// + /// + private void btn_DaysQuery_Click(object sender, EventArgs e) + { + dtDays = null; + string startDateTime = dtpDays.Value.ToString("yyyy-MM-dd 00:00:00"); + string endDateTime = dtpDays.Value.ToString("yyyy-MM-dd 23:59:59"); + dtDays = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.GetStaticByDay(startDateTime, endDateTime)); + //if (dtDays != null )//&& dtDays.Rows.Count > 0 + //{ + // this.dgvDays.DataSource = null; + // this.dgvDays.DataSource = dtDays; + //} + if (dtDays != null) + { + dtDays = GetHistoryOutData(8, dtDays); + this.dgvDays.DataSource = null; + this.dgvDays.DataSource = dtDays; + } + } + + /// + /// 按日导出 + /// + /// + /// + private void btn_DaysExPort_Click(object sender, EventArgs e) + { + if (dgvDays.Columns.Count <= 0) + { + MessageBox.Show("导出失败,无查询结果"); + return; + } + + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = $"产能统计_按日统计_{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + saveFileDialog.Filter = "*|*.csv"; + if (saveFileDialog.ShowDialog() == DialogResult.Cancel) + return; + + string msg = ""; + if (CSVHelper.ExportDataTableToCSV(dtDays, saveFileDialog.FileName, out msg)) + { + MessageBox.Show("导出成功!"); + } + } + + #endregion + + #region 3、按周查询 + /// + /// 按周查询 + /// + /// + /// + private void btn_WeekQuery_Click(object sender, EventArgs e) + { + dtWeeks = null; + //确定星期几 + var index = (int)dtpWeek.Value.DayOfWeek; + index = index == 0 ? 7 : index; + //当前周的范围 + string retStartDay = dtpWeek.Value.AddDays(-(index - 1)).ToString(); + string retEndDay = dtpWeek.Value.AddDays(7 - index).ToString(); + + dtWeeks = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.GetStaticByWeek(retStartDay, retEndDay)); + //if (dtWeeks != null)//&& dtWeeks.Rows.Count > 0 + //{ + // this.dgvWeek.DataSource = null; + // this.dgvWeek.DataSource = dtWeeks; + //} + if (dtWeeks != null) + { + dtWeeks = GetHistoryOutData(10, dtWeeks); + this.dgvWeek.DataSource = null; + this.dgvWeek.DataSource = dtWeeks; + } + } + + /// + /// 按周导出 + /// + /// + /// + private void btn_WeekExPort_Click(object sender, EventArgs e) + { + if (dgvWeek.Columns.Count <= 0) + { + MessageBox.Show("导出失败,无查询结果"); + return; + } + + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = $"产能统计_按周统计_{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + saveFileDialog.Filter = "*|*.csv"; + if (saveFileDialog.ShowDialog() == DialogResult.Cancel) + return; + + string msg = ""; + if (CSVHelper.ExportDataTableToCSV(dtWeeks, saveFileDialog.FileName, out msg)) + { + MessageBox.Show("导出成功!"); + } + } + #endregion + + #region 4、按月查询 + /// + /// 按月查询 + /// + /// + /// + private void btn_MonthQuery_Click(object sender, EventArgs e) + { + + dtMonths = null; + string startDateTime = dtMonth.Value.ToString("yyyy-MM-01 00:00:00"); + + string endDateTime = new DateTime(dtMonth.Value.Year, dtMonth.Value.Month, DateTime.DaysInMonth(dtMonth.Value.Year, dtMonth.Value.Month)).ToString("yyyy-MM-dd 23:59:59");//通过指定日期计算当月最后一天 + dtMonths = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.GetStaticByMonth(startDateTime, endDateTime)); + //if (dtMonths != null)// && dtMonths.Rows.Count > 0 + //{ + // this.dgvMonth.DataSource = null; + // this.dgvMonth.DataSource = dtMonths; + //} + if (dtMonths != null) + { + dtMonths = GetHistoryOutData(9, dtMonths); + this.dgvMonth.DataSource = null; + this.dgvMonth.DataSource = dtMonths; + } + } + + /// + /// 按月导出 + /// + /// + /// + private void btn_MonthExPort_Click(object sender, EventArgs e) + { + if (dgvMonth.Columns.Count <= 0) + { + MessageBox.Show("导出失败,无查询结果"); + return; + } + + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = $"产能统计_按月统计_{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + saveFileDialog.Filter = "*|*.csv"; + if (saveFileDialog.ShowDialog() == DialogResult.Cancel) + return; + + string msg = ""; + if (CSVHelper.ExportDataTableToCSV(dtMonths, saveFileDialog.FileName, out msg)) + { + MessageBox.Show("导出成功!"); + } + } + + #endregion + + #endregion + + /// + /// 选择班次时间变更 + /// + /// + /// + private void cmb_AlarmType_SelectedIndexChanged(object sender, EventArgs e) + { + if (cmb_AlarmType.SelectedIndex == 1) //白班 + { + DateTime baiClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 8:30:00")); + DateTime baiClassEnd = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 20:29:59")); + + dtp_AlarmTimeStart.Value = baiClassStart; + dtp_AlarmTimeEnd.Value = baiClassEnd; + } + else if (cmb_AlarmType.SelectedIndex == 2) //夜班 + { + DateTime yeClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 20:30:00")); + DateTime yeClassEnd = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 8:29:59")); + + dtp_AlarmTimeStart.Value = yeClassStart; + dtp_AlarmTimeEnd.Value = yeClassEnd; + } + else + { + DateTime baiClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")); + DateTime baiClassEnd = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")); + + dtp_AlarmTimeStart.Value = baiClassStart; + dtp_AlarmTimeEnd.Value = baiClassEnd; + } + } + + #region 报警查询 + /// + /// 查询数据 + /// + /// + /// + /// + /// + private DataResult QueryProcess(string start, string end, int alarmType) + { + DateTime startDateTime = Convert.ToDateTime(start); + DateTime endDateTime = Convert.ToDateTime(end); + + if (startDateTime >= endDateTime) + { + return DataResult.CreateFailResult("开始时间不能大于结束时间".Translated()); + } + + TimeSpan timeSpan = endDateTime - startDateTime; + + if (timeSpan.TotalDays > 1.0) + { + return DataResult.CreateFailResult("查询范围不能超过1天".Translated()); + } + + DataTable dataTable = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.SelectHostAlarmData(start, end, alarmType)); + if (dataTable != null) + { + dataTable = GetHistoryOutData(11, dataTable); + return DataResult.CreateSuccessResult(dataTable); + } + else + { + return DataResult.CreateFailResult("未能查到数据,请检测".Translated()); + } + } + + + /// + /// 报警信息查询 + /// + /// + /// + private void btn_AlarmQuery_Click(object sender, EventArgs e) + { + string start = this.dtp_AlarmTimeStart.Text; + string end = this.dtp_AlarmTimeEnd.Text; + + int alarmType = this.cmb_AlarmType.SelectedIndex; + + Task> task1 = Task.Run(() => + { + return QueryProcess(start, end, alarmType); + }); + + var task2 = task1.ContinueWith(task => + { + this.BeginInvoke(new Action(() => + { + if (task.Result.IsSuccess) + { + this.dgv_AlarmData.DataSource = null; + this.dgv_AlarmData.DataSource = task.Result.Content; + } + else + { + new FrmMsgBoxOutWithAck(2, "查询失败:".Translated() + task.Result.Message, "报警查询".Translated()).Show(); + } + })); + }); + } + + + /// + /// 报警信息导出 + /// + /// + /// + private void btn_AlarmExport_Click(object sender, EventArgs e) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Filter = "XLSX文件(*.xlsx)|*.xlsx|所有文件|*.*"; + saveFileDialog.Title = "导出历史报警"; + saveFileDialog.FileName = "历史报警".Translated() + DateTime.Now.ToString("yyyyMMddHHmmss"); + saveFileDialog.DefaultExt = "xlsx"; + saveFileDialog.AddExtension = true; + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + MiniExcel.SaveAs(saveFileDialog.FileName, this.dgv_AlarmData.DataSource); + + if (new FrmMsgBoxWithAck("导出报警成功,是否立即打开?".Translated(), "打开报警记录".Translated()).ShowDialog() == DialogResult.OK) + { + Process.Start(saveFileDialog.FileName); + } + } + } + + private void dgv_AlarmData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + DataGridViewHelper.DgvRowPostPaint((DataGridView)sender, e); + } + + #endregion + + private void button1_Click(object sender, EventArgs e) + { + string containercode = "test_111"; + if (CommonMethods.containerPrint == null) + { + CommonMethods.containerPrint = new JinYuan.VirtualDataLibrary.Utlis.BartenderPrinter(CommonMethods.btwConfig.printerName); + } + try + { + + // 初始化目标字典 + Dictionary vdaPrintValues = new Dictionary(); + + vdaPrintValues["customer"] = "57"; + vdaPrintValues["supplier"] = "EVE"; + vdaPrintValues["orderNumber"] = "19999"; + vdaPrintValues["materialCode"] = "1"; + //vdaPrintValues["产品描述"] = "方形铁锂"; + vdaPrintValues["productModel"] = "123"; + vdaPrintValues["productionDate"] = "2026-01-15"; + vdaPrintValues["batchQuantity"] = "240 PCS"; + vdaPrintValues["packingQuantity"] = "10 PCS"; + vdaPrintValues["boxNumber"] = "10001"; + vdaPrintValues["level"] = "A"; + vdaPrintValues["voltage"] = "100"; + vdaPrintValues["resistance"] = "1000"; + vdaPrintValues["capacity"] = "99"; + vdaPrintValues["boxNumber"] = "test111"; + vdaPrintValues["groupNumber"] = "88"; + vdaPrintValues["remark"] = "测试"; + + + //使用打印机 + bool b = CommonMethods.containerPrint.write(CommonMethods.btwConfig.containerBTWPath, "label print", vdaPrintValues); + if (b) + { + Debug.WriteLine($"箱唛码{containercode}:打印发送成功"); + //CommonMethods.AddDataMonitorLog(0, $"箱唛码{containercode}:打印发送成功".Translated()); + } + else + { + Debug.WriteLine($"箱唛码{containercode}:打印发送失败"); + //CommonMethods.AddDataMonitorLog(0, $"箱唛码{containercode}:打印发送失败".Translated()); + + } + } + catch (Exception ex) + { + Debug.WriteLine($"箱唛码{containercode}:打印发送失败{ex}"); + //CommonMethods.AddDataMonitorLog(0, $"箱唛码{containercode}:打印发送失败{ex }"); + } + } + + private void button2_Click(object sender, EventArgs e) + { + try + { + //if (CommonMethods.btwConfig.IsConnectPrinter && CommonMethods.tcpClient == null) + if ( CommonMethods.tcpClient == null) + { + CommonMethods.tcpClient = new PrintSocket.TCPClient(); + CommonMethods.tcpClient.InitClient("127.0.0.1", 8000); + System.Threading.Thread.Sleep(100); + } + + // 构建打印数据 + + Dictionary printData = new Dictionary + { + { "siteCode", "SZ-001" }, + { "lineCode", "LINE-05" }, + { "equipName", "打印" }, + { "ContainerCode", "CONT-20260119001" }, + { "weight", "12.5" }, + { "palletCode", "PAL-20260119001" }, + { "containerTypeCode", "TYPE-02" }, + { "virtualContainerCode", "VCONT-20260119001" }, + { "groupNum", "5" }, + { "supplierCode", "SUPP-003" }, + { "customerCode", "CUST-108" }, + { "customerName", "有限公司" }, + { "packQty", "24" }, + { "batchQty", "1000" }, + { "soNum", "SO-20260119001" }, + { "customerOrder", "CO-20260119001" }, + { "soLineNum", "SOL-20260119001-01" }, + { "materialCode", "MAT-18650-002" }, + { "materialName", "锂电池电芯" }, + { "model", "2500mAh" }, + { "grade", "A" }, // 等级 + { "voltage", "3.7" }, // 电压(V) + { "inresistance", "0.012-1.00" }, + { "capacity", "2500" }, + { "productDate", "2026-01-19" }, + { "rohs", "true" }, + { "locatorCode", "LOC-02-03-05" }, + { "locatorName", "电芯组盘区02库位" }, + { "enableFlag", "true" }, + { "actualLoadQty", "24" }, + { "poNum", "PO-20260119001" }, + { "autoFlag", "true" } + + }; + if(CommonMethods.tcpClient != null) + { + // 发送打印任务 + CommonMethods.tcpClient.Send(printData); + MessageBox.Show("打印数据发送完成"); + } + else + { + MessageBox.Show("打印服务器连不上"); + } + + } + catch (Exception ex) + { + MessageBox.Show($"发送失败:{ex.Message}"); + } + } + } +} diff --git a/LargeSquareOne/FrmHistory.resx b/LargeSquareOne/FrmHistory.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/FrmHistory.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmLogin.Designer.cs b/LargeSquareOne/FrmLogin.Designer.cs new file mode 100644 index 0000000..d596e4f --- /dev/null +++ b/LargeSquareOne/FrmLogin.Designer.cs @@ -0,0 +1,200 @@ +namespace LargeSquareOne +{ + partial class FrmLogin + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmLogin)); + this.txt_LoginPwd = new System.Windows.Forms.TextBox(); + this.txt_LoginName = new System.Windows.Forms.TextBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.SwitchLanguage = new AntdUI.Dropdown(); + this.pageHeader1 = new AntdUI.PageHeader(); + this.btn_Login = new AntdUI.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.pageHeader1.SuspendLayout(); + this.SuspendLayout(); + // + // txt_LoginPwd + // + this.txt_LoginPwd.BackColor = System.Drawing.Color.White; + this.txt_LoginPwd.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txt_LoginPwd.Font = new System.Drawing.Font("Microsoft JhengHei UI", 24F); + this.txt_LoginPwd.ForeColor = System.Drawing.Color.Black; + this.txt_LoginPwd.Location = new System.Drawing.Point(515, 281); + this.txt_LoginPwd.Name = "txt_LoginPwd"; + this.txt_LoginPwd.PasswordChar = '*'; + this.txt_LoginPwd.Size = new System.Drawing.Size(276, 41); + this.txt_LoginPwd.TabIndex = 1; + this.txt_LoginPwd.Text = "Admin"; + // + // txt_LoginName + // + this.txt_LoginName.BackColor = System.Drawing.Color.White; + this.txt_LoginName.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txt_LoginName.Font = new System.Drawing.Font("Microsoft JhengHei UI", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txt_LoginName.ForeColor = System.Drawing.Color.Black; + this.txt_LoginName.Location = new System.Drawing.Point(515, 207); + this.txt_LoginName.Name = "txt_LoginName"; + this.txt_LoginName.Size = new System.Drawing.Size(276, 41); + this.txt_LoginName.TabIndex = 0; + this.txt_LoginName.Text = "Admin"; + this.txt_LoginName.DoubleClick += new System.EventHandler(this.txt_LoginName_DoubleClick); + this.txt_LoginName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txt_LoginName_KeyDown); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.Image = global::LargeSquareOne.Properties.Resources.用户; + this.pictureBox1.Location = new System.Drawing.Point(441, 198); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(49, 50); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 8; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.BackColor = System.Drawing.Color.Transparent; + this.pictureBox2.Image = global::LargeSquareOne.Properties.Resources._25_密码; + this.pictureBox2.Location = new System.Drawing.Point(441, 277); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(49, 50); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 9; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox3.Image = global::LargeSquareOne.Properties.Resources.yiweidongli; + this.pictureBox3.Location = new System.Drawing.Point(0, 0); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(153, 38); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 10; + this.pictureBox3.TabStop = false; + // + // SwitchLanguage + // + this.SwitchLanguage.BackActive = System.Drawing.Color.FromArgb(((int)(((byte)(195)))), ((int)(((byte)(198)))), ((int)(((byte)(202))))); + this.SwitchLanguage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(89)))), ((int)(((byte)(197))))); + this.SwitchLanguage.BackHover = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(200)))), ((int)(((byte)(205))))); + this.SwitchLanguage.Dock = System.Windows.Forms.DockStyle.Right; + this.SwitchLanguage.Font = new System.Drawing.Font("Microsoft YaHei UI", 22F); + this.SwitchLanguage.Ghost = true; + this.SwitchLanguage.IconSvg = resources.GetString("SwitchLanguage.IconSvg"); + this.SwitchLanguage.Items.AddRange(new object[] { + "中文", + "英文", + "匈牙利语"}); + this.SwitchLanguage.Location = new System.Drawing.Point(855, 0); + this.SwitchLanguage.Name = "SwitchLanguage"; + this.SwitchLanguage.Size = new System.Drawing.Size(41, 38); + this.SwitchLanguage.TabIndex = 11; + this.SwitchLanguage.Type = AntdUI.TTypeMini.Primary; + this.SwitchLanguage.SelectedValueChanged += new AntdUI.ObjectNEventHandler(this.SwitchLanguage_SelectedValueChanged); + // + // pageHeader1 + // + this.pageHeader1.BackColor = System.Drawing.Color.Transparent; + this.pageHeader1.Controls.Add(this.SwitchLanguage); + this.pageHeader1.Controls.Add(this.pictureBox3); + this.pageHeader1.Dock = System.Windows.Forms.DockStyle.Top; + this.pageHeader1.Font = new System.Drawing.Font("Microsoft YaHei UI", 22F); + this.pageHeader1.Location = new System.Drawing.Point(0, 0); + this.pageHeader1.MaximizeBox = false; + this.pageHeader1.MinimizeBox = false; + this.pageHeader1.Name = "pageHeader1"; + this.pageHeader1.ShowButton = true; + this.pageHeader1.Size = new System.Drawing.Size(936, 38); + this.pageHeader1.TabIndex = 14; + this.pageHeader1.Text = " "; + // + // btn_Login + // + this.btn_Login.DefaultBack = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(29)))), ((int)(((byte)(85))))); + this.btn_Login.DefaultBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(29)))), ((int)(((byte)(85))))); + this.btn_Login.Font = new System.Drawing.Font("Microsoft JhengHei UI", 24F); + this.btn_Login.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(251)))), ((int)(((byte)(251)))), ((int)(((byte)(251))))); + this.btn_Login.Location = new System.Drawing.Point(441, 392); + this.btn_Login.Name = "btn_Login"; + this.btn_Login.Size = new System.Drawing.Size(380, 68); + this.btn_Login.TabIndex = 15; + this.btn_Login.Text = "登录"; + this.btn_Login.Click += new System.EventHandler(this.btn_Login_Click); + // + // FrmLogin + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::LargeSquareOne.Properties.Resources.Login11; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(936, 534); + this.Controls.Add(this.btn_Login); + this.Controls.Add(this.pageHeader1); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.txt_LoginPwd); + this.Controls.Add(this.txt_LoginName); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "FrmLogin"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "登录系统"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmLogin_FormClosing); + this.Load += new System.EventHandler(this.FrmLogin_Load); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form_MouseMove); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.pageHeader1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txt_LoginPwd; + private System.Windows.Forms.TextBox txt_LoginName; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox3; + private AntdUI.Dropdown SwitchLanguage; + private AntdUI.PageHeader pageHeader1; + private AntdUI.Button btn_Login; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmLogin.cs b/LargeSquareOne/FrmLogin.cs new file mode 100644 index 0000000..217ac91 --- /dev/null +++ b/LargeSquareOne/FrmLogin.cs @@ -0,0 +1,321 @@ +using AntdUI; +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmLogin : MultiLanguageForm + { + public FrmLogin() + { + InitializeComponent(); + InitializeLanguageSwitch(); + InitializeFormSettings(); + + this.Load += FrmLogin_Load; + } + + private void FrmLogin_Load(object sender, EventArgs e) + { + CommonMethods.GetSysConfig(); + if (CommonMethods.sysConfig != null) + { + if (CommonMethods.sysConfig.AutoLogin) + { + btn_Login_Click(null, null); + } + } + } + + /// + /// 登录 + /// + /// + /// + private void btn_Login_Click(object sender, EventArgs e) + { + //数据验证 + if (this.txt_LoginName.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录用户名".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginName.Focus(); + return; + } + if (this.txt_LoginPwd.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录密码".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginPwd.Focus(); + return; + } + + //封装对象 + SysAdmin sysAdminModel = new SysAdmin() + { + LoginName = this.txt_LoginName.Text.Trim(), + LoginPwd = StringSecurityHelper.DESEncrypt(this.txt_LoginPwd.Text.Trim()) + }; + + + sysAdminModel = CommonMethods.db.Query(it => it.LoginName == sysAdminModel.LoginName && it.LoginPwd == sysAdminModel.LoginPwd); + if (sysAdminModel == null) + { + new FrmMsgBoxOutWithAck(3, "登录用户或密码错误".Translated(), "登录提示".Translated()).ShowDialog(); + return; + } + else + { + this.DialogResult = DialogResult.OK; + CommonMethods.LoginOut = false; + //存储用户对象 + CommonMethods.currentAdmin = sysAdminModel; + CommonMethods.IsLoginOk = true; + } + } + + /// + /// 回车按钮事件 + /// + /// + /// + private void btn_Login_KeyDown(object sender, KeyEventArgs e) + { + //数据验证 + if (this.txt_LoginName.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录用户名".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginName.Focus(); + return; + } + if (this.txt_LoginPwd.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录密码".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginPwd.Focus(); + return; + } + + //封装对象 + SysAdmin sysAdmin = new SysAdmin() + { + LoginName = this.txt_LoginName.Text.Trim(), + LoginPwd = StringSecurityHelper.DESEncrypt(this.txt_LoginPwd.Text.Trim()) + }; + + //调用查询方法 + sysAdmin = CommonMethods.db.Query(it => it.LoginName == sysAdmin.LoginName && it.LoginPwd == sysAdmin.LoginPwd); + if (sysAdmin == null) + { + new FrmMsgBoxOutWithAck(3, "登录用户或密码错误".Translated(), "登录提示".Translated()).ShowDialog(); + return; + } + else + { + this.DialogResult = DialogResult.OK; + CommonMethods.LoginOut = false; + //存储用户对象 + CommonMethods.currentAdmin = sysAdmin; + CommonMethods.IsLoginOk = true; + } + } + + private void txt_LoginName_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + if (this.txt_LoginName.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录用户名".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginName.Focus(); + return; + } + // 1. 卡号填入用户名框 + string cardNo = this.txt_LoginName.Text.Trim(); + + + try + { + + + SysAdmin sysAdmin = CommonMethods.db.Query(it => it.LoginUid == cardNo); + + if (sysAdmin == null) + { + new FrmMsgBoxOutWithAck(3, "该卡片未绑定操作员".Translated(), "登录失败".Translated()).ShowDialog(); + return; + } + + // 3. 登录成功,赋值全局登录标记(和账号密码登录逻辑完全统一) + this.DialogResult = DialogResult.OK; + CommonMethods.LoginOut = false; + CommonMethods.currentAdmin = sysAdmin; + CommonMethods.IsLoginOk = true; + + // 关闭登录窗体,自动进入主界面 + this.Close(); + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX("刷卡自动登录异常", ex); + new FrmMsgBoxOutWithAck(3, $"刷卡登录异常:{ex.Message}".Translated(), "错误".Translated()).ShowDialog(); + } + } + } + + private void txt_LoginName_DoubleClick(object sender, EventArgs e) + { + StartKeyBoard(); + } + + + #region 启动软键盘 + private void StartKeyBoard() + { + //打开软键盘 + try + { + if (!System.IO.File.Exists(Environment.SystemDirectory + "\\osk.exe")) + { + MessageBox.Show("软件盘可执行文件不存在!"); + return; + } + + softKey = System.Diagnostics.Process.Start(Environment.SystemDirectory + "\\osk.exe"); + // 上面的语句在打开软键盘后,系统还没用立刻把软键盘的窗口创建出来了。所以下面的代码用循环来查询窗口是否创建,只有创建了窗口 + // FindWindow才能找到窗口句柄,才可以移动窗口的位置和设置窗口的大小。这里是关键。 + IntPtr intptr = IntPtr.Zero; + while (IntPtr.Zero == intptr) + { + System.Threading.Thread.Sleep(100); + intptr = FindWindow(null, "屏幕键盘"); + } + + + // 获取屏幕尺寸 + int iActulaWidth = Screen.PrimaryScreen.Bounds.Width; + int iActulaHeight = Screen.PrimaryScreen.Bounds.Height; + + + // 设置软键盘的显示位置,底部居中 + int posX = (iActulaWidth - 1000) / 2; + int posY = (iActulaHeight - 300); + + + //设定键盘显示位置 + MoveWindow(intptr, posX, posY, 1000, 300, true); + + + //设置软键盘到前端显示 + SetForegroundWindow(intptr); + } + catch (System.Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + + // 申明要使用的dll和api + [DllImport("User32.dll", EntryPoint = "FindWindow")] + public extern static IntPtr FindWindow(string lpClassName, string lpWindowName); + [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "MoveWindow")] + public static extern bool MoveWindow(System.IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); + + + [DllImport("user32.dll")] + static extern bool SetForegroundWindow(IntPtr hWnd); + + + private System.Diagnostics.Process softKey; + + #endregion + + /// + /// 退出 + /// + /// + /// + private void FrmLogin_FormClosing(object sender, FormClosingEventArgs e) + { + //this.Close(); + } + + #region 窗体拖动 + public static Point CPoint; + + private void Form_MouseDown(object sender, MouseEventArgs e) + { + CPoint = new Point(-e.X, -e.Y); + } + + private void Form_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标 + myPosittion.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的位置 + this.DesktopLocation = myPosittion;//设置当前窗体在屏幕上的位置 + } + } + #endregion + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + + private void InitializeFormSettings() + { + this.SetStyle(ControlStyles.AllPaintingInWmPaint | + ControlStyles.DoubleBuffer | + ControlStyles.ResizeRedraw | + ControlStyles.Selectable | + ControlStyles.SupportsTransparentBackColor, true); + } + #endregion + + + private void InitializeLanguageSwitch() + { + SwitchLanguage.Items.Clear(); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.中国国旗, "中文")); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.美国国旗, "English")); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.匈牙利国旗, "Hungary")); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.马来西亚国旗, "Malaysia")); + } + + /// + /// 切换语言 + /// + /// + /// + private void SwitchLanguage_SelectedValueChanged(object sender, ObjectNEventArgs e) + { + if (e.Value is SelectItem selectedItem) + { + string selectedLanguage = selectedItem.Text; + string languageCode = selectedLanguage switch + { + "中文" => "zh", + "English" => "en", + "Hungary" => "hu", + "Malaysia" => "ms", + _ => "zh" + }; + LanguageManager.ChangeLanguage(languageCode); + } + } + + } +} diff --git a/LargeSquareOne/FrmLogin.resx b/LargeSquareOne/FrmLogin.resx new file mode 100644 index 0000000..e7c34cc --- /dev/null +++ b/LargeSquareOne/FrmLogin.resx @@ -0,0 +1,1256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <svg t="1733552408265" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4514" width="200" height="200"><path d="M846.04 866.77c-17.08 2.03-32.57-10.18-34.59-27.26-0.22-1.9-0.27-3.81-0.15-5.71v-123c0-33.73-22.17-33.73-30.53-33.73-21.28-0.46-38.91 16.43-39.36 37.72-0.01 0.46-0.01 0.92 0 1.37v117.66c-0.76 18.9-16.71 33.61-35.61 32.84-17.83-0.72-32.12-15.01-32.84-32.84V647.68c-1.23-17.23 11.74-32.19 28.97-33.41 1.69-0.12 3.39-0.1 5.08 0.05a31.953 31.953 0 0 1 31.33 17.76 89.435 89.435 0 0 1 54.99-17.76c54.11 0 86.45 33.59 86.45 90.03V833.8a32.25 32.25 0 0 1-8.88 23.72 34.026 34.026 0 0 1-24.82 9.33l-0.04-0.08z m-233.12-7.46h-134.7c-42.77 0-61.85-18.96-61.85-61.57V608.07c0-42.52 19.09-61.57 61.85-61.57h128.74c17.92 0 32.45 14.53 32.45 32.45s-14.53 32.45-32.45 32.45H490.73c-1.22-0.08-2.45 0.09-3.6 0.5 0.13 0-0.15 0.8-0.15 2.89v52.58h106c16.33-1.66 30.91 10.24 32.57 26.57 0.17 1.68 0.2 3.37 0.08 5.06 0.98 16.66-11.73 30.97-28.4 31.95-1.41 0.08-2.83 0.07-4.24-0.05H486.9V791c-0.04 1.06 0.08 2.13 0.35 3.15 1.12 0.15 2.25 0.23 3.38 0.24h122.31c16.96-1.07 31.58 11.81 32.65 28.76 0.07 1.16 0.08 2.33 0.02 3.5 1.35 16.68-11.07 31.3-27.75 32.65-1.64 0.13-3.28 0.13-4.92 0h-0.02zM327.54 482.85c-17.36 2.36-33.34-9.8-35.7-27.16-0.3-2.21-0.37-4.44-0.2-6.67V370.5h-85.27c-45.86 0-66.31-20.52-66.31-66.31v-93.87c0-45.58 20.52-65.9 66.31-65.9h85.27v-31.53c-1.38-17.11 11.37-32.11 28.48-33.49 1.92-0.15 3.84-0.13 5.76 0.07 30.26 0 36.63 18.17 36.63 33.42v31.59h86.09c45.86 0 66.33 20.34 66.33 65.88v93.89c0 45.86-20.52 66.29-66.33 66.29h-86.05v78.52c1.25 17.47-11.9 32.65-29.37 33.91-1.88 0.13-3.76 0.1-5.63-0.1v-0.02zM217.21 211.27c-6.47 0-7.07 0.6-7.07 7.07v78.2c0 6.53 0.6 7.15 7.07 7.15h74.43v-92.42h-74.43z m145.35 92.38h75.29c6.29 0 7.09-0.8 7.09-7.07v-78.25c0-6.29-0.8-7.09-7.09-7.09h-75.31v92.42h0.02z m151.42 655.91C266.43 958.82 66.36 757.55 67.1 510c0.1-35 4.31-69.86 12.52-103.88 4.81-19 23.92-30.68 43.03-26.29 19.1 4.61 30.86 23.81 26.29 42.91-48.93 202.33 75.42 406.01 277.75 454.94a376.924 376.924 0 0 0 87.29 10.56c19.69 0.02 35.64 15.99 35.63 35.69-0.02 19.67-15.96 35.61-35.63 35.63z m398.49-310.05c-19.69 0-35.66-15.96-35.66-35.65 0-2.95 0.37-5.9 1.09-8.76 51.31-201.82-70.7-407.02-272.52-458.33-29.89-7.6-60.59-11.5-91.43-11.62-19.68 0-35.64-15.95-35.64-35.63 0-19.68 15.95-35.64 35.63-35.64h0.01c247.57 0.76 447.65 202.08 446.89 449.65-0.11 36.8-4.76 73.44-13.83 109.1-4 15.8-18.23 26.88-34.54 26.88z" fill="#2c2c2c" p-id="4515"></path></svg> + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABALADAACwAwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIACVEtDWFRNQ7RUTEPnVExD/lRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/dUTEPYVE1CklVOQCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUpAGFVLQsRUTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VE1D+lRNQnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVERA9UTELXVExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RLQ3oAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCmlRMQ/9UTEP/VExD/1RM + Q/9gWVD/fnhx/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8 + df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/3Ru + Zv9XT0b/VExD/1RMQ/9UTEP/VExD/VVKRTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVKQBhUTEP7VExD/1RMQ/9VTUT/s7Cs//7+/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+zr6v99d3D/VExD/1RMQ/9UTEP/U0xDqAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCYVRMQ/9UTEP/VExD/5iU + jv////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////Dw7/9eV07/VExD/1RMQ/9UTEPygICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABTS0OBVExD/1RMQ/9UTEP/zszJ//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4aBev9UTEP/VExD/1RM + Q/9RUUYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RM + Q//d29n///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////lpGL/1RMQ/9UTEP/VExD/1VNQl1TS0REU0tERFNLRERTS0REU0tERFNL + RERTS0REU0tERFNLRERUTERATk47DQAAAAAAAAAAAAAAAAAAAAAAAAAAV0pDJlNLRERTS0REU0tERFNL + RERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNL + RERVTUU/WU5DFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////////////////////// + /////////////////////////////////////////v39//v59//59vP/9/Tx//n39f/8+vn///////// + //////////////////////////////////////////////////////////////////+WkYv/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEPgVUdHEgAA + AAAAAAAAAAAAAFRMQmFUTEP9VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP9VUxDrFFRRhYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RM + Q/9UTEP/3dvZ///////////////////////////////////////////////////////+/v7/9vLv/+/o + 4v/q4Nn/6uDY/+rg2P/q4Nj/6uDY/+rg2P/s49v/8uzn//r49v////////////////////////////// + /////////////////////////////5aRi/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9ak5HBX8jLo1/Iy6NfyMujVmJd51RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD2lpLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////// + ////////////////////////9/Pw/+zj3P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY//Hq5P/8+vn/////////////////////////////////////////////////lpGL/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/UVBL/x2d + 6f8WqP//Fqj//xao//81eqH/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VE1EjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRM + Q/9UTEP/VExD/93b2f///////////////////////////////////////v7+//Ls5//q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+vh2v/49fP///////// + //////////////////////////////////+WkYv/VExD/1RMQ/9UTEP/PmSa/ztnp/85baf/M32n/zN9 + p/8zfaf/M32n/zN9p/8zfaf/M32n/zF/rP8gmuP/Fqj//xao//8WqP//Fqj//xan/v8qi8P/M32n/zN9 + p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/N3Gn/ztn + p/87Z6f/O2en/z9jlf9TTUX/VExD/1RMQ/9UTEPpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////// + //////////////7+/v/v5+H/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/38/D//////////////////////////////////////5aR + i/9UTEP/VExD/1RMQ/8reeb/JYD//yGK//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8anP//JYD//yWA//8lgP//JYD//0dad/9UTEP/VExD/1RM + Q/9VVUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRN + Q4xUTEP/VExD/1RMQ//d29n/////////////////////////////////8evm/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rh + 2f/69/X/////////////////////////////////lpGL/1RMQ/9UTEP/VExD/yt55v8lgP//IYr//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xqe + //8lgP//JYD//yWA//8lgP//RV1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////// + //////////////fz8P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+zj3P/+/v3///////////////////////// + //+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA//8hiv//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Gp7//yWA//8lgP//JYD//yWA//9FXX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1FP1RNQ4xVTEOyVUxDu1VM + Q7tUTEPgVExD/1RMQ/9UTEP/3dvZ///////////////////////+/v7/7OTc/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY//Xw7P///////////////////////////5aRi/9UTEP/VExD/1RMQ/8reeb/JYD//yGK + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8anv//JYD//yWA//8lgP//JYD//0Vdf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAV0lCI1RMQ8JUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ//d29n///////// + //////////////by7v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6+Ha//7+/f////////////// + ////////lpGL/1RMQ/9UTEP/VExD/yt55v8lgP//IYr//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xqe//8lgP//JYD//yWA//8lgP//RV1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVKRC1UTEPsVExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/93b2f//////////////////////7+ji/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/+PXy//////////////////////+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA + //8hiv//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Gp7//yWA//8lgP//JYD//yWA//9FXX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABNTU0KVExD3VRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/3dvZ//// + //////////////79/P/q4Nn/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/y7Of///////// + /////////////5aRi/9UTEP/VExD/1RMQ/8reeb/JYD//yGK//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8anv//JYD//yWA//8lgP//JYD//0Vd + f/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRLQndUTEP/VExD/1RMQ/9UTEP1VUxDclhP + Rh0AAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n/////////////////+/j3/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/4tnR/8W9tv/Kwrv/6N3V/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/d1Mz/w7y1/8/G + v//q4Nj/6uDY/+rg2P/q4Nj/6uDY/+/n4P//////////////////////lpGL/1RMQ/9UTEP/VExD/yt5 + 5v8lgP//IYr//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xqe//8lgP//JYD//yWA//8lgP//RV1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxC01RMQ/9UTEP/VExD/1NNRFMAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b + 2f/////////////////49fP/6uDY/+rg2P/q4Nj/6uDY/+rg2P+up6L/oZuW/6Gblv+/uLL/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/5dvU/6afm/+hm5b/oZuW/83Fvv/q4Nj/6uDY/+rg2P/q4Nj/7OTc//// + //////////////////+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA//8hiv//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Gp7//yWA//8lgP//JYD//yWA + //9FXX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVOQlUTEP/VExD/1RMQ/9UTEPRAAAAAAAA + AAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////f08f/q4Nj/6uDY/+rg + 2P/q4Nj/6d/X/6Ocl/+hm5b/oZuW/7Kspv/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/d1Mz/oZuW/6Gb + lv+hm5b/wLmy/+rg2P/q4Nj/6uDY/+rg2P/r4tr//////////////////////5aRi/9UTEP/VExD/1RM + Q/8mnOH/H6n5/ymw9f9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL + 4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL + 4v9Xy+L/V8vi/1fL4v9Fwej/H6j4/x+o+P8fqPj/H6j4/0Npff9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1EHlRMQ/9UTEP/VExD/1RMQ6QAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RM + Q//d29n/////////////////+fb0/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/w7u1/6Gblv+jnZj/08rD/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+nf1/+3r6r/oZuW/6ahm//d1Mz/6uDY/+rg2P/q4Nj/6uDY/+3l + 3v//////////////////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0 + //8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f/////////////////7+vj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/4tnR/+Xc1P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/i2ND/6N3V/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/7+ji//////////////////////+WkYv/VExD/1RM + Q/9UTEP/C6bm/wC0//8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RM + Q/9UTEP/3dvZ///////////////////////s4tv/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/07+v//////////////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0 + //8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////Lr + 5v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY//v59///////////////////////lpGL/1RM + Q/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRM + Q/9UTEP/VExD/93b2f//////////////////////+vf1/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/u5t////////////////////////////+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0//8Quf//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0 + //8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////// + ////////8Onj/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY//n29P///////////////////////////5aR + i/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRN + Q4xUTEP/VExD/1RMQ//d29n////////////////////////////8+vn/6+Ha/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/x6uT/////////////////////////////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC + //8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////// + ///////////////////49fP/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/7eXe//79/f////////////////////////////// + //+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0//8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AABUTUOMVExD/1RMQ/9UTEP/3dvZ///////////////////////////////////////38+//6uDZ/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+3l + 3v/8+/r//////////////////////////////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5 + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////// + ///////////////////////////////////59/X/7OPb/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/w6eT//v39//////////////////////////////////// + ////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////////////////////////////////////// + ///+/v3/9fHt/+vi2v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/t5d7/+PXy//// + //////////////////////////////////////////////////+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0 + //8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//// + /////////////////////////////////////////////////////////v39//j08v/x6+b/7ubg/+zj + 3P/r4tr/7eXe/+/o4v/07+v/+/n3//////////////////////////////////////////////////// + /////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zlt + f/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////lpGL/1RMQ/9UTEP/VExD/wum + 5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVEtEi1RMQ/9UTEP/VExD/9vZ + 1/////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+Uj4n/VExD/1RMQ/9UTEP/C6fn/wC0//8Ruf//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0 + //85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUR4VExD/1RMQ/9UTEP/wL26//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3hxav9UTEP/VExD/1RM + Q/8EsPb/ALT//xa7//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQkZUTEP/VExD/1RM + Q/9ybGT/+vn5//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////PzMr/VU1E/1RMQ/9UTEP/R1xf/wC0//8AtP//Hr3//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0 + //8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAVVVVBlRMQ+RUTEP/VExD/1RMQ/90bWb/xcK//+Tj4v/o5+b/6Ofm/+jn + 5v/o5+b/6Ofm/+no5//8+/v////////////////////////////7+/v/6Ofm/+jn5v/o5+b/6Ofm/+jn + 5v/o5+b/6Ofm/+jn5v/o5+b/6Ofm/+jn5v/o5+b/6Ofm/+jn5v/Z2Nb/qqah/1lSSf9UTEP/VExD/1RM + Q/8qgaL/ALT//wC0//8xwv//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExDW1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/2hhWf/r6un///////// + ////////5uTj/2VeVf9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/SlhZ/wSv9f8AtP//B7b//0HH//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0 + //8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1EiFRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/6Cbltz///+7////u////7uYlI7fVExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/01U + Uv8QoNz/ALT//wC0//8pwf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAU0tDX1RMQ+dUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VE1ETwAA + AAAAAAAAAAAAAFRMQ1tUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/88anj/C6fn/wC0//8AtP//E7n//0LI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0 + //8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYEBACFNMQk1UTESAVExEl1NN + Q5lTTUOZU01DmVNNQ5lTTUOZVEtDlVNNRFYAAAAAAAAAAAAAAAAAAAAAAAAAAVNLQ1xTTUKWU01DmVNN + Q5lUTEPeVExD/1RMQ/9UTEP/NXKI/zJ2jv8ydo7/MnaO/zJ2jv8ydo7/MnaO/y96lv8lhqz/DqPf/wC0 + //8AtP//ALT//xC5//9Ax///Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ/8GrfH/ALT//wC0 + //8AtP//ALT//wC0//8AtP//ALT//wC0//8AtP//ALT//wG0//8dvP//Qcf//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC + //8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD/wat8f8AtP//ALT//wC0//8AtP//ALT//wC0//8AtP//ALT//we2 + //8cvP//OMX//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/OLvx/zbE + //82xP//NsT//zbE//82xP//NsT//zfF//89x///Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ/9Ev/H/Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8Pm + 2//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/xPHR/8r4kf/K+JH/yviR/8r4kf95g1z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////0/P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////r+f//0PI//+S3/////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+N3v//Q8j//0TI + ///Q8f////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////6nm//9DyP//Q8j//17Q///5/f////////////////////////// + //////////////////////////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////xe7//0PI + //9DyP//Q8j//57j//////////////////////////////////////////////////////////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i9///Q8j//0PI//9DyP//Rsn//9z1//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v+ + //9Hyf//Q8j//0PI//9DyP//a9T///3+//////////////////////////////////////////////// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////1/Q//9DyP//Q8j//0PI//9DyP//r+j///// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////fNn//0PI//9DyP//Q8j//0PI//9Ny///6vn///////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+Y4f//Q8j//0PI//9DyP//Q8j//0PI + //962P////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Xp//9DyP//Q8j//0PI//9DyP//Q8j//0PI///C7f////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////0fL//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//1XN///z/P////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////A7f//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//47e//////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + ////////xu7//3jY//911///ddf//3XX//911///ddf//3XX//911///cdb//0nK//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//RMj//9Ly//////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////9v1f//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//YNH///r9 + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + /////////////7Xp//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//oOP///////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + /////////////////////////////////////////////////////////v///3TW//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9Hyf//3/b/////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + ////////////////////////4/f//0nK//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9s1P///v////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + ////////////////////////////////////////////////////////////////////////o+T//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//+y6f////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + ///////////////////////////////////7/v//Y9H//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//07L///t+v////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv+Rnlr/VExD/1RM + Q/9UTEPpgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + ///V8///RMj//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//7fq//////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/9D0c/+Iklf/bGpS4lRLQz0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////+S3///Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9f0P//gtr//4La//+C2v//gtr//4La//+C2v//gtr//4La//+N3v//8vv///// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/e+JeTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + //////////////X8//9Yzv//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Vc3///r9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/974l5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + /////////////////////////////////////////////////////////////8Xu//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9bz/////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/3viXkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + /////////////////////////////3/a//9DyP//Q8j//0PI//9DyP//Q8j//0TI///5/f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/1/x1/6CxYP+Bg17OVU1GIQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + ////////////////////////////////////////////////////////////////////////7fr//0/L + //9DyP//Q8j//0PI//9DyP//Q8j//9/2//////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv+bq17/VExD/1RMQ/9UTEPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////sun//0PI//9DyP//Q8j//0PI//9DyP//wu3///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/3+GU/9UTEP/VExD/1RMQ/9VREQPAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///+////b9X//0PI//9DyP//Q8j//0PI//+l5f////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////i9///Scr//0PI//9DyP//Q8j//4jc + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+h4///Q8j//0PI//9DyP//bNT///////////////////////////////////// + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////v+//9i0f//Q8j//0PI + //9Py/////////////////////////////////////////////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9bz//9EyP//Q8j//0PI///v+v////////////////////////// + ////////////////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////4/e + //9DyP//Q8j//9Py//////////////////////////////////////////////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9Pz//17Q//9Vzf//6vn///////////////////// + //////////////////////////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////v////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABSR0cZU0xDilRMQ95UTEP/VExD/1RMQ/9UTEP4VExDtlRNRE8AAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUtEaVRMQ/ZUTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQsBSSUAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFNMQodUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q+RXSUIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUNjVExD/1RMQ/9UTEP/VExD/1VN + RP9UTEP/VExD/1RMQ/9VTUT/VExD/1RMQ/9UTEP/VExD/1NMQ9ZVVTkJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUdHElRMQ/JUTEP/VExD/1RMQ/92bmf/wLy6/1RMQ/9UTEP/VExD/4+Ig/+jn5v/V09G/1RM + Q/9UTEP/VExD/1RMQn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEN5VExD/1RMQ/9UTEP/cmtk/93Z + 2f/j4OD/iIJ8/1RMQ/9dVU3/x8TC/+Pg4P+zrqv/VExD/1RMQ/9UTEP/VExD7WBAQAgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ8dUTEP/VExD/1RMQ//Fwb//4+Dg/+Pg4P/j4OD/z8vJ/9vZ2P/j4OD/4+Dg/+Pg + 4P97dG7/VExD/1RMQ/9UTEP/U0tERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExD+FRMQ/9UTEP/aGFa/+Pg + 4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/66ppv9UTEP/VExD/1RMQ/9UTEN2AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE5OOw1UTEP/VExD/1RMQ/99dnD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/w8C+/1RMQ/9UTEP/VExD/1RLRIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD/97yqf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/5Pun/9r1j//a9Y//2vWP/9r1j/9+glv/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWks8EVRMQ/9UTEP/VExD/4F7 + df/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/IxMP/VExD/1RMQ/9UTEP/VE1EjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/S92//v+Bd/7/g + Xf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABaSzwRVExD/1RMQ/9UTEP/gXt1/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/4+Dg/8jEw/9UTEP/VExD/1RMQ/9UTUSPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//P8nL/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEP/VExD/1RM + Q/+Be3X/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/yMTD/1RMQ/9UTEP/VExD/1RN + RI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/ycv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/0vdv/7/g + Xf+/4F3/v+Bd/7/gXf92e0z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWks8EVRMQ/9UTEP/VExD/4F7df/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/4+Dg/+Pg4P/IxMP/VExD/1RMQ/9UTEP/VE1EjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/S92//v+Bd/7/gXf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaSzwRVExD/1RM + Q/9UTEP/gXt1/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/8jEw/9UTEP/VExD/1RM + Q/9UTUSPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//P8nL/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3 + b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEP/VExD/1RMQ/9lXlf/jYiC/42Igv+NiIL/jYiC/42I + gv+NiIL/jYiC/42Igv+NiIL/g3x2/1RMQ/9UTEP/VExD/1RNRI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/ycv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/0vdv/7/gXf+/4F3/v+Bd/7/gXf92e0z/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWks8EVRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VE1EjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/S92//v+Bd/7/gXf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJSUkHVExD+1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9TS0OBAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//P8nL/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABUTEKDVExD/lRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD4FJKQh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/y + cv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/0vdv/7/gXf+/4F3/v+Bd/7/gXf92e0z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVR0cSVExDkVRMQ/9UTEP/VExD/1NN + QllTS0QiU0tEIlNLRCJTS0QiVExDyVRMQ/9UTEP/VExD/lJKQh9VVVUDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUTEOrVExD/1RMQ/9UTEP/zfBy/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/R9nD/v+Bd/7/gXf+/4F3/v+Bd/3V5 + S/9UTEP/VExD/1RMQ/9VREQPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUTESAVExD/1RMQ/9UTEP/VExEQAAAAAAAAAAAAAAAAAAAAABUTELAVExD/1RM + Q/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNMRJNUTEP/VExD/1RM + Q/+Ml1n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/6zFYP+iuFb/orhW/6K4Vv+ZrVT/WVRE/1RMQ/9UTEP/VExD9AAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMRIBUTEP/VExD/1RM + Q/9UTERAAAAAAAAAAAAAAAAAAAAAAFRMQsBUTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUpDSFRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9US0KpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVExEgFRMQ/9UTEP/VExD/1RMREAAAAAAAAAAAAAAAAAAAAAAVExCwFRM + Q/9UTEP/VExD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVUxEtVRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD8VNMRSUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTESAVExD/1RM + Q/9UTEP/VExEQAAAAAAAAAAAAAAAAAAAAABUTELAVExD/1RMQ/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdRkYLVEtCqVRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ91TSkE3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMRIBUTEP/VExD/1RMQ/9UTERAAAAAAAAAAAAAAAAAAAAAAFRM + QsBUTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUpELVNLQ59UTEP/VExD/1RMQ/95cGj/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/YlpR/1RMQ/9UTEP/VExD/1RLQ3pTTEJNVVVVBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCf1RM + Q/9UTEP/VExD/1VNRT8AAAAAAAAAAAAAAAAAAAAAVExCwFRMQ/9UTEP/VExD/gAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1CYFRMQ/9UTEP/VExD/6Oa + kf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf9zamL/VExD/1RM + Q/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTTURWVExD/1RMQ/9UTEP5WE5FGgAAAAAAAAAAAAAAAAAA + AABTTUKWVExD/1RMQ/9VTELTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUJgVExD/1RMQ/9UTEP/o5qR/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/3NqYv9UTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAFUS0J3VUxDr1VLQU4AAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEOUVExDp1VPQyoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRLQlVUTEP/VExD/1RM + Q/+AeG//ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mv + p/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mv + p/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+zqaL/YFhP/1RM + Q/9UTEP/VExD8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWFBAIFRMQ/5UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEK8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0xEolRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/VVNQkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdRkYLVUxDslRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/dVTUNjAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUkpCPlRMRIBUTUSIVE1EiFRNRIhUTUSIVE1EiFRNRIhUTUSIVE1EiFRMQ/ZUTEP/VExD/2BY + UP+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GW + jf+hlo3/oZaN/5GHfv9UTEP/VExD/1RMQ/9UTEPJVE1EiFRNRIhUTUSIVE1EiFRNRIhUTUSIVE1EiFRN + RIhTTUNuVUxCGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVExD61RMQ/9UTEP/cWde//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/1snB/1RMQ/9UTEP/VExD/1RL + RIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEPrVExD/1RM + Q/9xZ17/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/WycH/VExD/1RMQ/9UTEP/VEtEiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMQupUTEP/VExD/21kW//46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh/9THvv9UTEP/VExD/1RM + Q/9TTEOKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1D0lRM + Q/9UTEP/VExD/3lwZ/+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2 + bf+Adm3/gHZt/4B2bf+Adm3/aWBX/1RMQ/9UTEP/VExD/1NNRHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEJ/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTUP6U0tEIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1G + RgtUTETMVExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RNQnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVQAxUTEOJVExD4VRMQ/5UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD+FRN + RMhUS0RSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAH//////////////8AAAAAA//////////////+AAAAAAH/ + /////////////gAAAAAA//////////////wAAAAAAP/////////////8AAAAAAB//////////////AAA + AAAAf/////////////wAAAAAAAAPgAAB///////8AAAAAAAABwAAAH///////AAAAAAAAAAAAAA///// + //wAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAD///////AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAA + H//////8AAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAf/////gAAAAAAAAAAAAAAH/////wAAAAAAAAA + AAAAAB/////4AAAAAAAAAAAAAAAf////+AwAAAAAAAAAAAAAH/////g8AAAAAAAAAAAAAB/////wfAAA + AAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf//// + 8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAA + H/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAA + AAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAA + AAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfgAAAAAAAAAAAAAf//// + 8H8AAAAAAAAAAAAAH/////B/gAOAAAAAAAAAAB/////wf8AHgAAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAA + AAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAA + AAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAA/////8H////wAAAAAAAAAf/////B////8AAAA + AAAAAH/////wf////AAAAAAAAAB/////8H////wAAAAAAAAAP/////B////8AAAAAAAAAD/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////AD////AAAAAAAAAAf////gAf///wAAAAAAAAAH////wAD///8AAAA + AAAAAB////4AAf///AAAAAAAAAAf///8AAH///wAAAAAAAAAH////AAA///8AAAAAAAAAB////wAAP// + /AAAAAAAAAAf///8AAD///wAAAAAAAAAH///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4 + AAD///wAAAAAAAAAH///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4AAD///wAAAAAAAAA + H///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4AAD///wAAAAAAAAAH////AAA///8AAAA + AAAAAB////4AAf///AAAAAAAAAAf////B4f///wAAAAAAAAAH////weH///8AAAAAAAAAD////8Hh/// + /AAAAAAAAAA/////B4f///4AAAAAAAAAf////weH////gAAAAAAAAP////8Hh////8AAAAAAAAf///// + B4f////AAAAAAAAH/////w+H////wAAAAAAAB////////////8AAAAAAAAf////////////gAAAAAAAH + ////////////4AAAAAAAD/////////////gAAAAAAB///////////////gAAAH////////////////4A + AAB////////////////+AAAAf////////////////gAAAH////////////////4AAAB///////////// + ///+AAAA/////////////////wAAAf////8= + + + \ No newline at end of file diff --git a/LargeSquareOne/FrmLoginMes.Designer.cs b/LargeSquareOne/FrmLoginMes.Designer.cs new file mode 100644 index 0000000..0b6230a --- /dev/null +++ b/LargeSquareOne/FrmLoginMes.Designer.cs @@ -0,0 +1,193 @@ +namespace LargeSquareOne +{ + partial class FrmLoginMes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmLoginMes)); + this.txt_LoginMesPwd = new System.Windows.Forms.TextBox(); + this.txt_LoginMesName = new System.Windows.Forms.TextBox(); + this.btn_LoginMes = new System.Windows.Forms.Button(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.btn_Close = new System.Windows.Forms.Button(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.label1 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.SuspendLayout(); + // + // txt_LoginMesPwd + // + this.txt_LoginMesPwd.BackColor = System.Drawing.Color.White; + this.txt_LoginMesPwd.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txt_LoginMesPwd.Font = new System.Drawing.Font("微软雅黑", 15F); + this.txt_LoginMesPwd.ForeColor = System.Drawing.Color.Black; + this.txt_LoginMesPwd.Location = new System.Drawing.Point(334, 201); + this.txt_LoginMesPwd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txt_LoginMesPwd.Name = "txt_LoginMesPwd"; + this.txt_LoginMesPwd.PasswordChar = '*'; + this.txt_LoginMesPwd.Size = new System.Drawing.Size(164, 27); + this.txt_LoginMesPwd.TabIndex = 17; + // + // txt_LoginMesName + // + this.txt_LoginMesName.BackColor = System.Drawing.Color.White; + this.txt_LoginMesName.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txt_LoginMesName.Font = new System.Drawing.Font("微软雅黑", 15F); + this.txt_LoginMesName.ForeColor = System.Drawing.Color.Black; + this.txt_LoginMesName.Location = new System.Drawing.Point(334, 141); + this.txt_LoginMesName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txt_LoginMesName.Name = "txt_LoginMesName"; + this.txt_LoginMesName.Size = new System.Drawing.Size(164, 27); + this.txt_LoginMesName.TabIndex = 16; + this.txt_LoginMesName.DoubleClick += new System.EventHandler(this.txt_LoginMesName_DoubleClick); + this.txt_LoginMesName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txt_LoginMesName_KeyDown); + // + // btn_LoginMes + // + this.btn_LoginMes.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(29)))), ((int)(((byte)(85))))); + this.btn_LoginMes.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + this.btn_LoginMes.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + this.btn_LoginMes.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_LoginMes.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btn_LoginMes.ForeColor = System.Drawing.Color.White; + this.btn_LoginMes.Location = new System.Drawing.Point(323, 255); + this.btn_LoginMes.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btn_LoginMes.Name = "btn_LoginMes"; + this.btn_LoginMes.Size = new System.Drawing.Size(144, 43); + this.btn_LoginMes.TabIndex = 15; + this.btn_LoginMes.Text = "登 录"; + this.btn_LoginMes.UseVisualStyleBackColor = false; + this.btn_LoginMes.Click += new System.EventHandler(this.btn_LoginMes_Click); + // + // pictureBox2 + // + this.pictureBox2.BackColor = System.Drawing.Color.Transparent; + this.pictureBox2.Image = global::LargeSquareOne.Properties.Resources._25_密码; + this.pictureBox2.Location = new System.Drawing.Point(290, 192); + this.pictureBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(34, 37); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 19; + this.pictureBox2.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.Image = global::LargeSquareOne.Properties.Resources.用户; + this.pictureBox1.Location = new System.Drawing.Point(290, 132); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(34, 36); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 18; + this.pictureBox1.TabStop = false; + // + // btn_Close + // + this.btn_Close.BackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 14F); + this.btn_Close.ForeColor = System.Drawing.Color.Black; + this.btn_Close.Location = new System.Drawing.Point(566, 3); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 34); + this.btn_Close.TabIndex = 21; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = false; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // pictureBox3 + // + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.Image = global::LargeSquareOne.Properties.Resources.yiweidongli; + this.pictureBox3.Location = new System.Drawing.Point(0, 3); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(153, 34); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 22; + this.pictureBox3.TabStop = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("微软雅黑", 26.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(192))))); + this.label1.Location = new System.Drawing.Point(236, 61); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(97, 46); + this.label1.TabIndex = 23; + this.label1.Text = "MES"; + // + // FrmLoginMes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::LargeSquareOne.Properties.Resources.Login11; + this.ClientSize = new System.Drawing.Size(599, 357); + this.Controls.Add(this.label1); + this.Controls.Add(this.pictureBox3); + this.Controls.Add(this.btn_Close); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.txt_LoginMesPwd); + this.Controls.Add(this.txt_LoginMesName); + this.Controls.Add(this.btn_LoginMes); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmLoginMes"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmLoginMes"; + this.Load += new System.EventHandler(this.FrmLoginMes_Load); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form_MouseMove); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.TextBox txt_LoginMesPwd; + private System.Windows.Forms.TextBox txt_LoginMesName; + private System.Windows.Forms.Button btn_LoginMes; + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmLoginMes.cs b/LargeSquareOne/FrmLoginMes.cs new file mode 100644 index 0000000..dbe6565 --- /dev/null +++ b/LargeSquareOne/FrmLoginMes.cs @@ -0,0 +1,191 @@ +using JinYuan.VirtualDataLibrary; +using Language; +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmLoginMes : MultiLanguageForm + { + public FrmLoginMes() + { + InitializeComponent(); + this.Load += FrmLoginMes_Load; + } + + private void FrmLoginMes_Load(object sender, EventArgs e) + { + CommonMethods.GetSysConfig(); + if (CommonMethods.sysConfig != null) + { + if (CommonMethods.sysConfig.AutoLogin) + { + btn_LoginMes_Click(null, null); + } + } + } + + /// + /// Mes登录 + /// + /// + /// + private async void btn_LoginMes_Click(object sender, EventArgs e) + { + if (this.txt_LoginMesName.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录用户名".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginMesName.Focus(); + return; + } + if (this.txt_LoginMesPwd.Text.Trim().Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请填写登录密码".Translated(), "登录提示".Translated()).ShowDialog(); + this.txt_LoginMesPwd.Focus(); + return; + } + + CommonMethods.mesConfig.mesUserName = this.txt_LoginMesName.Text.Trim(); + CommonMethods.mesConfig.mesPwd = this.txt_LoginMesPwd.Text.Trim(); + string UserCardID = CommonMethods.currentAdmin.LoginUid; + var (success, Message, mesUserLevel) = await CommonMethods.hbgMes.LoginAsync(CommonMethods.mesConfig.EmployeeAuthCheck, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.mesUserName, CommonMethods.mesConfig.mesPwd); + if (!success) + { + new FrmMsgBoxOutWithAck(3, Message, "登录提示".Translated()).ShowDialog(); + return; + } + else + { + this.DialogResult = DialogResult.OK; + CommonMethods.mesConfig.IsLoginMesOK = true; + CommonMethods.mesConfig.mesUserLevel = mesUserLevel; + new FrmMsgBoxOutWithAck(1, "MES登录成功,登录用户".Translated() + $":{CommonMethods.mesConfig.mesUserName}", "登录提示".Translated()).ShowDialog(); + //登录日志 + CommonMethods.AddOPLog(false, "MES登录成功,登录用户".Translated() + $":{CommonMethods.mesConfig.mesUserName}"); + } + } + + + + private void txt_LoginMesName_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + this.btn_LoginMes_Click(null, null); + } + } + + private void txt_LoginMesName_DoubleClick(object sender, EventArgs e) + { + StartKeyBoard(); + } + + #region 启动软键盘 + private void StartKeyBoard() + { + //打开软键盘 + try + { + if (!System.IO.File.Exists(Environment.SystemDirectory + "\\osk.exe")) + { + MessageBox.Show("软件盘可执行文件不存在!"); + return; + } + + softKey = System.Diagnostics.Process.Start(Environment.SystemDirectory + "\\osk.exe"); + // 上面的语句在打开软键盘后,系统还没用立刻把软键盘的窗口创建出来了。所以下面的代码用循环来查询窗口是否创建,只有创建了窗口 + // FindWindow才能找到窗口句柄,才可以移动窗口的位置和设置窗口的大小。这里是关键。 + IntPtr intptr = IntPtr.Zero; + while (IntPtr.Zero == intptr) + { + System.Threading.Thread.Sleep(100); + intptr = FindWindow(null, "屏幕键盘"); + } + + + // 获取屏幕尺寸 + int iActulaWidth = Screen.PrimaryScreen.Bounds.Width; + int iActulaHeight = Screen.PrimaryScreen.Bounds.Height; + + + // 设置软键盘的显示位置,底部居中 + int posX = (iActulaWidth - 1000) / 2; + int posY = (iActulaHeight - 300); + + + //设定键盘显示位置 + MoveWindow(intptr, posX, posY, 1000, 300, true); + + + //设置软键盘到前端显示 + SetForegroundWindow(intptr); + } + catch (System.Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + + // 申明要使用的dll和api + [DllImport("User32.dll", EntryPoint = "FindWindow")] + public extern static IntPtr FindWindow(string lpClassName, string lpWindowName); + [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "MoveWindow")] + public static extern bool MoveWindow(System.IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); + + + [DllImport("user32.dll")] + static extern bool SetForegroundWindow(IntPtr hWnd); + + + private System.Diagnostics.Process softKey; + + + #endregion + + /// + /// 退出 + /// + /// + /// + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + + #region 窗体拖动 + public static Point CPoint; + + private void Form_MouseDown(object sender, MouseEventArgs e) + { + CPoint = new Point(-e.X, -e.Y); + } + + private void Form_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标 + myPosittion.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的位置 + this.DesktopLocation = myPosittion;//设置当前窗体在屏幕上的位置 + } + } + #endregion + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + + #endregion + } +} diff --git a/LargeSquareOne/FrmLoginMes.resx b/LargeSquareOne/FrmLoginMes.resx new file mode 100644 index 0000000..4700763 --- /dev/null +++ b/LargeSquareOne/FrmLoginMes.resx @@ -0,0 +1,1253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABALADAACwAwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIACVEtDWFRNQ7RUTEPnVExD/lRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/dUTEPYVE1CklVOQCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUpAGFVLQsRUTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VE1D+lRNQnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVERA9UTELXVExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RLQ3oAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCmlRMQ/9UTEP/VExD/1RM + Q/9gWVD/fnhx/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8 + df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/3Ru + Zv9XT0b/VExD/1RMQ/9UTEP/VExD/VVKRTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVKQBhUTEP7VExD/1RMQ/9VTUT/s7Cs//7+/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+zr6v99d3D/VExD/1RMQ/9UTEP/U0xDqAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCYVRMQ/9UTEP/VExD/5iU + jv////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////Dw7/9eV07/VExD/1RMQ/9UTEPygICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABTS0OBVExD/1RMQ/9UTEP/zszJ//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4aBev9UTEP/VExD/1RM + Q/9RUUYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RM + Q//d29n///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////lpGL/1RMQ/9UTEP/VExD/1VNQl1TS0REU0tERFNLRERTS0REU0tERFNL + RERTS0REU0tERFNLRERUTERATk47DQAAAAAAAAAAAAAAAAAAAAAAAAAAV0pDJlNLRERTS0REU0tERFNL + RERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNL + RERVTUU/WU5DFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////////////////////// + /////////////////////////////////////////v39//v59//59vP/9/Tx//n39f/8+vn///////// + //////////////////////////////////////////////////////////////////+WkYv/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEPgVUdHEgAA + AAAAAAAAAAAAAFRMQmFUTEP9VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP9VUxDrFFRRhYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RM + Q/9UTEP/3dvZ///////////////////////////////////////////////////////+/v7/9vLv/+/o + 4v/q4Nn/6uDY/+rg2P/q4Nj/6uDY/+rg2P/s49v/8uzn//r49v////////////////////////////// + /////////////////////////////5aRi/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9ak5HBX8jLo1/Iy6NfyMujVmJd51RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD2lpLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////// + ////////////////////////9/Pw/+zj3P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY//Hq5P/8+vn/////////////////////////////////////////////////lpGL/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/UVBL/x2d + 6f8WqP//Fqj//xao//81eqH/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VE1EjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRM + Q/9UTEP/VExD/93b2f///////////////////////////////////////v7+//Ls5//q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+vh2v/49fP///////// + //////////////////////////////////+WkYv/VExD/1RMQ/9UTEP/PmSa/ztnp/85baf/M32n/zN9 + p/8zfaf/M32n/zN9p/8zfaf/M32n/zF/rP8gmuP/Fqj//xao//8WqP//Fqj//xan/v8qi8P/M32n/zN9 + p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/N3Gn/ztn + p/87Z6f/O2en/z9jlf9TTUX/VExD/1RMQ/9UTEPpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////// + //////////////7+/v/v5+H/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/38/D//////////////////////////////////////5aR + i/9UTEP/VExD/1RMQ/8reeb/JYD//yGK//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8anP//JYD//yWA//8lgP//JYD//0dad/9UTEP/VExD/1RM + Q/9VVUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRN + Q4xUTEP/VExD/1RMQ//d29n/////////////////////////////////8evm/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rh + 2f/69/X/////////////////////////////////lpGL/1RMQ/9UTEP/VExD/yt55v8lgP//IYr//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xqe + //8lgP//JYD//yWA//8lgP//RV1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////// + //////////////fz8P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+zj3P/+/v3///////////////////////// + //+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA//8hiv//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Gp7//yWA//8lgP//JYD//yWA//9FXX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1FP1RNQ4xVTEOyVUxDu1VM + Q7tUTEPgVExD/1RMQ/9UTEP/3dvZ///////////////////////+/v7/7OTc/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY//Xw7P///////////////////////////5aRi/9UTEP/VExD/1RMQ/8reeb/JYD//yGK + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8anv//JYD//yWA//8lgP//JYD//0Vdf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAV0lCI1RMQ8JUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ//d29n///////// + //////////////by7v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6+Ha//7+/f////////////// + ////////lpGL/1RMQ/9UTEP/VExD/yt55v8lgP//IYr//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xqe//8lgP//JYD//yWA//8lgP//RV1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVKRC1UTEPsVExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/93b2f//////////////////////7+ji/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/+PXy//////////////////////+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA + //8hiv//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Gp7//yWA//8lgP//JYD//yWA//9FXX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABNTU0KVExD3VRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/3dvZ//// + //////////////79/P/q4Nn/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/y7Of///////// + /////////////5aRi/9UTEP/VExD/1RMQ/8reeb/JYD//yGK//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8anv//JYD//yWA//8lgP//JYD//0Vd + f/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRLQndUTEP/VExD/1RMQ/9UTEP1VUxDclhP + Rh0AAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n/////////////////+/j3/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/4tnR/8W9tv/Kwrv/6N3V/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/d1Mz/w7y1/8/G + v//q4Nj/6uDY/+rg2P/q4Nj/6uDY/+/n4P//////////////////////lpGL/1RMQ/9UTEP/VExD/yt5 + 5v8lgP//IYr//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xqe//8lgP//JYD//yWA//8lgP//RV1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxC01RMQ/9UTEP/VExD/1NNRFMAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b + 2f/////////////////49fP/6uDY/+rg2P/q4Nj/6uDY/+rg2P+up6L/oZuW/6Gblv+/uLL/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/5dvU/6afm/+hm5b/oZuW/83Fvv/q4Nj/6uDY/+rg2P/q4Nj/7OTc//// + //////////////////+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA//8hiv//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Gp7//yWA//8lgP//JYD//yWA + //9FXX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVOQlUTEP/VExD/1RMQ/9UTEPRAAAAAAAA + AAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////f08f/q4Nj/6uDY/+rg + 2P/q4Nj/6d/X/6Ocl/+hm5b/oZuW/7Kspv/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/d1Mz/oZuW/6Gb + lv+hm5b/wLmy/+rg2P/q4Nj/6uDY/+rg2P/r4tr//////////////////////5aRi/9UTEP/VExD/1RM + Q/8mnOH/H6n5/ymw9f9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL + 4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL + 4v9Xy+L/V8vi/1fL4v9Fwej/H6j4/x+o+P8fqPj/H6j4/0Npff9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1EHlRMQ/9UTEP/VExD/1RMQ6QAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RM + Q//d29n/////////////////+fb0/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/w7u1/6Gblv+jnZj/08rD/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+nf1/+3r6r/oZuW/6ahm//d1Mz/6uDY/+rg2P/q4Nj/6uDY/+3l + 3v//////////////////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0 + //8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f/////////////////7+vj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/4tnR/+Xc1P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/i2ND/6N3V/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/7+ji//////////////////////+WkYv/VExD/1RM + Q/9UTEP/C6bm/wC0//8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RM + Q/9UTEP/3dvZ///////////////////////s4tv/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/07+v//////////////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0 + //8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////Lr + 5v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY//v59///////////////////////lpGL/1RM + Q/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRM + Q/9UTEP/VExD/93b2f//////////////////////+vf1/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/u5t////////////////////////////+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0//8Quf//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0 + //8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////// + ////////8Onj/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY//n29P///////////////////////////5aR + i/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRN + Q4xUTEP/VExD/1RMQ//d29n////////////////////////////8+vn/6+Ha/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/x6uT/////////////////////////////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC + //8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////// + ///////////////////49fP/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/7eXe//79/f////////////////////////////// + //+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0//8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AABUTUOMVExD/1RMQ/9UTEP/3dvZ///////////////////////////////////////38+//6uDZ/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+3l + 3v/8+/r//////////////////////////////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5 + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////// + ///////////////////////////////////59/X/7OPb/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/w6eT//v39//////////////////////////////////// + ////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////////////////////////////////////// + ///+/v3/9fHt/+vi2v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/t5d7/+PXy//// + //////////////////////////////////////////////////+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0 + //8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//// + /////////////////////////////////////////////////////////v39//j08v/x6+b/7ubg/+zj + 3P/r4tr/7eXe/+/o4v/07+v/+/n3//////////////////////////////////////////////////// + /////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zlt + f/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////lpGL/1RMQ/9UTEP/VExD/wum + 5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVEtEi1RMQ/9UTEP/VExD/9vZ + 1/////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+Uj4n/VExD/1RMQ/9UTEP/C6fn/wC0//8Ruf//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0 + //85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUR4VExD/1RMQ/9UTEP/wL26//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3hxav9UTEP/VExD/1RM + Q/8EsPb/ALT//xa7//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQkZUTEP/VExD/1RM + Q/9ybGT/+vn5//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////PzMr/VU1E/1RMQ/9UTEP/R1xf/wC0//8AtP//Hr3//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0 + //8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAVVVVBlRMQ+RUTEP/VExD/1RMQ/90bWb/xcK//+Tj4v/o5+b/6Ofm/+jn + 5v/o5+b/6Ofm/+no5//8+/v////////////////////////////7+/v/6Ofm/+jn5v/o5+b/6Ofm/+jn + 5v/o5+b/6Ofm/+jn5v/o5+b/6Ofm/+jn5v/o5+b/6Ofm/+jn5v/Z2Nb/qqah/1lSSf9UTEP/VExD/1RM + Q/8qgaL/ALT//wC0//8xwv//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExDW1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/2hhWf/r6un///////// + ////////5uTj/2VeVf9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/SlhZ/wSv9f8AtP//B7b//0HH//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0 + //8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1EiFRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/6Cbltz///+7////u////7uYlI7fVExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/01U + Uv8QoNz/ALT//wC0//8pwf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAU0tDX1RMQ+dUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VE1ETwAA + AAAAAAAAAAAAAFRMQ1tUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/88anj/C6fn/wC0//8AtP//E7n//0LI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0 + //8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYEBACFNMQk1UTESAVExEl1NN + Q5lTTUOZU01DmVNNQ5lTTUOZVEtDlVNNRFYAAAAAAAAAAAAAAAAAAAAAAAAAAVNLQ1xTTUKWU01DmVNN + Q5lUTEPeVExD/1RMQ/9UTEP/NXKI/zJ2jv8ydo7/MnaO/zJ2jv8ydo7/MnaO/y96lv8lhqz/DqPf/wC0 + //8AtP//ALT//xC5//9Ax///Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ/8GrfH/ALT//wC0 + //8AtP//ALT//wC0//8AtP//ALT//wC0//8AtP//ALT//wG0//8dvP//Qcf//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC + //8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD/wat8f8AtP//ALT//wC0//8AtP//ALT//wC0//8AtP//ALT//we2 + //8cvP//OMX//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/OLvx/zbE + //82xP//NsT//zbE//82xP//NsT//zfF//89x///Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ/9Ev/H/Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8Pm + 2//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/xPHR/8r4kf/K+JH/yviR/8r4kf95g1z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////0/P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////r+f//0PI//+S3/////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+N3v//Q8j//0TI + ///Q8f////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////6nm//9DyP//Q8j//17Q///5/f////////////////////////// + //////////////////////////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////xe7//0PI + //9DyP//Q8j//57j//////////////////////////////////////////////////////////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i9///Q8j//0PI//9DyP//Rsn//9z1//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v+ + //9Hyf//Q8j//0PI//9DyP//a9T///3+//////////////////////////////////////////////// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////1/Q//9DyP//Q8j//0PI//9DyP//r+j///// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////fNn//0PI//9DyP//Q8j//0PI//9Ny///6vn///////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+Y4f//Q8j//0PI//9DyP//Q8j//0PI + //962P////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Xp//9DyP//Q8j//0PI//9DyP//Q8j//0PI///C7f////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////0fL//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//1XN///z/P////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////A7f//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//47e//////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + ////////xu7//3jY//911///ddf//3XX//911///ddf//3XX//911///cdb//0nK//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//RMj//9Ly//////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////9v1f//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//YNH///r9 + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + /////////////7Xp//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//oOP///////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + /////////////////////////////////////////////////////////v///3TW//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9Hyf//3/b/////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + ////////////////////////4/f//0nK//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9s1P///v////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + ////////////////////////////////////////////////////////////////////////o+T//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//+y6f////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + ///////////////////////////////////7/v//Y9H//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//07L///t+v////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv+Rnlr/VExD/1RM + Q/9UTEPpgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + ///V8///RMj//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//7fq//////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/9D0c/+Iklf/bGpS4lRLQz0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////+S3///Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9f0P//gtr//4La//+C2v//gtr//4La//+C2v//gtr//4La//+N3v//8vv///// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/e+JeTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + //////////////X8//9Yzv//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Vc3///r9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/974l5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + /////////////////////////////////////////////////////////////8Xu//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9bz/////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/3viXkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + /////////////////////////////3/a//9DyP//Q8j//0PI//9DyP//Q8j//0TI///5/f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/1/x1/6CxYP+Bg17OVU1GIQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + ////////////////////////////////////////////////////////////////////////7fr//0/L + //9DyP//Q8j//0PI//9DyP//Q8j//9/2//////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv+bq17/VExD/1RMQ/9UTEPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////sun//0PI//9DyP//Q8j//0PI//9DyP//wu3///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/3+GU/9UTEP/VExD/1RMQ/9VREQPAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///+////b9X//0PI//9DyP//Q8j//0PI//+l5f////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////i9///Scr//0PI//9DyP//Q8j//4jc + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+h4///Q8j//0PI//9DyP//bNT///////////////////////////////////// + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////v+//9i0f//Q8j//0PI + //9Py/////////////////////////////////////////////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9bz//9EyP//Q8j//0PI///v+v////////////////////////// + ////////////////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////4/e + //9DyP//Q8j//9Py//////////////////////////////////////////////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9Pz//17Q//9Vzf//6vn///////////////////// + //////////////////////////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////v////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABSR0cZU0xDilRMQ95UTEP/VExD/1RMQ/9UTEP4VExDtlRNRE8AAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUtEaVRMQ/ZUTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQsBSSUAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFNMQodUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q+RXSUIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUNjVExD/1RMQ/9UTEP/VExD/1VN + RP9UTEP/VExD/1RMQ/9VTUT/VExD/1RMQ/9UTEP/VExD/1NMQ9ZVVTkJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUdHElRMQ/JUTEP/VExD/1RMQ/92bmf/wLy6/1RMQ/9UTEP/VExD/4+Ig/+jn5v/V09G/1RM + Q/9UTEP/VExD/1RMQn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEN5VExD/1RMQ/9UTEP/cmtk/93Z + 2f/j4OD/iIJ8/1RMQ/9dVU3/x8TC/+Pg4P+zrqv/VExD/1RMQ/9UTEP/VExD7WBAQAgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ8dUTEP/VExD/1RMQ//Fwb//4+Dg/+Pg4P/j4OD/z8vJ/9vZ2P/j4OD/4+Dg/+Pg + 4P97dG7/VExD/1RMQ/9UTEP/U0tERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExD+FRMQ/9UTEP/aGFa/+Pg + 4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/66ppv9UTEP/VExD/1RMQ/9UTEN2AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE5OOw1UTEP/VExD/1RMQ/99dnD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/w8C+/1RMQ/9UTEP/VExD/1RLRIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD/97yqf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/5Pun/9r1j//a9Y//2vWP/9r1j/9+glv/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWks8EVRMQ/9UTEP/VExD/4F7 + df/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/IxMP/VExD/1RMQ/9UTEP/VE1EjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/S92//v+Bd/7/g + Xf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABaSzwRVExD/1RMQ/9UTEP/gXt1/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/4+Dg/8jEw/9UTEP/VExD/1RMQ/9UTUSPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//P8nL/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEP/VExD/1RM + Q/+Be3X/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/yMTD/1RMQ/9UTEP/VExD/1RN + RI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/ycv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/0vdv/7/g + Xf+/4F3/v+Bd/7/gXf92e0z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWks8EVRMQ/9UTEP/VExD/4F7df/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/4+Dg/+Pg4P/IxMP/VExD/1RMQ/9UTEP/VE1EjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/S92//v+Bd/7/gXf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaSzwRVExD/1RM + Q/9UTEP/gXt1/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/8jEw/9UTEP/VExD/1RM + Q/9UTUSPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//P8nL/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3 + b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEP/VExD/1RMQ/9lXlf/jYiC/42Igv+NiIL/jYiC/42I + gv+NiIL/jYiC/42Igv+NiIL/g3x2/1RMQ/9UTEP/VExD/1RNRI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/ycv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/0vdv/7/gXf+/4F3/v+Bd/7/gXf92e0z/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWks8EVRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VE1EjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/S92//v+Bd/7/gXf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJSUkHVExD+1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9TS0OBAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//P8nL/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABUTEKDVExD/lRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD4FJKQh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/y + cv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/0vdv/7/gXf+/4F3/v+Bd/7/gXf92e0z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVR0cSVExDkVRMQ/9UTEP/VExD/1NN + QllTS0QiU0tEIlNLRCJTS0QiVExDyVRMQ/9UTEP/VExD/lJKQh9VVVUDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUTEOrVExD/1RMQ/9UTEP/zfBy/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/R9nD/v+Bd/7/gXf+/4F3/v+Bd/3V5 + S/9UTEP/VExD/1RMQ/9VREQPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUTESAVExD/1RMQ/9UTEP/VExEQAAAAAAAAAAAAAAAAAAAAABUTELAVExD/1RM + Q/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNMRJNUTEP/VExD/1RM + Q/+Ml1n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/6zFYP+iuFb/orhW/6K4Vv+ZrVT/WVRE/1RMQ/9UTEP/VExD9AAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMRIBUTEP/VExD/1RM + Q/9UTERAAAAAAAAAAAAAAAAAAAAAAFRMQsBUTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUpDSFRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9US0KpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVExEgFRMQ/9UTEP/VExD/1RMREAAAAAAAAAAAAAAAAAAAAAAVExCwFRM + Q/9UTEP/VExD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVUxEtVRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD8VNMRSUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTESAVExD/1RM + Q/9UTEP/VExEQAAAAAAAAAAAAAAAAAAAAABUTELAVExD/1RMQ/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdRkYLVEtCqVRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ91TSkE3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMRIBUTEP/VExD/1RMQ/9UTERAAAAAAAAAAAAAAAAAAAAAAFRM + QsBUTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUpELVNLQ59UTEP/VExD/1RMQ/95cGj/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/YlpR/1RMQ/9UTEP/VExD/1RLQ3pTTEJNVVVVBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCf1RM + Q/9UTEP/VExD/1VNRT8AAAAAAAAAAAAAAAAAAAAAVExCwFRMQ/9UTEP/VExD/gAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1CYFRMQ/9UTEP/VExD/6Oa + kf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf9zamL/VExD/1RM + Q/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTTURWVExD/1RMQ/9UTEP5WE5FGgAAAAAAAAAAAAAAAAAA + AABTTUKWVExD/1RMQ/9VTELTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUJgVExD/1RMQ/9UTEP/o5qR/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/3NqYv9UTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAFUS0J3VUxDr1VLQU4AAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEOUVExDp1VPQyoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRLQlVUTEP/VExD/1RM + Q/+AeG//ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mv + p/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mv + p/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+zqaL/YFhP/1RM + Q/9UTEP/VExD8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWFBAIFRMQ/5UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEK8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0xEolRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/VVNQkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdRkYLVUxDslRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/dVTUNjAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUkpCPlRMRIBUTUSIVE1EiFRNRIhUTUSIVE1EiFRNRIhUTUSIVE1EiFRMQ/ZUTEP/VExD/2BY + UP+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GW + jf+hlo3/oZaN/5GHfv9UTEP/VExD/1RMQ/9UTEPJVE1EiFRNRIhUTUSIVE1EiFRNRIhUTUSIVE1EiFRN + RIhTTUNuVUxCGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVExD61RMQ/9UTEP/cWde//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/1snB/1RMQ/9UTEP/VExD/1RL + RIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEPrVExD/1RM + Q/9xZ17/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/WycH/VExD/1RMQ/9UTEP/VEtEiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMQupUTEP/VExD/21kW//46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh/9THvv9UTEP/VExD/1RM + Q/9TTEOKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1D0lRM + Q/9UTEP/VExD/3lwZ/+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2 + bf+Adm3/gHZt/4B2bf+Adm3/aWBX/1RMQ/9UTEP/VExD/1NNRHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEJ/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTUP6U0tEIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1G + RgtUTETMVExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RNQnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVQAxUTEOJVExD4VRMQ/5UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD+FRN + RMhUS0RSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAH//////////////8AAAAAA//////////////+AAAAAAH/ + /////////////gAAAAAA//////////////wAAAAAAP/////////////8AAAAAAB//////////////AAA + AAAAf/////////////wAAAAAAAAPgAAB///////8AAAAAAAABwAAAH///////AAAAAAAAAAAAAA///// + //wAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAD///////AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAA + H//////8AAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAf/////gAAAAAAAAAAAAAAH/////wAAAAAAAAA + AAAAAB/////4AAAAAAAAAAAAAAAf////+AwAAAAAAAAAAAAAH/////g8AAAAAAAAAAAAAB/////wfAAA + AAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf//// + 8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAA + H/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAA + AAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAA + AAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfgAAAAAAAAAAAAAf//// + 8H8AAAAAAAAAAAAAH/////B/gAOAAAAAAAAAAB/////wf8AHgAAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAA + AAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAA + AAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAA/////8H////wAAAAAAAAAf/////B////8AAAA + AAAAAH/////wf////AAAAAAAAAB/////8H////wAAAAAAAAAP/////B////8AAAAAAAAAD/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////AD////AAAAAAAAAAf////gAf///wAAAAAAAAAH////wAD///8AAAA + AAAAAB////4AAf///AAAAAAAAAAf///8AAH///wAAAAAAAAAH////AAA///8AAAAAAAAAB////wAAP// + /AAAAAAAAAAf///8AAD///wAAAAAAAAAH///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4 + AAD///wAAAAAAAAAH///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4AAD///wAAAAAAAAA + H///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4AAD///wAAAAAAAAAH////AAA///8AAAA + AAAAAB////4AAf///AAAAAAAAAAf////B4f///wAAAAAAAAAH////weH///8AAAAAAAAAD////8Hh/// + /AAAAAAAAAA/////B4f///4AAAAAAAAAf////weH////gAAAAAAAAP////8Hh////8AAAAAAAAf///// + B4f////AAAAAAAAH/////w+H////wAAAAAAAB////////////8AAAAAAAAf////////////gAAAAAAAH + ////////////4AAAAAAAD/////////////gAAAAAAB///////////////gAAAH////////////////4A + AAB////////////////+AAAAf////////////////gAAAH////////////////4AAAB///////////// + ///+AAAA/////////////////wAAAf////8= + + + \ No newline at end of file diff --git a/LargeSquareOne/FrmMain.Designer.cs b/LargeSquareOne/FrmMain.Designer.cs new file mode 100644 index 0000000..a4c33a7 --- /dev/null +++ b/LargeSquareOne/FrmMain.Designer.cs @@ -0,0 +1,862 @@ +namespace LargeSquareOne +{ + partial class FrmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); + this.pageHeader1 = new AntdUI.PageHeader(); + this.TopPanel = new System.Windows.Forms.Panel(); + this.nav_HistotryData = new JinYuan.ControlLib.NaviButton2(); + this.nav_AlarmLog = new JinYuan.ControlLib.NaviButton2(); + this.lblSubtitle = new System.Windows.Forms.Label(); + this.nav_UserInfo = new JinYuan.ControlLib.NaviButton2(); + this.nav_SetSystem = new JinYuan.ControlLib.NaviButton2(); + this.nav_DataMonitor = new JinYuan.ControlLib.NaviButton2(); + this.nav_System = new JinYuan.ControlLib.NaviButton2(); + this.nav_Monitor = new JinYuan.ControlLib.NaviButton2(); + this.nav_CPK = new JinYuan.ControlLib.NaviButton2(); + this.panel1 = new AntdUI.Panel(); + this.SwitchLanguage = new AntdUI.Dropdown(); + this.avatar2 = new AntdUI.Avatar(); + this.avMesicon = new AntdUI.Avatar(); + this.btnScale = new AntdUI.Button(); + this.lblMES = new System.Windows.Forms.Label(); + this.lblHeading = new System.Windows.Forms.Label(); + this.btExit = new AntdUI.Button(); + this.lblLogTitle = new System.Windows.Forms.Label(); + this.lbl_LoginName = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.lbl_LoginLevel = new System.Windows.Forms.Label(); + this.led_State = new SeeSharpTools.JY.GUI.LED(); + this.label1 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.led_RunState = new SeeSharpTools.JY.GUI.LED(); + this.label21 = new System.Windows.Forms.Label(); + this.led_MESState = new SeeSharpTools.JY.GUI.LED(); + this.label18 = new System.Windows.Forms.Label(); + this.led_PLCState = new SeeSharpTools.JY.GUI.LED(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lbl_DateTime = new System.Windows.Forms.Label(); + this.panel9 = new System.Windows.Forms.Panel(); + this.ucRollText1 = new JinYuan.ControlLib.UCRollText(); + this.panel5 = new AntdUI.Panel(); + this.panel8 = new System.Windows.Forms.Panel(); + this.panel7 = new System.Windows.Forms.Panel(); + this.btToggleMonitor = new AntdUI.Button(); + this.cmbModelType = new HML.DropDownListPlus(); + this.txtMaterialCode = new AntdUI.Input(); + this.CorePanel = new JinYuan.ControlLib.PanelExt(); + this.MainPanel = new System.Windows.Forms.Panel(); + this.pageHeader1.SuspendLayout(); + this.TopPanel.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel3.SuspendLayout(); + this.panel9.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel8.SuspendLayout(); + this.panel7.SuspendLayout(); + this.CorePanel.SuspendLayout(); + this.SuspendLayout(); + // + // pageHeader1 + // + this.pageHeader1.BackColor = System.Drawing.Color.Transparent; + this.pageHeader1.BackgroundImage = global::LargeSquareOne.Properties.Resources.导航栏; + this.pageHeader1.Controls.Add(this.TopPanel); + this.pageHeader1.Controls.Add(this.panel1); + this.pageHeader1.Dock = System.Windows.Forms.DockStyle.Top; + this.pageHeader1.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.pageHeader1.ForeColor = System.Drawing.Color.White; + this.pageHeader1.Location = new System.Drawing.Point(0, 0); + this.pageHeader1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.pageHeader1.Name = "pageHeader1"; + this.pageHeader1.Size = new System.Drawing.Size(1921, 116); + this.pageHeader1.SubText = ""; + this.pageHeader1.TabIndex = 0; + this.pageHeader1.Text = ""; + // + // TopPanel + // + this.TopPanel.Controls.Add(this.nav_HistotryData); + this.TopPanel.Controls.Add(this.nav_AlarmLog); + this.TopPanel.Controls.Add(this.lblSubtitle); + this.TopPanel.Controls.Add(this.nav_UserInfo); + this.TopPanel.Controls.Add(this.nav_SetSystem); + this.TopPanel.Controls.Add(this.nav_DataMonitor); + this.TopPanel.Controls.Add(this.nav_System); + this.TopPanel.Controls.Add(this.nav_Monitor); + this.TopPanel.Controls.Add(this.nav_CPK); + this.TopPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.TopPanel.Location = new System.Drawing.Point(0, 35); + this.TopPanel.Name = "TopPanel"; + this.TopPanel.Size = new System.Drawing.Size(1921, 81); + this.TopPanel.TabIndex = 16; + // + // nav_HistotryData + // + this.nav_HistotryData.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.nav_HistotryData.BackColor = System.Drawing.Color.Transparent; + this.nav_HistotryData.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_HistotryData.BackgroundImage"))); + this.nav_HistotryData.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_HistotryData.IsLeft = false; + this.nav_HistotryData.IsSelected = false; + this.nav_HistotryData.Location = new System.Drawing.Point(1280, 15); + this.nav_HistotryData.Margin = new System.Windows.Forms.Padding(2); + this.nav_HistotryData.Name = "nav_HistotryData"; + this.nav_HistotryData.Size = new System.Drawing.Size(132, 52); + this.nav_HistotryData.TabIndex = 15; + this.nav_HistotryData.Tag = "数据追溯"; + this.nav_HistotryData.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_HistotryData.TitleForeColor = System.Drawing.Color.White; + this.nav_HistotryData.TitleName = "数据追溯"; + this.nav_HistotryData.TitleTextMultiLine = true; + this.nav_HistotryData.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // nav_AlarmLog + // + this.nav_AlarmLog.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.nav_AlarmLog.BackColor = System.Drawing.Color.Transparent; + this.nav_AlarmLog.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_AlarmLog.BackgroundImage"))); + this.nav_AlarmLog.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_AlarmLog.IsLeft = true; + this.nav_AlarmLog.IsSelected = false; + this.nav_AlarmLog.Location = new System.Drawing.Point(461, 15); + this.nav_AlarmLog.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.nav_AlarmLog.Name = "nav_AlarmLog"; + this.nav_AlarmLog.Size = new System.Drawing.Size(132, 52); + this.nav_AlarmLog.TabIndex = 8; + this.nav_AlarmLog.Tag = "日志报警"; + this.nav_AlarmLog.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_AlarmLog.TitleForeColor = System.Drawing.Color.White; + this.nav_AlarmLog.TitleName = "日志报警"; + this.nav_AlarmLog.TitleTextMultiLine = true; + this.nav_AlarmLog.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // lblSubtitle + // + this.lblSubtitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblSubtitle.Font = new System.Drawing.Font("Cambria", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblSubtitle.ForeColor = System.Drawing.Color.White; + this.lblSubtitle.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblSubtitle.Location = new System.Drawing.Point(601, 3); + this.lblSubtitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblSubtitle.Name = "lblSubtitle"; + this.lblSubtitle.Size = new System.Drawing.Size(712, 38); + this.lblSubtitle.TabIndex = 2; + this.lblSubtitle.Text = "Pack and Label Management System"; + this.lblSubtitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lblSubtitle.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.lblSubtitle.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // nav_UserInfo + // + this.nav_UserInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.nav_UserInfo.BackColor = System.Drawing.Color.Transparent; + this.nav_UserInfo.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_UserInfo.BackgroundImage"))); + this.nav_UserInfo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_UserInfo.IsLeft = false; + this.nav_UserInfo.IsSelected = false; + this.nav_UserInfo.Location = new System.Drawing.Point(1754, 15); + this.nav_UserInfo.Margin = new System.Windows.Forms.Padding(2); + this.nav_UserInfo.Name = "nav_UserInfo"; + this.nav_UserInfo.Size = new System.Drawing.Size(132, 52); + this.nav_UserInfo.TabIndex = 9; + this.nav_UserInfo.Tag = "用户管理"; + this.nav_UserInfo.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_UserInfo.TitleForeColor = System.Drawing.Color.White; + this.nav_UserInfo.TitleName = "用户管理"; + this.nav_UserInfo.TitleTextMultiLine = true; + this.nav_UserInfo.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // nav_SetSystem + // + this.nav_SetSystem.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.nav_SetSystem.BackColor = System.Drawing.Color.Transparent; + this.nav_SetSystem.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_SetSystem.BackgroundImage"))); + this.nav_SetSystem.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_SetSystem.IsLeft = false; + this.nav_SetSystem.IsSelected = false; + this.nav_SetSystem.Location = new System.Drawing.Point(1438, 15); + this.nav_SetSystem.Margin = new System.Windows.Forms.Padding(2, 4, 2, 4); + this.nav_SetSystem.Name = "nav_SetSystem"; + this.nav_SetSystem.Size = new System.Drawing.Size(132, 52); + this.nav_SetSystem.TabIndex = 10; + this.nav_SetSystem.Tag = "参数设置"; + this.nav_SetSystem.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_SetSystem.TitleForeColor = System.Drawing.Color.White; + this.nav_SetSystem.TitleName = "参数设置"; + this.nav_SetSystem.TitleTextMultiLine = true; + this.nav_SetSystem.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // nav_DataMonitor + // + this.nav_DataMonitor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.nav_DataMonitor.BackColor = System.Drawing.Color.Transparent; + this.nav_DataMonitor.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_DataMonitor.BackgroundImage"))); + this.nav_DataMonitor.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_DataMonitor.ForeColor = System.Drawing.Color.White; + this.nav_DataMonitor.IsLeft = true; + this.nav_DataMonitor.IsSelected = false; + this.nav_DataMonitor.Location = new System.Drawing.Point(179, 15); + this.nav_DataMonitor.Margin = new System.Windows.Forms.Padding(10, 37, 10, 37); + this.nav_DataMonitor.Name = "nav_DataMonitor"; + this.nav_DataMonitor.Size = new System.Drawing.Size(132, 52); + this.nav_DataMonitor.TabIndex = 13; + this.nav_DataMonitor.Tag = "数据监控"; + this.nav_DataMonitor.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_DataMonitor.TitleForeColor = System.Drawing.Color.White; + this.nav_DataMonitor.TitleName = "数据监控"; + this.nav_DataMonitor.TitleTextMultiLine = true; + this.nav_DataMonitor.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // nav_System + // + this.nav_System.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.nav_System.BackColor = System.Drawing.Color.Transparent; + this.nav_System.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_System.BackgroundImage"))); + this.nav_System.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_System.IsLeft = false; + this.nav_System.IsSelected = false; + this.nav_System.Location = new System.Drawing.Point(1596, 15); + this.nav_System.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nav_System.Name = "nav_System"; + this.nav_System.Size = new System.Drawing.Size(132, 52); + this.nav_System.TabIndex = 11; + this.nav_System.Tag = "系统设置"; + this.nav_System.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_System.TitleForeColor = System.Drawing.Color.White; + this.nav_System.TitleName = "系统设置"; + this.nav_System.TitleTextMultiLine = true; + this.nav_System.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // nav_Monitor + // + this.nav_Monitor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.nav_Monitor.BackColor = System.Drawing.Color.Transparent; + this.nav_Monitor.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_Monitor.BackgroundImage"))); + this.nav_Monitor.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_Monitor.Font = new System.Drawing.Font("Cambria", 10.5F); + this.nav_Monitor.IsLeft = true; + this.nav_Monitor.IsSelected = false; + this.nav_Monitor.Location = new System.Drawing.Point(26, 15); + this.nav_Monitor.Margin = new System.Windows.Forms.Padding(12, 39, 12, 39); + this.nav_Monitor.Name = "nav_Monitor"; + this.nav_Monitor.Size = new System.Drawing.Size(132, 52); + this.nav_Monitor.TabIndex = 1; + this.nav_Monitor.Tag = "集中监控"; + this.nav_Monitor.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_Monitor.TitleForeColor = System.Drawing.Color.White; + this.nav_Monitor.TitleName = "集中监控"; + this.nav_Monitor.TitleTextMultiLine = false; + this.nav_Monitor.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // nav_CPK + // + this.nav_CPK.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.nav_CPK.BackColor = System.Drawing.Color.Transparent; + this.nav_CPK.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("nav_CPK.BackgroundImage"))); + this.nav_CPK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.nav_CPK.IsLeft = true; + this.nav_CPK.IsSelected = false; + this.nav_CPK.Location = new System.Drawing.Point(522, 15); + this.nav_CPK.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.nav_CPK.Name = "nav_CPK"; + this.nav_CPK.Size = new System.Drawing.Size(120, 52); + this.nav_CPK.TabIndex = 14; + this.nav_CPK.Tag = "数据分析"; + this.nav_CPK.TitleFont = new System.Drawing.Font("Cambria", 10.5F); + this.nav_CPK.TitleForeColor = System.Drawing.Color.White; + this.nav_CPK.TitleName = "数据分析"; + this.nav_CPK.TitleTextMultiLine = true; + this.nav_CPK.Visible = false; + this.nav_CPK.Click += new System.EventHandler(this.CommonNaviButton_Click); + // + // panel1 + // + this.panel1.Back = System.Drawing.Color.Transparent; + this.panel1.Controls.Add(this.SwitchLanguage); + this.panel1.Controls.Add(this.avatar2); + this.panel1.Controls.Add(this.avMesicon); + this.panel1.Controls.Add(this.btnScale); + this.panel1.Controls.Add(this.lblMES); + this.panel1.Controls.Add(this.lblHeading); + this.panel1.Controls.Add(this.btExit); + this.panel1.Controls.Add(this.lblLogTitle); + this.panel1.Controls.Add(this.lbl_LoginName); + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Controls.Add(this.lbl_LoginLevel); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1921, 35); + this.panel1.TabIndex = 15; + this.panel1.Text = "panel1"; + this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // SwitchLanguage + // + this.SwitchLanguage.BackActive = System.Drawing.Color.FromArgb(((int)(((byte)(195)))), ((int)(((byte)(198)))), ((int)(((byte)(202))))); + this.SwitchLanguage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(89)))), ((int)(((byte)(197))))); + this.SwitchLanguage.BackHover = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(200)))), ((int)(((byte)(205))))); + this.SwitchLanguage.Dock = System.Windows.Forms.DockStyle.Right; + this.SwitchLanguage.Font = new System.Drawing.Font("Microsoft YaHei UI", 22F); + this.SwitchLanguage.Ghost = true; + this.SwitchLanguage.IconSvg = resources.GetString("SwitchLanguage.IconSvg"); + this.SwitchLanguage.Items.AddRange(new object[] { + "中文", + "英文", + "匈牙利语"}); + this.SwitchLanguage.Location = new System.Drawing.Point(1806, 0); + this.SwitchLanguage.Name = "SwitchLanguage"; + this.SwitchLanguage.Size = new System.Drawing.Size(41, 35); + this.SwitchLanguage.TabIndex = 13; + this.SwitchLanguage.Type = AntdUI.TTypeMini.Primary; + this.SwitchLanguage.SelectedValueChanged += new AntdUI.ObjectNEventHandler(this.SwitchLanguage_SelectedValueChanged); + // + // avatar2 + // + this.avatar2.ImageSvg = resources.GetString("avatar2.ImageSvg"); + this.avatar2.Location = new System.Drawing.Point(1630, 8); + this.avatar2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.avatar2.Name = "avatar2"; + this.avatar2.Size = new System.Drawing.Size(26, 21); + this.avatar2.TabIndex = 5; + this.avatar2.Text = ""; + // + // avMesicon + // + this.avMesicon.ImageSvg = resources.GetString("avMesicon.ImageSvg"); + this.avMesicon.Location = new System.Drawing.Point(1523, 7); + this.avMesicon.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.avMesicon.Name = "avMesicon"; + this.avMesicon.Size = new System.Drawing.Size(26, 21); + this.avMesicon.TabIndex = 4; + this.avMesicon.Text = "a"; + // + // btnScale + // + this.btnScale.BackHover = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(130)))), ((int)(((byte)(133))))); + this.btnScale.DefaultBack = System.Drawing.Color.Transparent; + this.btnScale.DefaultBorderColor = System.Drawing.Color.Transparent; + this.btnScale.Dock = System.Windows.Forms.DockStyle.Right; + this.btnScale.Font = new System.Drawing.Font("Microsoft YaHei UI", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btnScale.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(8)))), ((int)(((byte)(8)))), ((int)(((byte)(8))))); + this.btnScale.IconSvg = resources.GetString("btnScale.IconSvg"); + this.btnScale.Location = new System.Drawing.Point(1847, 0); + this.btnScale.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.btnScale.Name = "btnScale"; + this.btnScale.Size = new System.Drawing.Size(37, 35); + this.btnScale.TabIndex = 8; + this.btnScale.Click += new System.EventHandler(this.btnScale_Click); + // + // lblMES + // + this.lblMES.Font = new System.Drawing.Font("微软雅黑", 11.5F, System.Drawing.FontStyle.Bold); + this.lblMES.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.lblMES.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblMES.Location = new System.Drawing.Point(1548, 5); + this.lblMES.Name = "lblMES"; + this.lblMES.Size = new System.Drawing.Size(74, 26); + this.lblMES.TabIndex = 7; + this.lblMES.Text = "075295"; + this.lblMES.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblHeading + // + this.lblHeading.Font = new System.Drawing.Font("Cambria", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblHeading.ForeColor = System.Drawing.Color.White; + this.lblHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblHeading.Location = new System.Drawing.Point(847, -2); + this.lblHeading.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblHeading.Name = "lblHeading"; + this.lblHeading.Size = new System.Drawing.Size(231, 35); + this.lblHeading.TabIndex = 3; + this.lblHeading.Text = "Factory 57"; + this.lblHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lblHeading.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.lblHeading.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // btExit + // + this.btExit.BackHover = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(130)))), ((int)(((byte)(133))))); + this.btExit.DefaultBack = System.Drawing.Color.Transparent; + this.btExit.Dock = System.Windows.Forms.DockStyle.Right; + this.btExit.Font = new System.Drawing.Font("Microsoft YaHei UI", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btExit.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.btExit.IconSvg = resources.GetString("btExit.IconSvg"); + this.btExit.Location = new System.Drawing.Point(1884, 0); + this.btExit.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.btExit.Name = "btExit"; + this.btExit.Size = new System.Drawing.Size(37, 35); + this.btExit.TabIndex = 2; + this.btExit.ToggleBackHover = System.Drawing.Color.FromArgb(((int)(((byte)(213)))), ((int)(((byte)(217)))), ((int)(((byte)(222))))); + this.btExit.Click += new System.EventHandler(this.btExit_Click); + // + // lblLogTitle + // + this.lblLogTitle.Dock = System.Windows.Forms.DockStyle.Left; + this.lblLogTitle.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.lblLogTitle.Font = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblLogTitle.ForeColor = System.Drawing.Color.White; + this.lblLogTitle.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lblLogTitle.Location = new System.Drawing.Point(74, 0); + this.lblLogTitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblLogTitle.Name = "lblLogTitle"; + this.lblLogTitle.Size = new System.Drawing.Size(233, 35); + this.lblLogTitle.TabIndex = 7; + this.lblLogTitle.Text = "亿纬动力"; + this.lblLogTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblLogTitle.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.lblLogTitle.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // lbl_LoginName + // + this.lbl_LoginName.Font = new System.Drawing.Font("微软雅黑", 11.5F, System.Drawing.FontStyle.Bold); + this.lbl_LoginName.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.lbl_LoginName.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lbl_LoginName.Location = new System.Drawing.Point(1730, 6); + this.lbl_LoginName.Name = "lbl_LoginName"; + this.lbl_LoginName.Size = new System.Drawing.Size(74, 26); + this.lbl_LoginName.TabIndex = 6; + this.lbl_LoginName.Text = "075295"; + this.lbl_LoginName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // pictureBox1 + // + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox1.Image = global::LargeSquareOne.Properties.Resources.eve; + this.pictureBox1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(74, 35); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // lbl_LoginLevel + // + this.lbl_LoginLevel.Font = new System.Drawing.Font("微软雅黑", 11.5F, System.Drawing.FontStyle.Bold); + this.lbl_LoginLevel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.lbl_LoginLevel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lbl_LoginLevel.Location = new System.Drawing.Point(1662, 6); + this.lbl_LoginLevel.Name = "lbl_LoginLevel"; + this.lbl_LoginLevel.Size = new System.Drawing.Size(74, 26); + this.lbl_LoginLevel.TabIndex = 3; + this.lbl_LoginLevel.Text = "Admin"; + this.lbl_LoginLevel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // led_State + // + this.led_State.BlinkColor = System.Drawing.Color.Lime; + this.led_State.BlinkInterval = 500; + this.led_State.BlinkOn = false; + this.led_State.Cursor = System.Windows.Forms.Cursors.Arrow; + this.led_State.Interacton = SeeSharpTools.JY.GUI.LED.InteractionStyle.Indicator; + this.led_State.Location = new System.Drawing.Point(159, 3); + this.led_State.Margin = new System.Windows.Forms.Padding(10, 26, 10, 26); + this.led_State.Name = "led_State"; + this.led_State.OffColor = System.Drawing.Color.Gray; + this.led_State.OnColor = System.Drawing.Color.Lime; + this.led_State.Size = new System.Drawing.Size(25, 25); + this.led_State.Style = SeeSharpTools.JY.GUI.LED.LedStyle.Circular; + this.led_State.TabIndex = 20; + this.led_State.Value = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("微软雅黑", 9F); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label1.Location = new System.Drawing.Point(61, 28); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(41, 20); + this.label1.TabIndex = 34; + this.label1.Text = "MES"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.Font = new System.Drawing.Font("微软雅黑", 9F); + this.label6.ForeColor = System.Drawing.Color.White; + this.label6.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label6.Location = new System.Drawing.Point(22, 28); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(36, 20); + this.label6.TabIndex = 33; + this.label6.Text = "PLC"; + // + // led_RunState + // + this.led_RunState.BlinkColor = System.Drawing.Color.Lime; + this.led_RunState.BlinkInterval = 500; + this.led_RunState.BlinkOn = false; + this.led_RunState.Cursor = System.Windows.Forms.Cursors.Arrow; + this.led_RunState.Interacton = SeeSharpTools.JY.GUI.LED.InteractionStyle.Indicator; + this.led_RunState.Location = new System.Drawing.Point(112, 3); + this.led_RunState.Margin = new System.Windows.Forms.Padding(6, 9, 6, 9); + this.led_RunState.Name = "led_RunState"; + this.led_RunState.OffColor = System.Drawing.Color.Gray; + this.led_RunState.OnColor = System.Drawing.Color.Lime; + this.led_RunState.Size = new System.Drawing.Size(25, 25); + this.led_RunState.Style = SeeSharpTools.JY.GUI.LED.LedStyle.Circular; + this.led_RunState.TabIndex = 17; + this.led_RunState.Value = false; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.BackColor = System.Drawing.Color.Transparent; + this.label21.Font = new System.Drawing.Font("微软雅黑", 9F); + this.label21.ForeColor = System.Drawing.Color.White; + this.label21.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label21.Location = new System.Drawing.Point(151, 28); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(55, 20); + this.label21.TabIndex = 24; + this.label21.Text = "STATE"; + // + // led_MESState + // + this.led_MESState.BlinkColor = System.Drawing.Color.Lime; + this.led_MESState.BlinkInterval = 1000; + this.led_MESState.BlinkOn = false; + this.led_MESState.Cursor = System.Windows.Forms.Cursors.Arrow; + this.led_MESState.Interacton = SeeSharpTools.JY.GUI.LED.InteractionStyle.Indicator; + this.led_MESState.Location = new System.Drawing.Point(65, 3); + this.led_MESState.Margin = new System.Windows.Forms.Padding(6, 9, 6, 9); + this.led_MESState.Name = "led_MESState"; + this.led_MESState.OffColor = System.Drawing.Color.Gray; + this.led_MESState.OnColor = System.Drawing.Color.Lime; + this.led_MESState.Size = new System.Drawing.Size(25, 25); + this.led_MESState.Style = SeeSharpTools.JY.GUI.LED.LedStyle.Circular; + this.led_MESState.TabIndex = 16; + this.led_MESState.Value = false; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.BackColor = System.Drawing.Color.Transparent; + this.label18.Font = new System.Drawing.Font("微软雅黑", 9F); + this.label18.ForeColor = System.Drawing.Color.White; + this.label18.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label18.Location = new System.Drawing.Point(98, 28); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(64, 20); + this.label18.TabIndex = 27; + this.label18.Text = "SERVER"; + // + // led_PLCState + // + this.led_PLCState.BlinkColor = System.Drawing.Color.Lime; + this.led_PLCState.BlinkInterval = 1000; + this.led_PLCState.BlinkOn = false; + this.led_PLCState.Cursor = System.Windows.Forms.Cursors.Arrow; + this.led_PLCState.Interacton = SeeSharpTools.JY.GUI.LED.InteractionStyle.Indicator; + this.led_PLCState.Location = new System.Drawing.Point(25, 3); + this.led_PLCState.Margin = new System.Windows.Forms.Padding(5); + this.led_PLCState.Name = "led_PLCState"; + this.led_PLCState.OffColor = System.Drawing.Color.Gray; + this.led_PLCState.OnColor = System.Drawing.Color.Lime; + this.led_PLCState.Size = new System.Drawing.Size(25, 25); + this.led_PLCState.Style = SeeSharpTools.JY.GUI.LED.LedStyle.Circular; + this.led_PLCState.TabIndex = 0; + this.led_PLCState.Value = false; + // + // panel3 + // + this.panel3.BackgroundImage = global::LargeSquareOne.Properties.Resources.Alarm1; + this.panel3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel3.Controls.Add(this.lbl_DateTime); + this.panel3.Controls.Add(this.panel9); + this.panel3.Dock = System.Windows.Forms.DockStyle.Left; + this.panel3.Location = new System.Drawing.Point(0, 0); + this.panel3.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(737, 46); + this.panel3.TabIndex = 9; + // + // lbl_DateTime + // + this.lbl_DateTime.AutoSize = true; + this.lbl_DateTime.BackColor = System.Drawing.Color.Transparent; + this.lbl_DateTime.Font = new System.Drawing.Font("微软雅黑", 11.5F, System.Drawing.FontStyle.Bold); + this.lbl_DateTime.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.lbl_DateTime.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.lbl_DateTime.Location = new System.Drawing.Point(271, 12); + this.lbl_DateTime.Name = "lbl_DateTime"; + this.lbl_DateTime.Size = new System.Drawing.Size(414, 27); + this.lbl_DateTime.TabIndex = 5; + this.lbl_DateTime.Text = "June 2, 2023 19:50:50 Monday Day Shift"; + this.lbl_DateTime.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel9 + // + this.panel9.BackColor = System.Drawing.Color.Transparent; + this.panel9.Controls.Add(this.led_MESState); + this.panel9.Controls.Add(this.led_PLCState); + this.panel9.Controls.Add(this.led_State); + this.panel9.Controls.Add(this.led_RunState); + this.panel9.Controls.Add(this.label21); + this.panel9.Controls.Add(this.label6); + this.panel9.Controls.Add(this.label1); + this.panel9.Controls.Add(this.label18); + this.panel9.Dock = System.Windows.Forms.DockStyle.Left; + this.panel9.Location = new System.Drawing.Point(0, 0); + this.panel9.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.panel9.Name = "panel9"; + this.panel9.Size = new System.Drawing.Size(210, 46); + this.panel9.TabIndex = 12; + // + // ucRollText1 + // + this.ucRollText1.BackColor = System.Drawing.Color.Transparent; + this.ucRollText1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.ucRollText1.ForeColor = System.Drawing.Color.White; + this.ucRollText1.IsChangeReset = false; + this.ucRollText1.IsExit = false; + this.ucRollText1.Location = new System.Drawing.Point(6, 0); + this.ucRollText1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.ucRollText1.MoveSleepTime = 80; + this.ucRollText1.Name = "ucRollText1"; + this.ucRollText1.RollStyle = JinYuan.ControlLib.RollStyle.RightToLeft; + this.ucRollText1.Size = new System.Drawing.Size(737, 46); + this.ucRollText1.TabIndex = 0; + // + // panel5 + // + this.panel5.Back = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.panel5.Controls.Add(this.panel8); + this.panel5.Controls.Add(this.panel7); + this.panel5.Controls.Add(this.panel3); + this.panel5.Dock = System.Windows.Forms.DockStyle.Top; + this.panel5.Location = new System.Drawing.Point(0, 116); + this.panel5.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(1921, 46); + this.panel5.TabIndex = 3; + this.panel5.Text = "panel5"; + // + // panel8 + // + this.panel8.BackgroundImage = global::LargeSquareOne.Properties.Resources.Alarm1; + this.panel8.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.panel8.Controls.Add(this.ucRollText1); + this.panel8.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel8.Location = new System.Drawing.Point(1175, 0); + this.panel8.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(746, 46); + this.panel8.TabIndex = 11; + // + // panel7 + // + this.panel7.Controls.Add(this.btToggleMonitor); + this.panel7.Controls.Add(this.cmbModelType); + this.panel7.Controls.Add(this.txtMaterialCode); + this.panel7.Dock = System.Windows.Forms.DockStyle.Left; + this.panel7.Location = new System.Drawing.Point(737, 0); + this.panel7.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(438, 46); + this.panel7.TabIndex = 10; + // + // btToggleMonitor + // + this.btToggleMonitor.DefaultBack = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(184)))), ((int)(((byte)(61))))); + this.btToggleMonitor.Font = new System.Drawing.Font("Microsoft YaHei UI", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btToggleMonitor.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.btToggleMonitor.IconSvg = resources.GetString("btToggleMonitor.IconSvg"); + this.btToggleMonitor.IconToggleAnimation = 300; + this.btToggleMonitor.Location = new System.Drawing.Point(161, 3); + this.btToggleMonitor.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.btToggleMonitor.Name = "btToggleMonitor"; + this.btToggleMonitor.Size = new System.Drawing.Size(130, 41); + this.btToggleMonitor.TabIndex = 0; + this.btToggleMonitor.Text = "START"; + this.btToggleMonitor.ToggleBackActive = System.Drawing.Color.FromArgb(((int)(((byte)(98)))), ((int)(((byte)(136)))), ((int)(((byte)(190))))); + this.btToggleMonitor.ToggleFore = System.Drawing.Color.FromArgb(((int)(((byte)(246)))), ((int)(((byte)(246)))), ((int)(((byte)(250))))); + this.btToggleMonitor.Click += new System.EventHandler(this.btToggleMonitor_Click); + // + // cmbModelType + // + this.cmbModelType.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.cmbModelType.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(9)))), ((int)(((byte)(90)))), ((int)(((byte)(124))))); + this.cmbModelType.ContentItemsStyle.ItemBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.cmbModelType.DropDownButton.BackNormalColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.cmbModelType.DropDownButton.DropDownFullArea = true; + this.cmbModelType.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F); + this.cmbModelType.Location = new System.Drawing.Point(7, 7); + this.cmbModelType.Margin = new System.Windows.Forms.Padding(2); + this.cmbModelType.Name = "cmbModelType"; + this.cmbModelType.Size = new System.Drawing.Size(130, 41); + this.cmbModelType.TabIndex = 17; + this.cmbModelType.SelectedItemsChanged += new System.EventHandler(this.cmbModelType_SelectedItemsChanged); + this.cmbModelType.Enter += new System.EventHandler(this.cmbModelType_Enter); + // + // txtMaterialCode + // + this.txtMaterialCode.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.txtMaterialCode.Font = new System.Drawing.Font("黑体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtMaterialCode.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(254)))), ((int)(((byte)(254)))), ((int)(((byte)(255))))); + this.txtMaterialCode.Location = new System.Drawing.Point(302, 5); + this.txtMaterialCode.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.txtMaterialCode.Name = "txtMaterialCode"; + this.txtMaterialCode.ReadOnly = true; + this.txtMaterialCode.Size = new System.Drawing.Size(130, 37); + this.txtMaterialCode.TabIndex = 15; + // + // CorePanel + // + this.CorePanel.BackColor = System.Drawing.Color.Transparent; + this.CorePanel.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(9)))), ((int)(((byte)(90)))), ((int)(((byte)(124))))); + this.CorePanel.BordeWidth = 3; + this.CorePanel.BottomGap = 10; + this.CorePanel.Controls.Add(this.MainPanel); + this.CorePanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.CorePanel.LeftGap = 20; + this.CorePanel.Location = new System.Drawing.Point(0, 162); + this.CorePanel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.CorePanel.Name = "CorePanel"; + this.CorePanel.Padding = new System.Windows.Forms.Padding(23, 11, 23, 11); + this.CorePanel.RightGap = 20; + this.CorePanel.Size = new System.Drawing.Size(1921, 838); + this.CorePanel.TabIndex = 4; + this.CorePanel.TopGap = 10; + // + // MainPanel + // + this.MainPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainPanel.Location = new System.Drawing.Point(23, 11); + this.MainPanel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.MainPanel.Name = "MainPanel"; + this.MainPanel.Size = new System.Drawing.Size(1875, 816); + this.MainPanel.TabIndex = 0; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.ClientSize = new System.Drawing.Size(1921, 1000); + this.Controls.Add(this.CorePanel); + this.Controls.Add(this.panel5); + this.Controls.Add(this.pageHeader1); + this.Dark = true; + this.Font = new System.Drawing.Font("Cambria", 9F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.Mode = AntdUI.TAMode.Dark; + this.Name = "FrmMain"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmMain"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing); + this.Load += new System.EventHandler(this.FrmNewMain_Load); + this.pageHeader1.ResumeLayout(false); + this.TopPanel.ResumeLayout(false); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel9.ResumeLayout(false); + this.panel9.PerformLayout(); + this.panel5.ResumeLayout(false); + this.panel8.ResumeLayout(false); + this.panel7.ResumeLayout(false); + this.CorePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private AntdUI.PageHeader pageHeader1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label lblHeading; + private System.Windows.Forms.Label lblSubtitle; + private JinYuan.ControlLib.NaviButton2 nav_CPK; + private System.Windows.Forms.Label lblLogTitle; + private JinYuan.ControlLib.NaviButton2 nav_SetSystem; + private JinYuan.ControlLib.NaviButton2 nav_System; + private JinYuan.ControlLib.NaviButton2 nav_Monitor; + private JinYuan.ControlLib.NaviButton2 nav_DataMonitor; + private JinYuan.ControlLib.NaviButton2 nav_AlarmLog; + private JinYuan.ControlLib.NaviButton2 nav_UserInfo; + private JinYuan.ControlLib.NaviButton2 nav_HistotryData; + private AntdUI.Panel panel1; + private SeeSharpTools.JY.GUI.LED led_State; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label6; + private SeeSharpTools.JY.GUI.LED led_RunState; + private System.Windows.Forms.Label label21; + private SeeSharpTools.JY.GUI.LED led_MESState; + private System.Windows.Forms.Label label18; + private SeeSharpTools.JY.GUI.LED led_PLCState; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label lbl_DateTime; + private System.Windows.Forms.Label lblMES; + private System.Windows.Forms.Label lbl_LoginName; + private System.Windows.Forms.Label lbl_LoginLevel; + private JinYuan.ControlLib.UCRollText ucRollText1; + private AntdUI.Button btnScale; + private AntdUI.Button btExit; + private AntdUI.Panel panel5; + private System.Windows.Forms.Panel panel9; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Panel panel7; + private AntdUI.Avatar avMesicon; + private AntdUI.Avatar avatar2; + private JinYuan.ControlLib.PanelExt CorePanel; + private System.Windows.Forms.Panel MainPanel; + private AntdUI.Button btToggleMonitor; + private AntdUI.Input txtMaterialCode; + private HML.DropDownListPlus cmbModelType; + private System.Windows.Forms.Panel TopPanel; + private AntdUI.Dropdown SwitchLanguage; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmMain.cs b/LargeSquareOne/FrmMain.cs new file mode 100644 index 0000000..60769bb --- /dev/null +++ b/LargeSquareOne/FrmMain.cs @@ -0,0 +1,1414 @@ +using AntdUI; +using HML; +using JinYuan.ControlCenters; +using JinYuan.ControlLib; +using JinYuan.Helper; +using JinYuan.MES.Models; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using LargeSquareOne.ViewModel; +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Drawing.Text; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmMain : MultiLanguageForm + { + + private ControlCenter _controlCenter; + //实时更新的定时器 + private System.Windows.Forms.Timer updateTimer; + + //加载字体 + private PrivateFontCollection font = new PrivateFontCollection(); + //private Image _backgroundImage; + + //定时存储定时器 + private System.Timers.Timer storeTimer; + /// + /// 时间更新委托 + /// + /// + public delegate void ShowTimeHandler(DateTime time); + + //当前页面索引 + private int CurrentIndex = 0; + private List naviButton2s = new List(); + + + public bool IsNoOrg = false; + public bool IsSetParam = false; + + public FrmMain() + { + InitializeComponent(); + + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.UserPaint, true); + + InitializeLanguageSwitch(); + SetCombOrg(); + IsNoOrg = true; + + this.Resize += FrmNewMain_Resize; // 关联 Resize 事件 + + #region 添加工具栏 + naviButton2s.Add(this.nav_Monitor); + naviButton2s.Add(this.nav_DataMonitor); + naviButton2s.Add(this.nav_CPK); + naviButton2s.Add(this.nav_AlarmLog); + naviButton2s.Add(this.nav_HistotryData); + naviButton2s.Add(this.nav_SetSystem); + naviButton2s.Add(this.nav_System); + naviButton2s.Add(this.nav_UserInfo); + #endregion + + storeTimer = new System.Timers.Timer(); + storeTimer.Interval = 1000; + storeTimer.AutoReset = true; + storeTimer.Elapsed += StoreTimer_Elapsed; + //开启定时器 + storeTimer.Start(); + + updateTimer = new System.Windows.Forms.Timer(); + updateTimer.Interval = 200; + updateTimer.Tick += UpdateTimer_Tick; + updateTimer.Start(); + //刷卡模式 + if (CommonMethods.sysConfig.SwipeCardMode) + { + CommonMethods.listener.ScanerEvent += Listener_ScanerEvent; + } + CommonMethods.listener.Start(); + + } + + + private async void FrmNewMain_Load(object sender, EventArgs e) + { + InitReadInI(); + UserTimeOut(30); + + _controlCenter = ControlCenter.Instance; + await ControlCenter.Instance.StartAsync(); + + //1.设置登录用户 + this.lbl_LoginLevel.Text = CommonMethods.currentAdmin?.LoginLevel; + this.lbl_LoginName.Text = CommonMethods.currentAdmin?.LoginName; + + //2.打开日志报警窗体 + CommonNaviButton_Click(this.nav_AlarmLog, null); + //3.打开图表窗体 + CommonNaviButton_Click(this.nav_Monitor, null); + //打开集中监控窗体 + CommonNaviButton_Click(this.nav_DataMonitor, null); + //登录日志 + CommonMethods.AddOPLog(false, "登录成功,登录用户".Translated() + $":{CommonMethods.currentAdmin?.LoginName}," + "权限".Translated() + $":{CommonMethods.currentAdmin?.LoginLevel}"); + + //自动锁屏 + if (CommonMethods.sysConfig.AutoLock) + { + //开启监听键盘和鼠标操作 + Application.AddMessageFilter(new MessageFilter()); + } + // + if (CommonMethods.sysConfig != null) + { + CommonMethods.AddLog(false, "加载系统配置成功".Translated()); + } + else + { + CommonMethods.AddLog(true, "加载系统配置失败".Translated()); + } + if (CommonMethods.sysConfig.MesModeSwitching && !CommonMethods.mesConfig.IsLoginMesOK) + { + new FrmMsgBoxOutWithAck(2, "当前为MES模式,请登录!".Translated(), "MES未登录".Translated()).ShowDialog(); + FrmLoginMes frmLoginMes = new FrmLoginMes(); + + frmLoginMes.ShowDialog(); + } + + if (CommonMethods.btwConfig.IsConnectPrinter && CommonMethods.tcpClient == null) + { + CommonMethods.tcpClient = new PrintSocket.TCPClient(); + CommonMethods.tcpClient.InitClient("127.0.0.1", 8000); + } + } + + + #region 读取配置文件 + + /// + /// 读取配置文件 + /// + public void InitReadInI() + { + #region 系统配置 + CommonMethods.sysConfig = CommonMethods.GetSysConfig(); + //CommonMethods.sysConfig.MesModeSwitching = Convert.ToBoolean(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "MESModeSwitch", "false")); + //CommonMethods.sysConfig.GetMesParam = Convert.ToBoolean(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "FetchMESParams", "false")); + + + //CommonMethods.mesConfig.IsGet_Server = Convert.ToBoolean(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "FetchServerData", "false")); + //CommonMethods.sysConfig.IsDebugMode = Convert.ToBoolean(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "IsDebugMode", "false")); + //CommonMethods.mesConfig.CoreCount = Convert.ToInt32(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "CoreCount", "1")); + //CommonMethods.mesConfig.SteelshellCount = Convert.ToInt32(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "SteelshellCount", "1")); + #endregion + + #region MES配置 + + CommonMethods.mesConfig.RotueServerIP = CommonMethods.GetConfigValue(CommonMethods.Configxml, "MES_CONFIG", "StorageServerIP", "192.168.2.108"); + ///获取MES参数 + CommonMethods.mesConfig = CommonMethods.GetMesConfig(); + CommonMethods.btwConfig = CommonMethods.GetBtwConfig(); + + CommonMethods.mesConfig.electricMeterNum.Clear(); + + string str = CommonMethods.GetConfigValue(CommonMethods.Configxml, "MES_CONFIG", "SmartMeterCode", "1"); + if (str.Contains(',')) + { + string[] strArray = str.Split(','); + for (int i = 0; i < strArray.Length; i++) + { + CommonMethods.mesConfig.electricMeterNum.Add(strArray[i]); + } + + } + + CommonMethods.ChangeClassTime = CommonMethods.GetConfigValue(CommonMethods.Configxml, "MES_CONFIG", "ShiftChangeTime", "20:30:00"); + CommonMethods.strDeletepath = CommonMethods.GetConfigValue(CommonMethods.Configxml, "MES_CONFIG", "MESLogPath", "D:\\APILog") + "\\"; + CommonMethods.strAlarmLogspath = CommonMethods.strDeletepath + "Logs\\AlarmLogs\\"; + CommonMethods.strMesLogspath = CommonMethods.strDeletepath + "Logs\\MesLogs"; + CommonMethods.strSystemLogspath = CommonMethods.strDeletepath + "Logs\\SystemLogs"; + CommonMethods.strErrorLogspath = CommonMethods.strDeletepath + "Logs\\ErrorLogs"; + CommonMethods.strsqlLogspath = CommonMethods.strDeletepath + "Logs\\SqlLogs\\"; + CommonMethods.strWattrMeterpath = CommonMethods.strDeletepath + "Logs\\智能电表数据\\"; + #endregion + + CommonMethods.mesConfig.listAntiDustAirSpeedNum.Clear(); + CommonMethods.mesConfig.AntiDustAirSpeedCount = Convert.ToInt32(CommonMethods.GetConfigValue(CommonMethods.Configxml, "ANEMOMETER", "AntiDustAirSpeedCount", "1")); + for (int i = 0; i < CommonMethods.mesConfig.AntiDustAirSpeedCount; i++) + { + CommonMethods.mesConfig.listAntiDustAirSpeedNum.Add(CommonMethods.GetConfigValue(CommonMethods.Configxml, "ANEMOMETER", $"AntiDustAirSpeed{i + 1}", "0")); + } + } + #endregion + + #region 无操作 系统锁屏+切换到主监控界面 + private async void UpdateTimer_Tick(object sender, EventArgs e) + { + try + { + await Task.Run(() => + { + if (CommonMethods.sysConfig.AutoLock) + { + CommonMethods.tickCount++; + if (CommonMethods.tickCount >= CommonMethods.sysConfig.LockPeriod * 60 * 1000 / this.updateTimer.Interval) + { + CommonMethods.tickCount=0; + this.BeginInvoke(() => LockWorkStation()); + } + } + + if (CommonMethods.sysConfig.AutoQieHuanM) + { + CommonMethods.tickHomeCount++; + if (CommonMethods.tickHomeCount >= CommonMethods.sysConfig.QieHuanMPeriod * 60 * 1000 / this.updateTimer.Interval) + { + CommonMethods.tickHomeCount=0; + this.BeginInvoke((Action)(() => CommonNaviButton_Click(this.nav_Monitor, null))); + } + } + }).ConfigureAwait(false); + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + private async void StoreTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + try + { + DateTime time = DateTime.Now; + await Task.Run(() => ShowButtonEven_Run(time)); + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + + [DllImport("user32")] + public static extern bool LockWorkStation(); + + #endregion + + + /// + /// 刷卡事件 + /// + /// + private void Listener_ScanerEvent(ScanerHook.ScanerCodes codes) + { + //封装对象 + SysAdmin sysAdmin = new SysAdmin() + { + LoginUid = codes.Result, + }; + + //调用查询方法 + sysAdmin = CommonMethods.db.Query(it => it.LoginUid == sysAdmin.LoginUid); + if (sysAdmin == null) + { + new FrmMsgBoxOutWithAck(3, "登录用户或密码错误".Translated(), "登录提示".Translated()).ShowDialog(); + return; + } + + CommonMethods.IsLoginOk = true; + //存储用户对象 + CommonMethods.currentAdmin = sysAdmin; + //1.设置登录用户 + this.lbl_LoginLevel.Text = CommonMethods.currentAdmin?.LoginLevel; + this.lbl_LoginName.Text = CommonMethods.currentAdmin?.LoginName; + //登录日志 + CommonMethods.AddOPLog(false, "登录成功,登录用户".Translated() + $":{CommonMethods.currentAdmin?.LoginName}," + "权限".Translated() + $":{CommonMethods.currentAdmin?.LoginLevel}"); + } + + + #region 获取日期/星期,班次信息,更新 + private void ShowButtonEven_Run(DateTime time) + { + try + { + this.Invoke(new Action(() => + { + //this.led_StopState.Value = CommonMethods.EMCStatues; + + this.lbl_DateTime.Text = CurrentTime + " " + week.Translated() + " " + $"{CommonMethods.strClass}"; + if (CommonMethods.plcDevices != null && CommonMethods.plcDevices.Count > 0) + { + this.led_PLCState.Value = CommonMethods.plcDevices[0].IsConnected; + } + if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.IsLoginMesOK && CommonMethods.mesConfig.isConnected)//MES + { + CommonMethods.mesConfig.isUpMes = true; + this.led_MESState.Value = true; + avMesicon.Visible = true; + lblMES.Visible = true; + lblMES.Text = CommonMethods.mesConfig.mesUserName; + } + else + { + CommonMethods.mesConfig.isUpMes = false; + avMesicon.Visible = false; + lblMES.Visible = false; + this.led_MESState.Value = false; + } + if (CommonMethods.sysConfig.SwipeCardMode && !CommonMethods.IsLoginOk)//刷卡模式 + { + lbl_LoginName.Visible = false; + lbl_LoginLevel.Text = "未登录"; + } + else + { + lbl_LoginName.Visible = true; + } + + if (CommonMethods.sysConfig.ScreenCutting) + { + CommonNaviButton_Click(this.nav_DataMonitor, null); + CommonMethods.sysConfig.ScreenCutting = false; + } + + + if (CommonMethods.Statues != null && CommonMethods.Statues.Count > 0) + { + // 第一种状态:直接设置颜色 + this.led_State.BlinkColor = Color.Lime; + this.led_State.OnColor = Color.Lime; + this.led_State.Value = CommonMethods.Statues[0]; + + // 闪烁状态 + if (CommonMethods.Statues[1] || CommonMethods.Statues[2] || CommonMethods.Statues[3]) + { + this.led_State.BlinkOn = true; // 启用闪烁 + + // 根据不同的状态设置闪烁模式 + if (CommonMethods.Statues[1]) + { + // 闪烁模式 1 停止状态 + this.led_State.BlinkColor = Color.Yellow; + this.led_State.OnColor = Color.Yellow; + } + else if (CommonMethods.Statues[2]) + { + // 闪烁模式 2 报警状态 + this.led_State.BlinkColor = Color.Red; + this.led_State.OnColor = Color.Red; + } + else if (CommonMethods.Statues[3]) + { + // 闪烁模式 3 闲置状态 + this.led_State.BlinkColor = Color.Yellow; + this.led_State.OnColor = Color.Yellow; + } + } + else + { + this.led_State.BlinkOn = false; // 关闭闪烁 + } + + if (!CommonMethods.Statues[2]) + { + string SlideAlarm = "当前无报警".Translated(); + this.ucRollText1.Text = SlideAlarm; + this.ucRollText1.ForeColor = System.Drawing.Color.White; + CommonMethods.SlideAlarmText = ""; + } + else + { + this.ucRollText1.Text = CommonMethods.SlideAlarmText; + if(CommonMethods.SlideAlarmText == "当前无报警".Translated() || string.IsNullOrEmpty(CommonMethods.SlideAlarmText.Trim())) + this.ucRollText1.ForeColor = System.Drawing.Color.White; + else + this.ucRollText1.ForeColor = System.Drawing.Color.Red; + } + } + })); + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + + } + + private string CurrentTime + { + get { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } + } + + private string[] weeks = new string[] { "星期日".Translated(), "星期一".Translated(), "星期二".Translated(), "星期三".Translated(), "星期四".Translated(), "星期五".Translated(), "星期六".Translated() }; + private string week + { + get { return weeks[Convert.ToInt32(DateTime.Now.DayOfWeek)]; } + } + #endregion + + #region 窗体操作 + #region 无边框拖动 + private System.Drawing.Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new System.Drawing.Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new System.Drawing.Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + + /// + /// 关闭程序 + /// + /// + /// + private void btExit_Click(object sender, EventArgs e) + { + // 关闭窗体 + this.Close(); + } + + private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing) + { + e.Cancel = true; // 先取消关闭 + + DialogResult dialogResult = new FrmMsgBoxWithAck("是否确定要退出系统".Translated(), "退出系统".Translated()).ShowDialog(); + if (dialogResult == DialogResult.OK) + { + try + { + + CommonMethods.IsRun = false; + CommonMethods.IsExit = true; + + CommonMethods.listener?.Stop(); + ControlCenter.Instance.Dispose(); + + foreach (var plc in CommonMethods.plcDevices) + { + try { plc.Disconnect(); } + catch { } + } + if (CommonMethods.tcpClient != null) + { + CommonMethods.tcpClient.CloseSocket(); + CommonMethods.tcpClient = null; + } + + this.Dispose(true); + Application.Exit(); + } + catch (Exception ex) + { + // 记录退出异常,避免程序崩溃 + LogHelper.Instance.WriteLog($"程序退出时异常:{ex.Message}", "ExitError"); + // 异常时兜底退出(仅作为最后手段) + Environment.Exit(1); + } + } + else + { + e.Cancel = true; + } + } + else + { + ControlCenter.Instance.Dispose(); + Environment.Exit(0); + } + } + + + private void btnScale_Click(object sender, EventArgs e) + { + // 手动触发窗体最小化的逻辑 + this.WindowState = FormWindowState.Minimized; // 将窗体最小化 + FrmNewMain_Resize(this, EventArgs.Empty); // 调用 Resize 事件处理程序 + } + + private void FrmNewMain_Resize(object sender, EventArgs e) + { + if (this.WindowState == FormWindowState.Minimized) + { + // 在这里编写窗体最小化时的逻辑 + //MessageBox.Show("窗体已最小化"); + // 例如:隐藏窗体、显示通知等 + } + } + #endregion + + #region 左右切换 + private void btn_Left_Click(object sender, EventArgs e) + { + CurrentIndex--; + if (CurrentIndex >= 0) + { + CommonNaviButton_Click(naviButton2s[CurrentIndex], null); + } + else + { + CurrentIndex++; + } + } + + private void btn_right_Click(object sender, EventArgs e) + { + CurrentIndex++; + if (CurrentIndex < naviButton2s.Count) + { + CommonNaviButton_Click(naviButton2s[CurrentIndex], null); + } + else + { + CurrentIndex--; + } + } + #endregion + + #region 通用窗体切换 + /// + /// 通用窗体切换 + /// + /// + /// + private void CommonNaviButton_Click(object sender, EventArgs e) + { + if (sender is NaviButton2 navi) + { + if (Enum.IsDefined(typeof(FormNames), navi.Tag.ToString())) + { + //拿到导航按钮对应的窗体枚举值 + FormNames formNames = (FormNames)Enum.Parse(typeof(FormNames), navi.Tag.ToString(), true); + + //用户权限处理 + switch (formNames) + { + case FormNames.日志报警: + + if (CommonMethods.IsLoginOk) + { + if (!CommonMethods.currentAdmin.SystemLog) + { + new FrmMsgBoxOutWithAck(2, "当前登录用户权限不足!".Translated(), "权限不足".Translated()).ShowDialog(); + return; + } + } + else + { + new FrmMsgBoxOutWithAck(2, "请先刷卡登录!".Translated(), "登录系统".Translated()).ShowDialog(); + return; + } + break; + case FormNames.数据分析: + new FrmMsgBoxOutWithAck(2, "功能待开发中!".Translated(), "数据分析".Translated()).ShowDialog(); + return; + + case FormNames.数据追溯: + if (CommonMethods.IsLoginOk) + { + if (!CommonMethods.currentAdmin.HistoryData) + { + new FrmMsgBoxOutWithAck(2, "当前登录用户权限不足!".Translated(), "权限不足".Translated()).ShowDialog(); + return; + } + } + else + { + new FrmMsgBoxOutWithAck(2, "请先刷卡登录!".Translated(), "登录系统".Translated()).ShowDialog(); + return; + } + break; + case FormNames.参数设置: + if (CommonMethods.IsLoginOk) + { + if (!CommonMethods.currentAdmin.ParamSet) + { + new FrmMsgBoxOutWithAck(2, "当前登录用户权限不足!".Translated(), "权限不足".Translated()).ShowDialog(); + return; + } + } + else + { + new FrmMsgBoxOutWithAck(2, "请先刷卡登录!".Translated(), "登录系统".Translated()).ShowDialog(); + return; + } + break; + case FormNames.系统设置: + if (CommonMethods.IsLoginOk) + { + if (!CommonMethods.currentAdmin.UserManage) + { + new FrmMsgBoxOutWithAck(2, "当前登录用户权限不足!".Translated(), "权限不足".Translated()).ShowDialog(); + return; + } + } + else + { + new FrmMsgBoxOutWithAck(2, "请先刷卡登录!".Translated(), "登录系统".Translated()).ShowDialog(); + return; + } + break; + case FormNames.用户管理: + if (CommonMethods.IsLoginOk) + { + if (!CommonMethods.currentAdmin.SystemLog) + { + new FrmMsgBoxOutWithAck(2, "当前登录用户权限不足!".Translated(), "权限不足".Translated()).ShowDialog(); + return; + } + } + else + { + new FrmMsgBoxOutWithAck(2, "请先刷卡登录!".Translated(), "登录系统".Translated()).ShowDialog(); + return; + } + break; + + default: + break; + } + + //窗体切换 + OpenForm(this.MainPanel, formNames); + + //设置选中 + SetNaviButtonSelected(this.TopPanel, navi); + } + } + } + + /// + /// 通用打开窗体 + /// + /// 容器控件 + /// 窗体枚举名称 + private void OpenForm(System.Windows.Forms.Panel mainPanel, FormNames formNames) + { + int total = mainPanel.Controls.Count; + int closeCount = 0; + bool isFind = false; + + for (int i = 0; i < total; i++) + { + Control ct = mainPanel.Controls[i - closeCount]; + if (ct is Form frm) + { + //如果当前Form是我们需要操作的窗体 + if (frm.Text == formNames.ToString()) + { + frm.BringToFront(); + isFind = true; + break; + } + //如果当前Form不是我们需要操作的窗体,然后判断是否为固定窗体,如果不是,则关闭,如果是,则不做处理 + else if ((FormNames)Enum.Parse(typeof(FormNames), frm.Text, true) >= FormNames.临界窗体) + { + frm.Close(); + closeCount++; + } + } + } + + if (!isFind) + { + Form frm = null; + + switch (formNames) + { + case FormNames.集中监控: + frm = new FrmMonitor(); + break; + case FormNames.数据监控: + frm = new FrmDataMonitor(); + CommonMethods.AddDataMonitorDelegate += ((FrmDataMonitor)frm).AddDataMonitorLog;//日志记录显示 + CommonMethods.ShowFeedingDelegate += ((FrmDataMonitor)frm).ShowFeedingData;//上料显示 + CommonMethods.ShowBlankingDelegate += ((FrmDataMonitor)frm).ShowBlankingData;//出站显示 + CommonMethods.ShowPrintContainergDelegate += ((FrmDataMonitor)frm).ShowPrintContainerData;//箱唛打印显示 + CommonMethods.ShowPrintPalletDelegate += ((FrmDataMonitor)frm).ShowPrintPalletData;//栈板打印显示 + CommonMethods.ChangeParamDelegate += ((FrmDataMonitor)frm).GetLocalParaData;//参数更新 + break; + case FormNames.日志报警: + frm = new FrmAlarmLog(); + //绑定委托 + CommonMethods.AddLogDelegate += ((FrmAlarmLog)frm).AddLog;//系统日志 + CommonMethods.AddOPLogDelegate += ((FrmAlarmLog)frm).AddOPLog;//操作日志 + CommonMethods.AddAlarmDelegate += ((FrmAlarmLog)frm).AddAlarm;//报警日志 + break; + case FormNames.临界窗体: + break; + case FormNames.数据分析: + frm = new FrmCpkCount(); + break; + case FormNames.数据追溯: + frm = new FrmHistory(); + break; + case FormNames.参数设置: + frm = new FrmRecipe(); + break; + case FormNames.系统设置: + frm = new FrmSystemSet(CommonMethods.deviceConfigPath); + break; + case FormNames.用户管理: + frm = new FrmUserManage(); + break; + default: break; + } + + if (frm != null) + { + //设置非顶层窗体 + frm.TopLevel = false; + //去除边框 + frm.FormBorderStyle = FormBorderStyle.None; + //填充 + frm.Dock = DockStyle.Fill; + //设置父容器为容器控件 + frm.Parent = mainPanel; + System.Diagnostics.Debug.WriteLine($"frm.Text:{frm.Text}, frm.Size: {frm.Size}, mainPanel.ClientSize:{mainPanel.ClientSize}"); + // 强制同步尺寸 + frm.Size = mainPanel.ClientSize; + frm.Location = new Point(0, 0); + + //置前 + frm.BringToFront(); + frm.Show(); + + //// 强制刷新布局 + mainPanel.PerformLayout(); + frm.PerformLayout(); + } + } + } + + + /// + /// 设置标题内容 + /// + /// 标题控件 + /// 窗体枚举名称 + private void SetTitle(System.Windows.Forms.Label label, FormNames formNames) + { + label.Text = formNames.ToString(); + } + + /// + /// 设置导航按钮选中 + /// + /// 导航按钮的容器 + /// 导航按钮 + private void SetNaviButtonSelected(System.Windows.Forms.Panel topPanel, NaviButton2 naviButton) + { + foreach (var item in topPanel.Controls.OfType()) + { + item.IsSelected = false; + } + naviButton.IsSelected = true; + } + #endregion + + /// + /// 获取鼠标光标的当前位置 + /// + /// + /// + [DllImport("user32.dll")] + public static extern bool GetCursorPos(out Point pt); + + /// + /// 刷卡用户登录超时检查 + /// + /// + private void UserTimeOut(int secTime) + { + Task task = Task.Run(() => + { + for (int i = 0; i < secTime; i++) + { + GetCursorPos(out Point sourcePoint); + System.Threading.Thread.Sleep(1000); + GetCursorPos(out Point currentPoint); + if (sourcePoint.X != currentPoint.X | sourcePoint.Y == currentPoint.Y) + { + i = 0; + } + if (CommonMethods.LoginOut) + { + break; + } + } + LoginLocalOut(); + }); + } + private void LoginLocalOut() + { + CommonMethods.AddOPLog(false, "退出成功".Translated() + "," + "退出用户".Translated() + $":{CommonMethods.currentAdmin?.LoginName}," + "权限".Translated() + $":{CommonMethods.currentAdmin?.LoginLevel}"); + LogHelper.Instance.WriteLog("用户".Translated() + $":{CommonMethods.currentAdmin?.LoginName} - " + "退出".Translated()); + CommonMethods.LoginOut = true; + } + + + /// + /// 切换监控状态 + /// + /// + /// + private async void btToggleMonitor_Click(object sender, EventArgs e) + { + AntdUI.Button btn = sender as AntdUI.Button; + + if (btn.Text == "START") + { + // 执行开始监控的逻辑 + if (!CommonMethods.IsLoginOk) + { + new FrmMsgBoxOutWithAck(2, "当前未登录,请登录".Translated(), "未登录".Translated()).Show(); + return; + } + //if (CommonMethods.sysConfig.MesModeSwitching && !CommonMethods.mesConfig.IsLoginMesOK) + //{ + // new FrmMsgBoxOutWithAck(2, "当前为MES模式,请登录!".Translated(), "MES未登录".Translated()).ShowDialog(); + // FrmLoginMes frmLoginMes = new FrmLoginMes(); + // if (frmLoginMes.ShowDialog() != DialogResult.OK) { return; } + //} + if (CommonMethods.mesConfig.ModelName == "") + { + new FrmMsgBoxOutWithAck(2, "产品型号不能为空".Translated(), "型号选择".Translated()).Show(); + return; + } + if (txtMaterialCode.Text.Trim() == "") + { + new FrmMsgBoxOutWithAck(2, "物料编码不能为空".Translated(), "型号选择".Translated()).Show(); + return; + } + CommonMethods.mesConfig.MaterialCode = txtMaterialCode.Text.Trim(); + + #region MES下发参数 + //if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.IsMesParam) + //{ + // var (res, mesg) = await GetMesParaDataAsync(); + // if (!res) + // { + // new FrmMsgBoxOutWithAck(2, mesg, "提示").Show(); + // return; + // } + // CommonMethods.AddDataMonitorLog(1, "MES参数设置成功".Translated()); + // LogHelper.Instance.WriteLog("MES参数设置成功"); + //} + #endregion + + CommonMethods.AddDataMonitorLog(0, "启动开始监控".Translated()); + btn.Text = "连接PLC".Translated(); + bool IsLink = await ControlCenter.Instance.ConnectAllPlcsAsync(); + + if (IsLink) + { + CommonMethods.IsRun = true; + btn.Text = "STOP"; + btn.DefaultBack = Color.Red; // 按钮背景变为红色 + btn.IconSvg = Properties.Resources.StopPLC; + SetProductModelEnable(true); + } + else + { + btn.Text = "START"; + btn.DefaultBack = Color.FromArgb(18, 184, 61); // 按钮背景恢复绿色 + btn.IconSvg = Properties.Resources.StartPLC; + CommonMethods.AddDataMonitorLog(2, "启动开始监控失败".Translated()); + new FrmMsgBoxOutWithAck(2, "连接PLC失败,请检查PLC连接配置,网络".Translated(), "连接PLC".Translated()).Show(); + } + } + else if (btn.Text == "STOP") + { + // 执行停止监控的逻辑 + if (CommonMethods.IsRun) + { + SetProductModelEnable(false); + CommonMethods.IsRun = false; + CommonMethods.Statues = new List { false, false, false, false }; + ControlCenter.Instance.DisconnectAllPlcs(); + CommonMethods.AddDataMonitorLog(0, "停止与PLC连接".Translated()); + CommonMethods.AddOPLog(false, "停止与PLC连接".Translated()); + + btn.Text = "START"; + btn.DefaultBack = Color.FromArgb(18, 184, 61); // 按钮背景恢复绿色 + btn.IconSvg = Properties.Resources.StartPLC; + } + } + } + + + /// + /// 设置产品型号和工单是否只读 + /// + /// + public void SetProductModelEnable(bool b) + { + cmbModelType.Enabled = !b; + } + + + #region 获取参数 + /// + /// 从数据库获取产品型号并绑定到下拉框中 + /// + /// + bool IsModelInit = false; + public void SetCombOrg() + { + try + { + txtMaterialCode.Text = ""; + CommonMethods.mesConfig.MaterialCode = ""; + var productList = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetProdTypeSql()); + if (!IsModelInit) + { + //DropDownListPlusItemCollection list = new DropDownListPlusItemCollection(); + CommonMethods.DropDownItemList.Clear(); + for (int i = 0; i < productList.Count; i++) + { + CommonMethods.DropDownItemList.Add(new DropDownListPlusItem() { Text = productList[i].ModelName, Tag = productList[i].MaterialCode }); + } + this.cmbModelType.BindItemsSource(CommonMethods.DropDownItemList); + IsModelInit = true; + } + + if (productList != null && productList.Count > 0) + { + CommonMethods.mesConfig.ModelName = ""; + CommonMethods.mesConfig.MaterialCode = ""; + DropDownListPlusItem gg = cmbModelType.SelectedItem; + if (gg != null) + { + CommonMethods.mesConfig.ModelName = gg.Text.ToString(); + CommonMethods.mesConfig.MaterialCode = gg.Tag.ToString(); + txtMaterialCode.Text = CommonMethods.mesConfig.MaterialCode; + } + } + } + + catch (Exception ex) + { + //LogHelper.Instance.WriteEx("获取数据库型号异常", ex); + MessageBox.Show($"获取数据库型号异常:{ex}"); + } + } + + private void cmbModelType_SelectedItemsChanged(object sender, EventArgs e) + { + if (IsNoOrg && CommonMethods.IsLoginOk) + { + btToggleMonitor.Enabled = true; + IsSetParam = false; + SetCombOrg(); + GetLocalParaData(); + } + else + { + this.cmbModelType.BindItemsSource(null); + IsModelInit = false; + SetCombOrg(); + new FrmMsgBoxOutWithAck(2, "当前未登录,请先登录再操作!", "提示").ShowDialog(); + } + } + + + public void GetLocalParaData() + { + if (string.IsNullOrEmpty(CommonMethods.mesConfig.ModelName)) + { + new FrmMsgBoxOutWithAck(2, "产品型号不能为空!", "型号选择").Show(); + return; + } + try + { + var list = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetParamSql(CommonMethods.mesConfig.ModelName)); + if (list != null && list.Count > 0) + { + CommonMethods.paramlists = list; + IsSetParam = false; + CommonMethods.ChangeParamData(); + //GetParam(); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteEX(ex); + } + } + + + /// + /// 刷新参数 + /// + //public void GetParam() + //{ + // try + // { + // if (!IsSetParam && CommonMethods.paramlists != null) + // { + // System.Windows.Forms.ListViewItem listItem = null; + // lVConfigRange.Items.Clear(); + // int j = 0; + // foreach (var ProductPara in CommonMethods.paramlists) //遍历list集合 + // { + // string strRemark = ProductPara.Remark; + // string strName = ProductPara.ParaName; + // listItem = new System.Windows.Forms.ListViewItem(CommonMethods.paramlists[j].Remark); + // listItem.SubItems.Add("0"); + // listItem.SubItems.Add("0"); + // listItem.SubItems.Add("0"); + // lVConfigRange.Items.Add(listItem); + // lVConfigRange.Items[j].SubItems[1].Text = ProductPara.ParaValueMin; + // lVConfigRange.Items[j].SubItems[2].Text = ProductPara.ParaValueMax; + // lVConfigRange.Items[j].SubItems[3].Text = ProductPara.Uint; + // switch (strName) + // { + // //case "intoShellPressure1SettingA07": //入壳压力1 + // // CommonMethods.parRange.PrePressure1Max = Convert.ToDecimal(ProductPara.ParaValueMax == "" ? "0" : ProductPara.ParaValueMax); + // // break; + // //case "intoShellPressure2SettingA07": //入壳压力2 + // // CommonMethods.parRange.PrePressure2Max = Convert.ToDecimal(ProductPara.ParaValueMax == "" ? "0" : ProductPara.ParaValueMax); + // // break; + // //case "intoShellPressure3SettingA07": //入壳压力3 + // // CommonMethods.parRange.PrePressure3Max = Convert.ToDecimal(ProductPara.ParaValueMax == "" ? "0" : ProductPara.ParaValueMax); + // // break; + // //default: + // // break; + + // } + // j++; + // } + // IsSetParam = true; + // } + // } + // catch (Exception ex) + // { + + // LogHelper.Instance.WriteEX("获取参数失败", ex); + // } + //} + + /// + /// 加载MES参数 + /// + public async Task<(bool Success, string msg)> GetMesParaDataAsync() + { + bool Success = false; // 操作结果 + string Message = ""; // 消息 + + try + { + bool isChangeParam = false; + var nowDate = DateTime.Now; + + string filePath = $@"{CommonMethods.strMesLogspath}\参数设定值请求\变更记录\{nowDate.Year}\{nowDate.Month}"; + string fileName = $@"{nowDate.Day}.csv"; + string fileTitle = "时间,机台,MES账户,更改参数名称,更改前参数值,更改后参数值"; + string fileContent = string.Empty; + + DataTable dt = new DataTable(); + dt.Columns.Add("MES账户"); + dt.Columns.Add("更改参数名称"); + dt.Columns.Add("更改前参数值"); + dt.Columns.Add("更改后参数值"); + + var (resultData, Mesage) = await CommonMethods.hbgMes.GetParamSetRequestAsync( + CommonMethods.mesConfig.DeviceParamChange, + CommonMethods.mesConfig.equipNum, + CommonMethods.mesConfig.siteCode, + CommonMethods.mesConfig.lineCode, + CommonMethods.mesConfig.MaterialCode, + CommonMethods.mesConfig.mesUserName); + + //var resultData = JsonConvert.DeserializeObject(Data); + if (!resultData.success) + { + // 获取参数未成功 + Message = "获取MES参数不成功!"; + return (Success, Message); + } + + List NewParamlists = CommonMethods.paramlists; + for (int i = 0; i < resultData.total; i++) + { + List rows = resultData.rows; + for (int j = 0; j < rows.Count; j++) + { + var tagList = rows[j].tagList; + for (int k = 0; k < NewParamlists.Count; k++) + { + for (int n = 0; n < rows[j].tagList.Count; n++) + { + if (NewParamlists[k].ParaName == tagList[n].tagCode) + { + string strMin = "0"; + if (String.IsNullOrEmpty(tagList[n].minValue.Trim()) || tagList[n].minValue.Trim() == "null") + strMin = "0"; + else + strMin = tagList[n].minValue.Trim(); + if (NewParamlists[k].ParaValueMin != strMin) + { + fileContent += $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss")},{CommonMethods.mesConfig.equipNum}," + + $"{CommonMethods.mesConfig.mesUserName},{tagList[n].tagDescription}最小值,{NewParamlists[k].ParaValueMin},{strMin}\n"; + dt.Rows.Add(CommonMethods.mesConfig.mesUserName, $"{tagList[n].tagDescription}最小值", NewParamlists[k].ParaValueMin, strMin); + NewParamlists[k].ParaValueMin = strMin; + isChangeParam = true; + } + string strMax = "0"; + if (String.IsNullOrEmpty(tagList[n].maxValue.Trim()) || tagList[n].maxValue.Trim() == "null") + strMax = "0"; + else + strMax = tagList[n].maxValue.Trim(); + if (NewParamlists[k].ParaValueMax != tagList[n].maxValue) + { + fileContent += $"{nowDate.ToString("yyyy-MM-dd HH:mm:ss")},{CommonMethods.mesConfig.equipNum}," + + $"{CommonMethods.mesConfig.mesUserName},{tagList[n].tagDescription}最大值,{NewParamlists[k].ParaValueMax},{strMax}\n"; + dt.Rows.Add(CommonMethods.mesConfig.mesUserName, $"{tagList[n].tagDescription}最大值", NewParamlists[k].ParaValueMax, strMax); + NewParamlists[k].ParaValueMax = strMax; + isChangeParam = true; + } + } + } + } + + if (isChangeParam) + { + CustomMessageBox customMessageBox = new CustomMessageBox(dt, $"当前MES下发参数与设备本地参数不一致,请确认是否使用MES下发参数"); + if (customMessageBox.ShowDialog() == DialogResult.OK) + { + // 写csv文件 + fileContent = fileContent.Substring(0, fileContent.Length - 1); + CSVHelper.WriterCSV(filePath, fileName, fileTitle, fileContent); + CommonMethods.paramlists = NewParamlists; + int res = CommonMethods.db.Delete(it => it.ModelName == CommonMethods.paramlists[0].ModelName); + if (res > 0) + { + CommonMethods.db.AddReturnBool(CommonMethods.paramlists); + } + Message = "变更成功并保存"; + Success = true; + } + else + { + Message = "取消变更,采用本地参数配置"; + } + LogHelper.Instance.WriteLog(Message); + } + } + } + + Success = true; // 操作成功 + Message = "参数获取成功"; + } + catch (Exception ex) + { + Message = "获取参数失败:" + ex.Message; + LogHelper.Instance.WriteEX("获取参数失败", ex); + } + + return (Success, Message); + } + + #endregion + + private void InitializeLanguageSwitch() + { + SwitchLanguage.Items.Clear(); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.中国国旗, "中文")); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.美国国旗, "English")); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.匈牙利国旗, "Hungary")); + SwitchLanguage.Items.Add(new SelectItem(Properties.Resources.马来西亚国旗, "Malaysia")); + } + + /// + /// 切换语言 + /// + /// + /// + private void SwitchLanguage_SelectedValueChanged(object sender, ObjectNEventArgs e) + { + if (e.Value is SelectItem selectedItem) + { + string selectedLanguage = selectedItem.Text; + string languageCode = selectedLanguage switch + { + "中文" => "zh", + "English" => "en", + "Hungary" => "hu", + "Malaysia" => "ms", + _ => "zh" + }; + LanguageManager.ChangeLanguage(languageCode); + + DgvColumnsClear(); + //DgvShiftItemsChange(); + } + } + + /// + /// 清除dgv内容 + /// + public void DgvColumnsClear() + { + //清除 + if (FrmHistory._Form != null) + { + // 进出站 + if (FrmHistory._Form.dgv_Main.Columns != null) + { + if (FrmHistory._Form.dgv_Main.Columns.Count > 0) + { + FrmHistory._Form.dgv_Main.Columns.Clear(); + } + } + if (FrmHistory._Form.dgv_Main.Rows != null) + { + if (FrmHistory._Form.dgv_Main.Rows.Count > 0) + { + FrmHistory._Form.dgv_Main.Rows.Clear(); + } + } + // 班次 + if (FrmHistory._Form.dgvClass.Columns != null) + { + if (FrmHistory._Form.dgvClass.Columns.Count > 0) + { + FrmHistory._Form.dgvClass.Columns.Clear(); + } + } + if (FrmHistory._Form.dgvClass.Rows != null) + { + if (FrmHistory._Form.dgvClass.Rows.Count > 0) + { + FrmHistory._Form.dgvClass.Rows.Clear(); + } + } + // 日 + if (FrmHistory._Form.dgvDays.Columns != null) + { + if (FrmHistory._Form.dgvDays.Columns.Count > 0) + { + FrmHistory._Form.dgvDays.Columns.Clear(); + } + } + if (FrmHistory._Form.dgvDays.Rows != null) + { + if (FrmHistory._Form.dgvDays.Rows.Count > 0) + { + FrmHistory._Form.dgvDays.Rows.Clear(); + } + } + // 月 + if (FrmHistory._Form.dgvMonth.Columns != null) + { + if (FrmHistory._Form.dgvMonth.Columns.Count > 0) + { + FrmHistory._Form.dgvMonth.Columns.Clear(); + } + } + if (FrmHistory._Form.dgvMonth.Rows != null) + { + if (FrmHistory._Form.dgvMonth.Rows.Count > 0) + { + FrmHistory._Form.dgvMonth.Rows.Clear(); + } + } + // 周 + if (FrmHistory._Form.dgvWeek.Columns != null) + { + if (FrmHistory._Form.dgvWeek.Columns.Count > 0) + { + FrmHistory._Form.dgvWeek.Columns.Clear(); + } + } + if (FrmHistory._Form.dgvWeek.Rows != null) + { + if (FrmHistory._Form.dgvWeek.Rows.Count > 0) + { + FrmHistory._Form.dgvWeek.Rows.Clear(); + } + } + // 报警信息 + if (FrmHistory._Form.dgv_AlarmData.Columns != null) + { + if (FrmHistory._Form.dgv_AlarmData.Columns.Count > 0) + { + FrmHistory._Form.dgv_AlarmData.Columns.Clear(); + } + } + if (FrmHistory._Form.dgv_AlarmData.Rows != null) + { + if (FrmHistory._Form.dgv_AlarmData.Rows.Count > 0) + { + FrmHistory._Form.dgv_AlarmData.Rows.Clear(); + } + } + } + } + + /// + /// 下拉框语言切换 + /// + public void DgvShiftItemsChange() + { + if (FrmHistory._Form != null) + { + FrmHistory._Form.cmb_SelectType.Items.Clear(); + FrmHistory._Form.cmb_SelectType.Items.AddRange(new string[] { "包装箱进站".Translated(), /*"箱唛标签打印".Translated(),*/ "包装箱出站".Translated(), /*"栈板标签打印".Translated(),*/ "箱唛信息".Translated(), "栈板信息".Translated(), "箱唛码与栈板码绑定关系".Translated() }); + FrmHistory._Form.cmb_SelectType.SelectedIndex = 0; + + FrmHistory._Form.cmbClass.Items.Clear(); + FrmHistory._Form.cmbClass.Items.AddRange(new string[] { "白班".Translated(), "夜班".Translated() }); + FrmHistory._Form.cmbClass.SelectedIndex = 0; + + //FrmHistory._Form.cmbYears.Items.Clear(); + //FrmHistory._Form.cmbYears.Items.AddRange(new string[] { "白班".Translated(), "夜班".Translated() }); + //FrmHistory._Form.cmbYears.SelectedIndex = 0; + + FrmHistory._Form.cmb_AlarmType.Items.Clear(); + FrmHistory._Form.cmb_AlarmType.Items.AddRange(new string[] { "全天".Translated(), "白班".Translated(), "夜班".Translated() }); + FrmHistory._Form.cmb_AlarmType.SelectedIndex = 0; + } + } + + private void ToolStripMenuItem_Click(object sender, EventArgs e) + { + FrmLogin frmLogin = new FrmLogin(); + if (frmLogin.ShowDialog() == DialogResult.OK) + { + + CommonMethods.sysConfig.SwipeCardMode = false; + IniConfigHelper.WriteIniData("配置信息", "开启刷卡模式", CommonMethods.sysConfig.SwipeCardMode.ToString()); + lbl_LoginLevel.Text = CommonMethods.currentAdmin?.LoginLevel; + lbl_LoginName.Text = CommonMethods.currentAdmin?.LoginName; + lbl_LoginName.Visible = true; + //登录日志 + CommonMethods.AddOPLog(false, $"登录成功,登录用户:{CommonMethods.currentAdmin?.LoginName},权限:{CommonMethods.currentAdmin?.LoginLevel}"); + } + } + + private void cmbModelType_Enter(object sender, EventArgs e) + { + if (cmbModelType.SelectedItem != null) + { + int index = CommonMethods.DropDownItemList.IndexOf(cmbModelType.SelectedItem); + if (index == -1) + cmbModelType.SelectedItem = null; + } + } + } + + #region 枚举定义 + public enum FormNames + { + 集中监控, + 数据监控, + 数据分析, + 日志报警, + 临界窗体, + 数据追溯, + 参数设置, + 系统设置, + 用户管理 + } + #endregion + + #region 消息筛选器 + internal class MessageFilter : IMessageFilter + { + //0x0200:鼠标移动 + //0x0202:鼠标左键UP + //0x201:鼠标左键Down + //0x0203:鼠标左键双击 + //0x0205:鼠标右键UP + //0x0204:鼠标右键Down + //0x020a:鼠标滚轮 + //0x100:键盘按下 + public bool PreFilterMessage(ref System.Windows.Forms.Message m) + { + //throw new NotImplementedException(); + if (m.Msg == 0x0200 || m.Msg == 0x0202 || m.Msg == 0x201 || m.Msg == 0x0203 || m.Msg == 0x0205 || m.Msg == 0x204 || m.Msg == 0x20a || m.Msg == 0x100) + { + CommonMethods.tickCount = 0; + CommonMethods.tickHomeCount = 0; + } + return false; + } + } + #endregion +} diff --git a/LargeSquareOne/FrmMain.resx b/LargeSquareOne/FrmMain.resx new file mode 100644 index 0000000..dbfa2b7 --- /dev/null +++ b/LargeSquareOne/FrmMain.resx @@ -0,0 +1,2943 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + ewGg1MyM1QAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAALQAAAA7CAYAAADSK6A/AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAA + SMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEo + qGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAG + eIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK + 7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gz + SZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25q + bc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9Cvjc + M4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4 + oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjK + uLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqx + OPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIW + iAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFV + SAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAy + rA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYg + hUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2 + aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7r + h2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/ + Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SE + dJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3J + aSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQt + lHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJ + y5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV + 9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1 + JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7 + m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hop + b2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsy + u21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj + 9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCc + cNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527P + YS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT + 4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOw + EaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6s + faznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP + 8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy + +rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVs + S1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7 + SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9Uxlfe + qXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/w + jowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9V + t1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO + 6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503r + m10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9 + qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h + ++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7 + Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAlQElEQVR4Xu2deVgT9/b/+d5b + a10QESOIiCwK2EVBUBCQXdYAySQB3MW6I7TW29pqbd2JKIIosi8hewIB17a2tbauVVzInkwAwX2vW7XK + 8nvOJEPjEKvcK956f8zzvJ7+M9XknHfOnPP+fOajmZmJi4Qw/yPC9l81C91/1Sxk3zWzoP3XzQL33zAL + 2HfTzH/fLTPffbfNfPfdMfPZ+5vZhL13zcbvvW/mufeBmceeh/D//p8R/zDwz78R+Gfq+Jzv7n5q1hXe + 2/PktUD8e7vK6N0tpvJBjMd/E2IuMO2ZvIgC7SqYmPdfMwvuEPMNM/99N838DGKeuPc3M28jMY/7U8wd + QRudVr1y9Ec10tEf1aB/I2pHf1T9iVFA/w8SbwxRGH9XiJ8bcNujhyhi1xSx3ei06nUm4vHfJMstTTLe + OBegPZMXUaBdBRdzkEHMk4hi3gdivmfmufe+KTH3ckuTpI6cU4oOGJeImo+l/W2w8JqKui2pRJ3msS2+ + +e5AwuHDh9uPHDna/tNPP4lBCD/88AP9yJEj7cePH39jOXbsePvhw0faDxz4YQ0JYb7lkiIa5ZZWvcE2 + 9utO8fhvYh3+L0zU8Bm7XdCYmPfdMAvsEPMtM9+9t80m7tNX5gl775l5gZj3PoD7jcX8tltqVZLLIj46 + cMIM1GLCjNODaevYg5G1LCvqGpYVZXUZMIiy5k/iV5f+xxj+LCuAuqbcirqWZYWsY1nB301fzxkUsWwf + BHFY/FrULU2yPLtMMvzMmbPXL1y82H7hwsVrZ8+eJR0+fHhIXV3d9cuXL7ffvHnzjeTGjZvt165db9ei + utVQWFxSRGOgGg6N+RITkeXkj/da4bmgrmENRtawBmP/XVtBQtaySchazhDaWq41fR3fhrFeMDRhg8g2 + aUOlbdLGKrup6TV2U9N3209n7h0xY9M3DjMzvnOctfl7p+TNB53nbDnk/GHm4VFztx4bNS/rhMv8rJMu + C7bVui7KOeu6KOec2+LtUreU7bKRH2Yosc/hMxt1WyJGXZeIfUEzBu1gTxWilrGLKNCuErTveoeYoW+G + 6jyxo2/WixlaDaNHGyZmlxSRr1uqBLWatAA190hQ2a078pmzuGWGo7BligOvNcGB18qw57YixgzntlFf + Cbw2xJ7XRhvBb01wFLYlOYnapjlXts0cWdWWPCjy010Wnkmoa4oIdZhT4vjNgR8ldVJpu05X3y6Vyhmu + u9rMzp49K25ubm5vampqv3DhwhtHc/OF9qam5nalSo2LeQIm5qgvMDFbxX3FcRI9neEkbJnqxH+aNJL/ + ZMpI3pMkF/7jqa78R9NHC36f+Z7gYfIHgvtz3QV3F3oIf1vsKbrz0QTRrWU+4puf+4mvr/KvvLY2sPIK + M7jycmZI1aWcsKqL+eFVF0ojqprZkZJmYVR1kySqpmlPdE3TdzG7mg5G72n6JXpv87Hofc0no/c11zpM + +Vo9wIOBOs8pQV2XVKaSEKY5CWG+Y1yliVrGLqJAu8rzh8A/xWw0BGJiHpFcQnJLk+RYh38KAdQOTeFs + cBK0THHgtzBGsFsQu4rWONvyVrJteWvM0LLW6KGlrVE2pW2Rr4Sytqih5W3Rtqw28rCKtlg7ThsFxO0g + bEsall6bZj6WroFHrkuKeCMJYdqSEKYlCWH2IyHM3oZgEgeWNxH4Hr1AIC4pooDRadWoTcRnejFT1pQ5 + ClqSHPgtCQ6cpzRH9hPEkfUH4lzxmDay4hHdpeJhwuiKB0nvse9NH8P5bZY7585cT+6theO5N5b48K4v + 9eNfXT6Jf+XLQMGlNcGCi+mhwguZk4XN2yNETQWR4vNlUeJGbnRlozimqnEXWdK4n1zd+D255vwh8u7z + R2P2NJ2I3ttU676KJ4fPYodsBDFvNuRhIAlh9jF87u4TNHEI/AtHAz4EfJg+bmmSDXbUDVgASQnMIifB + 0ykO3BbacFZLnG1pa7R1cWs4qbA1jFTYGjo4vzXEKq8t6JWR3xY8uLAtlFTUFmZd0hYO4gZhQ9W2jPhU + MMAjAXVdJCAOJf+7pFWj1pOX6cWMrC+AJ6MDpwUZUfGUYl/2JNa+9A/yiJLHZKeS32OdSx7Eu5bcQ0aX + 3qV/UHYnaWz5renjym/OnsC6Ps+n4upiP/bljydxLn0WxLmwMoTbvDaM18QM553fGslv3BElaCiKEdaz + yMJ6fqyovipWXL8ntrL+u1hJw8HY6oZfyLsaj5P3nD8VVHKizsJrCkoKTsU+39CkbHcSwhxmKCx9u13Q + XRgCoSr0cUuVrHScvgM1d6ejluGfVDvxnkyBANqVt5BtilsjQMCDdrYGDdrRFmC5vW3SgJx231eMn8X2 + dn/L3LYAEDiI27q0LWLI2rMzzd3pauJA8v8LVoxN27Giwm6JH172lGxX8iTarvCPSPvCR5Ej8n+PdCx4 + ED2y4B7ZtfBu3HtFt5GxJTcTx5XemDa+7Npsn/Ir8/xYlxYHsC4uDa5oXh7KbloVzmlcF8lp2BTFrc+O + 4el2knloSSwf5cQJUFG8EK2JF6H74yt1P8RJ6g/F1jQci93VeDJaoj1jPXmxZuD46ajLIgHqNK9iEQlh + uhkJGip097YcLzkEwod4xy21avHIueUo9KgW/nN/dii5ORMTM6uFbF3UGm6V1xoEIrbIbvU13/rEp0/m + kwl9trxiMp9M6Lf1qXf/7NaJIG4Q9uDCtpBBc3kpA6NW5g+MXllgSV5VZBn7VfGguK9LOg2V/0vEfVUy + KPar4sGz8tfZV7RQIA92pU9jhhU/iRiW/0f4sLzHk4fnPpw8IvduuFPu7YhRO29Gj867HvdBwTXEo/BK + olfRpek+JReTfUub5weUnV8SXN64LJTV8EV4hW51ZAW6MYqNZsZwtDtiuZqieK6aFc/T8Cl8TRVFoN1D + EWkPUCrRn+KqdEfiahpOxO5qrHX5cDM2CDrO2ImOXMjfSkKYXiSE6UJCmENJCNPC0ENDy9R9Lsfz+maC + o9HbdUkl1XWxAJtaB4yffsZ+i3whVAQIok1RS/jgnS1BA3Pa/EDI/TY/ntB70+9eb6c/9OwO4M9+J+Ox + F4jbPLvNd+CO9klQrbE2pLQtYmh5W4xtRRvZjt0WDz12p6HyTYfTimHHbo0fVtEaOwzmldKWKJvip+FD + C55Mts37I8w291HIsO13g+1zboc4br8RNnL71fDRO67EvL/zUpx73gWaV0FTkk9h00y/osa5ASX1i4NL + dR+HlqGfhZdrV0WyNOuiK9QZ5ArVtji2Kj+eoyqjcFVcCk8lpvI1u6lCzbcUkfYgpRI9HC/RHY+rqa/1 + Sd8lBTHbxn6FjlokKCchzEASwhxLQpiOJIRJIiHM/gSXgyhl/UUUaFcx1TcTHY1RiwQe4GgMDkoBR0Np + +/m3yx14LXRjMVtkt/n2y/zDu8+m3716p9/3/Mf6u+7/WP9bN3HXvVf6g3Eg7D6b/xjfb2uLD7Qjxm3I + kOK2cOixQeCdBss3GP2A3RppU9IaAcCT0aaoZbJ1wdNQm7ynIdbbnwQN3f4wyHbb3SC7bTeDHLZdC3He + dinMJedCxHs7mshjdjZRPPMaE7wL6qf5FupmTypG5weXaFNDSzXLwsvUKyLLVWuiWUommaXMiqtQ5FLY + imIKR8GmcpUihKeqQfjq/VSh5geKWPszpQo9Fl9dfzKcdfqspc90LTheoJNh03ZMISHMCUbtBj4Qdr8P + jbUapvtmEHMvm4RMc7dUySYbvSWktZ5btMmB18Kwr2iJH1rcEknKawmGyqwX80OvXun3xoHo/m/dnbFm + a26P6Q7gz4a/458b73tAxTau1tCGDMxtn2S5sy1wEHGgfMMZnNcajAPtHRQSUl5L0ODcliDS9ieBpG2P + AoZsux8wNPtOgF32jaARWVeC9GJuDn93+/noMTsa4zx31tMm5OmSfAvQmZMKtXODijWLw0rUS8NLVZ9H + lim/jilXbiSzFJkg5vgKeRGVLWchHIUA4SolCF+1lyrQHKCKNIcolejReInu11gJWmsXu0wNbeio+Wzo + m2GRBzzn90kI056EMK2IwyCuPZMXUaBdxbjVIPTNHY7GcPombPAYTF1b7sh/mmjPbqHYlrREDclrCRmY + 0+aP9csdlbl7xYxDFHXvTY+waq3vsVt8QNzm2e0YJgbLNw4oGs+wrdXPMqfFf1DOE/9B2x75Dc5+6D8k + 656/TdbtScOybwQOz7oS5JR9KXQUiDnnfNSYHY2x43Y2ICDmiQXoDP9C7YdBRZrFocXqjyeXqpZHlilX + RZcr1pNZii1xLPn2+Ap5IYUtL6dyFHyEq6hC+Ko9iEB9gCrUHKJWajExx9fU1767OAfrm0ckZUHfXPAy + rQaOyYso0K7yZ3XuNAT2cUutWuE0M1/vaISm7XPiPUkawW6h2pa1RA/JbwmFAdB869OJfTMejcfbDBDa + 6xI0Lmr4e/8U9u9eIG6saoPAAeJg+YbRb8sf3jj9Mx/79N/yyHtA5iMfi8yHPhZb7vsMyrzra7Xljq/1 + 1lt+NpnX/O22Xgl0yL4YPHLbhcmjc85HfrDjPNljZwMyPk+XiIs5sEizKKRY/dHkUtVnejEr15HLFRlx + LPm2+ApFvkHMPEzMPCWI+TuqUPMTRaw9QqlCT8RX19dOWC2SgZiHRq+AvplNQpihhkFwFAlh2hAGwWeq + M2DyIgq0q+DV2YSjMQ8eIRaeU1AL3+RjDoVXk0dwniLDylpibApbJlvltgYOyG7xBTG/k/7A63WK2Rii + sHFxQ49tDHGwfJOA+AJ9mMA9r34Z97z6Z9wdPyDjtwkWGbe9LTNu+AzefN3Xess1P9vMK5NGZF0Kcs6+ + EOaW0xTx/vbzZPfcBopXXn2CTz46za8QTQ4s0iwIKVanTS5RfRpRqvoyqgwT86ZYljw7vkKeR2HLS6kc + BRfhKioRnmo3IlB/SxVqDlLF2sPxVejx+Or6U4HbD9ZZjEvA5irwwofPyJ9FQpjeL+qbjTF5EW/qKlCd + Ozsa4hjXFDE6aOIcdIDnlDp75tkU3NGwLmwJh54NrDlwM3Axv65W43ngwibSeaB8s3hrwx0P4O0Nd8bh + 9Em/5dWPecurf/oNL8uMa96DMq75WG++6ouJeevFIOes5lDXbU3h721vjMHEvLOe4Z2vm+pXgM4OKNLO + DylWp4aVqJdFlKpWRJUp18SUK5ixLHlWfIV8J4UtL6ay5WyEqxAhPOUuhK/+BoZAqsh4CDxzzsp3lhYc + L9hi4Phh+QoSwvQj9M2wOgtta6dWA8fkRbzp3+AZR2PkQt5o+MWRgtNQc3eGeti/dn/pxHuaYM96Gm9T + 3BJOym8Jhv4NHn19Mx6MhyEQAv7P9bfd/7H21tgeXi1vrb3ljvP2+pse72y4Ma7/xutewEDm1QmDmFe9 + h2y+4mu75bK/sZhhCBy7ozHec2c93TtfN8WvAJ0VUKSdF1ysSQkrUX8SXqr6IqpMuTqmXJkey1JsxRwN + /RBYgXAUQoSrrEb46n1UoeZ7qkgLQ+Cx+GrdyRiR+szQiFQNNgTOY6HO8zmZJvpm2LcBWw1wMb92QWOO + Bkyj4GjYkldhQ6B1cm4WbGpxqHhCHVb6NBqsIasdLQEDsh5P7JvxcHzv9LueUDF6rb/tYRz4Hl4dIGJc + yH033PAEIZtvvIaJ2WrTFR9jMTtlXQjBxdxFR2OHKUcDGwKNHI34al2t45Sv1TBT6RdPeIUkhBlMQpie + JIQ5ktA3P7fVwDF5EW/qIkRHY519Yqbe0YhbxXcR/DHdkf0Hzb7sCdm24Ek4acfTIMvsx74wiEAPB4++ + PhtvekKwe3j1gIBxERsLGaoyadPViTabL/sO23LpmTbjuWI25WiUKzbrHQ1FwYscDVg8eT9tpwK0MZyW + jo5axGeREOZkEsKEjfuuL9s3G2PyIt7UBYiOxnLn2YUobPmzDE753o17L3kU51GSI+sxZXjR4yhYfQKf + 02rrfV/LzXd8zJm3xkMPh2EIeA+vDhAvYJF+bTxgLGSoykM3X/Ybnnkp4K/E/Hx7rpOjUfYcR+Mw7mh4 + r6+SQWW2iVwOjgbfmr6ZTEKYPiSEOZqEMIeTEOYgI7/5uX2zMSYv4k0vifEQ+I5ralWyy0IuauE1DR3o + M+uUa2FTymje7zNGsX6nO5b8Hmdf8CjCNvdhyNBtdwOHZN72g6kahhEAAt3DqwfEC0BbgYk444ovLmS8 + KjtmXQgemd2MuRkwABp65mfEbGzP/YWjwaFylWIjR+NHqlj7CwVzNHSngnJ/rhvolYQODliErQQOn1mw + wGjxZAQJYQ424Te/NkEbD4G9XVLEk+FVpUF+c9EBnkkKl4yTK97nP5gzmvNgqkvZfWRk0X2yQ96DcLuc + 34KHZd0MtN5y3Q/sIZiqIcA9dB/QUoCAoUcGEeMVGYTsnN0c6gJVOed8FG7NmRDzQiN7bmVUmXJtjF7M + phwNWNbu5GhEsM+dHTxpjtbSexYKe3kc55Z/RUKYASSEOeY5Q+ALWw0ckxfxphfwjKPhPJ/tCHtWh4Qu + hcUTrdPy6q1jhXcXfsC5O/s91t0k15K7yKj8u2TYqeWQcyPUPvtaEKxA2W29HAAB7qF7AOEC9lsvBgIg + YgfD0IcLGaqyocWI9chtoOJuBvTMRpU5LaxE/S+DmA32nEK/R+NFjoZE9ytZrD5jG/2xGt4XhV2WzvM5 + 8F5gEAlhepAQpjMJYVqTEOaAlx0CiZi8iDe9gGcdjTRJ+rC41dgQOPzD7RWeojsfu/PvLBzLvjP7/bI7 + Se8W3UFc82+QXXKvR47MuRwO+wKcsi+GQmChSvTw6oHY4kBvDAKGtgJEDH0yrPyBkGH1D6/KsAIIPvNz + xGzwmg32HEv+l46G8bK28/R1KtCGw7Qd4GgUkRBmiNGWUHgLBRyNlx4CiZi8iDf9BYQhULJ6xJRsTMw2 + 1FXfeItvLR8vuPWRJ+fW/HHlN2eNLbk5ZUzhNdr7eVfi3t15iTx6R3O0W05zJAS1h+4HKjCACxgXMVRk + EDLsy4AFE2gxfPLR6bBogrsZWM+sbzNAzJjXjNlzRmI25WhQKtEj8RLdCXA0xi4rwhwNO+p6GAIrSAgz + nLCDDt+w32nT0cti8iLe9ByIjsZSeHkRHiWksCXHfPiX1voIbyz35l3/eAL7+sLxZdeTPYuvTPMouJTg + nt+MwJbDD3LPx36wA4MMQN/Ww6sHjy8OCBiGPRAx7MeAigzL2AYhT8OrMqwAwqKJwc2AAdDQZnSIufOG + I4KjEV+lg2Xt2onM3VJwuwzHD6A2iVkICWFOJCHMdw2OxkutBL4IkxfxJhM862gsqZzqslB/9ICl7+w6 + 7xJllr/o2mo//tXPJ3KuLJ3IurLIp+zSXO/iCzPHFzRNhb2zwLi8BhpUBQAC20P3gccZxIsJeGc9A9oK + EDH0yVCRDUKeA6t/hhYDlrOX4tacfgA0KWZje87Y0YCVwFMh+UfqBk6Yqt/bvKQStZ9dlGJY1v7gP3E0 + TGHyIt5E4Jkh0GWxyN8ttQo7esDCM0ntmXW4JFB8ZVOA8PKaAN6lFZPYl5ZNKr+Y6lfavMCvuHHuxKKG + WT6F9TN8CnTTIJAABLWH7gePN/TGIGBwLkDE0FoYKjIm5OBi9RKoytAvG1YAQczr9G4G1jP/KWa2HMRc + ifCUuxG+6htEqP7R2NGI5ErPkALnaaDYuSzkoU5zWWsNjga+rD3E6DiCLjkapjB5EW8y4hkxO8wptYbH + BzxGwCAf85WkCs5bCBZd2hzMv7gumHNhFbwgGVh+fmlgacOSgBLdwknF6Dz/IvRD2KEFgTQwq4duB4/1 + bIg9CBj6Y2grwIoz9MmpBiEvg6psaDFWG1YAQcxZRj0zLmYxwoUNRyrcnvvT0ajS1trF/QtzNKAddV7A + zTFyNLq8rP0ymLyINxlh7GgYjh5Yjw2BLotyfwyrulgUJr6QGyZo3hrGa0oPY59fE1bRsDK0TPdZaBn6 + SXCJ9qPgYs0SCB5UAggkbDuEoPbQvUCcDWDiBaA/NhLxUkNFBiGviCxTfqWvysqNsJxtWDTBrTnWn2JW + 1ND4qv2IQP09QnA0RiUzMUcDjIKRC/klRnubcUej07J2zDfNRM11CZMX8SYDxCFwFVgvUJntE74+GS5p + 5oZXNpdGCJvyIvjnt0VwGzdHsOs3RLDQNfCS5OQy9eeTS9Wfwa8fdmaFlqiXQiABmKCNSOvhlWEc14/w + eEPsIQeGSvwZiBh2ykFrARuMjIRs3GLkUSqwRRMWlSOHAbCSxlXsQnjKTmIGR8PjszLsYJhhcWtgjwZs + 1AdHw3hvs7GjgfXNIObXJWhjMcNG/RT86AGbiDTpZAFaHVnVxI8SNbKihQ1F0bz63GiOLju6Qrs5iqVJ + jypXrYsqV66JLFN9BUGDRxkEEPozQzCXwyOuh+4Bj7Eh3hD3LyAHBgFDf7waBj5oLbChr1yRYRDyNkNV + LqRUyEuxFUCOnE/jyqtoXMVuEDNNoPoegQ1HRm+d+G3ZjzkaQ8KWYo6G7ZScRMOyNjgaxnubnxkCX5eg + jR0NOHqApj96YBZq5TdbHVJ+9kC05PyumMpGMVlYzyPzdeVkHloUy9HsJFeocsgs5dYYlnJzTLlyE/zq + o8uVG2AjC1QBCCLYQIaA9tD9QKwh5usgB5ALyAkMeyBicC9gCdtQkUHIBfqqLGMhbBkX4ciFNI5ezDSe + 4huaQPUDIlQfooo1R/Vi1tWGFZ84Zzlhmha2PYCjMSK5ZKmRo+HwnHcCO8Tc3YJ+ZggctVjohR09ELgY + tfBK0vrn/HQ0prrxALmqYW+sqL4GTsCJ42m5cVw1K46jKolnKwvjKhQ7YW8s/NqhD4NfPgQOXpyE3gwL + pD6gPXQvEGdgMxZ7TLyKLMgJ5AYXcXyFPB/6ZEqFvMQgZA7ClvFpHFkljSOrpnEVe2k8xbemxBwtkJ8d + EjRfAxvSMEdjXkU6YaM+OBr4snaHo2Es5v9Y0P90X/xcjIdA2yk5A9zSJJttIj/H+mavNZW15JrGn2Ml + 9T/GiXXfxQvRPRSBppoKB4dwlXxstxVbzoKdV/Arh8cWBAs2sABxFfJcmJghkD28VnZA7PE8GAQMLQUu + 4nIqW1aBVWS9kMU0jkxC58h207ny/XSe4gCNrzxIE6p/RkSao9RK7QmKRFcbJ0HP2FOX608HTS5CRy7g + 7jRs1B9HcDQ6DYFEiCLtCp1ETBBzxxDomlo1fzidiTka76bmysi7G4/H1jQchXPIKGL0B4pQ8y3CV++F + d8agx0I4chEEBGHLeAhbxoZfuyFYZdCPGUSOA8HsofvB412i74mxfABQidmGXPFpbJkQKjJdL+RddK5s + H50r/5bOk39P5yt/ognVhxGR5hhSqf2VIkFr42vqz7rNy9Q7GomZ4GjAKUe4owEb9Z/raJiCKNKu0EnI + JgQNvU7/0WnVe6z856MDx0/VRkm0Z2J3NZ6Kq64/Hl+FHqGItYfAUKfxVQdoPAV8+T0QCPhl0ziyKhpb + KoYgGQSOixwqADzOIJA9vB4g3gDEHhevABMw5Igjq9KLWFpD50ghh3sZXNm3DK7sAIMnP0jnKw/RBaoj + NJH6OFKpPUmp0ovZcyUH26MBr9kZjh4w5Wg8s1GfKOLXJWhsaRseFS6LRXOdZhVgFfqDT4oUsbsaT8dV + 15+CDdvQR8EjiM5XHoRfMRYEjvQbOke6Vx8Y6S5DkKrpIPA/qdSLHUcm6uFVYxRffR8MYPGHXOhzguVm + tyFXexkc6X4GR/otgyuFXP7I4MkP0fmKX+gC1VGaSH0CEWsg76cp1bqzk7K+k8PRA6SQNOzogWHTcmcY + HI33XsbRMAVRpF2hk5CJgu7r/y9r85AVsHlkuOuSSg7sc4YqHcGtOxdfU3+aUoWeQsSaEzSh+hidrzwM + X57Bkx1kcKU/JHClBxgc6XdYcPRB2mckchwIZA+vB+O4G4tXL2CO9ADkLIEr/YHBlR5M4MoOMXjyXxh8 + xVG6QHWMLlT9iog1tdQq7RlKte7c5NJfZYMmztQO8v0QhSMqHOaUfkZCmJMIG/XB0XjmbW2igIkQRdoV + OgnZWNC9xi0Z2tdj+pJ+nrNSB4Su9HCay5oJB8XAAeCjkpnq+Jr6cxQJehqp1NbSROpf4UvDl0/gyX5J + 4Ep/TuBKDyVw6w4mcKU/QpASuNLvDSLHAbHjgu+he8Fj3RF/g3ghJ5Af4CfIWSLkjic9nMCTHU3gy48x + BMpf6SIVFK5apEp7llKN1sUI5TKb8BQtOBrY+XPz2ZsMjgYcRu70so6GKYgi7QqdhIzzlmeqeW/3uQHm + Y+mnzd0Zx/v6fhI9mJI+dtRiQR70SgPc6WhI/i9y+KXCL5YmVtfShapTDIHi1wS+7HgiT3YsgSc9ksgF + 6n5J5Nb9nMitO6QXOQYE7ye94Ht4PeAx78jBIciJITeH9bmSHk3kSY8l8GTHE/jyXxkCxSm6UAUF6wxS + qTlHlaDSeAkqc0j4UgOOBhzrZuRowNEDxkd2vdQQSIQo0q7QScgdjEtx7D+WUWE5LkFnPpZW399zesaA + sC+D7GbkIXCyDfwyh8d/qqHU1EvhS9IqNefoItUZhlBZm8CX1ybyZCcTedJfE3nS44ncumNGHDUAQgcO + 9/BaweMOOejISxK37ngiT3pCnzPZSchhgkBxmiFUnqGL1OdolZo6TMw1Otl7KTnYv2pgz8jAHY3nHT3Q + sVGfKNq/gijSrtBZyHqs+7pPXQgfekNhlY6exqw3d6cr+vmmTRsUuy5g5EJeDn56qG/6LhWlGpUhVVop + TayuY4hU5xIEirOJfPnpRJ6sNoknrU3kSU8ZAJHjQseBIPbw+sDjjucCOAV50udKdjqRLzsDOWQIlVCk + oFhJEYlWRqnRyb3XiDAx6w9T5HMMjgZ+9ICdqaMHiIJ9EUSRdgWikIH+b7t/6G8+llbrP3U5evVhq+6U + 9rLOavyUhv7jpvDMw1aGD6FlBMNEC8PAkOAF2rgqjZIqQeW0So2MLlZLGUKlNEGgqEsUyM8l8mVnE3kY + Z4wAseNAEHt4PRjH3TgfwNlEvuxcokBelyBQYDmki1QyWqVGjki0Cmo1qgze8ZP62cMU8+YQzm02uVGf + KNgXQRRpVyCKGRgBrYaVVxL6s7wZvfywHb30oF33yRZOvflYen0/7wVpllGrw5znc9bD0U3wa/VYXqam + 1OiUiESrpFVpFAyxSs4QqmQJQoUMgpMokJsCBG8KCGoPrw5ifHGI+YAiJIWcMURKOUOkktMr1QrIKbUa + VUWxz6it/GZj/3yI4TDFlSYcjU5HDxDF+jIQRdoViGK27jt26gIQ6Zd5ErTxfjtGw712nfzaI51z2LwG + c4/Eg/0CltPgy7ikiHeD/2jpPR2N5knV1GpUjUi0KlqVRkUXq5UMkUrJECmVCUKlwgg5AVkPrw1i7Dvy + whBhYDmD3EEOIZeQ09hKtXpoRKqWcJgibNTHHQ2TRw8QhfqyEEXaFUy2Gj5Jy1HV7VZU81t7B+o77bqt + wkNQpRv6j09eOzDiq3DHD8uWwheEvR1u87ZoKbvqNQZRq2lVGjW9Uq2mi9VqhlilpotVKoaIgFil7OE1 + Q8yBPg+GHKmxnEHuIIfUGhSevBqnKau1hMMU8aMHwNHA/zWqf8vRMAVRpF2hU6sxyCsJ3X2mGZXdbu9E + 3c02nc+UL+rN3Rnn+k36JMkqfkPgqEWC0qHRK7Hz68KKj2swUdfoNEg1qkEkWg1NosEC1MPfHAkmYixn + 1GoUyyHkcszH+fozVp49TBGOHngljoYpiCLtCp1ajWXbq9HTN9pNUnu9Xcc9gtZbuDMa+o+bVmwxeVXE + 8Bn501wXC7FT+UfQV6Dxexq0lN31UK211BqdllqDYiA9/K3R5wnypcNyF7+7XuuzsRqrzB2HKTK2EA9T + 7HT0AFGc/w5EkXYFvNWYBK3G4AlT0I+yq9ClOdV/hc41KgVsPF1/3yXzLGPWho5cyM+FXzC2Ey8lB3X/ + tBR1/7REi+PRw98e43y5f1qCjllWiBofpmg/6+UOUySK89+BKNKu0NFqgBhfEmyhBXppc4+k3eYhK6Ks + GVtC3NIkqOXEZOK9PbzB/HmYImtVdzkapiCKtCuYveW1wOotrwUe/3RfPOaFeKSMfcsjxb2XV9r43t4f + +/bx/zjcInwF9FOezgu4G9xSJcc6/UPoPbyxuKVJTjov4IKjAWLuFkfDFESRdgWzXn7JA3v5JQf18kte + 1ssveWMvv+T0F8Ds5Zec0ct/zsreAQuoFlFfwDZB2PcKUy9YOdEkhAnHPMGLkUkkhDm1hzcG+NdaIWd0 + EsKMM6wCwvuA8AoVvHVi0tEY/VGN2auEKNKuAIJ+p5dfsm0vv+TRvfySP3gxc8a87T9nTO9J88f2DVni + Ykn+EiZdGBBA1PC6DfRZsFEFghFJQphRPbwxQL4gb2DLQVWGpy+83AqVGcTcydEgivFVQBRpVyAurLwQ + Q/MPXwbf/A+9FEy7IGz44iBs6LXgdByo2j28WUBRgooMRw6AzwxL2rAVFK/MHY4GUYivCqJIuwJU6C5j + JGrsnA7DtAuv2cAXB2FDEGB4AEDkPbw5QM7AxYA8Qr8MxQp65mfEbKCToP7bmLyINz0H/BUtEDVYN/CF + oVrDLxnEDYGAabiHNwuw42DHHLQXIGTYOQdFCxcz1mqY0MPfApMX8abngP9K8fYDFzZ8eRA3AMHo4c0C + zx3kEfJJFPLfVsyAyYt401+Af0Fc2Li4e/jfAM+pcZ6JGvhb8f8A12MmquCr03YAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAALQAAAA7CAYAAADSK6A/AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAA + SMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEo + qGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAG + eIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK + 7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gz + SZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25q + bc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9Cvjc + M4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4 + oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjK + uLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqx + OPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIW + iAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFV + SAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAy + rA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYg + hUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2 + aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7r + h2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/ + Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SE + dJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3J + aSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQt + lHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJ + y5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV + 9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1 + JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7 + m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hop + b2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsy + u21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj + 9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCc + cNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527P + YS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT + 4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOw + EaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6s + faznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP + 8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy + +rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVs + S1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7 + SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9Uxlfe + qXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/w + jowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9V + t1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO + 6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503r + m10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9 + qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h + ++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7 + Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAlQElEQVR4Xu2deVgT9/b/+d5b + a10QESOIiCwK2EVBUBCQXdYAySQB3MW6I7TW29pqbd2JKIIosi8hewIB17a2tbauVVzInkwAwX2vW7XK + 8nvOJEPjEKvcK956f8zzvJ7+M9XknHfOnPP+fOajmZmJi4Qw/yPC9l81C91/1Sxk3zWzoP3XzQL33zAL + 2HfTzH/fLTPffbfNfPfdMfPZ+5vZhL13zcbvvW/mufeBmceeh/D//p8R/zDwz78R+Gfq+Jzv7n5q1hXe + 2/PktUD8e7vK6N0tpvJBjMd/E2IuMO2ZvIgC7SqYmPdfMwvuEPMNM/99N838DGKeuPc3M28jMY/7U8wd + QRudVr1y9Ec10tEf1aB/I2pHf1T9iVFA/w8SbwxRGH9XiJ8bcNujhyhi1xSx3ei06nUm4vHfJMstTTLe + OBegPZMXUaBdBRdzkEHMk4hi3gdivmfmufe+KTH3ckuTpI6cU4oOGJeImo+l/W2w8JqKui2pRJ3msS2+ + +e5AwuHDh9uPHDna/tNPP4lBCD/88AP9yJEj7cePH39jOXbsePvhw0faDxz4YQ0JYb7lkiIa5ZZWvcE2 + 9utO8fhvYh3+L0zU8Bm7XdCYmPfdMAvsEPMtM9+9t80m7tNX5gl775l5gZj3PoD7jcX8tltqVZLLIj46 + cMIM1GLCjNODaevYg5G1LCvqGpYVZXUZMIiy5k/iV5f+xxj+LCuAuqbcirqWZYWsY1nB301fzxkUsWwf + BHFY/FrULU2yPLtMMvzMmbPXL1y82H7hwsVrZ8+eJR0+fHhIXV3d9cuXL7ffvHnzjeTGjZvt165db9ei + utVQWFxSRGOgGg6N+RITkeXkj/da4bmgrmENRtawBmP/XVtBQtaySchazhDaWq41fR3fhrFeMDRhg8g2 + aUOlbdLGKrup6TV2U9N3209n7h0xY9M3DjMzvnOctfl7p+TNB53nbDnk/GHm4VFztx4bNS/rhMv8rJMu + C7bVui7KOeu6KOec2+LtUreU7bKRH2Yosc/hMxt1WyJGXZeIfUEzBu1gTxWilrGLKNCuErTveoeYoW+G + 6jyxo2/WixlaDaNHGyZmlxSRr1uqBLWatAA190hQ2a078pmzuGWGo7BligOvNcGB18qw57YixgzntlFf + Cbw2xJ7XRhvBb01wFLYlOYnapjlXts0cWdWWPCjy010Wnkmoa4oIdZhT4vjNgR8ldVJpu05X3y6Vyhmu + u9rMzp49K25ubm5vampqv3DhwhtHc/OF9qam5nalSo2LeQIm5qgvMDFbxX3FcRI9neEkbJnqxH+aNJL/ + ZMpI3pMkF/7jqa78R9NHC36f+Z7gYfIHgvtz3QV3F3oIf1vsKbrz0QTRrWU+4puf+4mvr/KvvLY2sPIK + M7jycmZI1aWcsKqL+eFVF0ojqprZkZJmYVR1kySqpmlPdE3TdzG7mg5G72n6JXpv87Hofc0no/c11zpM + +Vo9wIOBOs8pQV2XVKaSEKY5CWG+Y1yliVrGLqJAu8rzh8A/xWw0BGJiHpFcQnJLk+RYh38KAdQOTeFs + cBK0THHgtzBGsFsQu4rWONvyVrJteWvM0LLW6KGlrVE2pW2Rr4Sytqih5W3Rtqw28rCKtlg7ThsFxO0g + bEsall6bZj6WroFHrkuKeCMJYdqSEKYlCWH2IyHM3oZgEgeWNxH4Hr1AIC4pooDRadWoTcRnejFT1pQ5 + ClqSHPgtCQ6cpzRH9hPEkfUH4lzxmDay4hHdpeJhwuiKB0nvse9NH8P5bZY7585cT+6theO5N5b48K4v + 9eNfXT6Jf+XLQMGlNcGCi+mhwguZk4XN2yNETQWR4vNlUeJGbnRlozimqnEXWdK4n1zd+D255vwh8u7z + R2P2NJ2I3ttU676KJ4fPYodsBDFvNuRhIAlh9jF87u4TNHEI/AtHAz4EfJg+bmmSDXbUDVgASQnMIifB + 0ykO3BbacFZLnG1pa7R1cWs4qbA1jFTYGjo4vzXEKq8t6JWR3xY8uLAtlFTUFmZd0hYO4gZhQ9W2jPhU + MMAjAXVdJCAOJf+7pFWj1pOX6cWMrC+AJ6MDpwUZUfGUYl/2JNa+9A/yiJLHZKeS32OdSx7Eu5bcQ0aX + 3qV/UHYnaWz5renjym/OnsC6Ps+n4upiP/bljydxLn0WxLmwMoTbvDaM18QM553fGslv3BElaCiKEdaz + yMJ6fqyovipWXL8ntrL+u1hJw8HY6oZfyLsaj5P3nD8VVHKizsJrCkoKTsU+39CkbHcSwhxmKCx9u13Q + XRgCoSr0cUuVrHScvgM1d6ejluGfVDvxnkyBANqVt5BtilsjQMCDdrYGDdrRFmC5vW3SgJx231eMn8X2 + dn/L3LYAEDiI27q0LWLI2rMzzd3pauJA8v8LVoxN27Giwm6JH172lGxX8iTarvCPSPvCR5Ej8n+PdCx4 + ED2y4B7ZtfBu3HtFt5GxJTcTx5XemDa+7Npsn/Ir8/xYlxYHsC4uDa5oXh7KbloVzmlcF8lp2BTFrc+O + 4el2knloSSwf5cQJUFG8EK2JF6H74yt1P8RJ6g/F1jQci93VeDJaoj1jPXmxZuD46ajLIgHqNK9iEQlh + uhkJGip097YcLzkEwod4xy21avHIueUo9KgW/nN/dii5ORMTM6uFbF3UGm6V1xoEIrbIbvU13/rEp0/m + kwl9trxiMp9M6Lf1qXf/7NaJIG4Q9uDCtpBBc3kpA6NW5g+MXllgSV5VZBn7VfGguK9LOg2V/0vEfVUy + KPar4sGz8tfZV7RQIA92pU9jhhU/iRiW/0f4sLzHk4fnPpw8IvduuFPu7YhRO29Gj867HvdBwTXEo/BK + olfRpek+JReTfUub5weUnV8SXN64LJTV8EV4hW51ZAW6MYqNZsZwtDtiuZqieK6aFc/T8Cl8TRVFoN1D + EWkPUCrRn+KqdEfiahpOxO5qrHX5cDM2CDrO2ImOXMjfSkKYXiSE6UJCmENJCNPC0ENDy9R9Lsfz+maC + o9HbdUkl1XWxAJtaB4yffsZ+i3whVAQIok1RS/jgnS1BA3Pa/EDI/TY/ntB70+9eb6c/9OwO4M9+J+Ox + F4jbPLvNd+CO9klQrbE2pLQtYmh5W4xtRRvZjt0WDz12p6HyTYfTimHHbo0fVtEaOwzmldKWKJvip+FD + C55Mts37I8w291HIsO13g+1zboc4br8RNnL71fDRO67EvL/zUpx73gWaV0FTkk9h00y/osa5ASX1i4NL + dR+HlqGfhZdrV0WyNOuiK9QZ5ArVtji2Kj+eoyqjcFVcCk8lpvI1u6lCzbcUkfYgpRI9HC/RHY+rqa/1 + Sd8lBTHbxn6FjlokKCchzEASwhxLQpiOJIRJIiHM/gSXgyhl/UUUaFcx1TcTHY1RiwQe4GgMDkoBR0Np + +/m3yx14LXRjMVtkt/n2y/zDu8+m3716p9/3/Mf6u+7/WP9bN3HXvVf6g3Eg7D6b/xjfb2uLD7Qjxm3I + kOK2cOixQeCdBss3GP2A3RppU9IaAcCT0aaoZbJ1wdNQm7ynIdbbnwQN3f4wyHbb3SC7bTeDHLZdC3He + dinMJedCxHs7mshjdjZRPPMaE7wL6qf5FupmTypG5weXaFNDSzXLwsvUKyLLVWuiWUommaXMiqtQ5FLY + imIKR8GmcpUihKeqQfjq/VSh5geKWPszpQo9Fl9dfzKcdfqspc90LTheoJNh03ZMISHMCUbtBj4Qdr8P + jbUapvtmEHMvm4RMc7dUySYbvSWktZ5btMmB18Kwr2iJH1rcEknKawmGyqwX80OvXun3xoHo/m/dnbFm + a26P6Q7gz4a/458b73tAxTau1tCGDMxtn2S5sy1wEHGgfMMZnNcajAPtHRQSUl5L0ODcliDS9ieBpG2P + AoZsux8wNPtOgF32jaARWVeC9GJuDn93+/noMTsa4zx31tMm5OmSfAvQmZMKtXODijWLw0rUS8NLVZ9H + lim/jilXbiSzFJkg5vgKeRGVLWchHIUA4SolCF+1lyrQHKCKNIcolejReInu11gJWmsXu0wNbeio+Wzo + m2GRBzzn90kI056EMK2IwyCuPZMXUaBdxbjVIPTNHY7GcPombPAYTF1b7sh/mmjPbqHYlrREDclrCRmY + 0+aP9csdlbl7xYxDFHXvTY+waq3vsVt8QNzm2e0YJgbLNw4oGs+wrdXPMqfFf1DOE/9B2x75Dc5+6D8k + 656/TdbtScOybwQOz7oS5JR9KXQUiDnnfNSYHY2x43Y2ICDmiQXoDP9C7YdBRZrFocXqjyeXqpZHlilX + RZcr1pNZii1xLPn2+Ap5IYUtL6dyFHyEq6hC+Ko9iEB9gCrUHKJWajExx9fU1767OAfrm0ckZUHfXPAy + rQaOyYso0K7yZ3XuNAT2cUutWuE0M1/vaISm7XPiPUkawW6h2pa1RA/JbwmFAdB869OJfTMejcfbDBDa + 6xI0Lmr4e/8U9u9eIG6saoPAAeJg+YbRb8sf3jj9Mx/79N/yyHtA5iMfi8yHPhZb7vsMyrzra7Xljq/1 + 1lt+NpnX/O22Xgl0yL4YPHLbhcmjc85HfrDjPNljZwMyPk+XiIs5sEizKKRY/dHkUtVnejEr15HLFRlx + LPm2+ApFvkHMPEzMPCWI+TuqUPMTRaw9QqlCT8RX19dOWC2SgZiHRq+AvplNQpihhkFwFAlh2hAGwWeq + M2DyIgq0q+DV2YSjMQ8eIRaeU1AL3+RjDoVXk0dwniLDylpibApbJlvltgYOyG7xBTG/k/7A63WK2Rii + sHFxQ49tDHGwfJOA+AJ9mMA9r34Z97z6Z9wdPyDjtwkWGbe9LTNu+AzefN3Xess1P9vMK5NGZF0Kcs6+ + EOaW0xTx/vbzZPfcBopXXn2CTz46za8QTQ4s0iwIKVanTS5RfRpRqvoyqgwT86ZYljw7vkKeR2HLS6kc + BRfhKioRnmo3IlB/SxVqDlLF2sPxVejx+Or6U4HbD9ZZjEvA5irwwofPyJ9FQpjeL+qbjTF5EW/qKlCd + Ozsa4hjXFDE6aOIcdIDnlDp75tkU3NGwLmwJh54NrDlwM3Axv65W43ngwibSeaB8s3hrwx0P4O0Nd8bh + 9Em/5dWPecurf/oNL8uMa96DMq75WG++6ouJeevFIOes5lDXbU3h721vjMHEvLOe4Z2vm+pXgM4OKNLO + DylWp4aVqJdFlKpWRJUp18SUK5ixLHlWfIV8J4UtL6ay5WyEqxAhPOUuhK/+BoZAqsh4CDxzzsp3lhYc + L9hi4Phh+QoSwvQj9M2wOgtta6dWA8fkRbzp3+AZR2PkQt5o+MWRgtNQc3eGeti/dn/pxHuaYM96Gm9T + 3BJOym8Jhv4NHn19Mx6MhyEQAv7P9bfd/7H21tgeXi1vrb3ljvP2+pse72y4Ma7/xutewEDm1QmDmFe9 + h2y+4mu75bK/sZhhCBy7ozHec2c93TtfN8WvAJ0VUKSdF1ysSQkrUX8SXqr6IqpMuTqmXJkey1JsxRwN + /RBYgXAUQoSrrEb46n1UoeZ7qkgLQ+Cx+GrdyRiR+szQiFQNNgTOY6HO8zmZJvpm2LcBWw1wMb92QWOO + Bkyj4GjYkldhQ6B1cm4WbGpxqHhCHVb6NBqsIasdLQEDsh5P7JvxcHzv9LueUDF6rb/tYRz4Hl4dIGJc + yH033PAEIZtvvIaJ2WrTFR9jMTtlXQjBxdxFR2OHKUcDGwKNHI34al2t45Sv1TBT6RdPeIUkhBlMQpie + JIQ5ktA3P7fVwDF5EW/qIkRHY519Yqbe0YhbxXcR/DHdkf0Hzb7sCdm24Ek4acfTIMvsx74wiEAPB4++ + PhtvekKwe3j1gIBxERsLGaoyadPViTabL/sO23LpmTbjuWI25WiUKzbrHQ1FwYscDVg8eT9tpwK0MZyW + jo5axGeREOZkEsKEjfuuL9s3G2PyIt7UBYiOxnLn2YUobPmzDE753o17L3kU51GSI+sxZXjR4yhYfQKf + 02rrfV/LzXd8zJm3xkMPh2EIeA+vDhAvYJF+bTxgLGSoykM3X/Ybnnkp4K/E/Hx7rpOjUfYcR+Mw7mh4 + r6+SQWW2iVwOjgbfmr6ZTEKYPiSEOZqEMIeTEOYgI7/5uX2zMSYv4k0vifEQ+I5ralWyy0IuauE1DR3o + M+uUa2FTymje7zNGsX6nO5b8Hmdf8CjCNvdhyNBtdwOHZN72g6kahhEAAt3DqwfEC0BbgYk444ovLmS8 + KjtmXQgemd2MuRkwABp65mfEbGzP/YWjwaFylWIjR+NHqlj7CwVzNHSngnJ/rhvolYQODliErQQOn1mw + wGjxZAQJYQ424Te/NkEbD4G9XVLEk+FVpUF+c9EBnkkKl4yTK97nP5gzmvNgqkvZfWRk0X2yQ96DcLuc + 34KHZd0MtN5y3Q/sIZiqIcA9dB/QUoCAoUcGEeMVGYTsnN0c6gJVOed8FG7NmRDzQiN7bmVUmXJtjF7M + phwNWNbu5GhEsM+dHTxpjtbSexYKe3kc55Z/RUKYASSEOeY5Q+ALWw0ckxfxphfwjKPhPJ/tCHtWh4Qu + hcUTrdPy6q1jhXcXfsC5O/s91t0k15K7yKj8u2TYqeWQcyPUPvtaEKxA2W29HAAB7qF7AOEC9lsvBgIg + YgfD0IcLGaqyocWI9chtoOJuBvTMRpU5LaxE/S+DmA32nEK/R+NFjoZE9ytZrD5jG/2xGt4XhV2WzvM5 + 8F5gEAlhepAQpjMJYVqTEOaAlx0CiZi8iDe9gGcdjTRJ+rC41dgQOPzD7RWeojsfu/PvLBzLvjP7/bI7 + Se8W3UFc82+QXXKvR47MuRwO+wKcsi+GQmChSvTw6oHY4kBvDAKGtgJEDH0yrPyBkGH1D6/KsAIIPvNz + xGzwmg32HEv+l46G8bK28/R1KtCGw7Qd4GgUkRBmiNGWUHgLBRyNlx4CiZi8iDf9BYQhULJ6xJRsTMw2 + 1FXfeItvLR8vuPWRJ+fW/HHlN2eNLbk5ZUzhNdr7eVfi3t15iTx6R3O0W05zJAS1h+4HKjCACxgXMVRk + EDLsy4AFE2gxfPLR6bBogrsZWM+sbzNAzJjXjNlzRmI25WhQKtEj8RLdCXA0xi4rwhwNO+p6GAIrSAgz + nLCDDt+w32nT0cti8iLe9ByIjsZSeHkRHiWksCXHfPiX1voIbyz35l3/eAL7+sLxZdeTPYuvTPMouJTg + nt+MwJbDD3LPx36wA4MMQN/Ww6sHjy8OCBiGPRAx7MeAigzL2AYhT8OrMqwAwqKJwc2AAdDQZnSIufOG + I4KjEV+lg2Xt2onM3VJwuwzHD6A2iVkICWFOJCHMdw2OxkutBL4IkxfxJhM862gsqZzqslB/9ICl7+w6 + 7xJllr/o2mo//tXPJ3KuLJ3IurLIp+zSXO/iCzPHFzRNhb2zwLi8BhpUBQAC20P3gccZxIsJeGc9A9oK + EDH0yVCRDUKeA6t/hhYDlrOX4tacfgA0KWZje87Y0YCVwFMh+UfqBk6Yqt/bvKQStZ9dlGJY1v7gP3E0 + TGHyIt5E4Jkh0GWxyN8ttQo7esDCM0ntmXW4JFB8ZVOA8PKaAN6lFZPYl5ZNKr+Y6lfavMCvuHHuxKKG + WT6F9TN8CnTTIJAABLWH7gePN/TGIGBwLkDE0FoYKjIm5OBi9RKoytAvG1YAQczr9G4G1jP/KWa2HMRc + ifCUuxG+6htEqP7R2NGI5ErPkALnaaDYuSzkoU5zWWsNjga+rD3E6DiCLjkapjB5EW8y4hkxO8wptYbH + BzxGwCAf85WkCs5bCBZd2hzMv7gumHNhFbwgGVh+fmlgacOSgBLdwknF6Dz/IvRD2KEFgTQwq4duB4/1 + bIg9CBj6Y2grwIoz9MmpBiEvg6psaDFWG1YAQcxZRj0zLmYxwoUNRyrcnvvT0ajS1trF/QtzNKAddV7A + zTFyNLq8rP0ymLyINxlh7GgYjh5Yjw2BLotyfwyrulgUJr6QGyZo3hrGa0oPY59fE1bRsDK0TPdZaBn6 + SXCJ9qPgYs0SCB5UAggkbDuEoPbQvUCcDWDiBaA/NhLxUkNFBiGviCxTfqWvysqNsJxtWDTBrTnWn2JW + 1ND4qv2IQP09QnA0RiUzMUcDjIKRC/klRnubcUej07J2zDfNRM11CZMX8SYDxCFwFVgvUJntE74+GS5p + 5oZXNpdGCJvyIvjnt0VwGzdHsOs3RLDQNfCS5OQy9eeTS9Wfwa8fdmaFlqiXQiABmKCNSOvhlWEc14/w + eEPsIQeGSvwZiBh2ykFrARuMjIRs3GLkUSqwRRMWlSOHAbCSxlXsQnjKTmIGR8PjszLsYJhhcWtgjwZs + 1AdHw3hvs7GjgfXNIObXJWhjMcNG/RT86AGbiDTpZAFaHVnVxI8SNbKihQ1F0bz63GiOLju6Qrs5iqVJ + jypXrYsqV66JLFN9BUGDRxkEEPozQzCXwyOuh+4Bj7Eh3hD3LyAHBgFDf7waBj5oLbChr1yRYRDyNkNV + LqRUyEuxFUCOnE/jyqtoXMVuEDNNoPoegQ1HRm+d+G3ZjzkaQ8KWYo6G7ZScRMOyNjgaxnubnxkCX5eg + jR0NOHqApj96YBZq5TdbHVJ+9kC05PyumMpGMVlYzyPzdeVkHloUy9HsJFeocsgs5dYYlnJzTLlyE/zq + o8uVG2AjC1QBCCLYQIaA9tD9QKwh5usgB5ALyAkMeyBicC9gCdtQkUHIBfqqLGMhbBkX4ciFNI5ezDSe + 4huaQPUDIlQfooo1R/Vi1tWGFZ84Zzlhmha2PYCjMSK5ZKmRo+HwnHcCO8Tc3YJ+ZggctVjohR09ELgY + tfBK0vrn/HQ0prrxALmqYW+sqL4GTsCJ42m5cVw1K46jKolnKwvjKhQ7YW8s/NqhD4NfPgQOXpyE3gwL + pD6gPXQvEGdgMxZ7TLyKLMgJ5AYXcXyFPB/6ZEqFvMQgZA7ClvFpHFkljSOrpnEVe2k8xbemxBwtkJ8d + EjRfAxvSMEdjXkU6YaM+OBr4snaHo2Es5v9Y0P90X/xcjIdA2yk5A9zSJJttIj/H+mavNZW15JrGn2Ml + 9T/GiXXfxQvRPRSBppoKB4dwlXxstxVbzoKdV/Arh8cWBAs2sABxFfJcmJghkD28VnZA7PE8GAQMLQUu + 4nIqW1aBVWS9kMU0jkxC58h207ny/XSe4gCNrzxIE6p/RkSao9RK7QmKRFcbJ0HP2FOX608HTS5CRy7g + 7jRs1B9HcDQ6DYFEiCLtCp1ETBBzxxDomlo1fzidiTka76bmysi7G4/H1jQchXPIKGL0B4pQ8y3CV++F + d8agx0I4chEEBGHLeAhbxoZfuyFYZdCPGUSOA8HsofvB412i74mxfABQidmGXPFpbJkQKjJdL+RddK5s + H50r/5bOk39P5yt/ognVhxGR5hhSqf2VIkFr42vqz7rNy9Q7GomZ4GjAKUe4owEb9Z/raJiCKNKu0EnI + JgQNvU7/0WnVe6z856MDx0/VRkm0Z2J3NZ6Kq64/Hl+FHqGItYfAUKfxVQdoPAV8+T0QCPhl0ziyKhpb + KoYgGQSOixwqADzOIJA9vB4g3gDEHhevABMw5Igjq9KLWFpD50ghh3sZXNm3DK7sAIMnP0jnKw/RBaoj + NJH6OFKpPUmp0ovZcyUH26MBr9kZjh4w5Wg8s1GfKOLXJWhsaRseFS6LRXOdZhVgFfqDT4oUsbsaT8dV + 15+CDdvQR8EjiM5XHoRfMRYEjvQbOke6Vx8Y6S5DkKrpIPA/qdSLHUcm6uFVYxRffR8MYPGHXOhzguVm + tyFXexkc6X4GR/otgyuFXP7I4MkP0fmKX+gC1VGaSH0CEWsg76cp1bqzk7K+k8PRA6SQNOzogWHTcmcY + HI33XsbRMAVRpF2hk5CJgu7r/y9r85AVsHlkuOuSSg7sc4YqHcGtOxdfU3+aUoWeQsSaEzSh+hidrzwM + X57Bkx1kcKU/JHClBxgc6XdYcPRB2mckchwIZA+vB+O4G4tXL2CO9ADkLIEr/YHBlR5M4MoOMXjyXxh8 + xVG6QHWMLlT9iog1tdQq7RlKte7c5NJfZYMmztQO8v0QhSMqHOaUfkZCmJMIG/XB0XjmbW2igIkQRdoV + OgnZWNC9xi0Z2tdj+pJ+nrNSB4Su9HCay5oJB8XAAeCjkpnq+Jr6cxQJehqp1NbSROpf4UvDl0/gyX5J + 4Ep/TuBKDyVw6w4mcKU/QpASuNLvDSLHAbHjgu+he8Fj3RF/g3ghJ5Af4CfIWSLkjic9nMCTHU3gy48x + BMpf6SIVFK5apEp7llKN1sUI5TKb8BQtOBrY+XPz2ZsMjgYcRu70so6GKYgi7QqdhIzzlmeqeW/3uQHm + Y+mnzd0Zx/v6fhI9mJI+dtRiQR70SgPc6WhI/i9y+KXCL5YmVtfShapTDIHi1wS+7HgiT3YsgSc9ksgF + 6n5J5Nb9nMitO6QXOQYE7ye94Ht4PeAx78jBIciJITeH9bmSHk3kSY8l8GTHE/jyXxkCxSm6UAUF6wxS + qTlHlaDSeAkqc0j4UgOOBhzrZuRowNEDxkd2vdQQSIQo0q7QScgdjEtx7D+WUWE5LkFnPpZW399zesaA + sC+D7GbkIXCyDfwyh8d/qqHU1EvhS9IqNefoItUZhlBZm8CX1ybyZCcTedJfE3nS44ncumNGHDUAQgcO + 9/BaweMOOejISxK37ngiT3pCnzPZSchhgkBxmiFUnqGL1OdolZo6TMw1Otl7KTnYv2pgz8jAHY3nHT3Q + sVGfKNq/gijSrtBZyHqs+7pPXQgfekNhlY6exqw3d6cr+vmmTRsUuy5g5EJeDn56qG/6LhWlGpUhVVop + TayuY4hU5xIEirOJfPnpRJ6sNoknrU3kSU8ZAJHjQseBIPbw+sDjjucCOAV50udKdjqRLzsDOWQIlVCk + oFhJEYlWRqnRyb3XiDAx6w9T5HMMjgZ+9ICdqaMHiIJ9EUSRdgWikIH+b7t/6G8+llbrP3U5evVhq+6U + 9rLOavyUhv7jpvDMw1aGD6FlBMNEC8PAkOAF2rgqjZIqQeW0So2MLlZLGUKlNEGgqEsUyM8l8mVnE3kY + Z4wAseNAEHt4PRjH3TgfwNlEvuxcokBelyBQYDmki1QyWqVGjki0Cmo1qgze8ZP62cMU8+YQzm02uVGf + KNgXQRRpVyCKGRgBrYaVVxL6s7wZvfywHb30oF33yRZOvflYen0/7wVpllGrw5znc9bD0U3wa/VYXqam + 1OiUiESrpFVpFAyxSs4QqmQJQoUMgpMokJsCBG8KCGoPrw5ifHGI+YAiJIWcMURKOUOkktMr1QrIKbUa + VUWxz6it/GZj/3yI4TDFlSYcjU5HDxDF+jIQRdoViGK27jt26gIQ6Zd5ErTxfjtGw712nfzaI51z2LwG + c4/Eg/0CltPgy7ikiHeD/2jpPR2N5knV1GpUjUi0KlqVRkUXq5UMkUrJECmVCUKlwgg5AVkPrw1i7Dvy + whBhYDmD3EEOIZeQ09hKtXpoRKqWcJgibNTHHQ2TRw8QhfqyEEXaFUy2Gj5Jy1HV7VZU81t7B+o77bqt + wkNQpRv6j09eOzDiq3DHD8uWwheEvR1u87ZoKbvqNQZRq2lVGjW9Uq2mi9VqhlilpotVKoaIgFil7OE1 + Q8yBPg+GHKmxnEHuIIfUGhSevBqnKau1hMMU8aMHwNHA/zWqf8vRMAVRpF2hU6sxyCsJ3X2mGZXdbu9E + 3c02nc+UL+rN3Rnn+k36JMkqfkPgqEWC0qHRK7Hz68KKj2swUdfoNEg1qkEkWg1NosEC1MPfHAkmYixn + 1GoUyyHkcszH+fozVp49TBGOHngljoYpiCLtCp1ajWXbq9HTN9pNUnu9Xcc9gtZbuDMa+o+bVmwxeVXE + 8Bn501wXC7FT+UfQV6Dxexq0lN31UK211BqdllqDYiA9/K3R5wnypcNyF7+7XuuzsRqrzB2HKTK2EA9T + 7HT0AFGc/w5EkXYFvNWYBK3G4AlT0I+yq9ClOdV/hc41KgVsPF1/3yXzLGPWho5cyM+FXzC2Ey8lB3X/ + tBR1/7REi+PRw98e43y5f1qCjllWiBofpmg/6+UOUySK89+BKNKu0NFqgBhfEmyhBXppc4+k3eYhK6Ks + GVtC3NIkqOXEZOK9PbzB/HmYImtVdzkapiCKtCuYveW1wOotrwUe/3RfPOaFeKSMfcsjxb2XV9r43t4f + +/bx/zjcInwF9FOezgu4G9xSJcc6/UPoPbyxuKVJTjov4IKjAWLuFkfDFESRdgWzXn7JA3v5JQf18kte + 1ssveWMvv+T0F8Ds5Zec0ct/zsreAQuoFlFfwDZB2PcKUy9YOdEkhAnHPMGLkUkkhDm1hzcG+NdaIWd0 + EsKMM6wCwvuA8AoVvHVi0tEY/VGN2auEKNKuAIJ+p5dfsm0vv+TRvfySP3gxc8a87T9nTO9J88f2DVni + Ykn+EiZdGBBA1PC6DfRZsFEFghFJQphRPbwxQL4gb2DLQVWGpy+83AqVGcTcydEgivFVQBRpVyAurLwQ + Q/MPXwbf/A+9FEy7IGz44iBs6LXgdByo2j28WUBRgooMRw6AzwxL2rAVFK/MHY4GUYivCqJIuwJU6C5j + JGrsnA7DtAuv2cAXB2FDEGB4AEDkPbw5QM7AxYA8Qr8MxQp65mfEbKCToP7bmLyINz0H/BUtEDVYN/CF + oVrDLxnEDYGAabiHNwuw42DHHLQXIGTYOQdFCxcz1mqY0MPfApMX8abngP9K8fYDFzZ8eRA3AMHo4c0C + zx3kEfJJFPLfVsyAyYt401+Af0Fc2Li4e/jfAM+pcZ6JGvhb8f8A12MmquCr03YAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAALQAAAA7CAYAAADSK6A/AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAA + SMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEo + qGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAG + eIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK + 7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gz + SZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25q + bc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9Cvjc + M4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4 + oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjK + uLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqx + OPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIW + iAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFV + SAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAy + rA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYg + hUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2 + aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7r + h2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/ + Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SE + dJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3J + aSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQt + lHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJ + y5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV + 9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1 + JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7 + m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hop + b2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsy + u21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj + 9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCc + cNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527P + YS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT + 4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOw + EaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6s + faznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP + 8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy + +rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVs + S1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7 + SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9Uxlfe + qXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/w + jowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9V + t1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO + 6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503r + m10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9 + qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h + ++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7 + Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAlGElEQVR4Xu2dd1hU19bGudeY + 3KiIlBFEUEAETBEQEKQ36WXmzAxgF7tiiTHRRGNiZ8QCIkgvw3SGZk1iEmNij5XpM2cAwd5j1Ngo37PO + zPEez2Ai91rvx36e96/kwZm9fqyz1rv22RgNW1BnBKIgrH/o9U+9erxBgs+Df75/DNvRavTBjsf/lT7c + +eiViPzv/p2I3/MNjsVT8XDfec/IY9ddI69dd4xG7rpt5LPrdyPf3beMfHffNPLffcMocPd1o6A914yC + 91w1Ct19xShsz2WjcEyX4Pv+VzJYJJh7uMyv8Ry2oG7zsAV16Buj+bWrndPENoQNxT6vy85WIxAAThYZ + lDdV5M9NALnHsAW1nw5bUHfCYD9eryTD5tcuIwH+jxEEqL133TYapYfaD4P6ulHg7msY1CEA9Z5/Q00G + tKsyWASg4YO9M2x+baZlxOeosSv9jZF1/Deoy/zatU5plUPhM36/94eVBw4c7Dh8+EjHkSNvrw4ePNjx + 448/MuCX8ueffxYfPHio48CBAx3ffr83yWE6x8RlbhVq4jnWYD9ep/qOSEYdp5aiLvNr5lEQVk9DqO8Y + ee36w8h799NQB+ihDiZBTQa0qzJYxOxMQVjvOqeJR7nMFaOmPpOxL+A4NUPhkrZV6jJnq8R5dvYZ59nZ + p51mbjnhNCPzt6HTM48Onbb58JCpmw4MmbJxv0Pqhn32kzb8YDcx4/vBE9Z/O2g8a5fN2PQdNmPT66xT + 1lVbp6ytGpC0ttKKuUZoyVgt6E9fxaMgq7gUZBXHAllVYUFbybZAVrLNaXohq9im4Qt2wecYEPsVliGc + 0iqHw0ZqUO2KK1eudly7dr3j+vW3UxcvXuyor6+/duDAgf6nT5+2OHfu/JVz5893nDp1+lpWWY2ty/ya + JQMTV2FxMItctNuCsYZrTl/NMUdWs81pq2CPys2pK8vMcCWuKP2vRfh55tQVOmFxWcW2oK/m9B05/mS/ + kRNQp9lC1GVedQow8xTUu+4aeWKlxx+6TL37dyPfXTeN/HbfwKAOAqh3/xtqMqBdlcEiZmcKwvoXBWEZ + O8+tmjdkSgna152J2o1ZoYrZ3XIiZnfLbzG7Wg7H7Gz+NXZ7876Yuubvo+uad0bXNtdE1bSIIqtbOBHV + 50rDq8/nh1ZfyA6purgpqOoSy7/qyio/8dXlPuLrX4ysvLHIo/LWAnfR73PchLdnfSy8M+1D4b3UYcI/ + JzoL7o93EjwY68h/lOIoeDTGQfA4xUHUOtah8vEE84SvuRjU0V/iUI8EqBVK1dfNzS0dLS3nOs6de/vU + 3Nzc0dLS0nH69Gmx8/Z2I4lExtRqGzrqJZKOb/f+VGM3pcTeOa0SNfFIQc2iPt/uWN2eOqSqfaJDZfs4 + e1F7ymBBW9Igfjvdlt+O2PLaaS9Cg3htCFF2/DamHb8tyV7UOmaIuHWCzeqDi43dk5TmATNRl3k1EAtf + AtRYcoTSA4ca6ulRT0oPItRXMajJgHZVBosANDw+3qcgrH4UhGXtPLdqgw2yDssObsv5sphdzSdidzYf + jdtx9lBc3dn9cbVNP8TVNO2JrW7aHlPVJI4WN/GixGfLIiubC0aLWraGic5tChGeTw8SXlgZILj0lZ/g + 8hIf/tWFXrxrcz14N2a5cW9NG879fdKHnD/GD6u4m+JUcS/JseI+Y0jFA7o9+yFiz3mE2HEf0+0ErUn2 + wtYUyETwWawiF0NNDRsZqP8FhM8Nv4zk5uVtFHyP9ygIqzcFYZlCHJzSxOus479GjV0Z6oHpJ+bbidpT + AGIbbjt1YEV7vDW7PW5AeXuMVVl7tFVpe9SL0IDStugBZW0x1uVtsdblbXE2FW0JgzmtiJ2glekgbB0z + II271tiVroHS1GV+Tfbg1BIKEWq8SSRC3WmTuPvlA91Lv5EDB6RkuUE2pITMQ008x6DBJUfr43aePR63 + velIfG3jr/E1jfviqxq+jxc37Iyv1FbHiRoEsaIGdrSwsShK0JQTwT+7OZzfzArltawK5p5bFsC9sNiP + c/ETn4rLc0ayr04fUX59smv5jfEfl91KGVZ6m+Fc8gcypORuokPJn/GDSx7EDSp9GDeo7FH84IrHVDtu + K5YpzJE1BQC15ehFGNSdNCz/k4LHe1/3JNQ08nMBZGMAGSC2LGmPoBS1h1sUtoeZ57eHmOe1B78oWeS3 + hVIK28IohW3hlsVtEdalbTG27NYEO14r3UH4eAwliVUEsbChrQWo1+qTITCElR7Pcj7ITSIZ0K7KYJFK + DvhQGNAUhOXiML1iNmxmP6/xqOXoNHVMjeZU/Pam3+LrGg8n1DTsT6zS/phYie5JFKF1CUK0Ml6AcuP4 + aEksX7stmteQFcVtXB/BbVodxmleHlLRsiSQfX6hH/vCHJ/yS9O9yq5MHlF6bZxryfXkD4tuIs6FtxMc + C/6Isy+4GzM4/8+oQYX3o2wKH0bZlDyKsS17HGfLaU2EzTRnrt9KblT+38iNobJcfWaCZWl7JAZxXnuw + aW57oMnWDv++2R1+fbM7fF+kTLe2B5jltAeabWvDALcqbou0KW+NgwTjwH80xjTi0zpjNwZqPz4Hyg9w + PoAf4Oi5m0QyoF2VwSK4HPC4gEe4CQVhDaAgLCcKwvJ0nCXYbD9hG7ahTlM3KOK3N51IqGs8mlCtPUit + Qn+mVmr2UoWanVSBujqRrxYk8lTseJ66KJaryYnmoJuiKtB1ERXaFWHsxi9DypsWBZadnetb2jLDp+R8 + qmfRhfHuhZeSPy64ggzLu5owdNv1GIfcm5GDc29H2ObeGz0w78HogfkPIwYWP4q0KX0ca8NujRtU0Uq1 + mJS/2iz+62KzhK9LDJqa/yUlfFNiGv91sWnc8qJ+McsK+kUvyzebLkizKGwPBZAB4j5ZbaN6b37s/f6m + RyPf3/iCtenRSOPNj3xMstowuM3z2oIti9oiIA7YU7Pk+kQT/2m/QI3vOK0cmsQ5eob+DfXfNIlkQLsq + g0UCGuqgPhSEBTWRPQVhuVIQVtDQ2cJyXR1HR33St0sS6hpOJNZoj1Cr0APUSs0+mkj9HU2g3kHlK8VU + npKXyFWWJXCU+XEVyi0xFaqMKLZ6dUS5ZnlYGbo4pFT7SWBJwxy/oqZpPoXNEz0LmlPc8s7RP9p2IWFY + zqVYx62XI+y3XgsflH0zdODW2yHWufdDrfMehg8oeDTaqvhxhHVpa/TA8ra4gRVt8TactkRbbhsNUycN + ztsqqI8xcdoTrSuwGjkWsjKUF5CV++V0BBhntfsCcP/KeOD53vo/Pd9Nv+fxMgQ/u/eGBxjY/bLb/Sy2 + tQZbFbXqoOa10gdtlM3q6zX+FLhiznOEqPPcKpq+DwCeMKj/qp4mA9pVGSyyD01oDLGyg4KwRg4clzMG + Olpz/xmoqc94TQT75OnE2obfqNXoYapY8wtNpP4REaj2IHxlHY2nqKRy5RwqR16cUCHPjWMrMmPYClZU + uXJlRJlqaVipelFIiWZeQDE6w7dQO9m7oGGcR15T0vBtzdQPc5rjnLLPRQ7ZciHcbsuVUJst14Ott9wO + HrD1XrDl1kfBVnmPQy0LHodZFbWOhkxhVdIWiam0DWtkyM3N2ywAGGrk/sXtEcTyAkqB3ptbfd7f8NAL + YOuZfnfEP9fcdvvnmt9fkm67vZd+x+N9AHvTQ2+TrHbfp6DmtzKsv/huibF7ksIiOA1zPobOFrp35nx0 + Vk+TAe2qDBZp9E1sDs0pCGsQBWF9REFYvg7TK1YOncHBLCSbhM9U8TUoZOlj1Cr0EK1SvZ8mVO9FBMpd + CE9Rg3DlQhpHxk6skBXpoJZvii1XrIsqU3wTUar8IrxEtTC4WD0noFAzzbcAnTgyT5visa2BPjynKeGD + rWdjnLJbIgDqwZmXgm2yrgUPyLoV2H/LnUDKlvuBlK2PgixyW4Mpea3BsLHwGLTIawvBRW5u3maZAcTb + 2oMgI0N5QczKkD17rLvjDtD9Y/UtV6OVN4e/DMHPhn+jZ/ofI95ffw+DGjI1Ja81ZEBxa9SgitZEO34r + 03Ja0XpwPqyivwSo11slbTImDF4M62l96UEGtKsyWDjQz1N6OM4SFAxOycRKjw/mbFEk6kqPY7QqzSGa + SL0fEaoA6p0IT15N48oFVI6sPLFCVpjAlm2NY8s3xpTL10SVKZaPLlUuCStWfRJcpJ7jX6iZOqoAnQBQ + j9jWiAzPaYr/IPts9NDslgiHrAthtpmXggdmXQuyyrwZ0D/zD3+LrHv+Zlvu+5llP/I3zW7177elzQ82 + mChyc/M2yjgLV7suI0ONjGXl+68MZlw41Him1pcf/v3zWkOtS1qjB3FaqfaCx8kWtFXlwIYtY32nzgex + nsazNBnQrspgdQI0do6A0CBaURAWjJw9KQgrbOhsIWdAzFIMaq8VImlibcMJajV6lCrWHKSJ1D8jQtX3 + CF+BQ83XQS3PT2DLtsSVyzNiyhWr9VAvDi1WLQgqUs/GofbK0ya7b2tEPs45Gzcs+2yU45Zzo+2yzofY + bL4UZLXpir/l5ht+5htv+Zptuu1rsvGOj8mmez59N9336bPxvnefTQ98em986I3LoMF527ThoRdIVyPf + f1In60DWlRgA2qsCWge1rvzolXHfy3jz41HQKPbPbw2zLmuNGcxppTnwHqSYhs3fDc6Hw8R8aBK/JDsf + utLj364HGdCuymARgX6OetrbdkL+JPCAoV4yGZGEBmXvq0+sbTieWI0eoYk1B2gi9T5EqPoO4St3IDx5 + FY0r51E5stLECllePFuWFVcuXx9dplgdWar8anSJ8vPQYtX8oCL1TL9CNNUnHx3nmdeQ5JbbSP1o69k4 + l+zmyCFZ58IHZ14Itt50KcBy4xU/iw1XfU0zrvmYZNz07pvx+8g+Gbe9emf84fk+C3TX81/pOpGbm7dJ + UBcTRYT4VYJMFBFq2F+Aum9Wq695bluQVWHr6IFlrbGDuY8Ru8LLqSa+qYfhDAqUqC7zqqeTnQ9iliYD + 2lUZLDLQpNIDHhcwtSLW0372U8uXwkgWOlsz30maCPapM3iTSKt80iR+i/AV2xGevJLGkXGoHFlxYoVs + WzxblhlbLmdFlylWRpYql4aXqBaFFqvmBRZpZvgVoJO987VjPbc1MAHqD7c2xTpvaY4YktkSNnjzeR3U + Gy77mmVc8THNuOLdJ/2aZ2/WDc/30294vrv21ghc76y95Q4ybHDeLuEQkUWG7VUJLz1wqMH9AEsPehrL + QoLzwTqd1tdjTL3ZqCmoc5oYdZ4rjiU7H3iWJgPaVRksMswEoHGo4YNAgf9UPT1kBnfT0OlsrEkcEDlX + HVupOpVYq/2NWoVBvZ8mUv+ACFS7EZ6iFuHKRTSOrIKqbxLj2fLNseWK9OgyxYqIUuWX4SWqT0OK1WmB + RZrpfgXoJO987RiPbQ0M15ymRGgSn4J640X//hsu+ZqxLnv3Y10e2WfdVU/Qv9ZeG/Humuvu76y64Ybr + n6tuuHbrxarHmptukCygSeyVcdcLSj3oYyj5rSFWxa0Rg9iPEx34j5MGfrbjK2M3pooSMh+b6jrO4g8j + Ox/geJAB7aoMFhnmZ5QexHrakYKwPCgIK9RxFr8QG7rAtCjla1VirfYp50PfJHbmfOR01fkAqB0yz4US + oTZff8kHoDZedwWDutfaax442GS4u/Xi1HPNTXd4Er6XftujV8Y9r76ZD0aZ57QGgqU6sPRxjF3FIxoc + MrNMzc2EXss6bjnmfOjdsyfOB5QdZEC7KoNFBvkvoCbW084UhOVFQVijh84WsG3p6ViT+NG8XLl+6PI3 + zoe8AHM+yuUbOnM+/gpqPFMP3HghwGrDRV/K+suj8GyNg43DjQPerRev99dd94BSD3oYaNBNsx74UnIe + B1sXPIoYVPYozp7zkO4kfDjeImG5ANgYlLwJnI/VZOeDDGhXZbDIEJNFqqfhN8yMgrBsKQgLHiE+lsyN + cUNnCwVWUUuwTO29uprofECT2JnzUfYM56NTO+9ZUNtuuhA4YMNFP8jWRLBN0q94gQBwIuTdeoFKv4bJ + mHXDy3TDLR/zzXd8YU4AU13bogfR9uwH1KHc+ykuvD9STUPSfoCjyEMmF0KTuITsfJAh7YoMFhlgskj1 + NO5PW1AQ1mB86DJoUsFMmBBZBM5G+3mmoME5++sTa7XHqTrn41eaSP0T7nzQeAoxjSvnPtP56MTOw6GG + mhoaRXA/HLNawu0zz4Xg2RoHu3+GDm4oRwBwHPJuvXhBY67TNZ/+m276DdhyO8g6917ooIL7kfYlfyYM + Zf/JGMb/c4JzYXNaP59Jx008x6FOs3io87zqVH0Z+6RJJIP6vDJYZIA7E6H06KxJhDdIAu2nlX8Ds/x+ + 3hNRi4ApmsiK00/G4yTno+4ZzgdAvSqyVLmMYOfNIkONW3owfHGCbJ3VEoaDDRkb4IYaGwCHkgSDvFsv + TeA6gZ1qufGq38DM60E22b+H2OXdjXAsuhPnVHYHGca9O/Yjwd0pThm/Le3rkSI385uGwqtlTmni0QTn + A0+aBsD+nQwWGd5nqZMmsS8FYVlSENYQCsKC2X3wkJncLDh1Be+dWcd8oooVq07pm8TncT6Idt6y8BLV + Z3qosUwNNTXufrjnNtKwieLWszGQrXGwoWm023w+GOAetPl8EAggx0Hv1suRzeaLgTDRHZR1Jdgu+1oY + nJgcmn87zrnkNvIh+3bKx9zbk11Ft2c5LKndbOzG0PQPW4id8x4ygwMJ8Snngwzs38lgkcH9K3XSJILz + YY0fNdU5H4Jiu3E5WJM4ZPxqJe58YE3iXzkfbFkOwc7DPerOoB4LE0U8W8NUEcCGySLU1wA3lCMAONTa + ADkuyOTdevHC9jfrfBicv3HMvhjhlHs1yjn/WtwHRbeQj8pupbhW3JrkJrg1y6Py1ie2U7dWABsDE1ZA + k5hOdj7IwP6dDBYZ2r8TAWr8la0nLwTAyTwKwooYOltYYUNbg0HtuqgIdz6OUqtQfDz+lPNBhFpv52Ee + NUCtLz8W4O4HDF988tHxUILAAAbOfwDYkLFxuHHAIXuDAPRuvXy5ZLdEDctpiflg24W4j/IuJQwvvEJ3 + Lbk+ZkT59Uke3BszvIQ3FniLbyyxoi3/FtgYPCYL7LwV/02TaLDIwD6PSM4HPkkE5+MDCsIaZZWcicAj + xTLiM7SvGwMdxdohAecjsVp7RO98wHic6HyQDzLhUGPlBzSK4H7ohy8z8GwNo3IM7LyGJMjYcA4E4Ibm + EQecKKi9u/XiRdjj+I9zz8bDUWC3/BbEveBCkkfxpXFeZVdTR3KuzvLmX/3ER3RtiY/gwipK+NzDUJrC + y9gu86oX/qdQGywyrM+jZzgf0CSC8/ExjMcHTS5Kg+If3g7u5zVWE5p/EHc+Dj/tfJAPMhlAvQq39GD4 + AmNyKEFgquhfqJmiB3s81NcAN5QjkLkBcBBkcBDA3q2XJ3yfR+Q10uF8O8iroHmsd/G5iT5lF6aNYl+a + PYp7aaGf4PIX/pVXVniXKDJNfSfXY1cizBLAiwFj/xPnw2CRYX1ekZwP7PoDCsLqTxiPBzpMY69ymsVH + 4UNTgqapo3iSU0TnAxGpfkIESnA+dAeZOLKnoNbV1DpLD6DWTxQ/02Vr1VwC2FOhFAG4wRHRAz4WIMdB + 79bLF77fPgXacT6FDRNGFTVO8itumuZX2jIzoPz8vADOhUWB/AtLA0UXVwaJL633yDxQYuKZotJdiVCN + Os2p9O9qk2iwyKB2RZ04H8TxuN754GVjd3yMSMZeDIir1uDjcdz5+BGDmocdZBID1DQd1HijmAk+NUwU + 9XU1lCCQrRcB2JCxob4Giw/KEaizMcAL0VSAnKBJ3Xrp0u11IZrqX4RODShGpweWaGcFlTbODSo/uxBe + lA7hnlseIji/OqTywga4v2X41zXVMJCD8hTKVLsppeCcPTfUBosMaVfVifOB3etBcD7CHGcJSqABgEZg + aCpLSXwxANE5Hz/QBco9CE8OHjUONRssvcQKWa5++LIBzn7os/XX0DBG6MD+DEoRHG6oswFwHHI4mgoC + 2Lv1cqXfa9jz2bD/IcXquSElmgVhZeinYWXaxeEVjcvCOWdXhvOb08OFLZvDxedyw6vPFznNzv0J2AAj + wWV+zTrCePxvnQ+DRQa0q4r9tgWHGm8Syc6Ht875EHDAqoEP7r64TEY884FDjfAVe+g8OWTqKhpXhrkf + 1Aps+JKHlyCQrQlgf6MvRb4EuKF5hMwNp/fC9JDrQV9A0vxuvTA92Vd8v2HvIQYQi9GlqsWjy1RfwEvS + kWx0ZSSnYW0kr2lDpODslkhRc15EVUtJRE0Lb1DSN79BpgbL12Ve9fLnbRINFhnQrooANLFJJJ6hBufD + 13psdjI8UsBUh7m+38Y9mPMBZz5oYs1BRKTeTxcqcah30HmyakQHNYdaISulVsgKIVvD+Q892BnQNOpL + kVVQjgDcIChL9JCDvgDY9cB36yUJ32P9fn8JMdDFQ/l1dLliZXS5cnU0W50eU6HZEMPVZsXwG3JjRI1F + 0ZVN7KjqZsFoIVprFTlf0nfEkysR0sgvBpBhfmlAPwNq3Pmw0zsf/oNTSxaC8wHjT9OR4zThxUfPwOBF + B7X6ECJSAdQ/0vnybzGouRjUIoQj5dE4UixbUytkBXqwt8LIHNwQHdy6zB1TrlgLh50gg+tBXwmwd+uV + CPYa9nw1xABiATGJLVesj2UrNsSxFZvjKpTZ8Vz1tjg+WhQn0JbHiRr4sVVN4pias9tDy0/vNfebrDL1 + mYRfiUAnvxjwyoAmQE10PmA8TnQ+ghymc9LhgAocVOkfPEMdI5CdfgbU39F58l10rrSWzpVWIRypAOFI + uXqwS/T1dT4Oty5zy7KwJhIgZ8s3Qt0NsOu1vlsvXbDPG7C9Z8s3wZMUYgKxgTPwCRXybYkcRWECV1mS + wFOxE/gaHnbjVmVDXVx1467Y2qa9AVt/PmTimaKxCJqjuxJhjgj6sGc2iQaLDGhXRQSaBDVxPE58MSDE + cSZv25DUIqz0GERdrEqoQU9Ra7QnaFWao0il+hBdpPqFLlDsY/Dlexk82R4GV7qDzpXW0LlSsR5syNgV + NI60HIdbX5IA4NtACTrQc/Swd+vVKQf2Ho8DxARigz1dObJS6IvgtCWNpxDQ4GIiobo2UYTuTBBrv4+v + afgprq7pF89V1SegnraK+gKg3jhwXA4w9KRJ7OE2xwj0SoB+BtS48wEvBsBvXLjjLEH54ORNWJPoMn0j + OB+nqTXoCaRKcwypVB+mC5UHGALFzwy+7AcGT/YdgyfdzeBKtzN0YFfROVIoRQBuPsKRciBzA+B6yKHm + BtChRAEB8N16+cL3G1RK40jL9DFhQ4z0sRIgXFkl1iPBO6cC1S6qSP0dVYz+CPclxtc1Horb0XTkg3m5 + UuxKBDoLjpvOJDeJrxRoAtS48/HkVtOnnQ8hB17PgQ/usYwrx6CuxqD+jV6pOsIQKg8yBIr9TL5sH5Mn + 3cvkSb9jcKW7GFzJTgZXUqeHu5rOkYgBcDpHKiRAzoMSRS/YzG69GsF+w97r4OVIBbrYSMRYrLjSGiwx + 8WQ76Xz5brpAuRcGbFSxZn9iNXowobbhSPz2puPRNZpTMGGG27qGza/dqe/JoPR4rUCTnQ94MQCcjw/B + +Rg4LncCvEBJCZ2PXYkQkPm9jFqrBahPImL1cXql6ihDqDzEEMh/ZfJl+5k86U9MnuQHJlfyHZMr2cPg + SnC4d+gAl9QydJuGq0qXzQF4XNLKbr1oEfZXt+fY/kMsdDHBYrNdH6tdTK7kWyw5wdNXoNgHJSb0T/BC + SEJtw/H47U0nP15UJIdE5zCpAO4Cn6YvXfHR+KsHuhOooVsl3sYELwYE2E0pXQyvupv5TkXNRk3UjC49 + JqXWas/QqjWnELH6BEOkPMYQKg8zBfJDTL7s1ySedD+TJ9mXxJP8mMST7GVyMWGAkyAnCoDv1qsRcd8B + 3t362ECMvsdixpP8yORL90GSYggUB+gi1WFErD5KrUaPJ9Y1nIzk1Z+B7AwWr/PcKi4cfDMOXWrby/8z + mCI+AbqnX6qBDADtqsgQk/UXzocDBWG5Yc7HDM567N48z7GoVUSaJlYkk1Jr0XqkWnMag7pSeZwpVBxL + EsgOJ/Glh5L4kgPJPMkvSTzJ/iSe5OcknuQnvX4gQI7re71gQ7v1coXvNbb3EAt9TCD5/JTEq4dEBDH7 + JYkv/RWSFCQreqXqGFKlOUGtQU8m1jWcGZrKUsEF78CEwzT2xL5hy9x6e0ya18t9/NyeI+bCVc+vD2gS + 1GTnA64Yw52PPLg+Cvu7LklfqRNrUCmtBpUgVeoz9ErVKYZIeYIplB9PEsiOJfGlR5L5ksPJPMmhZJ7k + YDKv/kAyr/6XZF49bBZRAPvPuo3s1qsRvue6GEBM9LH5FWKVxJccTOZLDycJpEeYQvkxhkh5nC5WnYAn + MjyZQ/N/lcGRY+iths4R5llQ0117+X4aY+zGPGzsyjj5ntu0wHc85hm/VqBJUOPjcYMrEcD5sGVmYE3i + h2nZqsQ6LQY1vUpdz6hUnWGKFKeShPKTSQLZiWS+9LdkvuRYMl9yNIVXfySZV3+YoEPJvHoAHYe9W69O + +L5DDED/jgtfAonoGMQOYsgUKeDpe4pepT4DcabWNUhsEz9Xw4wCbuaymZCH9A3/KriPx/gMY1d6g+mI + JG0fV2ZFjxFp9q8daALUROcDrkSAP6iJXYmgP/PBxS+D9F5ZqaLWaWVIjUZKr1JLGJVKCVOkOJMklJ9O + FkhPJfOlJ1P4khOgZL7keDJfApDjAtgx4Lv1SoXvOwiPBcTmuC5O0hPJAtlJiCGzUnmGLlZBaSmh1qJS + 3/TtSsyqY6yHm5ayzeJXB/b2nT/O2I0hp89jNaQX1Wrhv/dyGzurh9scSzLMrwtoovOBX4nw5B5q2wl5 + U4iXQYbk/Kyi1aIKpEYjp1epZYxKpZQpUkiShHJJslBWnyyQnknmS08n8zHAiTpJkG4ju/UqRNx3Yjwg + CZ1OFsogIdVDDBliFTx94SksS6hWK/qHzNSAOQDx70/PCDEOXxbRZ8QYvrnXmMbjmovay/fatP5jl0Cy + O/Gu21T/Hm5z+rxWoAlQ401iZ1ciBNhPLV/mPEeEXQZp7jcZjeacAqiVSI1GwahSyZmVShmzUiFLEsml + erA7U/0zdKZbL1Tk/cVFjgeWhCBmTJFSyhQrZfRqtRxiSq3TKtwXl6og+8LVckNmcNeYRq8I7+09a66x + K6Ph043chgt3O7QX73Wgv8haUHPPFBQrPdzmDH7tQJOgJl+JgDsfwU9dBhk1TxNfpQKoVUiNRkmvVisZ + YpWCWalUMCsVIHmS6CnJSJJ265WJvPdP4qKLlVIBsYMYQiwhpjF8icrUezw2j3BKE++ApNY7cAnd2D15 + 35Dw6Y2yK/e1jX90aJvudKCgr/JqsJK0l+vYmeTSwwDQrooM6/PqGc4HWDL45epPXQbpMHaFhlqnVdPq + MKhV9Gq1ilGlUjHEKhVTrNSpUqk0kFip6NYrFikGDDEWByxWEDOIHcQQYKZub1C7TN+ogRhDArOfWraw + X+TXEX28UlcZuzIaN4t+aVDd6tCqf+9AcSlvtqE+KZ2XHgaAdlVkULuiv3A+8CsRnroMcvgn+ShsAA3A + rkXVSI0GE71GjW1St95w1WAgq5FaFIshxDK8+IgarNoBMcvgjw2VmieuDewd8GmKsRvzjM+YLxvqr7dr + pTc7ULJ2nGpBzTopPQwA7arIkHZVJOeDeCVCp5dB+qTXaRJ3NGio2xs0tDqtXqgG6dYbLYiRTlosdtQd + DZrEnY2awYylqInHGBR6JtsJ+eNMRi+P7DNiXJGJG7ORdxBtOHG1Q3vyWgfamRZtNSw9DADtqsiAdlV/ + 4Xw88zLI4YsKUbfPS0AaXO7deuNFjJfb56XoB2nZGJDwBHacJcg1jV0V1sd37nRIXM7RaQ0Ls2u1C7Nr + 0WdpQVY1ajFyzFOlhwGgXRUZ0P9Ez+V8TGMvxy+DhE3o1v+GTEelwouxqCVzY6hx6NJoY/eUHVA7wyDF + 2JWO+c7PI7z0MAC0qyLD+Z/qOZyPgCEzeZtd5tccJ/9x9269vXKZV314yEzeGjgCYRKxdOT7/p9EvOf9 + iW9Pz/le77inufVwT3Pt4TZn+N/pHc+Z7u94zjQ3APR16i+cD3jbBV7h8oNpIgVhJVAQFoOCsFIoCGsM + BWHBrTvdejsEMUumICyEgrBiwKLVu1ouJtFffvhe4ExaT/8pS3v6pWb09Etl9fRLTf8brevpl7qop19q + cE+/1H4GUL1uPcP5AKghU8PLtuB+BICtp4c7ioKworv11gjiBXELgf6IgrBG6F0tW9O4rwb2Cp3r9F7A + DNd3/acM7+kHSv34OTSsp1+qdU+/1H8ZAPUmiOR84JkajpzCiBx8argaATI2bAb8dnfr7RLcqgW9EYAM + iQqsWnC3oHd66n47/P3BzkSeEmIuB/m18DdEROcDhxpqavjSUFfDBoALAk0jbEi33h5BzECQnCCOkKjg + 9Txwt566h4MM6/OIDNKbJKLzAVDDl4UTegA2lCFwUg/sPXBDuvV2CRITQAxPXsjKkLDAsgWYsTdSOuGh + Uxks8v/whgnP1ESw4YsD3LAJIIC8W2+X8NhBHIkgY5n5fxloEP4FcbBxuLv1vyE8psQ4kxl4psjr/wBq + ewGg1MyM1QAAAABJRU5ErkJggg== + + + + + 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 + ewGg1MyM1QAAAABJRU5ErkJggg== + + + + + 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 + ewGg1MyM1QAAAABJRU5ErkJggg== + + + + <svg t="1741312782108" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4575" id="mx_n_1741312782109" width="200" height="200"><path d="M293.741714 570.148571l105.764572-206.482285a30.061714 30.061714 0 0 1 13.165714-13.019429 67.803429 67.803429 0 0 1 2.633143-2.706286c23.698286-7.899429 39.497143 0 55.222857 15.725715l104.594286 214.454857a37.010286 37.010286 0 0 1 3.218285 6.509714l50.029715 102.546286c7.899429 15.798857 0 39.497143-15.798857 55.222857-15.798857 7.899429-15.798857 7.899429-23.698286 7.899429-15.725714 0-31.524571-7.899429-31.524572-23.625143L514.925714 639.853714H341.430857L296.96 726.674286c0 15.725714-15.798857 23.625143-31.597714 23.625143-7.826286 0-15.725714 0-15.725715-7.899429-15.798857-7.826286-23.698286-31.524571-15.798857-55.222857l47.762286-93.184a37.156571 37.156571 0 0 1 12.141714-23.844572zM381.805714 561.005714h94.72l-46.226285-94.646857-48.493715 94.646857z m562.176 228.864c-23.698286 0-39.497143-15.798857-39.497143-39.497143v-670.72h-670.72c-23.625143 0-39.350857-15.725714-39.350857-39.424 0-23.625143 15.725714-39.424 39.424-39.424h670.72c47.323429 0 78.848 31.597714 78.848 78.921143v670.72c0 23.625143-15.798857 39.424-39.497143 39.424z m-189.44 165.668572h-39.424c-23.625143 0-39.497143-15.798857-39.497143-39.497143 0-23.625143 15.872-39.424 39.497143-39.424h39.497143V237.421714H115.492571v631.222857h299.812572c23.698286 0 39.497143 15.798857 39.497143 39.497143 0 23.625143-15.798857 39.497143-39.497143 39.497143h-299.885714c-47.250286 0-78.848-31.597714-78.848-78.994286v-631.222857C36.571429 190.171429 68.169143 158.573714 115.492571 158.573714h639.122286c47.323429 0 78.848 31.524571 78.848 78.848v639.122286c0 47.396571-31.524571 78.994286-78.848 78.994286z" fill="#07ecf4" p-id="4576"></path></svg> + + + <svg t="1736407844527" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="24963" id="mx_n_1736407844528" width="200" height="200"><path d="M512.6 1023.2c-69 0-135.9-13.5-198.9-40.2-60.8-25.7-115.5-62.6-162.4-109.5S67.6 772 41.8 711.2c-26.6-63-40.2-129.9-40.2-198.9s13.5-135.9 40.2-198.9c25.7-60.8 62.6-115.5 109.5-162.4S252.9 67.3 313.7 41.6C376.7 15 443.6 1.4 512.6 1.4s135.9 13.5 198.9 40.2c60.8 25.7 115.5 62.6 162.4 109.5s83.7 101.5 109.5 162.4c26.6 63 40.2 129.9 40.2 198.9s-13.5 135.9-40.2 198.9c-25.7 60.8-62.6 115.5-109.5 162.4S772.3 957.3 711.4 983c-63 26.7-129.9 40.2-198.8 40.2z m0-957.8c-246.4 0-446.9 200.5-446.9 446.9 0 246.4 200.5 446.9 446.9 446.9 246.4 0 446.9-200.5 446.9-446.9C959.4 265.9 759 65.4 512.6 65.4z" p-id="24964" fill="#00E9FF"></path><path d="M508.3 688.3c-68.4 0-132.7-26.6-181.1-75s-75-112.7-75-181.1 26.6-132.7 75-181.1 112.7-75 181.1-75c68.4 0 132.7 26.6 181.1 75s75 112.7 75 181.1-26.6 132.7-75 181.1-112.7 75-181.1 75z m0-448.2c-105.9 0-192.1 86.2-192.1 192.1 0 105.9 86.2 192.1 192.1 192.1 105.9 0 192.1-86.2 192.1-192.1 0-105.9-86.2-192.1-192.1-192.1z" p-id="24965" fill="#00E9FF"></path><path d="M209.6 915.2c-3.4 0-6.8-0.5-10.2-1.7-16.8-5.6-25.8-23.8-20.2-40.5 11.6-34.5 28.4-66.8 50-96.2 21.4-29 46.9-54.5 76-75.8 60.5-44.2 132.1-67.6 207.3-67.6 75.1 0 146.8 23.4 207.3 67.6 29.1 21.3 54.7 46.8 76 75.8 21.6 29.4 38.4 61.8 50 96.2 5.6 16.8-3.4 34.9-20.2 40.5-16.8 5.6-34.9-3.4-40.5-20.2-39.3-117.2-148.9-196-272.6-196-123.7 0-233.3 78.8-272.6 196-4.4 13.4-16.9 21.9-30.3 21.9z" p-id="24966" fill="#00E9FF"></path></svg> + + + <svg t="1736407617616" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21030" id="mx_n_1736407617617" width="200" height="200"><path d="M246.72704 716.8V563.072l39.296 153.728h46.08l39.424-153.728V716.8H422.40704V515.2H340.74304l-31.488 122.688-31.616-122.688h-81.92v201.6h51.008z m385.28 0v-45.632h-107.52v-39.744h96.896v-41.152H524.42304v-32h104.512V515.2H462.08704v201.6h169.92z m116.288 3.392c19.52 0 35.712-2.816 48.512-8.448 12.864-5.632 22.848-13.888 30.016-24.832a63.744 63.744 0 0 0 10.752-35.712 56.832 56.832 0 0 0-8.064-29.824 61.44 61.44 0 0 0-25.728-22.4c-11.776-5.952-31.296-11.904-58.496-17.792-11.008-2.304-17.984-4.736-20.928-7.424-3.008-2.56-4.48-5.44-4.48-8.64 0-4.416 1.792-8.128 5.44-11.2 3.648-3.072 9.152-4.608 16.384-4.608 8.768 0 15.68 2.048 20.672 6.208 4.992 4.096 8.32 10.688 9.856 19.776l58.688-3.456c-2.56-20.864-10.624-36.096-24.128-45.696-13.504-9.6-33.152-14.336-58.88-14.336-20.992 0-37.504 2.56-49.6 7.872a59.456 59.456 0 0 0-27.072 21.76 52.8 52.8 0 0 0-8.96 29.312 49.28 49.28 0 0 0 17.536 38.912c11.648 10.176 31.104 18.368 58.432 24.512 16.64 3.648 27.328 7.552 31.872 11.648a18.368 18.368 0 0 1 6.912 14.08 18.752 18.752 0 0 1-7.232 14.464 30.464 30.464 0 0 1-20.48 6.272 32.832 32.832 0 0 1-27.52-12.288 45.44 45.44 0 0 1-7.872-21.952l-59.264 3.712c1.728 20.352 9.216 37.12 22.4 50.304 13.248 13.184 36.928 19.84 71.232 19.84z" fill="#00E9FF" p-id="21031"></path><path d="M741.57504 906.048H282.43904a283.52 283.52 0 0 1-200.832-83.968A277.184 277.184 0 0 1 0.00704 623.616a280.512 280.512 0 0 1 161.92-252.224 360 360 0 0 1 340.48-243.2l5.888-0.064a170.88 170.88 0 0 1 14.336 0.064 360.512 360.512 0 0 1 339.392 243.2A280.512 280.512 0 0 1 1024.00704 623.488a277.376 277.376 0 0 1-81.536 198.592 283.584 283.584 0 0 1-200.832 83.84z m-281.92-74.88h281.92c55.552 0 108.8-22.208 147.712-61.824 38.976-39.232 60.16-90.816 59.84-145.28a205.632 205.632 0 0 0-118.208-184.64 58.24 58.24 0 0 1-37.632-37.632 287.488 287.488 0 0 0-101.76-142.592 282.624 282.624 0 0 0-169.856-56.128h-1.216l-1.152-0.064a84.16 84.16 0 0 0-8.96 0l-7.68 0.128A282.624 282.624 0 0 0 332.80704 259.2a287.488 287.488 0 0 0-102.016 142.528 58.24 58.24 0 0 1-37.696 37.632 205.632 205.632 0 0 0-118.144 184.64 202.624 202.624 0 0 0 59.776 145.28c38.976 39.616 92.16 61.888 147.712 61.824h177.216z" fill="#00E9FF" p-id="21032"></path></svg> + + + <svg t="1736401550361" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9328" width="200" height="200"><path d="M149.333333 469.333333h725.333334v85.333334H149.333333z" p-id="9329" fill="#ffffff"></path></svg> + + + <svg t="1736401591969" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12028" width="200" height="200"><path d="M240.512 180.181333l271.530667 271.488 271.530666-271.488a42.666667 42.666667 0 0 1 56.32-3.541333l4.010667 3.541333a42.666667 42.666667 0 0 1 0 60.330667l-271.530667 271.530667 271.530667 271.530666a42.666667 42.666667 0 0 1-56.32 63.872l-4.010667-3.541333-271.530666-271.530667-271.530667 271.530667-4.010667 3.541333a42.666667 42.666667 0 0 1-56.32-63.872l271.488-271.530666-271.488-271.530667a42.666667 42.666667 0 0 1 60.330667-60.330667z" fill="#ffffff" p-id="12029"></path></svg> + + + <svg t="1737110574910" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6992" width="200" height="200"><path d="M512 62.389956c-248.312412 0-449.610044 201.297632-449.610044 449.610044s201.297632 449.610044 449.610044 449.610044 449.610044-201.297632 449.610044-449.610044S760.312412 62.389956 512 62.389956zM786.507004 786.507004c-35.672454 35.672454-77.196173 63.672158-123.416867 83.222423-47.821145 20.22667-98.655927 30.482245-151.09116 30.482245-52.435233 0-103.270015-10.255575-151.09116-30.482245-46.220694-19.549242-87.744413-47.549969-123.416867-83.222423-35.672454-35.672454-63.672158-77.196173-83.222423-123.416867-20.22667-47.821145-30.482245-98.655927-30.482245-151.090137 0-52.435233 10.255575-103.270015 30.482245-151.09116 19.549242-46.220694 47.549969-87.744413 83.222423-123.416867 35.672454-35.672454 77.196173-63.672158 123.416867-83.222423 47.821145-20.22667 98.654904-30.482245 151.09116-30.482245 52.435233 0 103.268992 10.255575 151.09116 30.482245 46.220694 19.549242 87.744413 47.549969 123.416867 83.222423 35.672454 35.672454 63.672158 77.196173 83.222423 123.416867 20.22667 47.821145 30.482245 98.655927 30.482245 151.09116 0 52.435233-10.255575 103.268992-30.482245 151.090137C850.179163 709.310831 822.179458 750.83455 786.507004 786.507004z" p-id="6993"></path><path d="M727.558427 506.975567l-334.355067-252.891707c-3.868097-2.232854-8.702196 0.558725-8.702196 5.024433l0 505.782392c0 4.465708 4.834098 7.257288 8.702196 5.024433l334.355067-252.890684C731.426525 514.791579 731.426525 509.208421 727.558427 506.975567z" p-id="6994"></path></svg> + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABALADAACwAwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIACVEtDWFRNQ7RUTEPnVExD/lRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/dUTEPYVE1CklVOQCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUpAGFVLQsRUTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VE1D+lRNQnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVERA9UTELXVExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RLQ3oAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCmlRMQ/9UTEP/VExD/1RM + Q/9gWVD/fnhx/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8 + df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/4J8df+CfHX/gnx1/3Ru + Zv9XT0b/VExD/1RMQ/9UTEP/VExD/VVKRTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVKQBhUTEP7VExD/1RMQ/9VTUT/s7Cs//7+/v////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////+zr6v99d3D/VExD/1RMQ/9UTEP/U0xDqAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCYVRMQ/9UTEP/VExD/5iU + jv////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////Dw7/9eV07/VExD/1RMQ/9UTEPygICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABTS0OBVExD/1RMQ/9UTEP/zszJ//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4aBev9UTEP/VExD/1RM + Q/9RUUYWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RM + Q//d29n///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////lpGL/1RMQ/9UTEP/VExD/1VNQl1TS0REU0tERFNLRERTS0REU0tERFNL + RERTS0REU0tERFNLRERUTERATk47DQAAAAAAAAAAAAAAAAAAAAAAAAAAV0pDJlNLRERTS0REU0tERFNL + RERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNLRERTS0REU0tERFNL + RERVTUU/WU5DFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////////////////////// + /////////////////////////////////////////v39//v59//59vP/9/Tx//n39f/8+vn///////// + //////////////////////////////////////////////////////////////////+WkYv/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEPgVUdHEgAA + AAAAAAAAAAAAAFRMQmFUTEP9VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP9VUxDrFFRRhYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RM + Q/9UTEP/3dvZ///////////////////////////////////////////////////////+/v7/9vLv/+/o + 4v/q4Nn/6uDY/+rg2P/q4Nj/6uDY/+rg2P/s49v/8uzn//r49v////////////////////////////// + /////////////////////////////5aRi/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9ak5HBX8jLo1/Iy6NfyMujVmJd51RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD2lpLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////// + ////////////////////////9/Pw/+zj3P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY//Hq5P/8+vn/////////////////////////////////////////////////lpGL/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/UVBL/x2d + 6f8WqP//Fqj//xao//81eqH/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VE1EjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRM + Q/9UTEP/VExD/93b2f///////////////////////////////////////v7+//Ls5//q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+vh2v/49fP///////// + //////////////////////////////////+WkYv/VExD/1RMQ/9UTEP/PmSa/ztnp/85baf/M32n/zN9 + p/8zfaf/M32n/zN9p/8zfaf/M32n/zF/rP8gmuP/Fqj//xao//8WqP//Fqj//xan/v8qi8P/M32n/zN9 + p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/M32n/zN9p/8zfaf/N3Gn/ztn + p/87Z6f/O2en/z9jlf9TTUX/VExD/1RMQ/9UTEPpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////// + //////////////7+/v/v5+H/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/38/D//////////////////////////////////////5aR + i/9UTEP/VExD/1RMQ/8reeb/JYD//yGK//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8anP//JYD//yWA//8lgP//JYD//0dad/9UTEP/VExD/1RM + Q/9VVUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRN + Q4xUTEP/VExD/1RMQ//d29n/////////////////////////////////8evm/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rh + 2f/69/X/////////////////////////////////lpGL/1RMQ/9UTEP/VExD/yt55v8lgP//IYr//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xqe + //8lgP//JYD//yWA//8lgP//RV1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////// + //////////////fz8P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+zj3P/+/v3///////////////////////// + //+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA//8hiv//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Gp7//yWA//8lgP//JYD//yWA//9FXX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1FP1RNQ4xVTEOyVUxDu1VM + Q7tUTEPgVExD/1RMQ/9UTEP/3dvZ///////////////////////+/v7/7OTc/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY//Xw7P///////////////////////////5aRi/9UTEP/VExD/1RMQ/8reeb/JYD//yGK + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8anv//JYD//yWA//8lgP//JYD//0Vdf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAV0lCI1RMQ8JUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ//d29n///////// + //////////////by7v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6+Ha//7+/f////////////// + ////////lpGL/1RMQ/9UTEP/VExD/yt55v8lgP//IYr//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xqe//8lgP//JYD//yWA//8lgP//RV1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVKRC1UTEPsVExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/93b2f//////////////////////7+ji/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/+PXy//////////////////////+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA + //8hiv//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Gp7//yWA//8lgP//JYD//yWA//9FXX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABNTU0KVExD3VRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/3dvZ//// + //////////////79/P/q4Nn/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/y7Of///////// + /////////////5aRi/9UTEP/VExD/1RMQ/8reeb/JYD//yGK//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8anv//JYD//yWA//8lgP//JYD//0Vd + f/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRLQndUTEP/VExD/1RMQ/9UTEP1VUxDclhP + Rh0AAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n/////////////////+/j3/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/4tnR/8W9tv/Kwrv/6N3V/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/d1Mz/w7y1/8/G + v//q4Nj/6uDY/+rg2P/q4Nj/6uDY/+/n4P//////////////////////lpGL/1RMQ/9UTEP/VExD/yt5 + 5v8lgP//IYr//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xqe//8lgP//JYD//yWA//8lgP//RV1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxC01RMQ/9UTEP/VExD/1NNRFMAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b + 2f/////////////////49fP/6uDY/+rg2P/q4Nj/6uDY/+rg2P+up6L/oZuW/6Gblv+/uLL/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/5dvU/6afm/+hm5b/oZuW/83Fvv/q4Nj/6uDY/+rg2P/q4Nj/7OTc//// + //////////////////+WkYv/VExD/1RMQ/9UTEP/K3nm/yWA//8hiv//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao + //8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Fqj//xao//8WqP//Gp7//yWA//8lgP//JYD//yWA + //9FXX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVOQlUTEP/VExD/1RMQ/9UTEPRAAAAAAAA + AAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////f08f/q4Nj/6uDY/+rg + 2P/q4Nj/6d/X/6Ocl/+hm5b/oZuW/7Kspv/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/d1Mz/oZuW/6Gb + lv+hm5b/wLmy/+rg2P/q4Nj/6uDY/+rg2P/r4tr//////////////////////5aRi/9UTEP/VExD/1RM + Q/8mnOH/H6n5/ymw9f9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL + 4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL4v9Xy+L/V8vi/1fL + 4v9Xy+L/V8vi/1fL4v9Fwej/H6j4/x+o+P8fqPj/H6j4/0Npff9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1EHlRMQ/9UTEP/VExD/1RMQ6QAAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RM + Q//d29n/////////////////+fb0/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/w7u1/6Gblv+jnZj/08rD/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+nf1/+3r6r/oZuW/6ahm//d1Mz/6uDY/+rg2P/q4Nj/6uDY/+3l + 3v//////////////////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0 + //8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f/////////////////7+vj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/4tnR/+Xc1P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/i2ND/6N3V/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/7+ji//////////////////////+WkYv/VExD/1RM + Q/9UTEP/C6bm/wC0//8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RM + Q/9UTEP/3dvZ///////////////////////s4tv/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/07+v//////////////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0 + //8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////Lr + 5v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY//v59///////////////////////lpGL/1RM + Q/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRM + Q/9UTEP/VExD/93b2f//////////////////////+vf1/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/u5t////////////////////////////+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0//8Quf//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0 + //8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//////////////////// + ////////8Onj/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY//n29P///////////////////////////5aR + i/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRN + Q4xUTEP/VExD/1RMQ//d29n////////////////////////////8+vn/6+Ha/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/x6uT/////////////////////////////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC + //8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////// + ///////////////////49fP/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/7eXe//79/f////////////////////////////// + //+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0//8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AABUTUOMVExD/1RMQ/9UTEP/3dvZ///////////////////////////////////////38+//6uDZ/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+3l + 3v/8+/r//////////////////////////////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5 + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////// + ///////////////////////////////////59/X/7OPb/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg + 2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/w6eT//v39//////////////////////////////////// + ////////lpGL/1RMQ/9UTEP/VExD/wum5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAVE1DjFRMQ/9UTEP/VExD/93b2f////////////////////////////////////////////// + ///+/v3/9fHt/+vi2v/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/q4Nj/6uDY/+rg2P/t5d7/+PXy//// + //////////////////////////////////////////////////+WkYv/VExD/1RMQ/9UTEP/C6bm/wC0 + //8Quf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAABUTUOMVExD/1RMQ/9UTEP/3dvZ//// + /////////////////////////////////////////////////////////v39//j08v/x6+b/7ubg/+zj + 3P/r4tr/7eXe/+/o4v/07+v/+/n3//////////////////////////////////////////////////// + /////////////5aRi/9UTEP/VExD/1RMQ/8Lpub/ALT//xC5//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zlt + f/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAFRNQ4xUTEP/VExD/1RMQ//d29n///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////lpGL/1RMQ/9UTEP/VExD/wum + 5v8AtP//ELn//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAVEtEi1RMQ/9UTEP/VExD/9vZ + 1/////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+Uj4n/VExD/1RMQ/9UTEP/C6fn/wC0//8Ruf//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0 + //85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUR4VExD/1RMQ/9UTEP/wL26//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////3hxav9UTEP/VExD/1RM + Q/8EsPb/ALT//xa7//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAFRNQkZUTEP/VExD/1RM + Q/9ybGT/+vn5//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////PzMr/VU1E/1RMQ/9UTEP/R1xf/wC0//8AtP//Hr3//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0 + //8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAVVVVBlRMQ+RUTEP/VExD/1RMQ/90bWb/xcK//+Tj4v/o5+b/6Ofm/+jn + 5v/o5+b/6Ofm/+no5//8+/v////////////////////////////7+/v/6Ofm/+jn5v/o5+b/6Ofm/+jn + 5v/o5+b/6Ofm/+jn5v/o5+b/6Ofm/+jn5v/o5+b/6Ofm/+jn5v/Z2Nb/qqah/1lSSf9UTEP/VExD/1RM + Q/8qgaL/ALT//wC0//8xwv//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExDW1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/2hhWf/r6un///////// + ////////5uTj/2VeVf9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/SlhZ/wSv9f8AtP//B7b//0HH//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0 + //8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1EiFRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/6Cbltz///+7////u////7uYlI7fVExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/01U + Uv8QoNz/ALT//wC0//8pwf//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAU0tDX1RMQ+dUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VE1ETwAA + AAAAAAAAAAAAAFRMQ1tUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/88anj/C6fn/wC0//8AtP//E7n//0LI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0 + //8AtP//ALT//wC0//85bX//VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYEBACFNMQk1UTESAVExEl1NN + Q5lTTUOZU01DmVNNQ5lTTUOZVEtDlVNNRFYAAAAAAAAAAAAAAAAAAAAAAAAAAVNLQ1xTTUKWU01DmVNN + Q5lUTEPeVExD/1RMQ/9UTEP/NXKI/zJ2jv8ydo7/MnaO/zJ2jv8ydo7/MnaO/y96lv8lhqz/DqPf/wC0 + //8AtP//ALT//xC5//9Ax///Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ/8GrfH/ALT//wC0 + //8AtP//ALT//wC0//8AtP//ALT//wC0//8AtP//ALT//wG0//8dvP//Qcf//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC + //8AtP//ALT//wC0//8AtP//OW1//1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD/wat8f8AtP//ALT//wC0//8AtP//ALT//wC0//8AtP//ALT//we2 + //8cvP//OMX//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//McL//wC0//8AtP//ALT//wC0//85bX//VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/OLvx/zbE + //82xP//NsT//zbE//82xP//NsT//zfF//89x///Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //8xwv//ALT//wC0//8AtP//ALT//zltf/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ/9Ev/H/Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//zHC//8AtP//ALT//wC0//8AtP//OW1//1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8Pm + 2//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy5//M8uf/zPLn/8zy + 5//M8uf/xPHR/8r4kf/K+JH/yviR/8r4kf95g1z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////0/P////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////r+f//0PI//+S3/////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////+N3v//Q8j//0TI + ///Q8f////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////6nm//9DyP//Q8j//17Q///5/f////////////////////////// + //////////////////////////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////xe7//0PI + //9DyP//Q8j//57j//////////////////////////////////////////////////////////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i9///Q8j//0PI//9DyP//Rsn//9z1//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v+ + //9Hyf//Q8j//0PI//9DyP//a9T///3+//////////////////////////////////////////////// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////1/Q//9DyP//Q8j//0PI//9DyP//r+j///// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////fNn//0PI//9DyP//Q8j//0PI//9Ny///6vn///////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////+Y4f//Q8j//0PI//9DyP//Q8j//0PI + //962P////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////7Xp//9DyP//Q8j//0PI//9DyP//Q8j//0PI///C7f////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////0fL//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//1XN///z/P////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////A7f//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//47e//////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + ////////xu7//3jY//911///ddf//3XX//911///ddf//3XX//911///cdb//0nK//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//RMj//9Ly//////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////9v1f//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//YNH///r9 + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + /////////////7Xp//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//oOP///////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + /////////////////////////////////////////////////////////v///3TW//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9Hyf//3/b/////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + ////////////////////////4/f//0nK//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9s1P///v////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + ////////////////////////////////////////////////////////////////////////o+T//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//+y6f////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + ///////////////////////////////////7/v//Y9H//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//07L///t+v////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv+Rnlr/VExD/1RM + Q/9UTEPpgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + ///V8///RMj//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9DyP//Q8j//7fq//////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/9D0c/+Iklf/bGpS4lRLQz0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRM + Q/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////+S3///Q8j//0PI//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9f0P//gtr//4La//+C2v//gtr//4La//+C2v//gtr//4La//+N3v//8vv///// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/e+JeTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + //////////////X8//9Yzv//Q8j//0PI//9DyP//Q8j//0PI//9DyP//Vc3///r9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/974l5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVN + RiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + /////////////////////////////////////////////////////////////8Xu//9DyP//Q8j//0PI + //9DyP//Q8j//0PI//9bz/////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/3viXkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + /////////////////////////////3/a//9DyP//Q8j//0PI//9DyP//Q8j//0TI///5/f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/1/x1/6CxYP+Bg17OVU1GIQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + ////////////////////////////////////////////////////////////////////////7fr//0/L + //9DyP//Q8j//0PI//9DyP//Q8j//9/2//////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv+bq17/VExD/1RMQ/9UTEPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////sun//0PI//9DyP//Q8j//0PI//9DyP//wu3///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/3+GU/9UTEP/VExD/1RMQ/9VREQPAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///+////b9X//0PI//9DyP//Q8j//0PI//+l5f////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD//Ly8f////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////i9///Scr//0PI//9DyP//Q8j//4jc + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVNRiFUTEP/VExD/1RMQ/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+h4///Q8j//0PI//9DyP//bNT///////////////////////////////////// + ///////////////////////////////////////////////////////////////////1/9v/2f92/9n/ + dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RM + RJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////v+//9i0f//Q8j//0PI + //9Py/////////////////////////////////////////////////////////////////////////// + //////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUYhVExD/1RMQ/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////9bz//9EyP//Q8j//0PI///v+v////////////////////////// + ////////////////////////////////////////////////////////////////////////9f/b/9n/ + dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVNRiFUTEP/VExD/1RM + Q/9UTESeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////4/e + //9DyP//Q8j//9Py//////////////////////////////////////////////////////////////// + ///////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVU1GIVRMQ/9UTEP/VExD/1RMRJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9Pz//17Q//9Vzf//6vn///////////////////// + //////////////////////////////////////////////////////////////////////////////X/ + 2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUYhVExD/1RM + Q/9UTEP/VExEngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////v////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABSR0cZU0xDilRMQ95UTEP/VExD/1RMQ/9UTEP4VExDtlRNRE8AAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUtEaVRMQ/ZUTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQsBSSUAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFNMQodUTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q+RXSUIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly + 8f////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9f/b/9n/dv/Z/3b/2f92/9n/dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTUNjVExD/1RMQ/9UTEP/VExD/1VN + RP9UTEP/VExD/1RMQ/9VTUT/VExD/1RMQ/9UTEP/VExD/1NMQ9ZVVTkJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/8vLx//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36F + U/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUdHElRMQ/JUTEP/VExD/1RMQ/92bmf/wLy6/1RMQ/9UTEP/VExD/4+Ig/+jn5v/V09G/1RM + Q/9UTEP/VExD/1RMQn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RM + Q//y8vH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////X/2//Z/3b/2f92/9n/dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEN5VExD/1RMQ/9UTEP/cmtk/93Z + 2f/j4OD/iIJ8/1RMQ/9dVU3/x8TC/+Pg4P+zrqv/VExD/1RMQ/9UTEP/VExD7WBAQAgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD//Ly8f////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9f/b/9n/dv/Z/3b/2f92/9n/ + dv9+hVP/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ8dUTEP/VExD/1RMQ//Fwb//4+Dg/+Pg4P/j4OD/z8vJ/9vZ2P/j4OD/4+Dg/+Pg + 4P97dG7/VExD/1RMQ/9UTEP/U0tERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RM + Q/9UTEP/8vLx//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////1/9v/2f92/9n/dv/Z/3b/2f92/36FU/9UTEP/VExD/1RMQ/9aSzwRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExD+FRMQ/9UTEP/aGFa/+Pg + 4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/66ppv9UTEP/VExD/1RMQ/9UTEN2AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//y8vH///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////X/2//Z/3b/2f92/9n/ + dv/Z/3b/foVT/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE5OOw1UTEP/VExD/1RMQ/99dnD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/w8C+/1RMQ/9UTEP/VExD/1RLRIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRM + Q/9UTEP/VExD/97yqf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/sf/p/7H/6f+x/+n/ + sf/p/7H/6f+x/+n/sf/p/7H/5Pun/9r1j//a9Y//2vWP/9r1j/9+glv/VExD/1RMQ/9UTEP/Wks8EQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWks8EVRMQ/9UTEP/VExD/4F7 + df/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/IxMP/VExD/1RMQ/9UTEP/VE1EjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/S92//v+Bd/7/g + Xf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABaSzwRVExD/1RMQ/9UTEP/gXt1/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/4+Dg/8jEw/9UTEP/VExD/1RMQ/9UTUSPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVM + Q6xUTEP/VExD/1RMQ//P8nL/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RMQ/9UTEP/VExD/1pL + PBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEP/VExD/1RM + Q/+Be3X/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/yMTD/1RMQ/9UTEP/VExD/1RN + RI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/ycv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/0vdv/7/g + Xf+/4F3/v+Bd/7/gXf92e0z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWks8EVRMQ/9UTEP/VExD/4F7df/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg + 4P/j4OD/4+Dg/+Pg4P/IxMP/VExD/1RMQ/9UTEP/VE1EjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/S92//v+Bd/7/gXf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RM + Q/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaSzwRVExD/1RM + Q/9UTEP/gXt1/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/+Pg4P/j4OD/4+Dg/8jEw/9UTEP/VExD/1RM + Q/9UTUSPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//P8nL/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3 + b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RMQ/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEP/VExD/1RMQ/9lXlf/jYiC/42Igv+NiIL/jYiC/42I + gv+NiIL/jYiC/42Igv+NiIL/g3x2/1RMQ/9UTEP/VExD/1RNRI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/ycv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/0vdv/7/gXf+/4F3/v+Bd/7/gXf92e0z/VExD/1RM + Q/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWks8EVRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VE1EjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVTEOsVExD/1RMQ/9UTEP/z/Jy/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/S92//v+Bd/7/gXf+/4F3/v+Bd/3Z7TP9UTEP/VExD/1RMQ/9aSzwRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJSUkHVExD+1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9TS0OBAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFVMQ6xUTEP/VExD/1RMQ//P8nL/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9L3b/+/4F3/v+Bd/7/gXf+/4F3/dntM/1RM + Q/9UTEP/VExD/1pLPBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABUTEKDVExD/lRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD4FJKQh8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUxDrFRMQ/9UTEP/VExD/8/y + cv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/0vdv/7/gXf+/4F3/v+Bd/7/gXf92e0z/VExD/1RMQ/9UTEP/Wks8EQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVR0cSVExDkVRMQ/9UTEP/VExD/1NN + QllTS0QiU0tEIlNLRCJTS0QiVExDyVRMQ/9UTEP/VExD/lJKQh9VVVUDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUTEOrVExD/1RMQ/9UTEP/zfBy/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/ + dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/Z/3b/2f92/9n/dv/R9nD/v+Bd/7/gXf+/4F3/v+Bd/3V5 + S/9UTEP/VExD/1RMQ/9VREQPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABUTESAVExD/1RMQ/9UTEP/VExEQAAAAAAAAAAAAAAAAAAAAABUTELAVExD/1RM + Q/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNMRJNUTEP/VExD/1RM + Q/+Ml1n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XPaf+1z2n/tc9p/7XP + af+1z2n/tc9p/6zFYP+iuFb/orhW/6K4Vv+ZrVT/WVRE/1RMQ/9UTEP/VExD9AAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMRIBUTEP/VExD/1RM + Q/9UTERAAAAAAAAAAAAAAAAAAAAAAFRMQsBUTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVUpDSFRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9US0KpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVExEgFRMQ/9UTEP/VExD/1RMREAAAAAAAAAAAAAAAAAAAAAAVExCwFRM + Q/9UTEP/VExD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVUxEtVRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD8VNMRSUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTESAVExD/1RM + Q/9UTEP/VExEQAAAAAAAAAAAAAAAAAAAAABUTELAVExD/1RMQ/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdRkYLVEtCqVRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ91TSkE3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMRIBUTEP/VExD/1RMQ/9UTERAAAAAAAAAAAAAAAAAAAAAAFRM + QsBUTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVUpELVNLQ59UTEP/VExD/1RMQ/95cGj/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+Gfv+Phn7/j4Z+/4+G + fv+Phn7/j4Z+/4+Gfv+Phn7/YlpR/1RMQ/9UTEP/VExD/1RLQ3pTTEJNVVVVBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVExCf1RM + Q/9UTEP/VExD/1VNRT8AAAAAAAAAAAAAAAAAAAAAVExCwFRMQ/9UTEP/VExD/gAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVU1CYFRMQ/9UTEP/VExD/6Oa + kf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf9zamL/VExD/1RM + Q/9UTEP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTTURWVExD/1RMQ/9UTEP5WE5FGgAAAAAAAAAAAAAAAAAA + AABTTUKWVExD/1RMQ/9VTELTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVTUJgVExD/1RMQ/9UTEP/o5qR/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LIwf/SyMH/0sjB/9LI + wf/SyMH/0sjB/9LIwf/SyMH/0sjB/3NqYv9UTEP/VExD/1RMQ/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAFUS0J3VUxDr1VLQU4AAAAAAAAAAAAAAAAAAAAAAAAAAFpLPBFUTEOUVExDp1VPQyoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRLQlVUTEP/VExD/1RM + Q/+AeG//ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mv + p/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mv + p/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+5r6f/ua+n/7mvp/+zqaL/YFhP/1RM + Q/9UTEP/VExD8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWFBAIFRMQ/5UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEK8AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0xEolRM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/VVNQkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdRkYLVUxDslRMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/dVTUNjAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUkpCPlRMRIBUTUSIVE1EiFRNRIhUTUSIVE1EiFRNRIhUTUSIVE1EiFRMQ/ZUTEP/VExD/2BY + UP+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GWjf+hlo3/oZaN/6GW + jf+hlo3/oZaN/5GHfv9UTEP/VExD/1RMQ/9UTEPJVE1EiFRNRIhUTUSIVE1EiFRNRIhUTUSIVE1EiFRN + RIhTTUNuVUxCGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVExD61RMQ/9UTEP/cWde//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/1snB/1RMQ/9UTEP/VExD/1RL + RIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEPrVExD/1RM + Q/9xZ17/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/WycH/VExD/1RMQ/9UTEP/VEtEiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRMQupUTEP/VExD/21kW//46uH/+Orh//jq4f/46uH/+Orh//jq + 4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh//jq4f/46uH/+Orh/9THvv9UTEP/VExD/1RM + Q/9TTEOKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVE1D0lRM + Q/9UTEP/VExD/3lwZ/+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2bf+Adm3/gHZt/4B2 + bf+Adm3/gHZt/4B2bf+Adm3/aWBX/1RMQ/9UTEP/VExD/1NNRHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUTEJ/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTUP6U0tEIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1G + RgtUTETMVExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RNQnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVQAxUTEOJVExD4VRMQ/5UTEP/VExD/1RM + Q/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD/1RMQ/9UTEP/VExD+FRN + RMhUS0RSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/////4AAAAAH//////////////8AAAAAA//////////////+AAAAAAH/ + /////////////gAAAAAA//////////////wAAAAAAP/////////////8AAAAAAB//////////////AAA + AAAAf/////////////wAAAAAAAAPgAAB///////8AAAAAAAABwAAAH///////AAAAAAAAAAAAAA///// + //wAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAD///////AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAA + H//////8AAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAf/////gAAAAAAAAAAAAAAH/////wAAAAAAAAA + AAAAAB/////4AAAAAAAAAAAAAAAf////+AwAAAAAAAAAAAAAH/////g8AAAAAAAAAAAAAB/////wfAAA + AAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf//// + 8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAA + H/////B8AAAAAAAAAAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAA + AAAAAB/////wfAAAAAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfAAA + AAAAAAAAAAAf////8HwAAAAAAAAAAAAAH/////B8AAAAAAAAAAAAAB/////wfgAAAAAAAAAAAAAf//// + 8H8AAAAAAAAAAAAAH/////B/gAOAAAAAAAAAAB/////wf8AHgAAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAA + AAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAA + AAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////wf////AAAAAAAAAA/////8H////wAAAAAAAAAf/////B////8AAAA + AAAAAH/////wf////AAAAAAAAAB/////8H////wAAAAAAAAAP/////B////8AAAAAAAAAD/////wf/// + /AAAAAAAAAAf////8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf//// + 8H////wAAAAAAAAAH/////B////8AAAAAAAAAB/////wf////AAAAAAAAAAf////8H////wAAAAAAAAA + H/////B////8AAAAAAAAAB/////AD////AAAAAAAAAAf////gAf///wAAAAAAAAAH////wAD///8AAAA + AAAAAB////4AAf///AAAAAAAAAAf///8AAH///wAAAAAAAAAH////AAA///8AAAAAAAAAB////wAAP// + /AAAAAAAAAAf///8AAD///wAAAAAAAAAH///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4 + AAD///wAAAAAAAAAH///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4AAD///wAAAAAAAAA + H///+AAA///8AAAAAAAAAB////gAAP///AAAAAAAAAAf///4AAD///wAAAAAAAAAH////AAA///8AAAA + AAAAAB////4AAf///AAAAAAAAAAf////B4f///wAAAAAAAAAH////weH///8AAAAAAAAAD////8Hh/// + /AAAAAAAAAA/////B4f///4AAAAAAAAAf////weH////gAAAAAAAAP////8Hh////8AAAAAAAAf///// + B4f////AAAAAAAAH/////w+H////wAAAAAAAB////////////8AAAAAAAAf////////////gAAAAAAAH + ////////////4AAAAAAAD/////////////gAAAAAAB///////////////gAAAH////////////////4A + AAB////////////////+AAAAf////////////////gAAAH////////////////4AAAB///////////// + ///+AAAA/////////////////wAAAf////8= + + + \ No newline at end of file diff --git a/LargeSquareOne/FrmMesParamMsgBoxWithAck.Designer.cs b/LargeSquareOne/FrmMesParamMsgBoxWithAck.Designer.cs new file mode 100644 index 0000000..5226b88 --- /dev/null +++ b/LargeSquareOne/FrmMesParamMsgBoxWithAck.Designer.cs @@ -0,0 +1,197 @@ +namespace LargeSquareOne +{ + partial class FrmMesParamMsgBoxWithAck + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + this.btn_Close = new System.Windows.Forms.Button(); + this.btn_Sure = new System.Windows.Forms.Button(); + this.btn_Cancel = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.lblMessage = new System.Windows.Forms.Label(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // btn_Close + // + this.btn_Close.BackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(569, 14); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 2; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = false; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // btn_Sure + // + this.btn_Sure.BackColor = System.Drawing.Color.Green; + this.btn_Sure.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Sure.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Sure.ForeColor = System.Drawing.Color.White; + this.btn_Sure.Location = new System.Drawing.Point(159, 358); + this.btn_Sure.Name = "btn_Sure"; + this.btn_Sure.Size = new System.Drawing.Size(101, 36); + this.btn_Sure.TabIndex = 13; + this.btn_Sure.Text = "确定"; + this.btn_Sure.UseVisualStyleBackColor = false; + this.btn_Sure.Click += new System.EventHandler(this.btn_Sure_Click); + // + // btn_Cancel + // + this.btn_Cancel.BackColor = System.Drawing.Color.Red; + this.btn_Cancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Cancel.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Cancel.ForeColor = System.Drawing.Color.White; + this.btn_Cancel.Location = new System.Drawing.Point(329, 358); + this.btn_Cancel.Name = "btn_Cancel"; + this.btn_Cancel.Size = new System.Drawing.Size(101, 36); + this.btn_Cancel.TabIndex = 14; + this.btn_Cancel.Text = "取消"; + this.btn_Cancel.UseVisualStyleBackColor = false; + this.btn_Cancel.Click += new System.EventHandler(this.btn_Cancel_Click); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.Image = global::LargeSquareOne.Properties.Resources.黄色_警告; + this.pictureBox1.Location = new System.Drawing.Point(12, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(45, 37); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 16; + this.pictureBox1.TabStop = false; + // + // lblMessage + // + this.lblMessage.AutoSize = true; + this.lblMessage.BackColor = System.Drawing.Color.Transparent; + this.lblMessage.Font = new System.Drawing.Font("思源黑体 CN Bold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lblMessage.ForeColor = System.Drawing.Color.Red; + this.lblMessage.Location = new System.Drawing.Point(63, 20); + this.lblMessage.Name = "lblMessage"; + this.lblMessage.Size = new System.Drawing.Size(42, 23); + this.lblMessage.TabIndex = 15; + this.lblMessage.Text = "提示"; + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToDeleteRows = false; + this.dataGridView1.AllowUserToResizeColumns = false; + this.dataGridView1.AllowUserToResizeRows = false; + this.dataGridView1.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.dataGridView1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dataGridView1.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle2; + this.dataGridView1.EnableHeadersVisualStyles = false; + this.dataGridView1.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(146)))), ((int)(((byte)(235))))); + this.dataGridView1.Location = new System.Drawing.Point(12, 64); + this.dataGridView1.MultiSelect = false; + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.ReadOnly = true; + this.dataGridView1.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dataGridView1.RowHeadersVisible = false; + this.dataGridView1.RowHeadersWidth = 45; + this.dataGridView1.RowTemplate.Height = 23; + this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView1.Size = new System.Drawing.Size(589, 278); + this.dataGridView1.TabIndex = 17; + this.dataGridView1.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dataGridView1_RowPostPaint); + // + // FrmMesParamMsgBoxWithAck + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(616, 410); + this.Controls.Add(this.dataGridView1); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.lblMessage); + this.Controls.Add(this.btn_Cancel); + this.Controls.Add(this.btn_Sure); + this.Controls.Add(this.btn_Close); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmMesParamMsgBoxWithAck"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmMsgBoxWithAck"; + this.Load += new System.EventHandler(this.FrmMesParamMsgBoxWithAck_Load); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.Button btn_Sure; + private System.Windows.Forms.Button btn_Cancel; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label lblMessage; + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmMesParamMsgBoxWithAck.cs b/LargeSquareOne/FrmMesParamMsgBoxWithAck.cs new file mode 100644 index 0000000..aa1f8c8 --- /dev/null +++ b/LargeSquareOne/FrmMesParamMsgBoxWithAck.cs @@ -0,0 +1,84 @@ +using Language; +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 LargeSquareOne +{ + public partial class FrmMesParamMsgBoxWithAck : MultiLanguageForm + { + + DataTable dataTable = new DataTable(); + string strLblMessage = ""; + + public FrmMesParamMsgBoxWithAck(DataTable _dataTable, string _strLblMessage) + { + InitializeComponent(); + + this.TopMost = true; + + dataTable = _dataTable; + strLblMessage = _strLblMessage; + this.Text = _strLblMessage; + } + + private void btn_Sure_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void btn_Cancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.No; + this.Close(); + } + + private void btn_Close_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + private void FrmMesParamMsgBoxWithAck_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = dataTable; + lblMessage.Text = strLblMessage; + } + + private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //自动编号,与数据无关 + Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, + e.RowBounds.Location.Y, + dataGridView1.RowHeadersWidth - 4, + e.RowBounds.Height); + TextRenderer.DrawText(e.Graphics, + (e.RowIndex + 1).ToString(), + dataGridView1.RowHeadersDefaultCellStyle.Font, + rectangle, + dataGridView1.RowHeadersDefaultCellStyle.ForeColor, + TextFormatFlags.VerticalCenter | TextFormatFlags.Right); + } + } +} diff --git a/LargeSquareOne/FrmMesParamMsgBoxWithAck.resx b/LargeSquareOne/FrmMesParamMsgBoxWithAck.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/FrmMesParamMsgBoxWithAck.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmMonitor.Designer.cs b/LargeSquareOne/FrmMonitor.Designer.cs new file mode 100644 index 0000000..8f31203 --- /dev/null +++ b/LargeSquareOne/FrmMonitor.Designer.cs @@ -0,0 +1,830 @@ +namespace LargeSquareOne +{ + partial class FrmMonitor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMonitor)); + JinYuan.Models.ElectricEnergy electricEnergy1 = new JinYuan.Models.ElectricEnergy(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series(); + this.imageList1 = new System.Windows.Forms.ImageList(this.components); + this.MainPanel = new JinYuan.ControlLib.PanelEnhanced(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tabMeters = new HML.TabControlPlus(); + this.tabPagePlus1 = new HML.TabPagePlus(); + this.EyMaterH1 = new JinYuan.ControlLib.UCElectricityMeterV(); + this.tabPagePlus2 = new HML.TabPagePlus(); + this.panelExt1 = new JinYuan.ControlLib.PanelExt(); + this.gpCapacityBox = new JinYuan.ControlLib.GroupBoxEX(); + this.Chart12HourTotal = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panelExt2 = new JinYuan.ControlLib.PanelExt(); + this.gpAlarmBox = new JinYuan.ControlLib.GroupBoxEX(); + this.chartAlarmData = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.gpNgBox = new JinYuan.ControlLib.GroupBoxEX(); + this.chartNgShow = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panelExt3 = new JinYuan.ControlLib.PanelExt(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.titleModeName = new JinYuan.ControlLib.TitleTime(); + this.panel5 = new System.Windows.Forms.Panel(); + this.proUtilizationRate = new JinYuan.ControlLib.ProcessEllipse(); + this.label6 = new System.Windows.Forms.Label(); + this.proPPM = new JinYuan.ControlLib.ProcessEllipse(); + this.proTotalQty = new JinYuan.ControlLib.ArrTotalQty(); + this.lblOkTotal = new System.Windows.Forms.Label(); + this.proOKRatio = new HML.ArcProgress(); + this.lblTotalQty = new System.Windows.Forms.Label(); + this.proOKQty = new JinYuan.ControlLib.ProcessEllipse(); + this.lblRate = new System.Windows.Forms.Label(); + this.lblUtilizationRate = new System.Windows.Forms.Label(); + this.titleRunTime = new JinYuan.ControlLib.TitleTime(); + this.titleEqp_code = new JinYuan.ControlLib.TitleTime(); + this.titleFactory_code = new JinYuan.ControlLib.TitleTime(); + this.titleLine_No = new JinYuan.ControlLib.TitleTime(); + this.titleStartTime = new JinYuan.ControlLib.TitleTime(); + this.MainPanel.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.tabMeters.SuspendLayout(); + this.tabPagePlus1.SuspendLayout(); + this.panelExt1.SuspendLayout(); + this.gpCapacityBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.Chart12HourTotal)).BeginInit(); + this.panelExt2.SuspendLayout(); + this.gpAlarmBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chartAlarmData)).BeginInit(); + this.gpNgBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chartNgShow)).BeginInit(); + this.panelExt3.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.panel5.SuspendLayout(); + this.SuspendLayout(); + // + // imageList1 + // + this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); + this.imageList1.TransparentColor = System.Drawing.Color.Transparent; + this.imageList1.Images.SetKeyName(0, "info.png"); + this.imageList1.Images.SetKeyName(1, "warning.png"); + this.imageList1.Images.SetKeyName(2, "error.png"); + // + // MainPanel + // + this.MainPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.MainPanel.Controls.Add(this.tableLayoutPanel1); + this.MainPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainPanel.Location = new System.Drawing.Point(0, 0); + this.MainPanel.Margin = new System.Windows.Forms.Padding(0); + this.MainPanel.Name = "MainPanel"; + this.MainPanel.Size = new System.Drawing.Size(1874, 818); + this.MainPanel.TabIndex = 0; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F)); + this.tableLayoutPanel1.Controls.Add(this.tabMeters, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.panelExt1, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.panelExt2, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.gpNgBox, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.panelExt3, 1, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 23.64294F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 27.38239F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.28468F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 32.56936F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1874, 818); + this.tableLayoutPanel1.TabIndex = 37; + // + // tabMeters + // + this.tabMeters.ContentBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.tabMeters.Controls.Add(this.tabPagePlus1); + //this.tabMeters.Controls.Add(this.tabPagePlus2); + this.tabMeters.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabMeters.Location = new System.Drawing.Point(3, 3); + this.tabMeters.Name = "tabMeters"; + this.tabMeters.Picker.ItemFont = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tabMeters.Size = new System.Drawing.Size(618, 187); + this.tabMeters.TabBarBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabMeters.TabIndex = 23; + this.tabMeters.TabItemAutoWidth = true; + this.tabMeters.TabItemBackEnterColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabMeters.TabItemBackNormalColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabMeters.TabItemBackSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.tabMeters.TabItemFont = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.tabMeters.TabItemIcoSize = new System.Drawing.Size(32, 32); + this.tabMeters.TabItemSize = new System.Drawing.Size(150, 30); + // + // tabPagePlus1 + // + this.tabPagePlus1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabPagePlus1.Controls.Add(this.EyMaterH1); + this.tabPagePlus1.Location = new System.Drawing.Point(1, 31); + this.tabPagePlus1.Name = "tabPagePlus1"; + this.tabPagePlus1.Padding = new System.Windows.Forms.Padding(3); + this.tabPagePlus1.Size = new System.Drawing.Size(616, 155); + this.tabPagePlus1.TabIndex = 0; + this.tabPagePlus1.Text = "Meter1"; + // + // EyMaterH1 + // + this.EyMaterH1.BackColor = System.Drawing.Color.Transparent; + this.EyMaterH1.Dock = System.Windows.Forms.DockStyle.Fill; + electricEnergy1.AccumulatedElectricity = null; + electricEnergy1.ActivePower = null; + electricEnergy1.ct = null; + electricEnergy1.PhaseCurrentA = null; + electricEnergy1.PhaseCurrentB = null; + electricEnergy1.PhaseCurrentC = null; + electricEnergy1.PhasePowerA = null; + electricEnergy1.PhasePowerB = null; + electricEnergy1.PhasePowerC = null; + electricEnergy1.PhaseVoltageA = null; + electricEnergy1.PhaseVoltageB = null; + electricEnergy1.PhaseVoltageC = null; + electricEnergy1.PowerFactor = null; + electricEnergy1.pt = null; + this.EyMaterH1.ElectricEnergy = electricEnergy1; + this.EyMaterH1.Font = new System.Drawing.Font("微软雅黑", 7.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.EyMaterH1.Location = new System.Drawing.Point(3, 3); + this.EyMaterH1.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); + this.EyMaterH1.Name = "EyMaterH1"; + this.EyMaterH1.Size = new System.Drawing.Size(610, 149); + this.EyMaterH1.TabIndex = 0; + this.EyMaterH1.Text1 = "A相电压"; + this.EyMaterH1.Text10 = "总有功功率"; + this.EyMaterH1.Text11 = "总功率因数"; + this.EyMaterH1.Text12 = "电压变比"; + this.EyMaterH1.Text13 = "电流变比"; + this.EyMaterH1.Text14 = "累计电能"; + this.EyMaterH1.Text2 = "B相电压"; + this.EyMaterH1.Text3 = "C相电压"; + this.EyMaterH1.Text4 = "A相电流"; + this.EyMaterH1.Text5 = "B相电流"; + this.EyMaterH1.Text6 = "C相电流"; + this.EyMaterH1.Text7 = "A相功率"; + this.EyMaterH1.Text8 = "B相功率"; + this.EyMaterH1.Text9 = "C相功率"; + // + // tabPagePlus2 + // + this.tabPagePlus2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.tabPagePlus2.Location = new System.Drawing.Point(1, 31); + this.tabPagePlus2.Name = "tabPagePlus2"; + this.tabPagePlus2.Size = new System.Drawing.Size(616, 155); + this.tabPagePlus2.TabIndex = 1; + this.tabPagePlus2.Text = "Meter2"; + // + // panelExt1 + // + this.panelExt1.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.panelExt1.BordeWidth = 2; + this.panelExt1.BottomGap = 1; + this.tableLayoutPanel1.SetColumnSpan(this.panelExt1, 3); + this.panelExt1.Controls.Add(this.gpCapacityBox); + this.panelExt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt1.LeftGap = 0; + this.panelExt1.Location = new System.Drawing.Point(627, 419); + this.panelExt1.Name = "panelExt1"; + this.panelExt1.RightGap = 0; + this.tableLayoutPanel1.SetRowSpan(this.panelExt1, 2); + this.panelExt1.Size = new System.Drawing.Size(1244, 396); + this.panelExt1.TabIndex = 41; + this.panelExt1.TopGap = 0; + // + // gpCapacityBox + // + this.gpCapacityBox.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.gpCapacityBox.Controls.Add(this.Chart12HourTotal); + this.gpCapacityBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.gpCapacityBox.ForeColor = System.Drawing.Color.White; + this.gpCapacityBox.Location = new System.Drawing.Point(0, 0); + this.gpCapacityBox.Name = "gpCapacityBox"; + this.gpCapacityBox.Size = new System.Drawing.Size(1244, 396); + this.gpCapacityBox.TabIndex = 0; + this.gpCapacityBox.TabStop = false; + this.gpCapacityBox.Text = "当天每2小时产能"; + // + // Chart12HourTotal + // + this.Chart12HourTotal.BackColor = System.Drawing.Color.Transparent; + this.Chart12HourTotal.BorderlineColor = System.Drawing.Color.Blue; + chartArea1.AxisX.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea1.AxisX.LineColor = System.Drawing.Color.White; + chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisX.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea1.AxisX.MinorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisX.MinorTickMark.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisX.TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + chartArea1.AxisX.TitleForeColor = System.Drawing.Color.White; + chartArea1.AxisX2.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea1.AxisX2.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisX2.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea1.AxisY.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea1.AxisY.LineColor = System.Drawing.Color.White; + chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisY.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea1.AxisY.MinorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisY.MinorTickMark.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisY.TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + chartArea1.AxisY.TitleForeColor = System.Drawing.Color.White; + chartArea1.AxisY2.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.True; + chartArea1.AxisY2.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea1.AxisY2.LineColor = System.Drawing.Color.White; + chartArea1.AxisY2.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea1.AxisY2.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea1.AxisY2.ScaleBreakStyle.LineColor = System.Drawing.Color.White; + chartArea1.AxisY2.TitleFont = new System.Drawing.Font("微软雅黑", 9F); + chartArea1.AxisY2.TitleForeColor = System.Drawing.Color.White; + chartArea1.BackColor = System.Drawing.Color.Transparent; + chartArea1.BorderColor = System.Drawing.Color.Empty; + chartArea1.Name = "ChartArea1"; + this.Chart12HourTotal.ChartAreas.Add(chartArea1); + this.Chart12HourTotal.Dock = System.Windows.Forms.DockStyle.Fill; + legend1.BackColor = System.Drawing.Color.Transparent; + legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top; + legend1.ForeColor = System.Drawing.Color.White; + legend1.Name = "Legend1"; + this.Chart12HourTotal.Legends.Add(legend1); + this.Chart12HourTotal.Location = new System.Drawing.Point(3, 22); + this.Chart12HourTotal.Margin = new System.Windows.Forms.Padding(0); + this.Chart12HourTotal.Name = "Chart12HourTotal"; + this.Chart12HourTotal.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.Fire; + this.Chart12HourTotal.PaletteCustomColors = new System.Drawing.Color[] { + System.Drawing.Color.DarkTurquoise, + System.Drawing.Color.PaleGoldenrod, + System.Drawing.Color.Green}; + series1.ChartArea = "ChartArea1"; + series1.IsXValueIndexed = true; + series1.Legend = "Legend1"; + series1.Name = "Series1"; + this.Chart12HourTotal.Series.Add(series1); + this.Chart12HourTotal.Size = new System.Drawing.Size(1238, 371); + this.Chart12HourTotal.TabIndex = 4; + this.Chart12HourTotal.Text = "chart1"; + // + // panelExt2 + // + this.panelExt2.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(55))))); + this.panelExt2.BordeWidth = 2; + this.panelExt2.BottomGap = 0; + this.panelExt2.Controls.Add(this.gpAlarmBox); + this.panelExt2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt2.LeftGap = 0; + this.panelExt2.Location = new System.Drawing.Point(1251, 3); + this.panelExt2.Name = "panelExt2"; + this.panelExt2.RightGap = 0; + this.tableLayoutPanel1.SetRowSpan(this.panelExt2, 2); + this.panelExt2.Size = new System.Drawing.Size(620, 410); + this.panelExt2.TabIndex = 42; + this.panelExt2.TopGap = 0; + // + // gpAlarmBox + // + this.gpAlarmBox.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.gpAlarmBox.Controls.Add(this.chartAlarmData); + this.gpAlarmBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.gpAlarmBox.ForeColor = System.Drawing.Color.White; + this.gpAlarmBox.Location = new System.Drawing.Point(0, 0); + this.gpAlarmBox.Name = "gpAlarmBox"; + this.gpAlarmBox.Size = new System.Drawing.Size(620, 410); + this.gpAlarmBox.TabIndex = 0; + this.gpAlarmBox.TabStop = false; + this.gpAlarmBox.Text = "告警TOP10统计"; + // + // chartAlarmData + // + this.chartAlarmData.BackColor = System.Drawing.Color.Transparent; + this.chartAlarmData.BorderlineColor = System.Drawing.Color.Blue; + chartArea2.AxisX.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea2.AxisX.LineColor = System.Drawing.Color.White; + chartArea2.AxisX.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea2.AxisX.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea2.AxisX.ScaleBreakStyle.LineColor = System.Drawing.Color.White; + chartArea2.AxisX.TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + chartArea2.AxisX.TitleForeColor = System.Drawing.Color.White; + chartArea2.AxisY.IntervalAutoMode = System.Windows.Forms.DataVisualization.Charting.IntervalAutoMode.VariableCount; + chartArea2.AxisY.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea2.AxisY.LineColor = System.Drawing.Color.White; + chartArea2.AxisY.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea2.AxisY.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea2.AxisY.MinorGrid.LineColor = System.Drawing.Color.White; + chartArea2.AxisY.TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + chartArea2.AxisY.TitleForeColor = System.Drawing.Color.White; + chartArea2.BackColor = System.Drawing.Color.Transparent; + chartArea2.BorderColor = System.Drawing.Color.Empty; + chartArea2.BorderWidth = 2; + chartArea2.Name = "ChartArea1"; + this.chartAlarmData.ChartAreas.Add(chartArea2); + this.chartAlarmData.Dock = System.Windows.Forms.DockStyle.Fill; + legend2.BackColor = System.Drawing.Color.Transparent; + legend2.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top; + legend2.Enabled = false; + legend2.ForeColor = System.Drawing.Color.White; + legend2.IsEquallySpacedItems = true; + legend2.Name = "Legend1"; + this.chartAlarmData.Legends.Add(legend2); + this.chartAlarmData.Location = new System.Drawing.Point(3, 22); + this.chartAlarmData.Name = "chartAlarmData"; + this.chartAlarmData.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + this.chartAlarmData.PaletteCustomColors = new System.Drawing.Color[] { + System.Drawing.Color.DarkTurquoise}; + series2.ChartArea = "ChartArea1"; + series2.IsXValueIndexed = true; + series2.Legend = "Legend1"; + series2.Name = "Series1"; + this.chartAlarmData.Series.Add(series2); + this.chartAlarmData.Size = new System.Drawing.Size(614, 385); + this.chartAlarmData.TabIndex = 6; + this.chartAlarmData.Text = "chart1"; + // + // gpNgBox + // + this.gpNgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.gpNgBox.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.gpNgBox.Controls.Add(this.chartNgShow); + this.gpNgBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.gpNgBox.ForeColor = System.Drawing.Color.White; + this.gpNgBox.Location = new System.Drawing.Point(3, 196); + this.gpNgBox.Name = "gpNgBox"; + this.gpNgBox.Size = new System.Drawing.Size(618, 217); + this.gpNgBox.TabIndex = 43; + this.gpNgBox.TabStop = false; + this.gpNgBox.Text = "不良项统计"; + // + // chartNgShow + // + this.chartNgShow.BackColor = System.Drawing.Color.Transparent; + this.chartNgShow.BorderlineColor = System.Drawing.Color.Blue; + chartArea3.AxisX.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea3.AxisX.LineColor = System.Drawing.Color.White; + chartArea3.AxisX.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea3.AxisX.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea3.AxisX.TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + chartArea3.AxisX.TitleForeColor = System.Drawing.Color.White; + chartArea3.AxisY.LabelStyle.ForeColor = System.Drawing.Color.White; + chartArea3.AxisY.LineColor = System.Drawing.Color.White; + chartArea3.AxisY.MajorGrid.LineColor = System.Drawing.Color.Transparent; + chartArea3.AxisY.MajorTickMark.LineColor = System.Drawing.Color.White; + chartArea3.AxisY.TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + chartArea3.AxisY.TitleForeColor = System.Drawing.Color.White; + chartArea3.BackColor = System.Drawing.Color.Transparent; + chartArea3.BorderColor = System.Drawing.Color.Empty; + chartArea3.Name = "ChartArea1"; + this.chartNgShow.ChartAreas.Add(chartArea3); + this.chartNgShow.Dock = System.Windows.Forms.DockStyle.Fill; + legend3.BackColor = System.Drawing.Color.Transparent; + legend3.Enabled = false; + legend3.ForeColor = System.Drawing.Color.White; + legend3.IsEquallySpacedItems = true; + legend3.Name = "Legend1"; + this.chartNgShow.Legends.Add(legend3); + this.chartNgShow.Location = new System.Drawing.Point(3, 22); + this.chartNgShow.Name = "chartNgShow"; + this.chartNgShow.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + this.chartNgShow.PaletteCustomColors = new System.Drawing.Color[] { + System.Drawing.Color.DarkTurquoise, + System.Drawing.Color.PaleGoldenrod, + System.Drawing.Color.Green}; + series3.ChartArea = "ChartArea1"; + series3.IsXValueIndexed = true; + series3.Legend = "Legend1"; + series3.Name = "Series1"; + this.chartNgShow.Series.Add(series3); + this.chartNgShow.Size = new System.Drawing.Size(612, 192); + this.chartNgShow.TabIndex = 5; + this.chartNgShow.Text = "chart1"; + // + // panelExt3 + // + this.panelExt3.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.panelExt3.BordeWidth = 3; + this.panelExt3.BottomGap = 1; + this.panelExt3.Controls.Add(this.tableLayoutPanel3); + this.panelExt3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt3.LeftGap = 0; + this.panelExt3.Location = new System.Drawing.Point(627, 3); + this.panelExt3.Name = "panelExt3"; + this.panelExt3.RightGap = 0; + this.tableLayoutPanel1.SetRowSpan(this.panelExt3, 2); + this.panelExt3.Size = new System.Drawing.Size(618, 410); + this.panelExt3.TabIndex = 44; + this.panelExt3.TopGap = 0; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Controls.Add(this.titleModeName, 0, 0); + this.tableLayoutPanel3.Controls.Add(this.panel5, 0, 3); + this.tableLayoutPanel3.Controls.Add(this.titleRunTime, 0, 2); + this.tableLayoutPanel3.Controls.Add(this.titleEqp_code, 1, 2); + this.tableLayoutPanel3.Controls.Add(this.titleFactory_code, 1, 0); + this.tableLayoutPanel3.Controls.Add(this.titleLine_No, 1, 1); + this.tableLayoutPanel3.Controls.Add(this.titleStartTime, 0, 1); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 6; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 270F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 51F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 54F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(618, 410); + this.tableLayoutPanel3.TabIndex = 0; + // + // titleModeName + // + this.titleModeName.BackColor = System.Drawing.Color.Transparent; + this.titleModeName.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titleModeName.BackgroundImage"))); + this.titleModeName.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleModeName.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleModeName.Font = new System.Drawing.Font("Cambria", 10.5F); + this.titleModeName.Location = new System.Drawing.Point(4, 5); + this.titleModeName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.titleModeName.Name = "titleModeName"; + this.titleModeName.Size = new System.Drawing.Size(301, 30); + this.titleModeName.TabIndex = 8; + this.titleModeName.Title = "G11"; + this.titleModeName.TitleFontSize = 12F; + this.titleModeName.TitleName = "生产型号"; + this.titleModeName.TitleNameForColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.titleModeName.TtfPath = ""; + // + // panel5 + // + this.panel5.BackgroundImage = global::LargeSquareOne.Properties.Resources.组_178_拷贝1; + this.panel5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.tableLayoutPanel3.SetColumnSpan(this.panel5, 2); + this.panel5.Controls.Add(this.proUtilizationRate); + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.proPPM); + this.panel5.Controls.Add(this.proTotalQty); + this.panel5.Controls.Add(this.lblOkTotal); + this.panel5.Controls.Add(this.proOKRatio); + this.panel5.Controls.Add(this.lblTotalQty); + this.panel5.Controls.Add(this.proOKQty); + this.panel5.Controls.Add(this.lblRate); + this.panel5.Controls.Add(this.lblUtilizationRate); + this.panel5.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel5.Location = new System.Drawing.Point(3, 123); + this.panel5.Name = "panel5"; + this.tableLayoutPanel3.SetRowSpan(this.panel5, 2); + this.panel5.Size = new System.Drawing.Size(612, 315); + this.panel5.TabIndex = 4; + // + // proUtilizationRate + // + this.proUtilizationRate.BackColor = System.Drawing.Color.Transparent; + this.proUtilizationRate.BackEllipseColor = System.Drawing.Color.Transparent; + this.proUtilizationRate.CoreEllipseColor = System.Drawing.Color.Transparent; + this.proUtilizationRate.FloatValue = 0F; + this.proUtilizationRate.IntValue = 0; + this.proUtilizationRate.IsShowCoreEllipseBorder = true; + this.proUtilizationRate.Location = new System.Drawing.Point(486, 61); + this.proUtilizationRate.Margin = new System.Windows.Forms.Padding(2); + this.proUtilizationRate.MaxValue = 100; + this.proUtilizationRate.Name = "proUtilizationRate"; + this.proUtilizationRate.ShowStyleType = JinYuan.ControlLib.ShowStyleType.Ring; + this.proUtilizationRate.ShowType = JinYuan.ControlLib.ShowType.稼动率; + this.proUtilizationRate.Size = new System.Drawing.Size(100, 100); + this.proUtilizationRate.TabIndex = 22; + this.proUtilizationRate.ValueColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(128))))); + this.proUtilizationRate.ValueFloatOrInt = JinYuan.ControlLib.ValueFloatOrInt.Float; + this.proUtilizationRate.ValueMargin = 2; + this.proUtilizationRate.ValueType = JinYuan.ControlLib.ValueType.Percent; + this.proUtilizationRate.ValueWidth = 10; + // + // label6 + // + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.Font = new System.Drawing.Font("Cambria", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label6.ForeColor = System.Drawing.Color.White; + this.label6.Location = new System.Drawing.Point(397, 2); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(87, 25); + this.label6.TabIndex = 32; + this.label6.Text = "PPM"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // proPPM + // + this.proPPM.BackColor = System.Drawing.Color.Transparent; + this.proPPM.BackEllipseColor = System.Drawing.Color.Transparent; + this.proPPM.CoreEllipseColor = System.Drawing.Color.Transparent; + this.proPPM.FloatValue = 0F; + this.proPPM.IntValue = 0; + this.proPPM.IsShowCoreEllipseBorder = true; + this.proPPM.Location = new System.Drawing.Point(387, 18); + this.proPPM.MaxValue = 50000; + this.proPPM.Name = "proPPM"; + this.proPPM.ShowStyleType = JinYuan.ControlLib.ShowStyleType.Ring; + this.proPPM.ShowType = JinYuan.ControlLib.ShowType.生产数; + this.proPPM.Size = new System.Drawing.Size(102, 112); + this.proPPM.TabIndex = 35; + this.proPPM.ValueColor = System.Drawing.Color.Aquamarine; + this.proPPM.ValueFloatOrInt = JinYuan.ControlLib.ValueFloatOrInt.Int; + this.proPPM.ValueMargin = 1; + this.proPPM.ValueType = JinYuan.ControlLib.ValueType.Absolute; + this.proPPM.ValueWidth = 10; + // + // proTotalQty + // + this.proTotalQty.BackColor = System.Drawing.Color.Transparent; + this.proTotalQty.Location = new System.Drawing.Point(128, 238); + this.proTotalQty.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.proTotalQty.Name = "proTotalQty"; + this.proTotalQty.Size = new System.Drawing.Size(361, 65); + this.proTotalQty.TabIndex = 31; + this.proTotalQty.Tag = "生产总数"; + this.proTotalQty.TotalValue = 0; + // + // lblOkTotal + // + this.lblOkTotal.BackColor = System.Drawing.Color.Transparent; + this.lblOkTotal.Font = new System.Drawing.Font("Cambria", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblOkTotal.ForeColor = System.Drawing.Color.White; + this.lblOkTotal.Location = new System.Drawing.Point(91, 3); + this.lblOkTotal.Name = "lblOkTotal"; + this.lblOkTotal.Size = new System.Drawing.Size(136, 37); + this.lblOkTotal.TabIndex = 26; + this.lblOkTotal.Text = "良品总数"; + this.lblOkTotal.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // proOKRatio + // + this.proOKRatio.AnimationEnabled = true; + this.proOKRatio.ArcAngleSize = 360; + this.proOKRatio.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); + this.proOKRatio.ForeColor = System.Drawing.Color.White; + this.proOKRatio.Location = new System.Drawing.Point(33, 78); + this.proOKRatio.Name = "proOKRatio"; + this.proOKRatio.Size = new System.Drawing.Size(80, 80); + this.proOKRatio.TabIndex = 34; + this.proOKRatio.ThicknessProportion = 10F; + this.proOKRatio.TotalBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0))))); + this.proOKRatio.ValueBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + // + // lblTotalQty + // + this.lblTotalQty.BackColor = System.Drawing.Color.Transparent; + this.lblTotalQty.Font = new System.Drawing.Font("Cambria", 22F, System.Drawing.FontStyle.Bold); + this.lblTotalQty.ForeColor = System.Drawing.Color.White; + this.lblTotalQty.Location = new System.Drawing.Point(189, 200); + this.lblTotalQty.Name = "lblTotalQty"; + this.lblTotalQty.Size = new System.Drawing.Size(254, 44); + this.lblTotalQty.TabIndex = 28; + this.lblTotalQty.Text = "生产总数"; + this.lblTotalQty.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // proOKQty + // + this.proOKQty.BackColor = System.Drawing.Color.Transparent; + this.proOKQty.BackEllipseColor = System.Drawing.Color.Transparent; + this.proOKQty.CoreEllipseColor = System.Drawing.Color.Transparent; + this.proOKQty.FloatValue = 0F; + this.proOKQty.IntValue = 0; + this.proOKQty.IsShowCoreEllipseBorder = true; + this.proOKQty.Location = new System.Drawing.Point(110, 32); + this.proOKQty.MaxValue = 50000; + this.proOKQty.Name = "proOKQty"; + this.proOKQty.ShowStyleType = JinYuan.ControlLib.ShowStyleType.Ring; + this.proOKQty.ShowType = JinYuan.ControlLib.ShowType.生产数; + this.proOKQty.Size = new System.Drawing.Size(100, 100); + this.proOKQty.TabIndex = 4; + this.proOKQty.ValueColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(128))))); + this.proOKQty.ValueFloatOrInt = JinYuan.ControlLib.ValueFloatOrInt.Int; + this.proOKQty.ValueMargin = 1; + this.proOKQty.ValueType = JinYuan.ControlLib.ValueType.Absolute; + this.proOKQty.ValueWidth = 10; + // + // lblRate + // + this.lblRate.BackColor = System.Drawing.Color.Transparent; + this.lblRate.Font = new System.Drawing.Font("Cambria", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblRate.ForeColor = System.Drawing.Color.White; + this.lblRate.Location = new System.Drawing.Point(3, 32); + this.lblRate.Name = "lblRate"; + this.lblRate.Size = new System.Drawing.Size(111, 52); + this.lblRate.TabIndex = 30; + this.lblRate.Text = "优率"; + this.lblRate.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblUtilizationRate + // + this.lblUtilizationRate.BackColor = System.Drawing.Color.Transparent; + this.lblUtilizationRate.Font = new System.Drawing.Font("Cambria", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblUtilizationRate.ForeColor = System.Drawing.Color.White; + this.lblUtilizationRate.Location = new System.Drawing.Point(490, 18); + this.lblUtilizationRate.Name = "lblUtilizationRate"; + this.lblUtilizationRate.Size = new System.Drawing.Size(107, 46); + this.lblUtilizationRate.TabIndex = 25; + this.lblUtilizationRate.Text = "稼动率"; + this.lblUtilizationRate.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // titleRunTime + // + this.titleRunTime.BackColor = System.Drawing.Color.Transparent; + this.titleRunTime.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titleRunTime.BackgroundImage"))); + this.titleRunTime.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleRunTime.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleRunTime.Font = new System.Drawing.Font("Cambria", 10.5F); + this.titleRunTime.Location = new System.Drawing.Point(4, 85); + this.titleRunTime.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.titleRunTime.Name = "titleRunTime"; + this.titleRunTime.Size = new System.Drawing.Size(301, 30); + this.titleRunTime.TabIndex = 1; + this.titleRunTime.Title = "2023/08/17 10:10:10"; + this.titleRunTime.TitleFontSize = 12F; + this.titleRunTime.TitleName = "开机时间"; + this.titleRunTime.TitleNameForColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.titleRunTime.TtfPath = ""; + // + // titleEqp_code + // + this.titleEqp_code.BackColor = System.Drawing.Color.Transparent; + this.titleEqp_code.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titleEqp_code.BackgroundImage"))); + this.titleEqp_code.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleEqp_code.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleEqp_code.Font = new System.Drawing.Font("Cambria", 10.5F); + this.titleEqp_code.Location = new System.Drawing.Point(313, 85); + this.titleEqp_code.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.titleEqp_code.Name = "titleEqp_code"; + this.titleEqp_code.Size = new System.Drawing.Size(301, 30); + this.titleEqp_code.TabIndex = 5; + this.titleEqp_code.Title = "EVEDL14L1ZJHJ01"; + this.titleEqp_code.TitleFontSize = 12F; + this.titleEqp_code.TitleName = "设备编号"; + this.titleEqp_code.TitleNameForColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.titleEqp_code.TtfPath = ""; + // + // titleFactory_code + // + this.titleFactory_code.BackColor = System.Drawing.Color.Transparent; + this.titleFactory_code.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titleFactory_code.BackgroundImage"))); + this.titleFactory_code.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleFactory_code.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleFactory_code.Font = new System.Drawing.Font("Cambria", 10.5F); + this.titleFactory_code.Location = new System.Drawing.Point(313, 5); + this.titleFactory_code.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.titleFactory_code.Name = "titleFactory_code"; + this.titleFactory_code.Size = new System.Drawing.Size(301, 30); + this.titleFactory_code.TabIndex = 2; + this.titleFactory_code.Title = "14J"; + this.titleFactory_code.TitleFontSize = 12F; + this.titleFactory_code.TitleName = "工厂代号"; + this.titleFactory_code.TitleNameForColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.titleFactory_code.TtfPath = ""; + // + // titleLine_No + // + this.titleLine_No.BackColor = System.Drawing.Color.Transparent; + this.titleLine_No.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titleLine_No.BackgroundImage"))); + this.titleLine_No.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleLine_No.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleLine_No.Font = new System.Drawing.Font("Cambria", 10.5F); + this.titleLine_No.Location = new System.Drawing.Point(313, 45); + this.titleLine_No.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.titleLine_No.Name = "titleLine_No"; + this.titleLine_No.Size = new System.Drawing.Size(301, 30); + this.titleLine_No.TabIndex = 3; + this.titleLine_No.Title = "14J-ZZ-L1"; + this.titleLine_No.TitleFontSize = 12F; + this.titleLine_No.TitleName = "线体编号"; + this.titleLine_No.TitleNameForColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.titleLine_No.TtfPath = ""; + // + // titleStartTime + // + this.titleStartTime.BackColor = System.Drawing.Color.Transparent; + this.titleStartTime.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titleStartTime.BackgroundImage"))); + this.titleStartTime.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleStartTime.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleStartTime.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.titleStartTime.Location = new System.Drawing.Point(4, 45); + this.titleStartTime.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.titleStartTime.Name = "titleStartTime"; + this.titleStartTime.Size = new System.Drawing.Size(301, 30); + this.titleStartTime.TabIndex = 0; + this.titleStartTime.Title = "2023/08/17 10:10:10"; + this.titleStartTime.TitleFontSize = 12F; + this.titleStartTime.TitleName = "运行时间"; + this.titleStartTime.TitleNameForColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(233)))), ((int)(((byte)(255))))); + this.titleStartTime.TtfPath = ""; + // + // FrmMonitor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(41)))), ((int)(((byte)(96))))); + this.ClientSize = new System.Drawing.Size(1874, 896); + this.ControlBox = false; + this.Controls.Add(this.MainPanel); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "FrmMonitor"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = "集中监控"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Load += new System.EventHandler(this.FrmMonitor_Load); + this.MainPanel.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tabMeters.ResumeLayout(false); + this.tabPagePlus1.ResumeLayout(false); + this.panelExt1.ResumeLayout(false); + this.gpCapacityBox.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.Chart12HourTotal)).EndInit(); + this.panelExt2.ResumeLayout(false); + this.gpAlarmBox.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chartAlarmData)).EndInit(); + this.gpNgBox.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chartNgShow)).EndInit(); + this.panelExt3.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.panel5.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private JinYuan.ControlLib.PanelEnhanced MainPanel; + private System.Windows.Forms.ImageList imageList1; + private JinYuan.ControlLib.ProcessEllipse proUtilizationRate; + private System.Windows.Forms.Label lblOkTotal; + private System.Windows.Forms.Label lblUtilizationRate; + private System.Windows.Forms.Label lblRate; + private System.Windows.Forms.Label lblTotalQty; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Panel panel5; + private HML.ArcProgress proOKRatio; + internal JinYuan.ControlLib.ArrTotalQty proTotalQty; + private JinYuan.ControlLib.ProcessEllipse proOKQty; + private JinYuan.ControlLib.TitleTime titleEqp_code; + private JinYuan.ControlLib.TitleTime titleFactory_code; + private JinYuan.ControlLib.TitleTime titleLine_No; + private JinYuan.ControlLib.TitleTime titleStartTime; + private JinYuan.ControlLib.TitleTime titleRunTime; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private JinYuan.ControlLib.TitleTime titleModeName; + private System.Windows.Forms.DataVisualization.Charting.Chart chartAlarmData; + private System.Windows.Forms.DataVisualization.Charting.Chart Chart12HourTotal; + private System.Windows.Forms.DataVisualization.Charting.Chart chartNgShow; + private JinYuan.ControlLib.ProcessEllipse proPPM; + private HML.TabControlPlus tabMeters; + private HML.TabPagePlus tabPagePlus1; + private HML.TabPagePlus tabPagePlus2; + private JinYuan.ControlLib.PanelExt panelExt1; + private JinYuan.ControlLib.PanelExt panelExt2; + private JinYuan.ControlLib.GroupBoxEX gpCapacityBox; + private JinYuan.ControlLib.GroupBoxEX gpAlarmBox; + private JinYuan.ControlLib.GroupBoxEX gpNgBox; + private JinYuan.ControlLib.PanelExt panelExt3; + private JinYuan.ControlLib.UCElectricityMeterV EyMaterH1; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmMonitor.cs b/LargeSquareOne/FrmMonitor.cs new file mode 100644 index 0000000..d8e5e03 --- /dev/null +++ b/LargeSquareOne/FrmMonitor.cs @@ -0,0 +1,469 @@ +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace LargeSquareOne +{ + + + public partial class FrmMonitor : MultiLanguageForm + { + private static readonly object uiLock = new object(); + private static FrmMonitor _instance; + private readonly CancellationTokenSource _cts = new CancellationTokenSource(); + private readonly PrivateFontCollection _font = new PrivateFontCollection(); + private Font _myFont; + + public static FrmMonitor Instance + { + get + { + lock (uiLock) + { + return _instance ??= new FrmMonitor(); + } + } + } + + public FrmMonitor() + { + InitializeComponent(); + InitializeFormSettings(); + //LoadCustomFont(); + + this.FormClosing += FrmMonitor_FormClosing; + } + + private void InitializeFormSettings() + { + this.SetStyle(ControlStyles.AllPaintingInWmPaint | + ControlStyles.DoubleBuffer | + ControlStyles.ResizeRedraw | + ControlStyles.Selectable | + ControlStyles.SupportsTransparentBackColor, true); + } + + private void LoadCustomFont() + { + try + { + var fontPath = Path.Combine(Environment.CurrentDirectory, "Assts", "Fonts", "FZY4JW.ttf"); + _font.AddFontFile(fontPath); + var myFontFamily = new FontFamily(_font.Families[0].Name, _font); + _myFont = new Font(myFontFamily, 20, FontStyle.Bold); + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "加载字体异常".Translated() + $":{ex.Message}"); + } + } + + private void FrmMonitor_FormClosing(object sender, FormClosingEventArgs e) + { + _cts.Cancel(); + _font?.Dispose(); + _myFont?.Dispose(); + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x0014) return; // 禁掉清除背景消息 + base.WndProc(ref m); + } + + private async void FrmMonitor_Load(object sender, EventArgs e) + { + try + { + SetChart(); + await RefreshAllDataAsync(); + await StartPeriodicRefreshAsync(_cts.Token); + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "窗体加载异常".Translated() + $":{ex.Message}"); + } + } + + private void SetChart() + { + try + { + #region 24小时统计 + Chart12HourTotal.Series.Clear(); + Chart12HourTotal.ChartAreas[0].AxisY.Minimum = 0; + Chart12HourTotal.ChartAreas[0].AxisY.Maximum = 2000; + + ChartHelper.AddSeries(Chart12HourTotal, "投入".Translated(), SeriesChartType.Column, + ChartValueType.Auto, MarkerStyle.Diamond, 8, Color.DarkTurquoise, + Color.Aqua, "", false, true); + + ChartHelper.AddSeries(Chart12HourTotal, "产出".Translated(), SeriesChartType.Column, + ChartValueType.Auto, MarkerStyle.Diamond, 8, Color.PaleGoldenrod, + Color.PaleGoldenrod, "", false, true); + + ChartHelper.AddSeries(Chart12HourTotal, "优率".Translated(), SeriesChartType.Spline, + ChartValueType.String, MarkerStyle.Circle, 8, Color.Lime, + Color.Lime, "#VAL{P}", true, true); + + ChartHelper.SetStyle(Chart12HourTotal, Color.Transparent, Color.White); + ChartHelper.SetLegend(Chart12HourTotal, Docking.Left, StringAlignment.Center, + Color.Transparent, Color.White); + ChartHelper.SetXY(Chart12HourTotal, "时间".Translated(), "数值".Translated(), -45, StringAlignment.Center, + Color.White, Color.White, AxisArrowStyle.None, 1, true); + ChartHelper.SetMajorGrid(Chart12HourTotal, Color.Transparent, 20, 2); + #endregion + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "图表初始化异常".Translated() + $":{ex.Message}"); + } + } + + private async Task StartPeriodicRefreshAsync(CancellationToken ct) + { + while (!ct.IsCancellationRequested) + { + try + { + await RefreshAllDataAsync(); + await Task.Delay(2000, ct); + } + catch (OperationCanceledException) + { + break; + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "定时刷新异常".Translated() + $":{ex.Message}"); + await Task.Delay(1000, ct); + } + } + } + + private async Task RefreshAllDataAsync() + { + var tasks = new[] + { + Refresh12ProdQtyAsync(), + RefreshXiaoLvDataAsync(), + RefreshChatTop10AlarmDataAsync(), + RefreshChatNGDataAsync() + }; + + await Task.WhenAll(tasks); + } + + private async Task Refresh12ProdQtyAsync() + { + await Task.Run(() => + { + if (IsDisposed) return; + + this.InvokeIfRequired(() => + { + var data = CommonMethods.Lst_Prod12HourData?.Count > 0 ? CommonMethods.Lst_Prod12HourData : MockDataGenerator.Generate12HourData(); + + UpdateChart12HourData(data); + }); + }); + } + + private void UpdateChart12HourData(List data) + { + try + { + var maxValue = data.Max(x => x.ProdIn); + Chart12HourTotal.ChartAreas[0].AxisY.Minimum = 0; + Chart12HourTotal.ChartAreas[0].AxisY.Maximum = (int)maxValue + 1500; + + // 直接使用数据,不需要额外排序 + var x1 = data.Select(c => c.DisplayTime).ToList(); + var y1 = data.Select(c => c.ProdIn).ToList(); + var y2 = data.Select(c => c.ProdOut).ToList(); + var y3 = data.Select(c => c.OKRatio).ToList(); + + Chart12HourTotal.Series[0].Points.DataBindXY(x1, y1); + Chart12HourTotal.Series[1].Points.DataBindXY(x1, y2); + Chart12HourTotal.Series[2].Points.DataBindXY(x1, y3); + + // 设置X轴标签的角度,提高可读性 + Chart12HourTotal.ChartAreas[0].AxisX.LabelStyle.Angle = 0; + // 确保显示所有标签 + Chart12HourTotal.ChartAreas[0].AxisX.Interval = 1; + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "更新12小时数据异常".Translated() + $":{ex.Message}"); + } + } + + + // 效率数据也可以添加模拟数据 + private async Task RefreshXiaoLvDataAsync() + { + await Task.Run(() => + { + if (IsDisposed) return; + + // 使用实际数据或模拟数据 + var utilizationRate = CommonMethods.JiaDL >= 0 + ? Convert.ToDouble(CommonMethods.JiaDL) * 100 + : MockDataGenerator._random.Next(60, 95); + + var totalQty = CommonMethods.TotalQty >= 0 + ? CommonMethods.TotalQty + : MockDataGenerator._random.Next(1000, 5000); + + var okQty = CommonMethods.ProOKQty >= 0 + ? CommonMethods.ProOKQty + : MockDataGenerator._random.Next(900, (int)totalQty); + + var yieldRate = totalQty == 0 ? 0 : + Convert.ToDouble((Convert.ToDouble(okQty) / + Convert.ToDouble(totalQty) * 100.0) + .ToString("f2")); + + this.InvokeIfRequired(() => + { + UpdateEfficiencyControls(utilizationRate, yieldRate, (int)totalQty, (int)okQty); + UpdateTimeDisplay(); + UpdateEnergyDisplay(); + }); + }); + } + + private double CalculateYieldRate() + { + if (CommonMethods.TotalQty == 0) return 0; + + return Convert.ToDouble((Convert.ToDouble(CommonMethods.ProOKQty) / + Convert.ToDouble(CommonMethods.TotalQty) * 100.0) + .ToString("f2")); + } + + private void UpdateEfficiencyControls(double utilizationRate, double yieldRate, int totalQty, int okQty) + { + try + { + titleModeName.Title = CommonMethods.mesConfig.ModelName ?? "测试型号"; + titleFactory_code.Title = CommonMethods.mesConfig.siteCode ?? "TEST001"; + titleLine_No.Title = CommonMethods.mesConfig.lineCode ?? "LINE01"; + titleEqp_code.Title = CommonMethods.mesConfig.equipNum ?? "EQP001"; + proUtilizationRate.FloatValue = (float)utilizationRate; + proPPM.IntValue = (int)(CommonMethods.Ppm > 0 ? CommonMethods.Ppm : MockDataGenerator._random.Next(100, 1000)); + proOKQty.IntValue = okQty; + proOKRatio.Value = yieldRate; + proTotalQty.TotalValue = totalQty; + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "更新效率控件异常".Translated() + $":{ex.Message}"); + } + } + + private void UpdateTimeDisplay() + { + try + { + if (CommonMethods.PlcOpenAndRunTime?.Count > 0) + { + titleStartTime.Title = $"{CommonMethods.PlcOpenAndRunTime[0]}:" + + $"{CommonMethods.PlcOpenAndRunTime[1]}:" + + $"{CommonMethods.PlcOpenAndRunTime[2]}"; + + titleRunTime.Title = $"{CommonMethods.PlcOpenAndRunTime[3]}:" + + $"{CommonMethods.PlcOpenAndRunTime[4]}:" + + $"{CommonMethods.PlcOpenAndRunTime[5]}"; + } + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "更新时间显示异常".Translated() + $":{ex.Message}"); + } + } + + private void UpdateEnergyDisplay() + { + try + { + if (CommonMethods.listElectricEnergy?.Count > 0) + { + EyMaterH1.ElectricEnergy = CommonMethods.listElectricEnergy[0]; + } + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "更新能源显示异常".Translated() + $":{ex.Message}"); + } + } + + private async Task RefreshChatTop10AlarmDataAsync() + { + await Task.Run(() => + { + if (IsDisposed) return; + + this.InvokeIfRequired(() => + { + UpdateAlarmChart(); + }); + }); + } + + private void UpdateAlarmChart() + { + try + { + var alarmData = CommonMethods.Lst_AlarmTop10_Qty?.Count > 0 + ? CommonMethods.Lst_AlarmTop10_Qty + : MockDataGenerator.GenerateAlarmTop10Data(); + + if (alarmData?.Count > 0) + { + chartAlarmData.Series.Clear(); + chartAlarmData.Titles.Clear(); + + var maxValue = alarmData.Max(x => x.DataCount); + chartAlarmData.ChartAreas[0].AxisY.Minimum = 0; + chartAlarmData.ChartAreas[0].AxisY.Maximum = (int)maxValue + 20; + + foreach (var item in alarmData) + { + ChartHelper.AddSeries(chartAlarmData, item.DataType, + SeriesChartType.Column, ChartValueType.Auto, + MarkerStyle.Diamond, 4, Color.DarkTurquoise, + Color.White, "", false, true); + } + + ConfigureAlarmChart(); + + var xData = alarmData.Select(c => c.DataType).ToList(); + var yData = alarmData.Select(c => c.DataCount).ToList(); + chartAlarmData.Series[0].Points.DataBindXY(xData, yData); + } + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "更新报警图表异常".Translated() + $":{ex.Message}"); + } + } + + private void ConfigureAlarmChart() + { + ChartHelper.SetTitle(chartAlarmData, "告警TOP10".Translated(), + new Font("微软雅黑", 12), Docking.Top, Color.White); + ChartHelper.SetStyle(chartAlarmData, Color.Transparent, Color.White); + ChartHelper.SetLegend(chartAlarmData, Docking.Top, + StringAlignment.Center, Color.Transparent, Color.White); + ChartHelper.SetXY(chartAlarmData, "报警项".Translated(), "次数".Translated(), -45, + StringAlignment.Center, Color.White, Color.White, + AxisArrowStyle.None, 1, false); + ChartHelper.SetMajorGrid(chartAlarmData, Color.Transparent, 20, 2); + } + + private void BindAlarmChartData() + { + var xData = CommonMethods.Lst_AlarmTop10_Qty.Select(c => c.DataType).ToList(); + var yData = CommonMethods.Lst_AlarmTop10_Qty.Select(c => c.DataCount).ToList(); + chartAlarmData.Series[0].Points.DataBindXY(xData, yData); + } + + private async Task RefreshChatNGDataAsync() + { + await Task.Run(() => + { + if (IsDisposed) return; + + this.InvokeIfRequired(() => + { + UpdateNGChart(); + }); + }); + } + + private void UpdateNGChart() + { + try + { + var ngData = CommonMethods.Lst_DefectTypeQty?.Count > 0 + ? CommonMethods.Lst_DefectTypeQty + : MockDataGenerator.GenerateNGData(); + + if (ngData?.Count > 0) + { + chartNgShow.Series.Clear(); + chartNgShow.Titles.Clear(); + + var maxValue = ngData.Max(x => x.DataCount); + chartNgShow.ChartAreas[0].AxisY.Minimum = 0; + chartNgShow.ChartAreas[0].AxisY.Maximum = (int)maxValue + 100; + + foreach (var item in ngData) + { + ChartHelper.AddSeries(chartNgShow, item.DataType, + SeriesChartType.Column, ChartValueType.Auto, + MarkerStyle.Diamond, 4, Color.Red, + Color.White, "", false, true); + } + + ConfigureNGChart(); + + var xData = ngData.Select(c => c.DataType).ToList(); + var yData = ngData.Select(c => c.DataCount).ToList(); + chartNgShow.Series[0].Points.DataBindXY(xData, yData); + } + } + catch (Exception ex) + { + CommonMethods.AddLog(true, "更新不良图表异常".Translated() + $":{ex.Message}"); + } + } + + private void ConfigureNGChart() + { + ChartHelper.SetTitle(chartNgShow, "各不良项".Translated(), + new Font("微软雅黑", 12), Docking.Top, Color.White); + ChartHelper.SetStyle(chartNgShow, Color.Transparent, Color.White); + ChartHelper.SetLegend(chartNgShow, Docking.Top, + StringAlignment.Center, Color.Transparent, Color.White); + ChartHelper.SetXY(chartNgShow, "项名".Translated(), "数值".Translated(), 0, + StringAlignment.Center, Color.White, Color.White, + AxisArrowStyle.None, 1, false); + ChartHelper.SetMajorGrid(chartNgShow, Color.Transparent, 1, 1); + } + + private void BindNGChartData() + { + var xData = CommonMethods.Lst_DefectTypeQty.Select(c => c.DataType).ToList(); + var yData = CommonMethods.Lst_DefectTypeQty.Select(c => c.DataCount).ToList(); + chartNgShow.Series[0].Points.DataBindXY(xData, yData); + } + } + + // 扩展方法 + public static class ControlExtensions + { + public static void InvokeIfRequired(this Control control, Action action) + { + if (control.IsDisposed) return; + + if (control.InvokeRequired) + control.BeginInvoke(action); + else + action(); + } + } + +} \ No newline at end of file diff --git a/LargeSquareOne/FrmMonitor.resx b/LargeSquareOne/FrmMonitor.resx new file mode 100644 index 0000000..327d826 --- /dev/null +++ b/LargeSquareOne/FrmMonitor.resx @@ -0,0 +1,3227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + 25 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABG + DQAAAk1TRnQBSQFMAgEBAwEAARgBDAEYAQwBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABEAMAAQEBAAEgBgABEC4AAxUBHQMkATQDBQEGaAADHQEpAl4BZwHwATQBNQHPAf8BNAE1Ac8B/wE0 + ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wNOAZZgAAMTARkDZQHlA+YB/wPmAf8D5gH/A+YB/wPmAf8DRwGA + GAADYAHbASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0 + Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wM1AVUQAAJTAVQBqgE0ATUBzwH/ATQBNQHP + Af8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/1gA + AzgBWwPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/xAAAUYCRwGAASgB6gH0Af8BKAHq + AfQB/wEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ + ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8MAAJhAWsB6wE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ + ATQBNQHPAf9QAAM9AWgD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wwA + AzsBYwEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8DXQHMBAABKAHqAfQB/wEo + AeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8IAANIAYQBNAE1Ac8B/wE0ATUBzwH/ + ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/0wAA+YB/wPmAf8D5gH/A+YB/wPmAf8DKgFABAADKgFA + A+YB/wPmAf8D5gH/A+YB/wNHAYAMAAEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0 + Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wM/ + AW0IAAE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/AxABFQE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wE0ATUBzwH/AlMBVAGqBAABNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8DTgGWRAADOAFbA+YB/wPm + Af8D5gH/A+YB/wPmAf8D5gH/BAAD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8MAAM1AVUBKAHqAfQB/wEo + AeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/AyoBQAEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEo + AeoB9AH/ASgB6gH0Af8IAAMzAVEBNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wgAATQBNQHP + Af8BNAE1Ac8B/wJTAVQBqgQAAlMBVAGqATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf9EAAPm + Af8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8EAAPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wMFAQYMAAEo + AeoB9AH/ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8EAAEoAeoB9AH/ASgB6gH0Af8BKAHq + AfQB/wEoAeoB9AH/AygBPAgAAl0BXwHOATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wgAAlMBVAGqBAACUwFUAaoBNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ + RAAD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/BAAD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8DJAE0 + DAADGQEjASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8EAAEoAeoB9AH/ASgB6gH0Af8BKAHq + AfQB/wFhAmsB6wwAAloBbQH1ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0 + ATUBzwH/CAACUwFUAaoBNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHP + Af9EAAPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wNaAb8EAAPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wMV + AR0QAANeAdIBKAHqAfQB/wEoAeoB9AH/ASgB6gH0Af8EAAEoAeoB9AH/ASgB6gH0Af8BKAHqAfQB/wMJ + AQsMAAJeAWQB4gE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8CUwFUAaoMAAE0 + ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/0QAA1oBvwPmAf8D5gH/ + A+YB/wPmAf8D5gH/A0cBgANHAYAD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8YAAEoAeoB9AH/ASgB6gH0 + Af8BKAHqAfQB/wQAASgB6gH0Af8BKAHqAfQB/wFXAlkBuRAAA1UBrAE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wE0ATUBzwH/AlMBVAGqBAACUwFUAaoBNAE1Ac8B/wgAATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ + ATQBNQHPAf8BNAE1Ac8B/0QAAxABFQPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wNHAYAD5gH/A+YB/wPm + Af8D5gH/A+YB/wNlAeUYAAFRAlIBoQEoAeoB9AH/ASgB6gH0Af8DOgFgASgB6gH0Af8BKAHqAfQB/xQA + AwwBDwE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wJaAWoB8gQAAlMBVAGqATQBNQHPAf8BNAE1Ac8B/wE0 + ATUBzwH/BAADDAEQATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/Al4BZwHwSAADZQHlA+YB/wPmAf8D5gH/ + A+YB/wNvAfEDKgFAA+YB/wPmAf8D5gH/A+YB/wPmAf8DEwEZHAABKAHqAfQB/wEoAeoB9AH/ASgB6gH0 + Af8BKAHqAfQB/wNJAYgYAAJlAW8B8QE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wJaAWoB8gE0ATUBzwH/ + ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wMdASlMAAPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8DOAFbIAADQAFw + ASgB6gH0Af8BKAHqAfQB/wEoAeoB9AH/IAABNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0 + ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHP + Af8CUwFUAapUAANlAeUD5gH/A+YB/wPmAf8D5gH/A+YB/wPmAf8D5gH/Az0BaCgAA00BkgFdAmAB1CgA + ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1 + Ac8B/wE0ATUBzwH/ATQBNQHPAf8CYQFrAetcAAMOARIDVgGyA+YB/wPmAf8D5gH/AzgBW2QAAmUBbwHx + ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8BNAE1Ac8B/wE0ATUBzwH/ATQBNQHPAf8DSAGE + 4AADCgENAlIBVAGoAl4BZAHiAloBbQH1Al0BXwHOAzMBUVQAAUIBTQE+BwABPgMAASgDAAFAAwABEAMA + AQEBAAEBBQABgBcAA/8BAAH+AT8C/wHwAQ8CAAHwAQ8BwAEBAeABBwIAAeABBwGAAQEBwAEDAgABwAED + AYABgQGAAQECAAHAAYEBwAEBAYABEAIAAYABgQHAAQMBBgEgAgACgAHgAYMBAwFAAgACgAHgAYcBAQGA + AgACgAHwAYcBAQHAAgABgAEBAfgBjwECAWACAAGAAQEB+AEfAQQBIAIAAcABAQH8AR8BgAMAAeABAwH8 + AT8BwAEBAgAB8AEHAf4BfwHgAQMCAAH4AR8C/wHwAQcCAAT/AfgBHwIACw== + + + + + iVBORw0KGgoAAAANSUhEUgAAAc0AAAApCAYAAABX53I9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAA + SMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEo + qGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAG + eIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK + 7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gz + SZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25q + bc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9Cvjc + M4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4 + oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjK + uLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqx + OPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIW + iAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFV + SAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAy + rA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYg + hUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2 + aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7r + h2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/ + Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SE + dJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3J + aSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQt + lHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJ + y5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV + 9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1 + JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7 + m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hop + b2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsy + u21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj + 9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCc + cNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527P + YS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT + 4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOw + EaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6s + faznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP + 8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy + +rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVs + S1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7 + SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9Uxlfe + qXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/w + jowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9V + t1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO + 6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503r + m10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9 + qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h + ++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7 + Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsMAAALDAE/QCLIAABqsElEQVR4Xu29dbQdVbb2XVlV + +773vu81bve9gXba6N5VOwIEd3eSkJx0N9pI4+5wdlXtHfcEIrgEJ2hwDS7B3d0aaTR6bH3jmbJq7Ton + 0Pd+4/vj/QYZY461DyQh0Bn59TPnM58ZBJ/Y4H9Q/f5fVPHzfP/t+2/ff/v+2/ffvv/2f9W33kD8tioD + sK8yffy1vup7eH7/7ftv33/7/tv33/4v+9YbjH1VGXgKR7/CPqr8fco/h4Pn7uf0Uefyu8e5Ut7nPct1 + ng32OlcKn/Vr+by3X+fzu498jXef86W8z3+W2veCldd+WhfaYP8L+cXX+OzXAX7NKz7/BTWP60Ap//NB + F9ngwIv4Pdivi4vPh8jXeA+9uHcddgmX/xl1eKmOuJTrSHnd15fZ4KhLuehzqY5GXV7UMaU6FnWFDY7T + 16vjpU7AeyW/J+CVOtGv+VwnSZ0sddJVNjhlvlf4+iobnOrX1cXn9qu56lrXcKVX2yDFe40NMu/NruU3 + v9YGub7X8dvwqnld7xp9vQ1GX2eDMXiv53fsAnlLNW4B/71xN/Dn8VIT8N5ggwl+3WiDiTfYYCLeG20w + CXWDvDcV72TUjfxOudEGU26ywdSbbTAVr9S0m20wTd+bbTBd31uKmtFHzby1qNPKdZsNTkfdyu8s+Rqv + 1myt24t3Tqnm4r2D37l477DBGV6deafUHTY4Sz7779l47+I6G4W/dpcNzpGv8VLdzXVuqc7zayG/5+Nd + aIPz8VnqgoVe3VO8Fy6Uwmev5pXqIr/uba2LUfdJydeXaN1ng0vv41c/t9T9NrjsPq/wdakuL9cDXFfI + 11fgs5b39ZVS5a/n432weOmz92pVkiZXrSEln5NmECX6tf59/5WiH98IopbvV/xc+Ov+3wsu+Pi/VS3/ + LK/KcAyOusLavupIrSt71xGlCj6xkVd9QbRPcDp4KiD9WhksBZgOnPis0PRKgVkGqIOlAFKhqcD0a9+V + AFSh2QuY3udvg2VLCSQJmvICmFoKSnw+REBJr1dlaB4KYHqgLL+HCxz19eFJdRm/AKQDqMLyW4CpsHTQ + 7KMUmgTMEixbwOnB0oemD0+UArMvaLZ7wHTgBDDlVWD2AicgCXDKqwVQAp4ETIFmQ2HpAVNh6ReBUiGp + wJRXgUnvDQJMwNODpg9Mhaa+BEkfmgCmD018VnDiFUhS3VKAkwrQlM8OmAClB05Asi9wKjD9UlgSOBWW + XvWCpgJTygemKw+cBEsBKMFSIEmw1M8eMH1wnusXoHlXCZpSDpYAJ+BYgiag6D73Ac0yMAmaJVA6WPrQ + 7AOYZXhqlb9GESRL4OwFTAVlGaCl6guW5XKglM/0agGaPugInkUx7MqQLH0t3yfyfmwBSe/nls9lKH5X + 9f5ncX0nNFcGSx+Sh2vN5xp5VhdV21mddiTqzE7bdkanbTuzw7bR5w47ij532FFndNi2uSuoRs1d0TPq + DH7b5i7vaZuzvGfUXK/mLHP1B7yzl/LXeGcv7WmbvaRnVGt1j5qFWtw9ajZXGz7P+obr9G+62+jz16iu + Uad/3eVeqq+0OkedJnX6l52jZn7Z+YfTvuwcddoXnW2omZ93jpr5RUfbzM872mZwjZr5N6q2GVQrRs34 + bEXbjM/c2zb90xWjpn+6vG36p8vxjpr+Cd5lo6Z/sqxtxif0jpr+8bJR0z5Z2jbtY66pf9VaQjXtoyVt + Uz9aPGraR4vbpqA+XNw29cNvRknhc9uUD75pm/z+1yMnv/9125T3vx415f2vUG1T3v+ybfJ7X7ZNeg/v + F6Mmv/fFyEnvftGGmvzu522T3vl85OR3Pm+b9O7f2ia+/be2Se98RjXxbdSnIye+/WnbhLe0Pmmb+NbH + I8e/+XEbasKbf5X6iGr8Gx+NHP/6hyPHv/Fh2/g3Phg5/nXU+1yvvTdyHNW7qLbxr70zctyr77SNe/Xt + kaixVG+NHPsK6s2RY15+c+TYV96gGvPy6yPHvPwa1diXX2sb8/KrI8e89IrUy1SjX3xp5JgXXxwx+sUX + RzRfeAE1cvQLz49oPv+c1LMjR7/wzIjGc1pPj2w+/9SI5nNPjmignn1iROO5J0bkzzw+ovHsYyPyZxft + lj+zaET+zKMjsmceGZFTPbxb/vRDIzKqB3fLnnpgRP70/SOyp+7fLX3qvhGo7Kl7R6RP3btb+uQ9u6VP + LhyePnH38PoTd++WPnEnVf2JO3arP3H78Prjt+1Wf+LW3eqP3zq8/fFbhrc/fjPXYzcOb3/sBtRu9cdu + GH7qogXDT110/bBTF103/NRF1w4/ddE1w09ddPWwUxddNfzURVcNPeWR+cO4rhh+8iNXDDvlkcuGnvzI + ZcNOefjSYSc/fMnQkx6+eNjJj1w09KSH5w09+eELh5740IXDTnr4gqEnPXT+0JMePG/oiQ+dO/Tkh84Z + etKDZw896cGzdj3xgbOGnvjgmUNPfOCMXU98YO6uJzwwe9cTUffP2vWE+0/f9YT7Z0rNQO1y/H3TULue + cP/UXY6/b/LOx947edfj752483FU46mOvWfczsfdO3bn4+4Zs/Ox94ze+dh7mlL5TscszHY+9p50x6Pv + ru90zN3tqB2PufvkHY++65Sd6L37pB2PvuuEHY+++4Qdj77r+J2OuuvYHY+685gdj77zmB2PuvOo7Y+8 + 46gdjrzjyB2OuvNw1PZH3n7oDkfecch2h99+yPaH33aQ1IHbcR2w/eG377/d4bfut93ht/4Zte1ht+6z + 7WG37LXtYbfsve2ht+y57WG37rHtoTfvvs0hN/9pm0Nv+ePWB9/8h60PvmnUNofc3LbVwTeN2PqQm0Zs + ddCNu2118I27bXXQjcO2OujGXbc86IZdtzzwhl22PHDBLpsfcP3OW/xlwQ5bHrhgB7ybH3D99psfsGC7 + LQ64fptN979um80PuH6rTfe/bkvUJvtdu8XG+16z2Sao/a7ddJN9r9l4o32u3gi14d7zN6Ta56r11t/j + ynU32Gv+OuvtceUQ1Pp7Xrn2OrtfvvZ6e1yx1rq7X7HWOrtfPnjdPa4YtPYfLxs45I+XDVz7D5fWhvzh + 0mRw28XxWqMuqQ4aMa86aMRF1QHD560xcLd5awwaMe+3tWEX/CaRioee/8tk6Pm//P0u5/7i9zuf+4vf + 7HDmz3+741k/+82OZ/1sjZ3O+elPNj/9Jz/dataPUT/bavaPVtt05mo/2mzmqj/ccMp/8Tv1v/5zw2n/ + +c9DJvzwX4aM/8G/rD3+B5Va8z8qSXOVKGmuUqk1/71Sa6xSqTX+rZI0/z2qNf+tUmv+ayWh+pdKjeqf + uRpSzf8j9b8rSfOf8EY1ev9Jvv7HSq3xj5Va839xNf6hUmtqVfB1cO5HOdV5H2W96vy/pqhKrWkqtWY/ + 7wUw8fbrBU1Tbbcmbu8xcb2ohKrb1NJuU8u6zACpgVmnGdToMoPyTlQ4uNFhtAblRQ3Ml6PCAdlyMyBd + bmrpMpPUUUtNnC6Vd4mJ25eE1fbFYbW+2FTr35hqu9bXJqb6ylTrX5lq+5emis/tX5q4/Yuw2v6Fqdal + 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 + Fg32AAAAAElFTkSuQmCC + + + + + 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 + ZcNOefjSYSc/fMnQkx6+eNjJj1w09KSH5w09+eELh5740IXDTnr4gqEnPXT+0JMePG/oiQ+dO/Tkh84Z + etKDZw896cGzdj3xgbOGnvjgmUNPfOCMXU98YO6uJzwwe9cTUffP2vWE+0/f9YT7Z0rNQO1y/H3TULue + cP/UXY6/b/LOx947edfj752483FU46mOvWfczsfdO3bn4+4Zs/Ox94ze+dh7mlL5TscszHY+9p50x6Pv + ru90zN3tqB2PufvkHY++65Sd6L37pB2PvuuEHY+++4Qdj77r+J2OuuvYHY+685gdj77zmB2PuvOo7Y+8 + 46gdjrzjyB2OuvNw1PZH3n7oDkfecch2h99+yPaH33aQ1IHbcR2w/eG377/d4bfut93ht/4Zte1ht+6z + 7WG37LXtYbfsve2ht+y57WG37rHtoTfvvs0hN/9pm0Nv+ePWB9/8h60PvmnUNofc3LbVwTeN2PqQm0Zs + ddCNu2118I27bXXQjcO2OujGXbc86IZdtzzwhl22PHDBLpsfcP3OW/xlwQ5bHrhgB7ybH3D99psfsGC7 + LQ64fptN979um80PuH6rTfe/bkvUJvtdu8XG+16z2Sao/a7ddJN9r9l4o32u3gi14d7zN6Ta56r11t/j + ynU32Gv+OuvtceUQ1Pp7Xrn2OrtfvvZ6e1yx1rq7X7HWOrtfPnjdPa4YtPYfLxs45I+XDVz7D5fWhvzh + 0mRw28XxWqMuqQ4aMa86aMRF1QHD560xcLd5awwaMe+3tWEX/CaRioee/8tk6Pm//P0u5/7i9zuf+4vf + 7HDmz3+741k/+82OZ/1sjZ3O+elPNj/9Jz/dataPUT/bavaPVtt05mo/2mzmqj/ccMp/8Tv1v/5zw2n/ + +c9DJvzwX4aM/8G/rD3+B5Va8z8qSXOVKGmuUqk1/71Sa6xSqTX+rZI0/z2qNf+tUmv+ayWh+pdKjeqf + uRpSzf8j9b8rSfOf8EY1ev9Jvv7HSq3xj5Va839xNf6hUmtqVfB1cO5HOdV5H2W96vy/pqhKrWkqtWY/ + 7wUw8fbrBU1Tbbcmbu8xcb2ohKrb1NJuU8u6zACpgVmnGdToMoPyTlQ4uNFhtAblRQ3Ml6PCAdlyMyBd + bmrpMpPUUUtNnC6Vd4mJ25eE1fbFYbW+2FTr35hqu9bXJqb6ylTrX5lq+5emis/tX5q4/Yuw2v6Fqdal + 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 + Fg32AAAAAElFTkSuQmCC + + + + + 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 + ZcNOefjSYSc/fMnQkx6+eNjJj1w09KSH5w09+eELh5740IXDTnr4gqEnPXT+0JMePG/oiQ+dO/Tkh84Z + etKDZw896cGzdj3xgbOGnvjgmUNPfOCMXU98YO6uJzwwe9cTUffP2vWE+0/f9YT7Z0rNQO1y/H3TULue + cP/UXY6/b/LOx947edfj752483FU46mOvWfczsfdO3bn4+4Zs/Ox94ze+dh7mlL5TscszHY+9p50x6Pv + ru90zN3tqB2PufvkHY++65Sd6L37pB2PvuuEHY+++4Qdj77r+J2OuuvYHY+685gdj77zmB2PuvOo7Y+8 + 46gdjrzjyB2OuvNw1PZH3n7oDkfecch2h99+yPaH33aQ1IHbcR2w/eG377/d4bfut93ht/4Zte1ht+6z + 7WG37LXtYbfsve2ht+y57WG37rHtoTfvvs0hN/9pm0Nv+ePWB9/8h60PvmnUNofc3LbVwTeN2PqQm0Zs + ddCNu2118I27bXXQjcO2OujGXbc86IZdtzzwhl22PHDBLpsfcP3OW/xlwQ5bHrhgB7ybH3D99psfsGC7 + LQ64fptN979um80PuH6rTfe/bkvUJvtdu8XG+16z2Sao/a7ddJN9r9l4o32u3gi14d7zN6Ta56r11t/j + ynU32Gv+OuvtceUQ1Pp7Xrn2OrtfvvZ6e1yx1rq7X7HWOrtfPnjdPa4YtPYfLxs45I+XDVz7D5fWhvzh + 0mRw28XxWqMuqQ4aMa86aMRF1QHD560xcLd5awwaMe+3tWEX/CaRioee/8tk6Pm//P0u5/7i9zuf+4vf + 7HDmz3+741k/+82OZ/1sjZ3O+elPNj/9Jz/dataPUT/bavaPVtt05mo/2mzmqj/ccMp/8Tv1v/5zw2n/ + +c9DJvzwX4aM/8G/rD3+B5Va8z8qSXOVKGmuUqk1/71Sa6xSqTX+rZI0/z2qNf+tUmv+ayWh+pdKjeqf + uRpSzf8j9b8rSfOf8EY1ev9Jvv7HSq3xj5Va839xNf6hUmtqVfB1cO5HOdV5H2W96vy/pqhKrWkqtWY/ + 7wUw8fbrBU1Tbbcmbu8xcb2ohKrb1NJuU8u6zACpgVmnGdToMoPyTlQ4uNFhtAblRQ3Ml6PCAdlyMyBd + bmrpMpPUUUtNnC6Vd4mJ25eE1fbFYbW+2FTr35hqu9bXJqb6ylTrX5lq+5emis/tX5q4/Yuw2v6Fqdal + 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 + Fg32AAAAAElFTkSuQmCC + + + + + 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 + ZcNOefjSYSc/fMnQkx6+eNjJj1w09KSH5w09+eELh5740IXDTnr4gqEnPXT+0JMePG/oiQ+dO/Tkh84Z + etKDZw896cGzdj3xgbOGnvjgmUNPfOCMXU98YO6uJzwwe9cTUffP2vWE+0/f9YT7Z0rNQO1y/H3TULue + cP/UXY6/b/LOx947edfj752483FU46mOvWfczsfdO3bn4+4Zs/Ox94ze+dh7mlL5TscszHY+9p50x6Pv + ru90zN3tqB2PufvkHY++65Sd6L37pB2PvuuEHY+++4Qdj77r+J2OuuvYHY+685gdj77zmB2PuvOo7Y+8 + 46gdjrzjyB2OuvNw1PZH3n7oDkfecch2h99+yPaH33aQ1IHbcR2w/eG377/d4bfut93ht/4Zte1ht+6z + 7WG37LXtYbfsve2ht+y57WG37rHtoTfvvs0hN/9pm0Nv+ePWB9/8h60PvmnUNofc3LbVwTeN2PqQm0Zs + ddCNu2118I27bXXQjcO2OujGXbc86IZdtzzwhl22PHDBLpsfcP3OW/xlwQ5bHrhgB7ybH3D99psfsGC7 + LQ64fptN979um80PuH6rTfe/bkvUJvtdu8XG+16z2Sao/a7ddJN9r9l4o32u3gi14d7zN6Ta56r11t/j + ynU32Gv+OuvtceUQ1Pp7Xrn2OrtfvvZ6e1yx1rq7X7HWOrtfPnjdPa4YtPYfLxs45I+XDVz7D5fWhvzh + 0mRw28XxWqMuqQ4aMa86aMRF1QHD560xcLd5awwaMe+3tWEX/CaRioee/8tk6Pm//P0u5/7i9zuf+4vf + 7HDmz3+741k/+82OZ/1sjZ3O+elPNj/9Jz/dataPUT/bavaPVtt05mo/2mzmqj/ccMp/8Tv1v/5zw2n/ + +c9DJvzwX4aM/8G/rD3+B5Va8z8qSXOVKGmuUqk1/71Sa6xSqTX+rZI0/z2qNf+tUmv+ayWh+pdKjeqf + uRpSzf8j9b8rSfOf8EY1ev9Jvv7HSq3xj5Va839xNf6hUmtqVfB1cO5HOdV5H2W96vy/pqhKrWkqtWY/ + 7wUw8fbrBU1Tbbcmbu8xcb2ohKrb1NJuU8u6zACpgVmnGdToMoPyTlQ4uNFhtAblRQ3Ml6PCAdlyMyBd + bmrpMpPUUUtNnC6Vd4mJ25eE1fbFYbW+2FTr35hqu9bXJqb6ylTrX5lq+5emis/tX5q4/Yuw2v6Fqdal + 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 + Fg32AAAAAElFTkSuQmCC + + + + + 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 + ZcNOefjSYSc/fMnQkx6+eNjJj1w09KSH5w09+eELh5740IXDTnr4gqEnPXT+0JMePG/oiQ+dO/Tkh84Z + etKDZw896cGzdj3xgbOGnvjgmUNPfOCMXU98YO6uJzwwe9cTUffP2vWE+0/f9YT7Z0rNQO1y/H3TULue + cP/UXY6/b/LOx947edfj752483FU46mOvWfczsfdO3bn4+4Zs/Ox94ze+dh7mlL5TscszHY+9p50x6Pv + ru90zN3tqB2PufvkHY++65Sd6L37pB2PvuuEHY+++4Qdj77r+J2OuuvYHY+685gdj77zmB2PuvOo7Y+8 + 46gdjrzjyB2OuvNw1PZH3n7oDkfecch2h99+yPaH33aQ1IHbcR2w/eG377/d4bfut93ht/4Zte1ht+6z + 7WG37LXtYbfsve2ht+y57WG37rHtoTfvvs0hN/9pm0Nv+ePWB9/8h60PvmnUNofc3LbVwTeN2PqQm0Zs + ddCNu2118I27bXXQjcO2OujGXbc86IZdtzzwhl22PHDBLpsfcP3OW/xlwQ5bHrhgB7ybH3D99psfsGC7 + LQ64fptN979um80PuH6rTfe/bkvUJvtdu8XG+16z2Sao/a7ddJN9r9l4o32u3gi14d7zN6Ta56r11t/j + ynU32Gv+OuvtceUQ1Pp7Xrn2OrtfvvZ6e1yx1rq7X7HWOrtfPnjdPa4YtPYfLxs45I+XDVz7D5fWhvzh + 0mRw28XxWqMuqQ4aMa86aMRF1QHD560xcLd5awwaMe+3tWEX/CaRioee/8tk6Pm//P0u5/7i9zuf+4vf + 7HDmz3+741k/+82OZ/1sjZ3O+elPNj/9Jz/dataPUT/bavaPVtt05mo/2mzmqj/ccMp/8Tv1v/5zw2n/ + +c9DJvzwX4aM/8G/rD3+B5Va8z8qSXOVKGmuUqk1/71Sa6xSqTX+rZI0/z2qNf+tUmv+ayWh+pdKjeqf + uRpSzf8j9b8rSfOf8EY1ev9Jvv7HSq3xj5Va839xNf6hUmtqVfB1cO5HOdV5H2W96vy/pqhKrWkqtWY/ + 7wUw8fbrBU1Tbbcmbu8xcb2ohKrb1NJuU8u6zACpgVmnGdToMoPyTlQ4uNFhtAblRQ3Ml6PCAdlyMyBd + bmrpMpPUUUtNnC6Vd4mJ25eE1fbFYbW+2FTr35hqu9bXJqb6ylTrX5lq+5emis/tX5q4/Yuw2v6Fqdal + 2j831frfTFz/m6m2f2aq9c/CavunJm7/1FTrn5i4/omp1j/G5zBu/6up1qnCav0jE7d/GFbbPzRx/cOw + Wv/AVNvfR4Ux3vp7YbX+nonb3zPV+juu4va3TRVVfzuM62+aav1Nw+8bYbX+eog3rr9u4vprplp/zcT1 + V021/VUT118Jq/VXTLX95TCuvxRW6y+ZuP6iiesvUFXrL4TV+vNhtf6cqdafC6v1Z8O4/oyJ68+EcfpM + WK0/Hcb1p6SeRJm4/oSp1h8Pq+nj/NYfC6vpIhPXH0WF1fSRMK4/bKr1h01cfzis1h8Kq/UHTbX+YBjX + HzRx/QFTrd9v4vp9Ide9YZzeE8Z11EITpwtNXL87jOt3hXF6l4nTO8Nq/Y4wTu8I4/rtXOltYVy/zcTp + LSFV/ZawWr8pjFHpjWGc3iDvgjCuLwir9evDuH5dGKfXhXH92jBOrwmr6dX0xvReFcbpfKkrwzi9IozT + y6UuC+P00ihJLw2T9JIwTi8O4+ziME4vokqyeWGcXhjF2YVhnJ6PiuLs/DDOzgvj7JwwTlFnh3F2Vhin + UtmZYZyeEcbp3DChmhPG6ZwozmZHSTYrjNPTozg7LUzSmWGczQxjvOmMMM6mh3E6LYyzaVGcTY2SbEqY + ZFOiJJscxumkMM4moqIkmxDGqHR8GGfjooRqDFWcjQ65GqgozvIwybKIK42SrE4VZ+1hnLVHcXZqGGen + hHF2chRnJ4dJdlIYZydGcXaCqyQ7Pozz48IkOzZM8mOjJD86SrKj5T0qSrIjwyQ7AhXF+eFRkh8eJtlh + YZIdGiXZIVIHR0l+UJjkB0VJ9pcwzg6kN8kOiJJs/zDJ94vifL8oyfaNkvzPYZL/OUryfaIk3zuM872j + JN8rSvI9ozjfI4qzPaIk313qT1J/DJP8D1GSj4qSvE1qpNSIKMl3kxoeJY1hUZIPldpVapcoyXeOkgZq + pyjJd4qSxg6VJEdtH1E1tpPaNqo1tqkkqHzrqJZvFdXyLaOksWWl1tiikuSbR1ybcTU2jZJ80yhpbFJJ + GhtHVPlGlVpjw0pCtUElyTeIksb6UZKvH9Ua60a1fL1Kkq8bJfk6UdJYp1JrDKkkjbWjJJdqrFVJGmtG + SWOw1KCoRjWwkjQGRrV8QFRr1KKkUaskjaSSNOJKrVGtJI1qVKP6fZRQ/S5KGmtUas01Kknjt5Va47dR + rfGbiqvmrytJA/WrStL4ZaXW+GVUa64eJY1fVGrNX1SSxi+iGqr5s0qt8bNK0vhppdb4acT1k0qt8ZOo + 1vxxpdZA/SiqNX9USRqrRUlj1UqtuWql1uiPivAmTdR/VWqN/+Rq/jCqNX+IV+o/tBiYjVUqSWOVqMaw + FGD+WwRg1pr/GtUaeP8F8IwUnonCU6DJsNRXYakl0PSB6V6/okqtGfoFeAosTaXWIFD64OwNzRjQrKM8 + YKY9BMwBWbcZmAGSXIMbnWZNVLPTrNXsMGvhHY23qDWbgOhyMyjnGpgvCwdkyxicBM+lJq4vCeP6ErxU + 1fbFBMsYwCR4fh1W618DmCGBs/0rE7d/GTI88Qosqf5m4nYA828MT4Il4AlwfmIIoIBm+8chwbP9r4bg + ibf+UVitf2ikwmo7gTOs1hmegCZV+7um2i7QrL8dVtvfDqv1t0y1/S0CpkDTFaBZrb8WxigC5qsAZhjX + Xw6r9ZcNgMn1YugB08QEzecBTRPXn1Nomiq9T4fV+lNhNUUBmAAnQZOAGdcfMwTN+qIwpno0jNNHQwCz + mj5sYhRgmT5I4IzTB0yc3h/G6X1c9fvCagpoMjir6UKAU4EpL0HTEDRTQPM2geatDMv05rBav9nEqFSg + WRdw1hcwONPrpQBMhmYrMK8K4/r8MK4DmApNBmci0IwJmATNiMDJ0IzilKAZxtkFIcMS4DwvYmiey9Ak + eJ4dAZhJemaYOGiiAMs5YZLNDpNsVhSns8I4O92BE9BMCJwCTappYZJNDeNsShQTOCdHsYIznRgmKaBJ + wNSK4mxMmKQEToFmk6CZZHkYZ3kUZ5lUGgo0oyRrD5Ps1CjJTgmT7OSI66QoyU8ME4AzZ2Am+XFRknHF + 2bFhnB1D0Izzo8MkPzKKsyMBTsAySrLDozg7LErywyJAM2ZohrFAM84PDJP8wIjrL1GSHxDF+f4MzHy/ + MMkBTdQ+UUzQJHBGsUAzyfaMklygmSk0/ygFYGr1Bc3hUsOiWgs0d4mShkAz36kCaNbyHaOEaocoaQCa + 23m1bZTkBM0oaWxdSQDNxlaAZpTkW0RJY4tKrbF5lDQAzM0qSb5ppdbYJKLKN6nU8o2ipLERgzPfMEry + DSq1xvoVQLNG4FyPodlYt8LQHBIBmjVAs7EWAzNfs1JrrFlJGoMrtcZgALPC4BwY1RoDKkljQKXWqEkl + EcBZa8QCTMDz91Q1gubvolpjDRRDs/kbVCVp/CZiYP46qjV/BWACnBFV8xcEToJn4+dR0iBoRgTN5k8r + SfMnBM2EwPnjiKr5owpVY7VKrblapdZYtZIINPEmjf9SaEYeOCu15g+iWlMVJqAJUCo4AUxVmAJOgqUU + gzNKCJRapDQjhuX/rtQarDIdNBv/WEkYmBGgmTT/ISrA6UMTsCwXoGlEadLnApr09t2eFWByAZikLgHM + vMcMzLoFll1mzWaXWXt0pxmCGtNp1hnTQbXuWHnHdIRDxnaYIaOXm7VHLzdrNZebNRvLzKDGMoDTFOAU + pUnAXMzwJGgu5pdgqWrTU5p1APMLE5O6VIXJKlPhybAUtVkHPD811fZPwirgWQc0RWm2fxRKGShOqM1q + +weAZhiT4gQo3wv5fdfEqPo7oac2w7gOYL7llGZMCpNUpijO10zc/lpYhdKEwoTSbAcwXzYxgfPFUKAp + pdAELElpmrj+bFitQ2WS0jTV+lNGlKapOmg+ESo0Y6jMdJGppo+aGFV/ROrhkKH5kAE04/SBMK5zVev3 + A5hQmwbQZHAuJGhW07vDGKVqs36nFBSmFICZ3mriFO8tAGYYpzeL0izUZpUUp0CzpDQdNOu+0vSBibos + jDPUpQAnQTMpgBkyMOeFCZRmKtAktXleFKfnhUl6TsRK85wwyc6KYi4B5xlhnJ1BSjOG0sxmR3E6O4qh + NLPToyQ9jdUmQRPAnBEmqQCT1ObUMEmnhnE6OYyzyU5tJinUpoNmpJVkYwWYAGczRHngBDChOMO4l9o8 + NUpyUpoAJ5QmoBnF2YkhKc3ch+axUZwdEyYCzSQ7OiSlmRM0wyQ/IowzgPOwUKGZ5KI084OjODsI4Ixi + AJNU5l+iODsgTASaDE6FplOaUJmhgyaA2UtpKjShNP8QJVlf0EQNrwCatRxKU8FJ0Kw4pUkKE0pzx6gG + YEJpEjS3j2oAZmPbikKzlhM0BZgKTQKnqs0Kg3PTStLYhJRmLd+Y1Wa+UUTAbDA0SWWq0szXAzgBzYgL + wITSRK0VJflaUY1egiYpTVaZgypJPrAi0ITKJKVZc0ozjqA0E4YmlGYlafyukjTWYLXZcGqTgAmlmTR/ + HSWNX0VQmMULeK7OCrPxcy5RmqIy8foqMyKV2QAwCZxRrbEqqc2ksWpUa/ZHAZpR0kQBmj8EOPFWEgIm + Q5MByooT0Ewa/84tWoamgFNg2eD2LLVp6bO2ZYv2rN+adeCUEnAKKPVVtQlAEjyjvpRm0Z71a6VKs59T + mQxMLijMQXm3GZx3mzWb3Wbt0d1myJgus86YLrPe2E6z/rhOs8F4qQkdXOM7zPrjOsz6YxmkQ8YwPNcc + vdwMbi4LB+fLzMBsmRmQLzNJBnAuMUm6xCQAJ8Hym5Bas4Bm+zeqNLktixfQJGBSi9aBMyZwfh5Se1ag + GaNNC8XJLdqQVGY7WrQEToYnQROwFJVZ/4AUZgy1CaWJz9SiBTChNN8laJLS5CJoxvU3Q4BTFKaCE+1Z + ASa1Zhma9AKaaM06tYn2LClOVZqxtGhVZaI1y9DUFi21ZgmaMbVlHzcxqUxVmo9SETwBTCm0ZwHOKqtN + AmYVapNbswbt2SpaswJNUpoEzrvCKtRmCmDeEVYVmtqeTW8NqwROUpumgCYrTQamQtNv0ZaV5tWmFZp9 + tmdFZV4iivOiMAE0M7yiNAHN9IIwYWhKnRsm6blhnJ0dxdnZaM1GcXomYBmJ0iSVCWhSixZqM50VkdIk + tUlKM6L2LIFzepRIi9ZTmgTMJJsUoT2bUIt2QsgtWgXn2DAWaCasMgWc2p6F2gQ0CZhhTNBEa1aVJlq0 + 1J4ltcntWYJmmGQnhHF2vAdNtGiPiWJWmlGcHxXFDE2oTEAzxEvQzKE0Dw1de5ageWAkrVkBJtqzB0Bl + stJEezYDMNGiVaUJYJaVJsq1ZqMkE2B+S3u25pQmq02/RVsjaKKgMneqsMrckVq0DE+BZo7WrCpNqExA + c2sGZgHNKGlsHtWoNcst2hrAmaM9C7W5ccRqE8DcMKo1pDXrwEnQpDZt0mClmeTSnm2sDWASPEVpRlCa + UJwJWrP5wIhegibgWYsEmlEtj9GerdRIYZLSjKA0a01SmRFUJqDJ4ITSdK1ZVppNtGdXR0FlUgGcSePn + lYTBycBsorg1C8WZNElpVhKq1SJSmo3VKklzNUCzQtAUpVlr/FdUa4rKbPywKFWbDVabPM+UAjipFJyq + NBWWeP3WbFlt/lMlIbXpt2b99mypRduQUrXZ+C5o+u1ZAmcLMB00E1RqBZg9ZlDeYwY3us1azW4zZDRg + 2R2uN7bLbDC+y2w4odNsNLHTbDyx02yCmtRhNpnYYTae2GE2Qk1YYTYYv8KsNw4KdIUZMnqZWWv0MjO4 + scwoOGuAJQGT1KaJU1GZ2p4lcGoROENWmlqYZ34ektJsUZyYbQKW3J7FTJNVJoGTZ5vtH1N7NobK5Jkm + KUy0aEllOmCiRfteGFOLltqzCk3MM6k1W21/C8CUOSagibkmWrTcnqVqbc8qNKEyndqs8lwTapNK27MM + TG3RApikNgWapDQZnKnOMx8z3JrV9uwjplp/JKymUJpQmaI0SWE+gJlmGBM4tUULpYnWLM00oTQNFZSm + QpPqdlPVuSYpTG7PurlmepMRpWmKuaZTmoZUprRnq+m1hqBJKvM7Z5oRlwOnzjUjvz2bFDPNMEFrVqAp + c82I2rOYa4rS1JlmnM2NSGkSOGWmqWpTlCa3ZhmasahNzDS1PUtqEyozQwGcBMwIM80kGxcm6dgwTjHP + dDPNCODEXBMqE9BklYm5Zp3as2jNcov21JDas/kpOtMkpSlqM0pygmYordkozqU1S0oT80yaaVLF+RE8 + z2SVGQKabqaZU3s2SgBMVprUno0JmvsrNHWmKeAUpZntHSZZGZot88xCZf5d7VkoToWmzjOhNqE0pUVL + SlPaswJNtGZrgCaUJs0zt4kEmhVRmhWozBqgCaVJ4MQsEzPNTVxBbdYaG1XQoq3lNNOMUNSabSgsMdck + aFYInDlatDTPrNRIaa7JLdocsHTt2Uot5/ZsreFmmtSaBTShNvllaHL9jgpqU6Ap4ITSRFuWlKY301xd + XrRlMcuk9myF2rOF2mRwcmtWi+eZ1JYFODHPFGhyi7ZSawKYBM4KgZPgSdCMag1Vmv8RAZz0mVVmRGpT + FGfSgAGIW7RJ418jUZkRgEnQVJXZ8NVmL6UZJX1Dk9u0DajLUouWwOngWUCzUYZmr/ZsKzRrqe0NzDHd + Zt2x3WZ9gmWX2Xhil9l0UpfZbHKn2XxKp9mCqiPcYmoHXrPZ5A6z6SQAdEWo8Fx37DIzZMwys1aTwBkO + olbtkrAXOAmWbqbJpUpTjECxtGi1uFUrs0xWmiEBU4xABFAyAInSbFeV6WaaNM90RqD6BzABseKkWSbN + NEltcqE1q2qT2rP8trMRiJRmO4BJ0JRyJiBSmgAnZpusNqEyqQicbATSFu2zYTV9BmpTVSZVXH+K2rRV + gDOF0hS1mZLSJGhW62jTQm0+YuKUoUkqMyWVKUYgac3SXFNatCnUJpQmgdPE6d1kBGKVKTPN9I6wKq3Z + qjfTrNZZaZLKxGwTrVmaZyo0F4TVdIHheaZCE68oTdeaXVl71oemAlOg6bVnyQSEmSapTQfOiKCJ1iyg + CaVJZiAoTYYmtWY9aFJ7Np0VJSmrzARKk1VmROAsgBnGaM3CDJROiZKUlGYYMzQjUZowAPFMMx0rapOg + GSUOmk5tUnsWrVkuqE2aacIIhPYszzVznmnG+UlRkmGuCWDKXFNmmmwGAjSPIZVZQPMILjICwQR0WBQD + mvkhIQNToElmIAZnTDNNAJMrzvaL4kJpRknWojRDUZth39Asg/PboMntWQdNmmd6RiC0aP2ZJqnM7aMa + TED5dtSeJXDmW6MYmPlWFVWZgGZNzUCkNMkExNCEGYhnmjLbVKW5AbVmk8Z6lVqDW7O1fF0As1IjcLLS + pLYsVGa+Fs80c98IxCagpDAByQtoitqUFi2MQApMnmVSizaqNVll1nSe2fx1VGv8SlqzOtcEOBmaSfPn + BE0qQLOp7dmfRAnas5hrNn8cJTTL5Ero1ZnmqqQyWW0KMBmaPNeEGQgtWkCz8QOozIjmmuSYXSUSlRkl + 5KLVeaaqzX+pJKw0I89BG7W6Z/2ZZklt+g5aT20mfQLzv6M0XXvW7Ux6wLRmIAGzpwWYUJcbTeghWG4+ + uctsObXTbDWt02wzo7PfYTd1B6e91tPv0Bu7zDYzOsxW0zrMlgTQFWbTSSvMxhOXs+rsG5ykOAmeBE20 + aQmaaM1Se1ZmmmoA8lSmN9ckExDatOSeZWiiRVv/lFy0hdpklSlGIJ5nkspkMxC1ZTHTbP/AsHuWHLQ8 + 26y/G8Y8zwzJPUtmIAYmlCa3aN1M01TbYQASpQlotkNlMjCrZAZSExDAKTPNdmcC8h203lyTgIn2rGEj + EKnMUGaa1J7VuSZatNyafSSE0nQt2pTcs+ycTR+g1qxrz2KWCfds/R5DKrN+T8gK07lnw2p6JztoxQhE + bVqAk+eaMssENGWe6Tloq2wEAjQFnNf2nmn2UpotwPSqr5kmWrTantUWrbRnSW2iPdtiBIoSUpvUolVo + ojXL88x0tlOZ7J6V9qzMNdGaTcgENA3QjOJ0CuaZvhFIWrSAJqlMcc6OC2WeWW7PkotWlSa3Z8kIpNBE + exbu2QglRiByz4oRKEww08yOj9Q9i5kmzzXZQRvnR4UwAnGLlmaaIRuCZKYpRiCeZbJ7lmH5F27LUmt2 + /zDJRGlinunUppqAoDb3KrVmd49iAWec/0mcs77SVGB6M82GgpOgWSnaswpNVps1btFGSYOgKe5ZMQFR + a1baszLTJGCSytwyqjW2QFWgMhWaNSpuzSYy06zBCNTYUB20Ck0AM6IiYK4LYIraBDDXBizdPLNG7lnU + IDID8UszTW7N5gRNASaKTUBiBiJoihlIoAnnLKlM154FKJMmKU20aCNpz9JMU4xAOtcENCMyA5HKpBZt + xPXjCs82oTQx04QRCLNMAFOgCQdtoTK1RQv3bJSQ0sRs07lnqS1LM02aZzI4WW2KyiS3rLRom/8cubZs + aeWk1T37TwRQVpkCzAbBkgxBvY1A5RZt2QjUl9LsE5rGQXNgZkllrtnsMUNGKzB7nLrcYkqX2Wpal9lm + eqfZ67KuYMbLPcHk53v6HXBNF158bfa8tNNsM73DbDNthdly6gqz2eQVZuNJAOcyVpxo1TaXGkBzkECT + lGb6DatNOGilPRu7Fi23Z2NnCCqUZrX981BWTkJWm5+FmGfGgCcbgUJqzdY/ZgetuGfZEKRGoA/DWBy0 + bALCXFOAya3ZkGaaunZCLlqeZxI4WWWqEQgqk0xARYuW2rNiBiL3LMHSd9Cqe7ZYOcG6yXNhNX1WZppF + e5aV5pOhGIHCmIBJ7VkBp5tpwhAEtcnzzJTmmbpyIq1ZBidDU8BZrJy0mICq9btMXL/TYOWE105uN97K + icw1ndKEe5Zbs/UbjWvPEjhpntnSoi3WTspK07VnoTBFaRZGIKrMQTNKSsB0M004Z7Nz2QhE80woTQYn + 1GYCpZmpCYjdswRMcc8mKDfTnBGRGYiUpnPPsnNWjEBxNimieWY6MaKieSY7aBNSmuqeZZWpM002AdFc + k1Smtmdl5SRMcp5psglI2rNQmwROWjlhcJIZ6FiAU8xAR4dxBmAeRe5ZctCiPQsjEK+cYKYZwghEztns + YFk30RbtX4p5ZibuWYKlKs19nNKM0Z4tzTRj55z9U5Rk36Y01QS0W29oNvpYOVEzEM0zfWhuX2FoqntW + lGZj60qtwSqT106oPctGoIYzApHShHtW2rPknuXWLCnNwghEwFyPDUC8cgITENyzNM90JiCaZzI0a+Sg + 5ZUTnmfqTJNUpsw02T3L7VkCJ9qzPNNk52yUNAmcbqbJ6yZQl357lhy0um4iLVooTThnf8ZzTbhnWW0C + lphp0sttWplnYu2kye5ZcdDyyokozUSgmdDayQ8iKE1Wm/9RSag9S9CMEihOhqY4aUll8roJVCYpT3+W + WYYm72ryTJML0GwBJwNTW7PFXNOZgaKyGagPI1Cv9qyfzGOcyuS2bE+49ugesw5asuN6RGH2mC2mApbd + ZthZ3f2aj/UEc96y/Q65vtvsMqvD7DK7A2+/QxZ0BXPe6unXfKzbDDu7w2wzXcG5nBXnBAbn2qOXmjUb + S8JB+RJVmyErTQZmDBOQm2fyvqZTmfUv1ATE80wxAUmLVlqzrj3LSpMKarOYZwKasexqyp4mFbdoW9ZN + eKaJlRNyz8o805mAAM43wxgFM1C7rJu0EzixckLA5CIzkJiA3FxTZ5qyeuKUJtqzUJmmmvK6CRe3Zbk1 + C3Cy2gQ0VWmSEYhUpgITc01qz5J7lg1AKMw0AUzXnpXi9izMQIAmO2jZOQulySpT55mkMk2xcsLQrKY3 + GdrVJJXZa6YZVsU5WyW1qUqzvKfZ2p7ldRNVmaWZprZnqTUrpQ5atGZFaXIRNNk9m56pZiBuzToj0Gy0 + Z1ugSUYgZwIiaEbY0YQJSIxAtKfJ7llSmb7SjKA2eeVkbJhwezaM09FwzrqZJoCp7VnZ1RQjkKrNU0ll + xtSaPZkMQQxOmmcSOAHNOCOlKWYgds7yyslRtHbCwDwijHWmmR8WxuSeJSMQWrShGoFk3SQs1Ob+ESlN + Uput7tk42ycUB624Z/cMedWk3J4tK001A3nQdC3aUnvWrZ2UoNmyckJ7muKcJaWp7VkoTSlSmhW0Zmnl + pGjPwgQkLVqoTKc0WWGSyhSlKWqT4YlZpipNnmlyMTjVCMQmIF03cUYgMgF50ERrVmDJ7lkGJrdnZaYJ + YLJr1hWpTVozqTXhnF09SpqrEzRZdcpM0+1psoOW1abMNJtkAipmmrJuUsw2RWVipknQ1HUTUZpkANIq + lCaDs9UElACYpXUTV6IyEwdMNgIlDW3R6rqJAyYUZiRqsygBJ7dpy+smJaX53dCk/FhRmTzLXKtpzZCx + PWa9sT1mwwk9ZhMAc0qX2W5md79j7ugJznzX9jvpnh6z2xldZtjcTrPb3E4zXGronA4z/KyOfiff20Xf + 75jb8eOWmy2nLjebTloebjRhuVlv3DKzzpilpDYH50vCgdli154lcEJxSrgBtWhhAJI9TWcEqn8ZSrBB + GLu2rLZpGZq0qwloItxAgekrTWrJEjTDYq4p7tm6m2kCmN48U81A7JytyjxTjUCiNjXkwHfPojWrM01S + mlUXbsCGIHXPqtqUlROaaxI4XXvWgZMCDlqh+XgYpwAmlUATe5qycuLcs9SedSsnDMz7DZRmlYxA9xqa + Z9YXmqqozaruapIJSHY0qcoq01s5kXWTajHTNL33NL2Z5rcrzVKLtphpknPW7WkClmjRSmtWgw3UCFS0 + Z4twA93RpHnm3DAhcEp7Np3FDlrsaSo005m+0gQ4ea7JAQfqng0TXTlJJ4QJmYAAznFRksqeZutMU8IN + WG1KwIEAE+BEa9btaapzlsINPKVJc020Z4sdzWNDNgOh4Jw9KpR1ExiB0JoVI5BA0+1oHuzaswntakqw + AdQmzTS99qzsabLaFCMQzTQJmrRyoq3ZJFNwFtCMV6Y0+4QmgRNtWWnNKjS5PVsjpQlwqsp0e5rcmqUq + oJk0yDnL4OSAgwqHHAg4RWWS0iRobhjV8g2oZKZJ7Vm8vG5CM0120MqeJlq0rDgHRzWZacIIRDNNMgKh + dEeTZ5rY1ZR5pjhode0ELVpVm7Jugh3NJlq0MAFxixYKE/Bk5+zqFQdOUplo0QowuTVLc02aadK+pgs3 + 4PasqE1aO2G1SXua3KYFOBmWaNEm5JyFGQhKU/Y0dZ4J449CkxSmwtO5ZyPnnkWLlpVmRCYgMgLJTJNb + tLx60uKiLTtnv601C1j2YQQSWCYt0KT2bCs0aZaZ8SyTVWaPtGV7zOaTe/rtfUVPMOsN22/skz3mjxd0 + m2FzugDNfiPO7Oo3EnVWZ7+RZ3b2G3FmZ7/hZ3QQPP90YUe/cU91B7Pe6Om39+UdZvMpy80m0qbFfHPt + MUvN4MYSMzBfHA7IF5skAzS/oWJlqa/uafqGIFGa7KAVhanBBrKnKQoTwIyLPU2BpyQCkeKE0kSbluaZ + pDTRmiXnLLtnsaMZYt2EZppkAkJ7FrD0Vk6oRUu7mrJ2AoVJKrO8duLNNHXdxLVnqdQ9C2hSW5bSgDQR + qIBmAUw2AsFBq+3ZKsHyUYOX1CbtaCLkgFu0HHLglGZrIhDNMhma3Jp1c020Z2nlBODEPLOa3maqGm5A + wCyMQDrPBDRp5aQOcAKWAKfXmqW55tVhlcDpQ7OsNv2VE1KafrCB7Gj6KyecCJQ4YLYoTQfNItxATECA + ZkZzTWrRJgTMwj2bpJhrMjSxq8kqU/Y0tUWbUntW1Sbas1yp7mi2rJzQniYUJ881GZocbKBrJ6wyxT1L + RiBRmWGcA5y8cgLnLFZOYkAzJ2Bi5SRUtZlkBTQpFci1Zv1wAwAT7Vm8WDmBa5aDDZL8AIEn9jRlnklt + Wm3PEjRJacaUCOS7Z/09zXJrtg+l2dqeLSlNUpkVB03a1Sycs7WGGoFEaXruWYamv24i7llNBMo31ZUT + hiYMQDncs26eyQ7aFmiSCYhe2dHkdZN8bayboDVLpeBkaFJ71leaDMucgantWcwzJdxAE4Ek2ID2NCMO + NSBoUrmVE2rR0jyTi6HJ7Vlt0TZ/ioADtGgBTG3RitpkExCXU5nSni2UJlqz1J7lfU2CJrVmZeWEnbPF + jia/UJmqNv2AAzEDrXSmWXbPEjQjD5zBBR9bVB/gjCpJn0rTTwQCKMtzzT6UJrdmrcwye8x641hlclu2 + B7+Afvte2WN2mdX9w/ve7vnhfW/bH97/Ts+31b+c8WCX2WXWin77ze/Ejye1udmk5WbDCctIbQ4ZszRc + s7nEDAI0s8VmQErADH0XbVz/2qUBOaXJahNKM+Q27eeG1aanNFuDDRScCswwRmtWjECUCIT2LLVoCyMQ + zTVpZ5MVJsAZY7bJ80wxAYmDllqzrDIL9yyZgDhGr50ctOqcdWsnrDZ57USi9MJqquDk9iwZgdLCCMSu + WY7RoxYthxs496ybaWKWSUXtWTECUXuWzECF0uT2rETpGVaa1J41DE52z3Kwge5p+mpT3LMETh+YnhmI + 5pquPesZgUp7mnV/rlmGZmlPM2tZN+ndnvVnmhmCDTRGr9yeFQctr51EMAIV7llvpolwA55pktKEg5aM + QM5Bi7kmtWcl4MDF6PFcE0YgjdFLXXtWlCY7Z4tgA7enWQo3ADCpPSvAPDlKclKZBE1RmnDPQmlyjB4p + TFo7AThDdtCKe1ZmmjFasy7cQMAJ92ymwQacCgRw0soJlCai9LQ9m0mMnkJT27NqBKJwA99B60OzPNP0 + 3bO+g3ZohJlmzUsE4l1Nf6a5gwQcYJ4pMXpwzyJGr1d7lmeaNM8kM9DmmGtWalCYunLijECYZ5LSZGhy + IhDNNMk5S8EGKFWZ61AiUNIAMNeuiIO2Uss5Rs/NNHOdaZJ7VnY02QhUAJN3Nbk9y0pT5prioiVoSlsW + zllSm7x2AkNQU4MNVGnqTBNmIJprtsTosdqkuWaUUMCBtGebFKVHoQbsouV1E4QbAJ4KTijNRJSmCzho + /Efk2rMKTlGZDpgESm3LIuCAV044Gci1Z1vmmi0OWrRkORmoBE3AUlu0MtPs5Z41DE0yAZXbs84I5EMz + ctBcq9lj1hnD0NxoYo/ZbHKP2WoaQdPsdHqPGTqn+0cfLrffVv926ZPd/zzn/q5Vrnuh2wyds8LsdPpy + +vFbT1tOanPjScvM+tKiXZsMQUsImrV0sUnQmmV4SiqQVi+lye1Zt58p2bM6zySl+VnI6ybSom3Z06S1 + E5lnEjQZlApN16L1IvRo1UTNQC7YgFKBXCJQ+xthtV3cswRPctCSyhRoejF6LkpPVCYHG7TuaTIseeWE + jEDOPduqNskIBBMQVRXt2SJGT+aZnAYk7Vna1aymDxgUzzQRoYdUIDICGS4v2KB+l6G1E1GatHZShxHI + i9GT9ixF6enKiT/T9GL0aKZZhqYPTMToCTATPxGo10wTwPRXThSaJfesv6ep7VmXPyuJQIV7FkYgSQPi + KD2ozDhDKhCHGyQpu2cJmC7cQHc1pT0r0MS6Ca+d8J6mBhxw/iy7Z2Wm6ZRmnNOeJoFT9jSjOCdoUvas + GIF4V5OUJmaZPNNklXmc5M5SIhDmmRGMQFCabAg6IkJRsIHmztLKCbdoZd1E6kBJA9LsWRduUMwzaZZZ + zDNjbc+2xOiRc9ZfOQl7hxv47dmWlRNxz7o9TT93tlLMNXVH04OmBBzwfiYpTZiBCqUpe5oUboB1E2rN + cvZsrbExVk4ATnkJmjLbZKXJ4Qbejqa3coI9zUTXTWAEytf0lKaagFAOmJhpigHIJQK5lRNuzf6uUmui + 2D3LVQIngg14pkkqkx20HKXHe5qkNF2LlmL0VGnSXFOTgNyuJsOSoOncswpO2dNU1yyFG7gWLaUBQWlS + fJ5LBIpcuIGozAT7mQRMDThQhUlVxOix2iySgbxVk9ZUoN5KU4sV53cZgTSwvUVp4nRXJK5ZQNMSNNfX + 1uyUHrPNjG6C3s6zesywud8JzdXeXWJXe3uxJWgOm7sCapN+/DbTl5stphI0Q7RovbmmGZgBnN+YGlZO + yEXLyUCuPeuUJkGTVWa9FZw812QHrUCzSARCe9aFtn9MSpPBSYHtnDsLcKI1iz1Nbs1yWLu4Z7moNStR + ejTTLGL02rU1q8EGGqUnztl2ac1SWLvMNNtfCtGaldD2MjDZBMSh7aV5JqBJ4QYuQo9XTtCi5UQgSQXi + CD0ObVcHLQIOtD0LcJLKJKUp4QYCzZDnma0OWuee1XWT9Da0aEvgLFQmzzOLPc3eM00/fxYxetqeRbmZ + ZqRqk8xAHKPn588W7dlsHs81M6QBFXuaDMxi5SQh5ywUZ7GnyUYgVZoyzyRoSvYszTRPi5LU7WlGojQj + tGaxoxmnHKHHRqBJUZwqMLGnSTNNUZvsnkW4AYNT55mcCiR7mrKryalAEqPnrZ2wc5bWTXjtRFqzRSIQ + lc40YQRS9yzmmbxyIusmiNLzlCa3aDHXZPcsgMnt2T5mmmQC4kQgas36RqDvitFbWbiBD85eM83e7tnG + jjTLrDXK2bO6owml6VZOJNhAZ5oETThnCZYOngRNuGhlrsl7mpUaYvQkSk8j9LhFyyoTwQaSP+uvnWhg + u1s3SXKK0cO6CZfb1yzAKa1ZQJMi9AiWXmtWAtupEsqg1Rg9ds8SMCmwnU1AvKcJJy3WTTgViNqzrDRl + pskuWt7ThHMWwe3UnqUWLWaaYgRye5rsnqXAdgk2kMB2QJMKO5rsnOW1E4nQ41ADWTtxirPXhZPCDKSX + TRSc1JqNNIMWijNhWEr+LCvNYlezgGdSKM7WwPbW1uzKoTnYU5o6z9xiao/ZZjorzV1m95jhc7tXuf6F + nlWuf7FnlQUv9qxyA+olr+SvX/9iz/+ZtrDLDJ+7wuw6m5XmtjPYELTJpGWyfsJKc3BjsRmYLQ5JaaI9 + y9DslQbEbdoif5aCDagoEUhmmtjRFActtWZdjJ46Z0lhEjTJ/AMzUHHphGL0sKNZpysn4pp9L4xlT1NW + TopUIA1tlxi9uF2ASQ5anmlW22EC0tasm2myymwv1k2oNdvLPastWr5y4tZNUm7RejNNUZvcntUdTV43 + Ke9qYuUELVoGpqycmCqFtVO4gTpnTRHYrjF6XmtWwekBE0aganmmqeEG2p5FfJ62ZjV/tg+lWfWMQIXS + 5PYsLpxAaRZXTjhCj1dPes00qTWrc02GZstMk92ztHKCmhNphJ6Aswhth9rkSycETc6ghXtWAw7EPZvS + ygkHHJARCGrTWzlh9ywlAulck7NnsaMpStMlAunaiUsE8uaa3J5VaHKwQYsRSMINuD2bcLgBZprUnmVg + UriBhLbLnibyZwmYLkqPnbMIa0eUHq2ciINWoBmjNavhBpkLNijA2eKedS3aPpQmQbPi2rONMjQ9pcnh + BqQyW9OAvF3NYk+z5KAtxejpTNOtnGCu2dqe5XmmJALRPHN9bs3KhRPXmqUIPQ03KELboTbRmgUsdaYp + ge2l0HZ2zhapQE5pFkVXTvwoPc6e5d1MBSbnzpLibGr2LAUcaGtWMmi90Ha9cCIqkx2ztHJSYRMQxehJ + kQmoJQ1IjEACTgo3kFQg3tP01k3Qnm05DSbtWQk04CsnBM1yGhC5ZwWaunrSADxFbZJ7VtQmzoS5CD2p + Uns2+Vb3bIvSpHnmSqG5CaAJpSnQ3HV2N6BZVpbl+vfrX+j+14ufILia4WcAmqw0Ac2tBJobjl9q1h23 + FKsn4ZqAZi4zTTfXdOfBCues757V7Fk/c5Zg6bVodU+TUoFIaUoqEFSmvAxOatH6p8GkPSsqs0gEovYs + pwHpaTBx0BZh7eSc5ZmmXDlBsAG5ZyXggMMNJHtWA9v1PBiFthdnwdg5S6fB5MoJ2rMy11SlqTPNItwA + aUAuEYhTgWTlxM01OXuWoGm4LSutWTUCkcL0smfFBNQCTorSK7Jniwg9bs/688wqQZNPg/GeJoOTVk5a + gg3KKyf+TLN3uEEf7VnZ1bygCG2nmSYrTQ1s55NgmggEWAKc3J51aycU2k6nwcorJzTTZOcs1Oa0iBKB + EHCAmSbvabq5Jq2cpKQ0dU/TZc9yhJ6agRia4p71A9tboCntWXLQktpEjB7PNFllUsABt2c1Sk8vnQCc + mj0rMXpFsEEZmnzpxEEzLsINfKUZxqI0vSsnAk1PbTI0w15rJxTW/h0rJw20ZktK0105oRZtRXY0daYJ + tVnh7FldO6GzYBXKnaU0IOeepZmm29H0nLM1KQ03oCi9HAEHYgRyMXp84YRPhAGahXtWnLMy12RoEjjJ + BMTQVKUJlUnQJCMQhxuIe9Y/DeaHG0hYO7VnxRBUBBwUaUA80yQjkDsRxjuavHpCJiBVmJw5y6lAlAyU + QGVy8eqJBLbTtRNRm0Vou7RmuSgNiFq0pDJ9MxDasr3cs0W1Zs72NgJ5l06SchJQeeWkD5W5ciNQ2Qz0 + nUqT27NOaXrQ3OXvg+aqb3xtV331S8vQRHtWoTl9ZUqTzECmxu5ZAmac6m6mGIE0rN13z7p9TT0PJi1a + CjlAGhC1Z6Ut+0mIYANnBtKVE0oEYrVJyUB6T1NWT2hXky6dkHvWRehxwIHMNNsx16SVEwlul/NgACcS + gdxM01eZvKMpMXpe7izNNeksmK80JXeWoZm6e5p65YQUp7ulKdDU0HZSmxShp6XgFPcsr5tgpinzTI7R + 09B2ac8apzQ1DQgOWhfWLisnfowejED1m+iuZjmsHcDkmWYf7VnXmm1pz5agWQ5sJ2hGK1OaLTNNd+nE + i9Gj1iy1Z4uAA1KbYgRCe1aVZkbrJhRwINmzBEznoOXTYE5lcvasy5+V8qE5JkrSIhHIi9Ej9yxDEy1a + DjegGD2qk0Pe1ZQIPZ5n4uUIPU0E4rlmcU+T9zRppilXTrhF6xmBAE4OODgohAkI7tniNJiYgPzsWY3R + 0xatQlPyZ+mmpsw0W9qzCG13F07K7VmFpqpMgWajl9LkuSbas2jN0rqJA6e0aLeR0Hbc0uSAg0JpFu5Z + JAGpyuT4PI3SI7UJYNLaCcXoOTOQmoD0womagPg8WGEEkuxZd1OTTUA811SlqWHtfriBBhsAngpMvXTi + 9jT1wokLN6B1E1KdGnAgwQY0y8RnyZ3l0HY6EcbnwYp1E51r8j1NUZvSopXAdnHPOmiK2uRwA1KY5VSg + IneWVCbgKfc09Y4mqUzOnS21Z2XtZKUxetSq/V/BeR9NRUmbti+V2RuafStNAubKoekbgdy6yZQes7VC + cxZmlN2rXIf27AvchnUtWmnT6l+7/gW0Z7G76c00Z8hMc6I30xzt2rNiBGLnLBmBONRAQg5aVaZLA/JM + QO6upmTP8uqJdxaMTEAAqB6gdnNNKToNJoHtHHBAqUB02YQunMilE1aayJ6NJbCdQw2wduIBk1qzfEtT + oOnH6Kna1Bi90kwTV044EYjnmc+GcequnHhmIFWauqP5GAoxenSI2ksDonUTKsw0vQPU4pz1gg1UbeIA + NcAp6yZFWDti9Iy2ZwWapkqB7d5Ms65GoCJGj5yzdN1ELpzolZOWcIOV7Wl+ixHIO0JdQLMcbiDrJpIK + lEh7NsnOjHimqUqzZeVEjlCL2qTzYHyIGkYgOUKNA9RiAkL2rCYCaWg7jlBz/mycYu2EVk4ImhRuUAS2 + S8hBEdZezDXrYZzzlRNA01OakgjEQe0OnH5gOzJnqaQ9yzF6fBZMD1CjPUtpQHrhRGaamgrkBba7cAMC + pq6doD2rV078meZecoAac03E6H1XuEFf80woTW3R9lo5KdZNoDRlrunasw6aOA/mrZtQIpBkz+pMk9yz + um6yGVy0fpQeqUwObXeB7ZhpVhBwwGYgyZ5llcmpQGQCopUTSQJSExC5Z/17mqI23RHqKMlb0oBopumZ + gQBNdxaM1aYzAck9zV/SWTCnNpukNMtGIFWakkEr0BS1ybmzUJd0GkyCDgBM7GtSe1ZXT2jdJHGXTkpp + QOSeFQdtA6lAmGtCaeo9TWnRyhFqd+2E5polExC1ZdU9K8EG7hA1GYEcNL9daQKWxUxz5dmzvfY0GZqa + BgRoDvkW9+yw73bPrnLTyz3/fsXTgKu4ZxWacM8SNJeze3asQBOtWYFmTRKBGJrepRNSmnSEWoxAehrM + NwHh4gnUpQYcQGW6I9QApx/ajjQgidNjMxAbgmRXU0+DcZQerZoIPHF8muea9LIRiA9QsxEIwJR7mi5C + D1dOBJouQo/h6RKB5Ai1ngbz55lsBvIunLh7mlSp5s+6KyccbqC7mrJyApUp6yYETbRnGZ6iNPmephqB + ZO1E3bNQmqw2uTWrarM13KC4cnIzHLR8hLoU2N7rnmaLyuwrEUirj/Ys1k4ImHThBMDElRMJOEB7Vo9Q + 49UdTc8ExOfB/HADF6PnZppsBJJbmqo0AU25cEK3NDXcADua7J7lGD0UFKYUVk4o2MDNNJEIpCsnZATi + HU1uz+p5MDUB8SyTE4E0DUh3NHVPU1q0nAgElcntWVk9OSpEazbO3Z4mzzR996zLn9UrJy5Gj9uzbAQK + EdbekgjEM82QXbTuCLWEtbcagRie3wZNABMvbmm2zjS9m5reuonmzrYeoZbAdt3T5KIrJxJuoDNNSQPy + lCZgWaHWrJ4Fo5JwA5pt8hFqPQ2ml07YCMRqs5bTabCWs2C6cqJKE3uatZyASXuarSqT55mycuJfOaF7 + mgU02QjELVqO0ONgA0kEKtyzAk63p1lcOeGwdoS2ozVbZM+S4mRY6j3NpIm2rBeh56UC+esmCWCp7lk6 + RE3QFPeshLbTLLN1T1Pj87BuwqsnrDI52KB0hLo1DchzzqJNq/PMvhy0rdD027MJXpdB2wuaK9nTlDQg + b0/T7HBaD1q0ZUiWq/9Ln9v+z3/Ws8q1zyNib4XZ4TQ2Am05dXm4GeaZE3VPc5mRPU0HTU0ESnxY+jNN + lwbk8meL02ASbqBXTty6iSjNmM1ApDA9I1BhCHIuWmrRwgjkXzkhxUl7mjTHfEdezZ3llRNpzfKlEw44 + 8Nuzzgzk3LMu4ICAqYlAHGyQsoOWA9u9s2ApK02O0isC22XdRGL0oDZ53aQwAVEqkFs7kRg93s9MdUdT + r5zcSysn3KL1Atsx06TilRO+p6nzTIKmqSLgwHPPtkAT80w2AvXe0yS1Wd7R/M5wg3IiUKEyW66ccHs2 + YXBGvHai+bOkMvmepoS2SyJQuT2re5oS2K63NLGrKUeoJUbPJQJ5MXq0pynuWaQC4dJJMdN0B6jdTNO7 + dKKB7ZIKVEBTwMnQzKVFm9PKiVw50Rg9OQ+G9myRPYs7mmQGoh1NXDphaFL+LN/T1EPUHKMHExCDU3Y0 + BZo80+xjT5Mi9NCaddCUmebfmT3rGYFqfQa2OyNQsXLSUJUJE5CunbARqNbYRtuzRSKQqk3saBI8N6M9 + zZrkz3IGrRyh5nuaCG2XRCCO0tP2bI3nmmICYmhKjJ5Tm+qgJfesBBuQEciBk8MN/CPURbgBm4C4Tetu + apIJiIxAdOHEtWid0qxRGpC7dOJi9HhHk92zlD1LKyc0z+RyB6hl5QTglD1NnmsWZ8GgMr00IHdLs4Bm + azIQq8tipomzYGjNFgeoxT1brJ1EvaEJI1Bf1020Sq3ZXsDsG5qtSrPFCNQKTZprNiwnAvkt2skcbvDn + K3vMjqd3V/58YXdl/3ldlQMu7o7+cklXdKBX+PovF3dW9ruoM9r9PFKZ/fa9soOgySpzWZE/O4byZ83A + BkNTW7PFyonfmmWVGWt8Hn3WSydQmHoWzIUbyC1NL3dWDlG70HYfnHxPk1y0ek+ToEnl2rKiNMU9KxdO + nNKU02Acn4dXc2c5FajInX055LUTnWdyKlDhoNVgg2JPs+WeJkNT55liAtJD1JI76+aa2NH0wg1wU5PU + JlqzvHJSBBxQe9btaRaHqEll8mkwhLZzjJ7R7Fk6DSYXTrhFW5iBisB2dc4W2bPlsPZWM1Bf4QZeezZr + mWsWEXqZxuhxcVi7Ks2We5oU1p6gPavBBpo9q6lA6Wysmwg49QA1t2cpEUjbsxlMQNKiZSMQWrS8qynO + WVaZACdF6EmwAe1pantW3bN+IpC7ciLZs7Sr2ceVEw030Bg9PQ3mgbMwAXHxygnPNeUQtc40qQSY+UEh + hxtIa5bas3oazJtptswzFZyFe1ahWYS2l6G5sj1NbtHW/NZsr5kmAbM4Ql2kAqkRSA5RF0oTwKxh5YQO + UbuwdlGcm8kxar2niT3NYqaph6gBTMw0aa7Jge0CTL2niVmmc85K9iwfoC6FtcvxaXeEmtuzvHLSMteU + CD1vtvlbOg1WhBvQTU3JnnVGILduQgagZrGjCedsEaXndjSLuSbNM2ndhMINdOVELp2wGYhCDaA2NRVI + 3LMabMDAJMUp7lk9D+alAWloO7dmeyUCtQQc+FF6uqPptWfdlRN/7aQvpSnV4HCDXu3ZxndA079wwi3a + bj97tt9el/UEp79u+415ose0nQ8F2WWGzkH2LNZKiuxZZNHuOrvD7Dyrw/zh/I5+Y5/kGL29LsONzeVm + 4wnLzPrjSWWGOEqNwPaBFNguKhP5swTNItjAGYG8uSbf0NTyYvR47aS0oykrJ9jPRFi7a8tq/qzkzrLS + RMgBm4C89iybgABPNgHxPU0kAblbmmwGQrABt2fFPYuXYvSoNctVXDjhl/c0+aWZJo5PS/GupoQbSIQe + m4Hkyom7p1lNH8chajlAjRZtEdhOBiAco6azYJoKxOEGeh6MdzTvM1U6D3YPsmfJQVtFIpCAU/c0deWE + ovT8HU0Ak8p3zvorJ39vuEFLe9btaMaZ16KlXU2BZjHT9KCJeeYFYULtWS9Gz0FT04DOigDOJJM0IDID + yTyzOA3GRTc1+SyYF9ouF07kyom4ZwmcBMyJgCdmmoV7FsAkBy1DszgPVlaZRWC7tGgpFSjmA9RwzoYo + bs3SaTAqXTnBpRNkzyLcgEMO9BC1QNNdOXHZs77KxDzT3dLkOoASgWIyAjE4aabJSlP2NPU8GMfoJfke + 1KLl7Nm+oNlXe7YcbiCJQFJIBar57llp0craScULbIcBqKKt2cIEBEOQtme9mSZOghUxerpyQu5ZgibP + NN0tTc8IJPuatHZSkZUTddBKjJ7ONV32rHPPqoNWU4F0pilReu7CiZwF0yg956CVKD2J0VNgEjS5RYv5 + JtQm7WwyNFVp8nUTitFDGhArTSlSmb7SlESgIuDA39XU0HZRm80f8NpJsadZtGb1nqbE6Lmwdlabre5Z + assW7lmnNl17VtUmJwIV7dliT7OvHU1PZRI0/xtKk8BZvnICtRmuM6a4crLZpB6z1fSufkffzoHtJy7s + NrvOQUxeF0Fylzl86QSwHDq3A3+fvt9Rt3eZracvL66cyHmwtUejNbssHNTAlROsm7SagDSwXU+DFVF6 + X4Y019TWrIvRAyzFEMTO2SJGj49Ql0LbJQ3ImYAYnKw2ZZ4pubNee1ZatOycrcIEJAEHXHwaTIxA1J7l + 1myre1Zi9Gj1pFg7QVtWYvQEmnrlhGeadBqMzEAacCAxeiFmmhpuoKfBCsVZzDT1libNNHndBGlAYgK6 + H2sn5KBFWLu3q9ly5YQPUfO6iR6hlrkmXTnhHU1vT5OUZqt7tvcRaj9Gr09oOqWZaHuWww3KStPb08Rc + U0xAPNfkKyd0HuycKCnuabZG6OkRapwGa1WaEc6CsREIBVhKIhClAU2j3Fm+cEIxehFMQBRuoCYguXTi + xehFccruWWnRUrABbmkWZqDiCHWS69qJzDVzlwoEcHKwgQATM02N0dN1E86e5dYsZ8+Kg1ahSVUyAvFM + k8FJc03JnmUHrac2W9uzuKcpiUAhqUyYgKAySWkCljrTRFi7rzQFnI0yOH3nbElpFjNNNQHx6gmyZ0un + wQBNBmfLTFPashSlhz1NjtHTYAPKnpW5JgUccPZsjU1AckuT9jSlRcsXTijgAO1ZrJzQPU09D9aybuKd + BVP3rO5p0lzTC2vH+7soaSo0OUqvBE2N0eMWrTMD0coJdjQVmjTX5Nmmd0uzOEItQe1iBCKVWUCTVGYR + 2E4qk0Gp2bNiBFLXrK6b6J4m588iEYgvnPA8k8+D+e1Zcc8mMAL1Cmx30CzPNoOz3tsrOPuDPcUtW4nk + 7aNFW0CzJbCdVGavlZMWtSn3NHvcpZPinqa2abvMppN7zJZTuswuZ3T2ayzqCWa/afv95dous8NpnWaH + 0zpQ/Q68jk+DNRZ1m13m4hj1inCzKThEvaLlniYDc5kZmIvKJGBquR1NjdBr3dXkRCBPZbqAAz97luaZ + dISaV070lia1aN1ck41AeuVEMmedEUgUpyYCYY4pMXpsAqK5pm8EYmAWiUA806REINee5WQgjtIT96wL + N+B1kxalSe5Z2tFk9yx2NGVXE8AkM5BC050HI+esu6kJhVlcOEEiEJmA0JqlcisnuG5CAQdkApJdTW3P + snuWoElKs6otWgKnzjQL92zhnPXds63t2WLtpDzT9KHpzzMdNPmmJuXPXhwmnhEooSPU/toJVKZ3U5Nm + mpo9q4lAHGxA0KSzYGQEwo6m7mlG3kxTQtu5PcuJQKQ0EW5A80y9p6k3NdU9K2lAYgbyr5xwYHuc6o4m + q80CnMVpMF45ATB1ron2LLdoKdwg19xZyZ6lXc1jMM/ks2AMzgKYfE+TdjXlygm7ZrODQ7pygvxZAiay + Z3lHM9bTYFCaelNTlSbWTSjcQCP0WG0WSrPcmi2vnJSBWQo3cDc1d4lq/mkw3wgkMXoAJ4Ub0LqJCzfg + Hc2WYANSmi0rJwxMnme2AJOhyTNNas3iPBics1Ca1Jql9iy3ZrUkDchfOUEaUOGepesmeuFE2rMIN9BD + 1FKSCqT5s801qD1LbVmkASkwOaxdnLMue9aBkw1BdIAaSpMunPDaiYMmBxuI0pTzYNya1WADXjWRcAON + 0dOAAyhMcdHKPJNDDoorJwnSgDSw3ZmARGn67Vk2ATlormTlxJ9tEjTPem+vlexq9qU0xT3rsmdbVCbe + MjT7uSPUA7IeM1DU5lrNbmrTrjsOh6i73CHqzad0mS2ndprdL+4Kpr/cE0x6rqffvvO78OJr86eLOs2W + U3HVZIXZdJIAEyHtY5eFQ8biAPUyM7ixLMQR6tZbmlIOmBJu4Nq0GmpASlNVZmEE4oADF2xARiB10Ao4 + i9NgDE4vEUgUpls7kT1NVpoS1C4nwvQAtYYbFPNMidGjkAM+C1bc0izOgrWcBnPhBtKeFWgSOMlFqzNN + vXBC4HTtWTEBUYu2SAQq5pk809QdTVw6oRg9PQ3mg5OK9jTpPBhCDRCjJy1aUpkabAAzkEsFqt9uaK6p + AQfUmi21aOXKSbXunwbje5q927OI0uvDCITWLM0yS7uazkHrVGavlRNOA5K1E3cWTN2zYgRyl04K96xT + m3zlRPc0OdzAzTQ1f5Zi9OCg5Si9lKApge2I0qMrJzzXpOzZApq6biLtWXdTUy6dKDQ1DYgDDnJAk9qz + cNDyHU23p4mAA8DyOJwGYyMQmYAw1wQw0aKVKydkBvJ3NKE2+cIJ3LOeEUjWTdCiJZVZ7GrKLU1Rmpo/ + G4qD1q2ctO5prsw96zloyQTU2p6t+WqToClKM98xqskR6iLgoEgEosB2MgC582A804TCzPmmZnHpxAW2 + V6g166CJtROFJiL0KEavAmAi4EDvafIBaqyd6LqJi9HjKye8buKunNTyARWJ0PMSgRSaHKXHZiB3T1Pa + s73ds6w25cIJwVOCDWi2iTQgnm3yvqbMMykNyN3U5FQgUZoue9bd1HTzTN7RlGADXjdhxYl7mgnMQNSW + 1dB2T22SytT2rGvNisKUSydOaRI4I1acrDST5j9FqNazYIUZyM014Z79VjNQAc2Vt2dboOnAaeK6bQGn + tmkdOHGQenyX2XAC4NlpNp3UaTab3Gm2mNbR7+AbuoLTXuvpd/CCLrMFwbLDbDq5w2wyaYXZaAIU5gqz + 7tgVRoG5ZhOzTAFmtsQk6RIPmIsLldlSLalAcM8KNGVX093U1FuacNACljrPRLgBWrTeaTBaO8GVE4DS + 3dN058HkrqbvnHXB7RyfVxyhLpyzfO2Eo/T4PFjRnpVUIJ5rqoOWzEDeLU23qyn3NDV7VsMNdE9T27Pk + oHXhBkXuLOaZ2NP0jUByU5NbtOqe5bNgYgSiFi3PNPkQtZc7q0qzdeVEzoL1TgQqHLQ3GmcCovKNQKw0 + +SSYbwIqG4GujOJMwNmne9ZBEysnrUYgadHCOZvIjqYYgXSu6Y5QJ3rlBO1Zmms692wBTb6n2XKI2sXo + ydpJoTRZZVLuLF040exZvXDCge3+PU0Fp3cajPc0/WADmmmeEiU5zzWLNCCcBgM8YQBiYEpgOzlnZVeT + L53oPNNTms4IpGlAxZUTOUKtKyfaolX3rKc0NXuWgw1EcfYVo6fQLLtnHTQlSs9fO/HXTRiaLfc08x0Z + mI3tea7J0KQrJzzXZGDSykmDr5wgg7bm5prYzyS1iRYthxuQ0nTgZDOQH9iuLVpAswhsR3tWoClmIAlt + l0QgP9xAlKbuaSaUCKQmoKJFW6ybyBFqt6upp8H4ukkx15QoPSq+blLsafKuJq+bcLCBAhOXTqg9y2Ht + bleTgw1o7aS0cuIdodawdhejJzNNt27it2hdYLu2ZjHT1HuaojblyglBs9bADU1Sm0V8Xh/QhLKk4PbG + P0Q0z2yJ0oui3uDkmSatmvSaZ1KtDJo9Jkl7qE07IOs2g/JuM7jRzeAc3WUw41xvXJfZYHxnuOGETrPR + xE6z8aROs8lEALKD3o0ndpiNJnaYDSd0mA3Hd5j1xq0w64xBS3Y5K0wB5sBsmamly0I+Pr3ExIURKBSF + 6anMr8LSlRP/LFjoiuBJe5oh0oDkCDVF6PE9TTIChXqEms6DcYQe3LOsMumWpl47KaAZi9pEsIGsm2BP + U92zcukEJiAJN1AjEIUc6J6mzDXbqTXrm4HcnmZxhJraswRNz0Er8OQ9zSK0/QkxAPGVE27LygFqXTnR + wHZSmWwCQrgBQZMctLR2ou5Z79KJH9juwg3cWTAObNf8WWrPIhHIXzlh92wLNOmepnHAJLWp7dm+1k78 + RKDSebCWGD1JBSonApHSpPZsRCsn/pUTDWwnpUkrJ5EkApERiNSmMwLRTLMFmnQajK+cILCdL5xwuAEF + G0i4AeaZFNbu3dMM45RzZ9U9qzF6ch7Mh6avNL1bmnwejFVmcRaMdzXdaTA4ZyV7lm9qApi8blIkAvE9 + TSjMQ8PYRekdHJLK5LNgdISacme1RduSPct7mhyjt7coTC3d0xS12afSXFkiEEXotc41nQmIZ5q1lexp + 1tCe1ZkmQ1MMQRrYrqHt1J4tjlBTlJ6sm+RIBXJGoJb2rNvRdFF6tKeJcAM+DwZo0p4mmYDoLJjsaorC + dDNNDTeQFi1B06lM3tOkW5q6qylXTtgI5GL0pD2r9zS5irNgLk5P9zQl2EDMQByhhz1NPxWIwemdCGNo + FvNMMQPRuokEtuvaSXEWjBRm8bIRyF06UbXpZpsapcc7mn5ou3PQ+isnPjhd5qzubJZbs30rzaTXPU2q + aCXQJHASNBWcgGYx32RwrtnsNmuP7jJDxnSZdcd2mvXGdpn1x3UCoGaDCR1mg/FFrT+OYbnu2I5wyJjl + MP2EUJeDGwUwB2TLTJIuZWB6rdlqO183cesm/lkwrJ24e5pu3YSyZ/m6CT5jlqlmoMIExIlAyJ+Fe5Yd + tHFL9iw7Z92JMHLNOmjyiTCK0uMD1Lh0Aliq2uR5JufP8tqJngcrwg20RVukAjEwxUGrRiAHTQ04kAxa + MgN52bOYZ+qOJsDpzTNp3UROgnG5Cyde9qzc0yT3rJtrUmj7vTzT9E+DoT3rQ5POg91u/HuakghkyAxU + Bzixo1kcoXbzzPoCU+0z3KBsBiqgSYHtpDL7itJziUAy13QrJxxugCPUBE6dZyo4KeCA1k5clB7NNL25 + pgtsZ/eshhsgQg8OWp5nIn+W27N8FozCDRBsoPc0/Ssn2p6VdZOWFq1cONGbmhzWLolAWDdRpcngpAg9 + CTgooBly7mzpygkpTDICUbgBrZxQa1azZyW0XYFJ0JSzYBlmmbp2UoQbsHuWgCnZs/6eZhGh1xpuUGrP + uhg9FGAJcOpM02/RDqu0rJ2w0qzgCHWvmSZdOUEGrUsDktYs9jShMnWm6dyznD2LKye0o0kOWpiASGmS + yuSzYK3g5B1NnmUSMGmmyaHt0qLlHc3WRCCaa+a6p8lXTmhHMwcwYQbiCydyiFrSgFqOUMuFEw5sTzDT + xImwprhnm5oMJK5ZSQSSe5oS2o7Adi/cwDlnGZgu3IBatJI52+TAdmcGkrkmnQZjcGK+GbHSLDJo0aoV + YEJtApbamo0of7aYaRbOWYrSa2nPesB0ZqBWYLp0ID0PVgYm1kt0zcRbN1nZysnKlSaVQLOnFzgHZN3h + wFxVZ5dZq9llhozuJOU5ZEynWUcKIF1nTAfVENRoFNTlcrNWY7kZlKMYlrUCmGFMShPAXCIJQNqebWnR + qtIMed3EuWc5rF3nmaw0WWWS0vwsJLUpUXrqno1hBnJGIHcazIUbeKfBdKbJ104o2IDWTigNqJhpIn+W + V064NUuHqOnwNM81ZeVEToNpuIE4Zz2liaJ5Ju1oCjidc1ZWTmS2Kbmz6ZNhleeZYgTie5qcCCRh7UUi + EIUbuGADUptyS5OMQJI/y+1ZTQQCOA25Z+kYNYe2854mO2ddlB6bgRia1KJ1RiBuz7o9zT6vnBgozGp6 + Nb2t0FQjUDl/FsBUcPoRevNCDmy/UNZNSolAdBaM27MMTIrSc1dOFJqyqxklfOFEz4LJyonmz3K4gSYC + Ofcsm4Fk1YTvaQo0XXsW7lkFZ2EGcu5ZhaafCBQl3j1Nd4Sa1CZi9PTKyfG4penas0WUnrpn1UHLShP3 + NCngoDACYaaJCye8cuLU5recBsv2DSlKT+5pwj1bQLPY01z5yklfRqCye9ZBs8Kt2VYHLa+b+IlALhVI + AtvVDOQctBSjR61ZOgvGzlnE5/F5MJlr5kgGonUTCThwEXquNQvnLAcbrENKU8IN+DwYpwLBRSttWW7N + 4gC1WzeheSaXa9EWRiDXni1WThiaqjIlf5agSRF60prlYAMJN2ATEA5Qy5UTOGgR2s7u2cTd0pSzYJQ7 + 68DJoe2SCOTuabpEIGrPMjDpnqa6Z52DVo5Qs8Jk56zMNDUNyJ0EK5SmF3DQckuzcNDqObByaLvOM+XK + SVlpuvzZvtyzSAP6e6DZXkCzaNV2m1raTa3agVkXgXNQ3sXwbHSaNZudZi3U6A5+m3i51mx2mMGNjpBg + CWiKunTApDmmKs0lYdwOaC4OqSRKz7Vp/dYszTL982BYN1HXLC6ccFg772r6Z8Fo5aRFacqepollnulK + jEB0hBptWQInR+jJnia7ZtvfpjYtK00CJx+i5oADjdHTSydyV5MD2wWadEtT55reyokEGzA0VWXqTNM7 + QG0Imk5tYuVEwemOUMulE75yUrRoNUKP82e9PU3E6Mk8k5Vmi3tWU4HcnqanNtVBS63ZItwAKrOKXU03 + z5Q9Tbly0qcR6Fvbsz40VWk6aLaEG/iJQFCaoja91iypzAjQ5JADvqfJKpMD2/m6CcXoUZQeF80zEdgu + e5pFIhDOg9FMM5UYPQ03kB1NyZ6leaYC02vPQmm6cAPOn8WqCa+byCFqtGelRStXTvgsGM0zufwrJxqh + h/YsQ5NPg8mVE0oEcu5Z7GnK2omcBdO5ppwG4/NgEtiO7FkXbiBKM3NGIBdw4PJnFZrZyhy0RXu21ss9 + KysnVApLvLhwUnbPitIUYNIBauec1R1NUZpqBnJReoAlXzrhKye8ciLnwejKibpnOdhAwOnH6BEs+coJ + mYB43SSqkXuWb2n6LVqaacIMJCYgddCy0mS1WUTp6XkwlwikqUACTG9Xs/nLCo5R80FqZwbC2gkpTUAT + BiAXoyfzTN7VhAGIWrNunskqU+5pcmC7GoFadzQluN3taTr3LJuBipmmBBz4qyZ+GlAvpUlzzXKLlhWm + zjTdhRMNOViZEUjgSUqT3LNRoTJ9tdmyclJAswpoOnByETjrDM5a2kXwHJB1CUA7XQ1uECDNYIAy7zCD + pAbmy83AbHk4IFtuaqh0mUnqS0MUgBmnS0lhCjC9YmDKlZPWCL12atGSCUgTgWJuzwow6dULJ0UiEKUB + FWsnMYLaZd2EAw6Kmabc09RgAzEC6aUTANNdOeEovXYKN1AHrR6hFnC+BsVJ58G8KL0wlkQguGc52ADA + dO5ZjtGjeaZTmryn6fJn3QFqnWnSPU3KnS0ctGjRCjAx1yRoFgeoFZg012yBppc/K9D072nKyklcF7Xp + bmlKIhDd1GwxAjn3bHHlBG/rnmbVZc/2BcyS0nR7mqiVBLaXj1DTAerSlRNtzSLYQNuz/hHqjAPbE43R + K9qzunJCrVnsaHIaELdok16nwQBOitGjtRMvEYiMQNya1cB2gFOBqRdO9AA1JwKxg1ZD22ndxIET7ll2 + zVLxPU1NBGK1icB2cs5Si5ZD26E0NUZPbmmiPYtXgg3oCLVcOXFKk+eZrj3behaMTUB+i1ZmmsiejXtB + U9uzJWjSTNNXmoCnqsxddKZZ4VfCDdzaCefP1orA9kqNivY0K2wE4pmm5s8W58H0LBjWTvQAtbupSVdO + ioADas+qCUhWThSaGqOHeSatnPjtWf/Siexr6o4mKc2+8mfVQSvF9zT10kmNHLNo0+p1E7mnydmz7J4V + I5CsnNClEw458Fu0LthA5plo02LlhGaaHHKg0ERrtkgDcjNNctC6SydkAiLFKWsnmGdKYHuv9mwv56y2 + ZskEpErz286DeesmiZqAWi6c+GpzZeEG5Jyt1BorgWa1vacXOON6N4EzqXeFACfDE9XpaiAAmXENoFph + BuQCy5QrqS8ztfoyUpeAJYET0FRgUltWXlKZgCWUZqEyORlITUCsNFllQnFqYDs5aPkItUsFkpmmxOip + EcgBU4xAfE8TqycuDci1ZeWeph6hdldOqD2LVCCXPyvhBrKn2RrY7tyzTmnyIeoXAUynMgWavWL0uC0L + cOppMD0PhpUTAia1aeUINanNVvesgFOh6e5pinuWoKkXTsRBK+AkaNJM8y5cOClyZ9UEVJeZJq2alNuz + vhHIC2zvFXCgKhMFYAKef8+VEzUDFdmzck+zVWnKTU1pzVJgO7Vn0ZqlNCANbZeVE2nPukSg9LQoyVCe + e5ZzZyNKBEqn4vXcswJOtGipTYuwdmcEkksnNM/URCA1AsnaCd/TlCPUMtPUI9QaoUd7mkgDopIrJxJw + cFwU58eyg1ZWTsgExDF6Ak5SmSGyZ4sj1IDmIf4B6uIINeaa/j3NbN+Igtu9GD1qzba0Zz2V2WeMnr9y + ojPNIkKvvHLSCk13T1NXTrzzYBqhV2TPcv6sGoGK3NmaXjrhI9QSbiDnwZwJiNdNaoV71gW2S4uW2rRk + BtLWbAFNzZ1lIxC1ZllpekYgadHS2onb05SzYHRLs3VPk4GJeWbhoP11hPNgunLitWfJDMRFRiA5Pq1h + 7W6m6cfoeSqTgYnVE1KcDE5RmWIE0j1NZwLyEoH8lRO5p6lRejgLBqXZcuHEGYEAS1WaACW9mGXSPBOX + TvTaSasZqK/9zDI4/ZUTH5plpUnw7AXNPspPDNK4PT1arRV9S/nfT39s+ed0/7yN5thgk7k22OxMG2x+ + lg22OtsGW59jg+3Os8H259lgxwtssPOFNtj1IhsMu9gGu11ig5GX2mDU5Tb44xU22P1KG+x5lQ32vtoG + f77aBvtfa4MDrrPBgQtscPANNjjsRhsccbMNjrrFBkffaoPjbrfBiXfY4KS7bHDq3TaoL7RBdo8N8vts + 0LzfBmMesMH4h2ww6REbTF1kgxmP2+D0J20w52kbnPmMDc59zgbnv2CDeS/Z4JJXbHD5azaY/7oNrn7T + Bte9bYMb3rXBTe/Z4NYPbHDHRza46682WPiJDe791AYPfGaDhz63wSNf2GDRlzZ4/CsbPPmNDZ5ebINn + ltjguaU2eGGZDV5cboOXltvg5RU2eKXDBq922uC1Lhu8LvVGlw3e7C5e+izvm/L36fvix3Xyj8fP89IK + /nnx8+Of8+xS/uc+9Q3/OvDrwa8Lv76H/sa/3vs+tcHCj/nf444P+d/r5vf43/P6t21w9Vs2mP8G/3fA + f4+LXrLB+S/a4NznbXDWszaY+7QNZj9lg5lP2GDaYzaY8ogNJjxsg3EP8n9r/Ddv3GeD7F4btC+0wakL + bXDyXTY46U4bHH8H/+91zG02OOpW/t/xsJtscOiNNjh4gQ0OvJ7/t97vWhv8+Vob7HO1Dfa+ygZ7zuff + F3+83AajLrNB26U2GHGpDYZfbIOhF9lgl3k22Gke/97a4Xz+vbbNufz7bsuzbbDFWfz7cZMzbLDRXBts + OMcGG8yxwXqzbLDu6TZY5zQbDJlpg7Vm2mDwdBsMmm6DgdNsUJtqg2SqDeLJNqhOtsHvJ9lgjYk2+A1q + gg1+Pd4Gvxxng1+OtcHqY23wizE2+PkYG/xsjA1+MtoGP2na4McNrtVQuQ1WzW3QP/u+vq//H9f/R7/H + gws+/nurjte/oelXGZArqzLkfHj2BdEyJFcGSwfM9WfZYMPZ/IeSQhN/WOEPLfzhtS2geb4HzXk2GHaR + QPMy/sPQQXO+QPMa/gP0gOv5D9RDbuA/YPGH7ZG38B+++EP4BIHmKQrNe/kP7tFlaD5qgxmPCTSfYmie + 8zxDE3BQaF75Ris0b36f4XL7hwLNj/uA5lc2ePzrvqH5AqAJYK6wwauAZgfDz0FTAVkq/HUt/b4ApkIT + EH5xBf/8PjTxz3/iGxs85kPzcxvc/zf+dQP6K4PmNW+WoPky//dpgeaTNjhNoflob2jm99ogBTTv4f8j + c/LdNjhxJdA8/CYbHAJo3mCDgwDN622w/3U22PcahuZeV9lgj/k2+BOgeQX/PsHvF4Umfg/h99JOF/Lv + LfweU2huVYLmpmfYYOO5/H/sNphdQHOID80ZHjSnFdD8vUJzUis0fzXOBqtLAZgEzdE2+KkHzR8JML+H + 5vf1ff3Pqw84rqwImiv/VgJk/8xaqtT2UGW2Z9XM9qzWsD0/ym3Pjxu2+ydN2/XT0bbrZ2Ns18/H2s5f + jLWdvxxnu3413nb+eoLt+M1E2/Hbibbjd5PsiupkuyKebFfUptgVA6ba5YOm2WWDp9vla86wy9eeaZcN + Oc0uXXeWXbr+bLt0wzl26cZz7JJNzrBLNjvTLt7iLLt4q7Pt4q3Psd9sd679Zvvz7Tc7nm+/3vlC+/Wu + 8+zXwy6yX+12if1y5KX2y1GX2y//eIX9Yvcr7Rd7zrdf7H2V/fzP19jP97/Wfn7AdfZvBy6wnx18g/3s + sJvsp4ffZD896hb76TG32k+Ou81+cuId9uOT7rIfn3q3/Wv7QvvX9B771/w++9Ho++1HYx+wH45/yH44 + 6RH7wdRF9oOZj9n3T3/Cvjfnafv+mc/Y9855zr53/gv23Xkv2XcvecW+c/lr9p35r9t3rn7Tvn3d2/at + G961b930nn3z1g/sG3d8aN+466/2jYUf29fv/dS+fv9n9rWHPrevPfKFfXXRl/bVx7+yrzz5tX35qW/s + y88ssS89t9S+9Pwy++KLy+yLLy23L7y8wr7wSod9/tUO+/zrXfY5qWff6LLPvtltn3mz2z5N1WOferOb + 6sk3UF32ide77OOvoTrtY6922Mde6bCPvbzCLnpphX30xeX20eeX2UeeW2offmaxffjpxfbhJ76xDz3+ + tX3w0S/tg498aR948HP7wP2f2fvv/dTet/ATe+9df7X33vGRvffWD+w9N71nF97wrl14/dv27mvetHfP + f93edflr9q5LX7F3XvSSveOCF+0d5z5nbz/rWXvb3KftbbOfsrfOfNzeOm2RvWXyI/bmCQ/Zm8c9aG8a + 84C9sXm/vbFxn70hvcfe0H6PXXDqQrvglLvt9Sfeaa874XZ73XG322uPudVee9St9pojbrFXH3aTvfrQ + G+1VB99g5x+4wM4/4Dp75f7X2iv2vcZesc/V9vK9rrKX7THfXvanK+2lf7zcXjrqMnvJyMvsxSMusRcP + v9heNOxiO2+Xi+y8nS60F+50gb1gh/PtBdudZ8/f5lx7/tbn2PO2Otueu/lZ9pzNzrTnbHqGPWfjufbs + DefaszaYbc9cf7Y9c93T7RnrnGbnrj3Tzl1zhp2z5nQ7e9B0O3vANDu7NtXOSqbY0+LJ9rTqJDvzd5Ps + zDUm2pm/nWhn/Ga8nf7rCXbar8bZqb8ca6f+gmvyz8bYKT8bbSf9dLSd9JOmnfhjVMNOWC2nGr9qbsf1 + R2V2bP/Mjumf2dFSzf6ZbfTPbC5vJpVK1ftntl3q1P6ZPaV/Zk/26qT+mT1R6oRVM3tC/8we3z+zx/XP + 7LFSx/TP7NFSR0kdKXWE1OH9M3tY/8we2j+zh0gdLHWQ1IH9M/sXqQP6Z3Z/qf2k9u2f2T9L7SO1t9Se + Xu0htbvUH6X+IDVKqq1/Zkd6NaJ/Znfrn9nhUsO8Gto/s7tK7dI/sztL7SS1Y//M7iDv9lLbSW0rtU3/ + zG7t1VZSW/bP7BZSm3u1af/MbibvJv0zu7H3ojbqn9kNvdqgf2bXl1pPal2v1umf2SFSa0ut5b2oNftn + drBXg/pndqDUAO+tSSVexaWq9s/s7736Xf/MrtFH/aZ/Zn8rr9av+2f2V96L+qVXq0v9olQ/75/Zn3mv + 1k+9+on3on7svT/C2wcw/wfQTAWaXAzN3PasltvuHzVst0Czm6A52nb9fIztAjRXH2s7fzXOdv56vO38 + zQTbscZErt8LNJMpdrlAc7lAc5lCc73T7dL1Z9klGwCac+2STebaxZudaZdsztD8Zptz7DfbntcCza92 + nWe/Gnax/Wq3i+1XIy61X7Zdbr/80+UOmp/vfTVDcz8PmocAmjfaz464yX521C32E4HmxwrNU+6yHzto + 3svQHFNA88Opi+z7Mx6375/+pH1/zlO9oPmOQPPt+a/bt69+074FaC541755M0PzTYHm6/d8Yl+/71P7 + 2gMMzVcFmq88/rV95clv7MtPLxZoLrEvvbDUvvTicoFmh0Cz0z7/WqeD5nNvdhEwtQBOBmaXK4ImgbPT + Pi7QXOSgucw+QtBcYh9+eol9+KnF9qEnv7EPPfaVfXDRl/aBR76wDzz0N/vAA5/Z+wiaH9v7BJr3eNC8 + +zpA8y179/w37F2Xv27vvORVe+dFLws0n2donvGMvW3Wk/a2mU/YW6Y/JtB82N487qECmvl99sbsXntD + faFdcOrddsHJAs3j77DXHnubvfbo2+y1R91irznyZoLmVYcwNK868Hp7pUDzyn2vsZcLNC930LzCXjrq + cntJ26UCzUvsRUMvsvN2mWcv3PlCe+GOF9gLtvegudU59twtGZrnbnqmPWeTM+zZG8+1Z20k0FxvFkNz + yGn2DIEmSqE5qzbVnp5MtadXJ9vTfj/Zzvw9Q3MGQXOCnf7r8Xbar8bbaauPc9Cc8nOFZlOg2bATfgRo + MjgZmgxMhebKwIn6LmgqOAHMFmgKMH1oAph4fWj6wAQstQBNH5w+NAHMA/vnDpyApoJzZdBUYKL2KgFT + ofknAaa+Ck0AU6sMTQWnD0wtAFOrDE0FZxmaPjhXBk0Fpw9NANOHpgITsNRSWPrlg7MMTQZn3gucCkwt + H5plcGopNPX1YVkGZl/QBCi1fFj60OwLmK3QzFuAWa6+gFkuwPLH5txPJ0tNEkD2VWVSum//D4B+wQ0b + Fg32AAAAAElFTkSuQmCC + + + + + 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 + ZcNOefjSYSc/fMnQkx6+eNjJj1w09KSH5w09+eELh5740IXDTnr4gqEnPXT+0JMePG/oiQ+dO/Tkh84Z + etKDZw896cGzdj3xgbOGnvjgmUNPfOCMXU98YO6uJzwwe9cTUffP2vWE+0/f9YT7Z0rNQO1y/H3TULue + cP/UXY6/b/LOx947edfj752483FU46mOvWfczsfdO3bn4+4Zs/Ox94ze+dh7mlL5TscszHY+9p50x6Pv + ru90zN3tqB2PufvkHY++65Sd6L37pB2PvuuEHY+++4Qdj77r+J2OuuvYHY+685gdj77zmB2PuvOo7Y+8 + 46gdjrzjyB2OuvNw1PZH3n7oDkfecch2h99+yPaH33aQ1IHbcR2w/eG377/d4bfut93ht/4Zte1ht+6z + 7WG37LXtYbfsve2ht+y57WG37rHtoTfvvs0hN/9pm0Nv+ePWB9/8h60PvmnUNofc3LbVwTeN2PqQm0Zs + ddCNu2118I27bXXQjcO2OujGXbc86IZdtzzwhl22PHDBLpsfcP3OW/xlwQ5bHrhgB7ybH3D99psfsGC7 + LQ64fptN979um80PuH6rTfe/bkvUJvtdu8XG+16z2Sao/a7ddJN9r9l4o32u3gi14d7zN6Ta56r11t/j + ynU32Gv+OuvtceUQ1Pp7Xrn2OrtfvvZ6e1yx1rq7X7HWOrtfPnjdPa4YtPYfLxs45I+XDVz7D5fWhvzh + 0mRw28XxWqMuqQ4aMa86aMRF1QHD560xcLd5awwaMe+3tWEX/CaRioee/8tk6Pm//P0u5/7i9zuf+4vf + 7HDmz3+741k/+82OZ/1sjZ3O+elPNj/9Jz/dataPUT/bavaPVtt05mo/2mzmqj/ccMp/8Tv1v/5zw2n/ + +c9DJvzwX4aM/8G/rD3+B5Va8z8qSXOVKGmuUqk1/71Sa6xSqTX+rZI0/z2qNf+tUmv+ayWh+pdKjeqf + uRpSzf8j9b8rSfOf8EY1ev9Jvv7HSq3xj5Va839xNf6hUmtqVfB1cO5HOdV5H2W96vy/pqhKrWkqtWY/ + 7wUw8fbrBU1Tbbcmbu8xcb2ohKrb1NJuU8u6zACpgVmnGdToMoPyTlQ4uNFhtAblRQ3Ml6PCAdlyMyBd + bmrpMpPUUUtNnC6Vd4mJ25eE1fbFYbW+2FTr35hqu9bXJqb6ylTrX5lq+5emis/tX5q4/Yuw2v6Fqdal + 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 + Fg32AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/LargeSquareOne/FrmMsgBoxOutWithAck.Designer.cs b/LargeSquareOne/FrmMsgBoxOutWithAck.Designer.cs new file mode 100644 index 0000000..d42e5ed --- /dev/null +++ b/LargeSquareOne/FrmMsgBoxOutWithAck.Designer.cs @@ -0,0 +1,141 @@ +namespace LargeSquareOne +{ + partial class FrmMsgBoxOutWithAck + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.lbl_Content = new System.Windows.Forms.Label(); + this.btn_Sure = new System.Windows.Forms.Button(); + this.pic_TitleImage = new System.Windows.Forms.PictureBox(); + this.btn_Close = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pic_TitleImage)).BeginInit(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.AutoSize = true; + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 15F); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(46, 9); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(92, 27); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "退出系统"; + // + // lbl_Content + // + this.lbl_Content.BackColor = System.Drawing.Color.Transparent; + this.lbl_Content.Font = new System.Drawing.Font("微软雅黑", 15F); + this.lbl_Content.ForeColor = System.Drawing.Color.White; + this.lbl_Content.Location = new System.Drawing.Point(2, 111); + this.lbl_Content.Name = "lbl_Content"; + this.lbl_Content.Size = new System.Drawing.Size(437, 78); + this.lbl_Content.TabIndex = 3; + this.lbl_Content.Text = "是否确认要退出系统?"; + this.lbl_Content.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btn_Sure + // + this.btn_Sure.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Sure.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Sure.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Sure.ForeColor = System.Drawing.Color.White; + this.btn_Sure.Location = new System.Drawing.Point(104, 234); + this.btn_Sure.Name = "btn_Sure"; + this.btn_Sure.Size = new System.Drawing.Size(258, 36); + this.btn_Sure.TabIndex = 13; + this.btn_Sure.Text = "确定"; + this.btn_Sure.UseVisualStyleBackColor = false; + this.btn_Sure.Click += new System.EventHandler(this.btn_Sure_Click); + // + // pic_TitleImage + // + this.pic_TitleImage.BackColor = System.Drawing.Color.Transparent; + this.pic_TitleImage.ErrorImage = null; + this.pic_TitleImage.Image = global::LargeSquareOne.Properties.Resources.warning; + this.pic_TitleImage.Location = new System.Drawing.Point(2, 3); + this.pic_TitleImage.Name = "pic_TitleImage"; + this.pic_TitleImage.Size = new System.Drawing.Size(45, 41); + this.pic_TitleImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pic_TitleImage.TabIndex = 14; + this.pic_TitleImage.TabStop = false; + // + // btn_Close + // + this.btn_Close.BackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(29)))), ((int)(((byte)(84))))); + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(395, 1); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 15; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = false; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // FrmMsgBoxOutWithAck + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(439, 312); + this.Controls.Add(this.btn_Close); + this.Controls.Add(this.pic_TitleImage); + this.Controls.Add(this.btn_Sure); + this.Controls.Add(this.lbl_Content); + this.Controls.Add(this.lbl_Title); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 10F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmMsgBoxOutWithAck"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmMsgBoxWithAck"; + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + ((System.ComponentModel.ISupportInitialize)(this.pic_TitleImage)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + private System.Windows.Forms.Label lbl_Content; + private System.Windows.Forms.Button btn_Sure; + private System.Windows.Forms.PictureBox pic_TitleImage; + private System.Windows.Forms.Button btn_Close; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmMsgBoxOutWithAck.cs b/LargeSquareOne/FrmMsgBoxOutWithAck.cs new file mode 100644 index 0000000..4485d77 --- /dev/null +++ b/LargeSquareOne/FrmMsgBoxOutWithAck.cs @@ -0,0 +1,69 @@ +using Language; +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 LargeSquareOne +{ + public partial class FrmMsgBoxOutWithAck : MultiLanguageForm + { + public FrmMsgBoxOutWithAck(int type, string content, string title) + { + InitializeComponent(); + + this.TopMost = true; + + this.lbl_Content.Text = content; + this.lbl_Title.Text = title; + + switch (type) + { + case 1: + this.pic_TitleImage.Image = LargeSquareOne.Properties.Resources.info; + break; + case 2: + this.pic_TitleImage.Image = LargeSquareOne.Properties.Resources.warning; + break; + case 3: + this.pic_TitleImage.Image = LargeSquareOne.Properties.Resources.error; + break; + } + + + + } + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + private void btn_Sure_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + + } +} diff --git a/LargeSquareOne/FrmMsgBoxOutWithAck.resx b/LargeSquareOne/FrmMsgBoxOutWithAck.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/FrmMsgBoxOutWithAck.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmMsgBoxWithAck.Designer.cs b/LargeSquareOne/FrmMsgBoxWithAck.Designer.cs new file mode 100644 index 0000000..f54b4db --- /dev/null +++ b/LargeSquareOne/FrmMsgBoxWithAck.Designer.cs @@ -0,0 +1,139 @@ +namespace LargeSquareOne +{ + partial class FrmMsgBoxWithAck + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lbl_Title = new System.Windows.Forms.Label(); + this.btn_Close = new System.Windows.Forms.Button(); + this.lbl_Content = new System.Windows.Forms.Label(); + this.btn_Sure = new System.Windows.Forms.Button(); + this.btn_Cancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lbl_Title + // + this.lbl_Title.AutoSize = true; + this.lbl_Title.BackColor = System.Drawing.Color.Transparent; + this.lbl_Title.Font = new System.Drawing.Font("微软雅黑", 15F); + this.lbl_Title.ForeColor = System.Drawing.Color.White; + this.lbl_Title.Location = new System.Drawing.Point(12, 6); + this.lbl_Title.Name = "lbl_Title"; + this.lbl_Title.Size = new System.Drawing.Size(92, 27); + this.lbl_Title.TabIndex = 0; + this.lbl_Title.Text = "退出系统"; + // + // btn_Close + // + this.btn_Close.BackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(397, 1); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 2; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = false; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // lbl_Content + // + this.lbl_Content.BackColor = System.Drawing.Color.Transparent; + this.lbl_Content.Font = new System.Drawing.Font("微软雅黑", 15F); + this.lbl_Content.ForeColor = System.Drawing.Color.White; + this.lbl_Content.Location = new System.Drawing.Point(2, 132); + this.lbl_Content.Name = "lbl_Content"; + this.lbl_Content.Size = new System.Drawing.Size(437, 27); + this.lbl_Content.TabIndex = 3; + this.lbl_Content.Text = "是否确认要退出系统?"; + this.lbl_Content.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btn_Sure + // + this.btn_Sure.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Sure.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Sure.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Sure.ForeColor = System.Drawing.Color.White; + this.btn_Sure.Location = new System.Drawing.Point(86, 233); + this.btn_Sure.Name = "btn_Sure"; + this.btn_Sure.Size = new System.Drawing.Size(101, 36); + this.btn_Sure.TabIndex = 13; + this.btn_Sure.Text = "确定"; + this.btn_Sure.UseVisualStyleBackColor = false; + this.btn_Sure.Click += new System.EventHandler(this.btn_Sure_Click); + // + // btn_Cancel + // + this.btn_Cancel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Cancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Cancel.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Cancel.ForeColor = System.Drawing.Color.White; + this.btn_Cancel.Location = new System.Drawing.Point(256, 233); + this.btn_Cancel.Name = "btn_Cancel"; + this.btn_Cancel.Size = new System.Drawing.Size(101, 36); + this.btn_Cancel.TabIndex = 14; + this.btn_Cancel.Text = "取消"; + this.btn_Cancel.UseVisualStyleBackColor = false; + this.btn_Cancel.Click += new System.EventHandler(this.btn_Cancel_Click); + // + // FrmMsgBoxWithAck + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(439, 312); + this.Controls.Add(this.btn_Cancel); + this.Controls.Add(this.btn_Sure); + this.Controls.Add(this.lbl_Content); + this.Controls.Add(this.btn_Close); + this.Controls.Add(this.lbl_Title); + this.Font = new System.Drawing.Font("微软雅黑", 10F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmMsgBoxWithAck"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmMsgBoxWithAck"; + this.Shown += new System.EventHandler(this.FrmMsgBoxWithAck_Shown); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbl_Title; + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.Label lbl_Content; + private System.Windows.Forms.Button btn_Sure; + private System.Windows.Forms.Button btn_Cancel; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmMsgBoxWithAck.cs b/LargeSquareOne/FrmMsgBoxWithAck.cs new file mode 100644 index 0000000..522d434 --- /dev/null +++ b/LargeSquareOne/FrmMsgBoxWithAck.cs @@ -0,0 +1,71 @@ +using Language; +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 LargeSquareOne +{ + public partial class FrmMsgBoxWithAck : MultiLanguageForm + { + public FrmMsgBoxWithAck(string content, string title) + { + InitializeComponent(); + + this.TopMost = true; + + this.content = content; + this.title = title; + + this.lbl_Content.Text = content; + this.lbl_Title.Text = title; + + } + + private void btn_Sure_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + } + + private void btn_Cancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btn_Close_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + string content; + string title; + + private void FrmMsgBoxWithAck_Shown(object sender, EventArgs e) + { + this.lbl_Content.Text = this.content; + this.lbl_Title.Text = this.title; + } + + } +} diff --git a/LargeSquareOne/FrmMsgBoxWithAck.resx b/LargeSquareOne/FrmMsgBoxWithAck.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/FrmMsgBoxWithAck.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/FrmParamSet.Designer.cs b/LargeSquareOne/FrmParamSet.Designer.cs new file mode 100644 index 0000000..a70268d --- /dev/null +++ b/LargeSquareOne/FrmParamSet.Designer.cs @@ -0,0 +1,1281 @@ +namespace LargeSquareOne +{ + partial class FrmSystemSet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSystemSet)); + this.label16 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.txtEqp_code = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.txtline_No = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.txtFactory_code = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.btn_Cancel = new System.Windows.Forms.Button(); + this.btn_Sure = new System.Windows.Forms.Button(); + this.dgvPlcConfigs = new System.Windows.Forms.DataGridView(); + this.btAddPLC = new System.Windows.Forms.Button(); + this.lblDebugMode = new System.Windows.Forms.Label(); + this.txtEmployeeAuthCheck = new System.Windows.Forms.TextBox(); + this.lblEmployeeAuthCheck = new System.Windows.Forms.Label(); + this.txtDeviceStatus = new System.Windows.Forms.TextBox(); + this.lblPalletInfo = new System.Windows.Forms.Label(); + this.txtPalletInfo = new System.Windows.Forms.TextBox(); + this.lblBindingLabel = new System.Windows.Forms.Label(); + this.txtBindingLabel = new System.Windows.Forms.TextBox(); + this.lblDeviceParamRequest = new System.Windows.Forms.Label(); + this.txtDeviceParamRequest = new System.Windows.Forms.TextBox(); + this.lblDeviceParamChange = new System.Windows.Forms.Label(); + this.txtDeviceParamChange = new System.Windows.Forms.TextBox(); + this.lblDeviceStatus = new System.Windows.Forms.Label(); + this.lblDeviceAlarm = new System.Windows.Forms.Label(); + this.txtDeviceAlarm = new System.Windows.Forms.TextBox(); + this.lblEnergyConsumption = new System.Windows.Forms.Label(); + this.txtEnergyConsumption = new System.Windows.Forms.TextBox(); + this.lblCartonInfo = new System.Windows.Forms.Label(); + this.txtCartonInfo = new System.Windows.Forms.TextBox(); + this.lblAnemometer = new System.Windows.Forms.Label(); + this.txtAnemometer = new System.Windows.Forms.TextBox(); + this.btnPlcConfig = new JinYuan.ControlLib.TButton(); + this.tog_IsDebugMode = new JinYuan.ControlLib.Toggle(); + this.up_QieHuanPeriod = new JinYuan.ControlLib.UpDownLabel(); + this.tog_AutoQieHuanM = new JinYuan.ControlLib.Toggle(); + this.titleSystemConfig = new JinYuan.ControlLib.Title(); + this.up_ShowSeriesCount = new JinYuan.ControlLib.UpDownLabel(); + this.tog_SaveThreadTime = new JinYuan.ControlLib.Toggle(); + this.titleMesConfig = new JinYuan.ControlLib.Title(); + this.up_LockPeriod = new JinYuan.ControlLib.UpDownLabel(); + this.tog_AutoLock = new JinYuan.ControlLib.Toggle(); + this.tog_OpenMesModel = new JinYuan.ControlLib.Toggle(); + this.tog_SwipeCardMode = new JinYuan.ControlLib.Toggle(); + this.tog_AutoLogin = new JinYuan.ControlLib.Toggle(); + this.tog_AutoStart = new JinYuan.ControlLib.Toggle(); + this.tog_GetMesParam = new JinYuan.ControlLib.Toggle(); + this.radio_O2 = new AntdUI.Radio(); + this.radio_other = new AntdUI.Radio(); + this.customGroupBox_customType = new JinYuan.ControlLib.CustomGroupBox(); + this.txtBox_materialCode = new System.Windows.Forms.TextBox(); + this.lbl_materialCode = new System.Windows.Forms.Label(); + this.title_btw = new JinYuan.ControlLib.Title(); + this.label_container = new System.Windows.Forms.Label(); + this.txtBox_containerPath = new System.Windows.Forms.TextBox(); + this.lbl_ConnectPrinter = new System.Windows.Forms.Label(); + this.tog_ConnectPrinter = new JinYuan.ControlLib.Toggle(); + this.label_pallet = new System.Windows.Forms.Label(); + this.txtBox_palletpath = new System.Windows.Forms.TextBox(); + this.btn_BrowseCatonBtw = new System.Windows.Forms.Button(); + this.btn_BrowsePalletBtw = new System.Windows.Forms.Button(); + this.label_6J = new System.Windows.Forms.Label(); + this.txtBox_6J = new System.Windows.Forms.TextBox(); + this.label_3S = new System.Windows.Forms.Label(); + this.txtBox_3S = new System.Windows.Forms.TextBox(); + this.label_printerName = new System.Windows.Forms.Label(); + this.combox_printer = new JinYuan.ControlLib.CustomComboBox(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPlcConfigs)).BeginInit(); + this.customGroupBox_customType.SuspendLayout(); + this.SuspendLayout(); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.BackColor = System.Drawing.Color.Transparent; + this.label16.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label16.ForeColor = System.Drawing.Color.White; + this.label16.Location = new System.Drawing.Point(1401, 284); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(157, 16); + this.label16.TabIndex = 43; + this.label16.Text = "自动切换监控界面时间"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.BackColor = System.Drawing.Color.Transparent; + this.label17.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label17.ForeColor = System.Drawing.Color.White; + this.label17.Location = new System.Drawing.Point(997, 274); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(172, 16); + this.label17.TabIndex = 44; + this.label17.Text = "无操作自动切换监控界面"; + // + // txtEqp_code + // + this.txtEqp_code.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtEqp_code.Location = new System.Drawing.Point(648, 523); + this.txtEqp_code.Name = "txtEqp_code"; + this.txtEqp_code.Size = new System.Drawing.Size(173, 24); + this.txtEqp_code.TabIndex = 42; + this.txtEqp_code.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.BackColor = System.Drawing.Color.Transparent; + this.label13.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label13.ForeColor = System.Drawing.Color.White; + this.label13.Location = new System.Drawing.Point(645, 504); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(67, 16); + this.label13.TabIndex = 41; + this.label13.Text = "设备编号"; + // + // txtline_No + // + this.txtline_No.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtline_No.Location = new System.Drawing.Point(353, 526); + this.txtline_No.Name = "txtline_No"; + this.txtline_No.Size = new System.Drawing.Size(173, 24); + this.txtline_No.TabIndex = 40; + this.txtline_No.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.BackColor = System.Drawing.Color.Transparent; + this.label14.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label14.ForeColor = System.Drawing.Color.White; + this.label14.Location = new System.Drawing.Point(358, 505); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(67, 16); + this.label14.TabIndex = 39; + this.label14.Text = "产线编号"; + // + // txtFactory_code + // + this.txtFactory_code.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtFactory_code.Location = new System.Drawing.Point(51, 521); + this.txtFactory_code.Name = "txtFactory_code"; + this.txtFactory_code.Size = new System.Drawing.Size(173, 24); + this.txtFactory_code.TabIndex = 38; + this.txtFactory_code.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.BackColor = System.Drawing.Color.Transparent; + this.label15.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label15.ForeColor = System.Drawing.Color.White; + this.label15.Location = new System.Drawing.Point(51, 502); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(67, 16); + this.label15.TabIndex = 37; + this.label15.Text = "工厂代码"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.BackColor = System.Drawing.Color.Transparent; + this.label11.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label11.ForeColor = System.Drawing.Color.White; + this.label11.Location = new System.Drawing.Point(63, 274); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(97, 16); + this.label11.TabIndex = 30; + this.label11.Text = "开启刷卡模式"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.BackColor = System.Drawing.Color.Transparent; + this.label10.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label10.ForeColor = System.Drawing.Color.White; + this.label10.Location = new System.Drawing.Point(353, 560); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(94, 16); + this.label10.TabIndex = 28; + this.label10.Text = "获取MES参数"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.BackColor = System.Drawing.Color.Transparent; + this.label9.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label9.ForeColor = System.Drawing.Color.White; + this.label9.Location = new System.Drawing.Point(48, 548); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(143, 16); + this.label9.TabIndex = 26; + this.label9.Text = "MES/非MES模式切换"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.BackColor = System.Drawing.Color.Transparent; + this.label8.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label8.ForeColor = System.Drawing.Color.White; + this.label8.Location = new System.Drawing.Point(364, 274); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(127, 16); + this.label8.TabIndex = 24; + this.label8.Text = "线程耗时日志保存"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.BackColor = System.Drawing.Color.Transparent; + this.label5.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label5.ForeColor = System.Drawing.Color.White; + this.label5.Location = new System.Drawing.Point(1401, 208); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(97, 16); + this.label5.TabIndex = 12; + this.label5.Text = "曲线显示数量"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.BackColor = System.Drawing.Color.Transparent; + this.label4.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label4.ForeColor = System.Drawing.Color.White; + this.label4.Location = new System.Drawing.Point(998, 210); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(97, 16); + this.label4.TabIndex = 13; + this.label4.Text = "自动锁屏时间"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(672, 210); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(112, 16); + this.label3.TabIndex = 14; + this.label3.Text = "无操作自动锁屏"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label6.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label6.Location = new System.Drawing.Point(367, 208); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(97, 16); + this.label6.TabIndex = 11; + this.label6.Text = "软件自动登录"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.BackColor = System.Drawing.Color.Transparent; + this.label7.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label7.ForeColor = System.Drawing.Color.White; + this.label7.Location = new System.Drawing.Point(62, 210); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(97, 16); + this.label7.TabIndex = 10; + this.label7.Text = "开机自动启动"; + // + // btn_Cancel + // + this.btn_Cancel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Cancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Cancel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_Cancel.ForeColor = System.Drawing.Color.White; + this.btn_Cancel.Location = new System.Drawing.Point(1352, 560); + this.btn_Cancel.Name = "btn_Cancel"; + this.btn_Cancel.Size = new System.Drawing.Size(189, 62); + this.btn_Cancel.TabIndex = 8; + this.btn_Cancel.Text = "取消设置"; + this.btn_Cancel.UseVisualStyleBackColor = false; + this.btn_Cancel.Visible = false; + this.btn_Cancel.Click += new System.EventHandler(this.btn_Cancel_Click); + // + // btn_Sure + // + this.btn_Sure.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Sure.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Sure.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_Sure.ForeColor = System.Drawing.Color.White; + this.btn_Sure.Location = new System.Drawing.Point(1116, 567); + this.btn_Sure.Name = "btn_Sure"; + this.btn_Sure.Size = new System.Drawing.Size(189, 62); + this.btn_Sure.TabIndex = 5; + this.btn_Sure.Text = "保存设置"; + this.btn_Sure.UseVisualStyleBackColor = false; + this.btn_Sure.Click += new System.EventHandler(this.btn_Sure_Click); + // + // dgvPlcConfigs + // + this.dgvPlcConfigs.AllowUserToAddRows = false; + this.dgvPlcConfigs.AllowUserToDeleteRows = false; + this.dgvPlcConfigs.AllowUserToResizeRows = false; + this.dgvPlcConfigs.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgvPlcConfigs.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.dgvPlcConfigs.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPlcConfigs.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvPlcConfigs.ColumnHeadersHeight = 40; + this.dgvPlcConfigs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPlcConfigs.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvPlcConfigs.EnableHeadersVisualStyles = false; + this.dgvPlcConfigs.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvPlcConfigs.Location = new System.Drawing.Point(57, 61); + this.dgvPlcConfigs.Name = "dgvPlcConfigs"; + this.dgvPlcConfigs.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPlcConfigs.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvPlcConfigs.RowHeadersWidth = 55; + this.dgvPlcConfigs.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvPlcConfigs.RowTemplate.Height = 40; + this.dgvPlcConfigs.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPlcConfigs.Size = new System.Drawing.Size(1648, 89); + this.dgvPlcConfigs.TabIndex = 47; + // + // btAddPLC + // + this.btAddPLC.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btAddPLC.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btAddPLC.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btAddPLC.ForeColor = System.Drawing.Color.White; + this.btAddPLC.Location = new System.Drawing.Point(1523, 12); + this.btAddPLC.Name = "btAddPLC"; + this.btAddPLC.Size = new System.Drawing.Size(182, 36); + this.btAddPLC.TabIndex = 48; + this.btAddPLC.Text = "添加PLC"; + this.btAddPLC.UseVisualStyleBackColor = false; + this.btAddPLC.Click += new System.EventHandler(this.btAddPLC_Click); + // + // lblDebugMode + // + this.lblDebugMode.AutoSize = true; + this.lblDebugMode.BackColor = System.Drawing.Color.Transparent; + this.lblDebugMode.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblDebugMode.ForeColor = System.Drawing.Color.White; + this.lblDebugMode.Location = new System.Drawing.Point(672, 274); + this.lblDebugMode.Name = "lblDebugMode"; + this.lblDebugMode.Size = new System.Drawing.Size(67, 16); + this.lblDebugMode.TabIndex = 49; + this.lblDebugMode.Text = "调试模式"; + // + // txtEmployeeAuthCheck + // + this.txtEmployeeAuthCheck.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtEmployeeAuthCheck.Location = new System.Drawing.Point(34, 648); + this.txtEmployeeAuthCheck.Name = "txtEmployeeAuthCheck"; + this.txtEmployeeAuthCheck.Size = new System.Drawing.Size(775, 24); + this.txtEmployeeAuthCheck.TabIndex = 52; + // + // lblEmployeeAuthCheck + // + this.lblEmployeeAuthCheck.AutoSize = true; + this.lblEmployeeAuthCheck.BackColor = System.Drawing.Color.Transparent; + this.lblEmployeeAuthCheck.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblEmployeeAuthCheck.ForeColor = System.Drawing.Color.White; + this.lblEmployeeAuthCheck.Location = new System.Drawing.Point(34, 624); + this.lblEmployeeAuthCheck.Name = "lblEmployeeAuthCheck"; + this.lblEmployeeAuthCheck.Size = new System.Drawing.Size(97, 16); + this.lblEmployeeAuthCheck.TabIndex = 53; + this.lblEmployeeAuthCheck.Text = "员工权限校验"; + // + // txtDeviceStatus + // + this.txtDeviceStatus.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtDeviceStatus.Location = new System.Drawing.Point(874, 746); + this.txtDeviceStatus.Name = "txtDeviceStatus"; + this.txtDeviceStatus.Size = new System.Drawing.Size(731, 24); + this.txtDeviceStatus.TabIndex = 54; + // + // lblPalletInfo + // + this.lblPalletInfo.AutoSize = true; + this.lblPalletInfo.BackColor = System.Drawing.Color.Transparent; + this.lblPalletInfo.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblPalletInfo.ForeColor = System.Drawing.Color.White; + this.lblPalletInfo.Location = new System.Drawing.Point(34, 737); + this.lblPalletInfo.Name = "lblPalletInfo"; + this.lblPalletInfo.Size = new System.Drawing.Size(97, 16); + this.lblPalletInfo.TabIndex = 60; + this.lblPalletInfo.Text = "栈板信息获取"; + // + // txtPalletInfo + // + this.txtPalletInfo.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtPalletInfo.Location = new System.Drawing.Point(34, 756); + this.txtPalletInfo.Name = "txtPalletInfo"; + this.txtPalletInfo.Size = new System.Drawing.Size(775, 24); + this.txtPalletInfo.TabIndex = 59; + // + // lblBindingLabel + // + this.lblBindingLabel.AutoSize = true; + this.lblBindingLabel.BackColor = System.Drawing.Color.Transparent; + this.lblBindingLabel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblBindingLabel.ForeColor = System.Drawing.Color.White; + this.lblBindingLabel.Location = new System.Drawing.Point(31, 831); + this.lblBindingLabel.Name = "lblBindingLabel"; + this.lblBindingLabel.Size = new System.Drawing.Size(172, 16); + this.lblBindingLabel.TabIndex = 62; + this.lblBindingLabel.Text = "客户标签与系统标签绑定"; + this.lblBindingLabel.Visible = false; + // + // txtBindingLabel + // + this.txtBindingLabel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtBindingLabel.Location = new System.Drawing.Point(34, 850); + this.txtBindingLabel.Name = "txtBindingLabel"; + this.txtBindingLabel.Size = new System.Drawing.Size(775, 24); + this.txtBindingLabel.TabIndex = 61; + this.txtBindingLabel.Visible = false; + this.txtBindingLabel.WordWrap = false; + // + // lblDeviceParamRequest + // + this.lblDeviceParamRequest.AutoSize = true; + this.lblDeviceParamRequest.BackColor = System.Drawing.Color.Transparent; + this.lblDeviceParamRequest.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblDeviceParamRequest.ForeColor = System.Drawing.Color.White; + this.lblDeviceParamRequest.Location = new System.Drawing.Point(877, 627); + this.lblDeviceParamRequest.Name = "lblDeviceParamRequest"; + this.lblDeviceParamRequest.Size = new System.Drawing.Size(142, 16); + this.lblDeviceParamRequest.TabIndex = 64; + this.lblDeviceParamRequest.Text = "设备参数设定值请求"; + // + // txtDeviceParamRequest + // + this.txtDeviceParamRequest.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtDeviceParamRequest.Location = new System.Drawing.Point(874, 648); + this.txtDeviceParamRequest.Name = "txtDeviceParamRequest"; + this.txtDeviceParamRequest.Size = new System.Drawing.Size(731, 24); + this.txtDeviceParamRequest.TabIndex = 63; + // + // lblDeviceParamChange + // + this.lblDeviceParamChange.AutoSize = true; + this.lblDeviceParamChange.BackColor = System.Drawing.Color.Transparent; + this.lblDeviceParamChange.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblDeviceParamChange.ForeColor = System.Drawing.Color.White; + this.lblDeviceParamChange.Location = new System.Drawing.Point(877, 679); + this.lblDeviceParamChange.Name = "lblDeviceParamChange"; + this.lblDeviceParamChange.Size = new System.Drawing.Size(142, 16); + this.lblDeviceParamChange.TabIndex = 66; + this.lblDeviceParamChange.Text = "设备参数设定值变更"; + // + // txtDeviceParamChange + // + this.txtDeviceParamChange.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtDeviceParamChange.Location = new System.Drawing.Point(877, 700); + this.txtDeviceParamChange.Name = "txtDeviceParamChange"; + this.txtDeviceParamChange.Size = new System.Drawing.Size(728, 24); + this.txtDeviceParamChange.TabIndex = 65; + // + // lblDeviceStatus + // + this.lblDeviceStatus.AutoSize = true; + this.lblDeviceStatus.BackColor = System.Drawing.Color.Transparent; + this.lblDeviceStatus.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblDeviceStatus.ForeColor = System.Drawing.Color.White; + this.lblDeviceStatus.Location = new System.Drawing.Point(877, 727); + this.lblDeviceStatus.Name = "lblDeviceStatus"; + this.lblDeviceStatus.Size = new System.Drawing.Size(67, 16); + this.lblDeviceStatus.TabIndex = 67; + this.lblDeviceStatus.Text = "设备状态"; + // + // lblDeviceAlarm + // + this.lblDeviceAlarm.AutoSize = true; + this.lblDeviceAlarm.BackColor = System.Drawing.Color.Transparent; + this.lblDeviceAlarm.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblDeviceAlarm.ForeColor = System.Drawing.Color.White; + this.lblDeviceAlarm.Location = new System.Drawing.Point(874, 773); + this.lblDeviceAlarm.Name = "lblDeviceAlarm"; + this.lblDeviceAlarm.Size = new System.Drawing.Size(67, 16); + this.lblDeviceAlarm.TabIndex = 69; + this.lblDeviceAlarm.Text = "设备报警"; + // + // txtDeviceAlarm + // + this.txtDeviceAlarm.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtDeviceAlarm.Location = new System.Drawing.Point(874, 792); + this.txtDeviceAlarm.Name = "txtDeviceAlarm"; + this.txtDeviceAlarm.Size = new System.Drawing.Size(731, 24); + this.txtDeviceAlarm.TabIndex = 68; + // + // lblEnergyConsumption + // + this.lblEnergyConsumption.AutoSize = true; + this.lblEnergyConsumption.BackColor = System.Drawing.Color.Transparent; + this.lblEnergyConsumption.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblEnergyConsumption.ForeColor = System.Drawing.Color.White; + this.lblEnergyConsumption.Location = new System.Drawing.Point(34, 783); + this.lblEnergyConsumption.Name = "lblEnergyConsumption"; + this.lblEnergyConsumption.Size = new System.Drawing.Size(67, 16); + this.lblEnergyConsumption.TabIndex = 71; + this.lblEnergyConsumption.Text = "电表能耗"; + // + // txtEnergyConsumption + // + this.txtEnergyConsumption.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtEnergyConsumption.Location = new System.Drawing.Point(34, 804); + this.txtEnergyConsumption.Name = "txtEnergyConsumption"; + this.txtEnergyConsumption.Size = new System.Drawing.Size(775, 24); + this.txtEnergyConsumption.TabIndex = 70; + // + // lblCartonInfo + // + this.lblCartonInfo.AutoSize = true; + this.lblCartonInfo.BackColor = System.Drawing.Color.Transparent; + this.lblCartonInfo.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblCartonInfo.ForeColor = System.Drawing.Color.White; + this.lblCartonInfo.Location = new System.Drawing.Point(34, 679); + this.lblCartonInfo.Name = "lblCartonInfo"; + this.lblCartonInfo.Size = new System.Drawing.Size(97, 16); + this.lblCartonInfo.TabIndex = 73; + this.lblCartonInfo.Text = "箱唛信息获取"; + // + // txtCartonInfo + // + this.txtCartonInfo.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtCartonInfo.Location = new System.Drawing.Point(34, 705); + this.txtCartonInfo.Name = "txtCartonInfo"; + this.txtCartonInfo.Size = new System.Drawing.Size(775, 24); + this.txtCartonInfo.TabIndex = 72; + // + // lblAnemometer + // + this.lblAnemometer.AutoSize = true; + this.lblAnemometer.BackColor = System.Drawing.Color.Transparent; + this.lblAnemometer.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lblAnemometer.ForeColor = System.Drawing.Color.White; + this.lblAnemometer.Location = new System.Drawing.Point(874, 819); + this.lblAnemometer.Name = "lblAnemometer"; + this.lblAnemometer.Size = new System.Drawing.Size(52, 16); + this.lblAnemometer.TabIndex = 75; + this.lblAnemometer.Text = "风速仪"; + // + // txtAnemometer + // + this.txtAnemometer.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtAnemometer.Location = new System.Drawing.Point(874, 847); + this.txtAnemometer.Name = "txtAnemometer"; + this.txtAnemometer.Size = new System.Drawing.Size(731, 24); + this.txtAnemometer.TabIndex = 74; + // + // btnPlcConfig + // + this.btnPlcConfig.BackColor = System.Drawing.Color.Transparent; + this.btnPlcConfig.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnPlcConfig.BackgroundImage"))); + this.btnPlcConfig.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnPlcConfig.Location = new System.Drawing.Point(32, 14); + this.btnPlcConfig.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnPlcConfig.Name = "btnPlcConfig"; + this.btnPlcConfig.Size = new System.Drawing.Size(208, 41); + this.btnPlcConfig.TabIndex = 85; + this.btnPlcConfig.TitleName = "PLC配置"; + this.btnPlcConfig.Click += new System.EventHandler(this.btnPlcConfig_Click); + // + // tog_IsDebugMode + // + this.tog_IsDebugMode.BackColor = System.Drawing.Color.Transparent; + this.tog_IsDebugMode.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_IsDebugMode.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_IsDebugMode.FalseText = ""; + this.tog_IsDebugMode.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_IsDebugMode.IsChecked = false; + this.tog_IsDebugMode.Location = new System.Drawing.Point(672, 293); + this.tog_IsDebugMode.Margin = new System.Windows.Forms.Padding(7, 13, 7, 13); + this.tog_IsDebugMode.Name = "tog_IsDebugMode"; + this.tog_IsDebugMode.Size = new System.Drawing.Size(88, 35); + this.tog_IsDebugMode.TabIndex = 50; + this.tog_IsDebugMode.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_IsDebugMode.TrueText = ""; + // + // up_QieHuanPeriod + // + this.up_QieHuanPeriod.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.up_QieHuanPeriod.CurrentValue = 0F; + this.up_QieHuanPeriod.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.up_QieHuanPeriod.Location = new System.Drawing.Point(1401, 308); + this.up_QieHuanPeriod.Margin = new System.Windows.Forms.Padding(0); + this.up_QieHuanPeriod.MaxValue = 1000F; + this.up_QieHuanPeriod.MinValue = -1000F; + this.up_QieHuanPeriod.Name = "up_QieHuanPeriod"; + this.up_QieHuanPeriod.Size = new System.Drawing.Size(83, 30); + this.up_QieHuanPeriod.StepValue = 1F; + this.up_QieHuanPeriod.TabIndex = 46; + this.up_QieHuanPeriod.TextWidth = 30; + this.up_QieHuanPeriod.ThemeColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(161)))), ((int)(((byte)(226))))); + this.up_QieHuanPeriod.ThemeForeColor = System.Drawing.Color.White; + // + // tog_AutoQieHuanM + // + this.tog_AutoQieHuanM.BackColor = System.Drawing.Color.Transparent; + this.tog_AutoQieHuanM.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_AutoQieHuanM.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_AutoQieHuanM.FalseText = ""; + this.tog_AutoQieHuanM.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_AutoQieHuanM.IsChecked = false; + this.tog_AutoQieHuanM.Location = new System.Drawing.Point(997, 295); + this.tog_AutoQieHuanM.Margin = new System.Windows.Forms.Padding(9, 22, 9, 22); + this.tog_AutoQieHuanM.Name = "tog_AutoQieHuanM"; + this.tog_AutoQieHuanM.Size = new System.Drawing.Size(88, 35); + this.tog_AutoQieHuanM.TabIndex = 45; + this.tog_AutoQieHuanM.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_AutoQieHuanM.TrueText = ""; + // + // titleSystemConfig + // + this.titleSystemConfig.BackColor = System.Drawing.Color.Transparent; + this.titleSystemConfig.BackgroundImage = global::LargeSquareOne.Properties.Resources.Title; + this.titleSystemConfig.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleSystemConfig.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.titleSystemConfig.Location = new System.Drawing.Point(37, 161); + this.titleSystemConfig.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.titleSystemConfig.Name = "titleSystemConfig"; + this.titleSystemConfig.Size = new System.Drawing.Size(207, 41); + this.titleSystemConfig.TabIndex = 9; + this.titleSystemConfig.TitleName = "系统设置"; + // + // up_ShowSeriesCount + // + this.up_ShowSeriesCount.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.up_ShowSeriesCount.CurrentValue = 0F; + this.up_ShowSeriesCount.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.up_ShowSeriesCount.Location = new System.Drawing.Point(1401, 232); + this.up_ShowSeriesCount.Margin = new System.Windows.Forms.Padding(0); + this.up_ShowSeriesCount.MaxValue = 1000F; + this.up_ShowSeriesCount.MinValue = -1000F; + this.up_ShowSeriesCount.Name = "up_ShowSeriesCount"; + this.up_ShowSeriesCount.Size = new System.Drawing.Size(83, 32); + this.up_ShowSeriesCount.StepValue = 1F; + this.up_ShowSeriesCount.TabIndex = 23; + this.up_ShowSeriesCount.TextWidth = 30; + this.up_ShowSeriesCount.ThemeColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(161)))), ((int)(((byte)(226))))); + this.up_ShowSeriesCount.ThemeForeColor = System.Drawing.Color.White; + // + // tog_SaveThreadTime + // + this.tog_SaveThreadTime.BackColor = System.Drawing.Color.Transparent; + this.tog_SaveThreadTime.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_SaveThreadTime.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_SaveThreadTime.FalseText = ""; + this.tog_SaveThreadTime.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_SaveThreadTime.IsChecked = false; + this.tog_SaveThreadTime.Location = new System.Drawing.Point(364, 295); + this.tog_SaveThreadTime.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.tog_SaveThreadTime.Name = "tog_SaveThreadTime"; + this.tog_SaveThreadTime.Size = new System.Drawing.Size(88, 35); + this.tog_SaveThreadTime.TabIndex = 25; + this.tog_SaveThreadTime.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_SaveThreadTime.TrueText = ""; + this.tog_SaveThreadTime.CheckedChanged += new System.EventHandler(this.tog_SaveThreadTime_CheckedChanged); + // + // titleMesConfig + // + this.titleMesConfig.BackColor = System.Drawing.Color.Transparent; + this.titleMesConfig.BackgroundImage = global::LargeSquareOne.Properties.Resources.Title; + this.titleMesConfig.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.titleMesConfig.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.titleMesConfig.Location = new System.Drawing.Point(30, 457); + this.titleMesConfig.Margin = new System.Windows.Forms.Padding(7, 13, 7, 13); + this.titleMesConfig.Name = "titleMesConfig"; + this.titleMesConfig.Size = new System.Drawing.Size(207, 41); + this.titleMesConfig.TabIndex = 35; + this.titleMesConfig.TitleName = "MES参数配置"; + // + // up_LockPeriod + // + this.up_LockPeriod.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.up_LockPeriod.CurrentValue = 0F; + this.up_LockPeriod.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.up_LockPeriod.Location = new System.Drawing.Point(998, 233); + this.up_LockPeriod.Margin = new System.Windows.Forms.Padding(0); + this.up_LockPeriod.MaxValue = 1000F; + this.up_LockPeriod.MinValue = -1000F; + this.up_LockPeriod.Name = "up_LockPeriod"; + this.up_LockPeriod.Size = new System.Drawing.Size(83, 32); + this.up_LockPeriod.StepValue = 1F; + this.up_LockPeriod.TabIndex = 20; + this.up_LockPeriod.TextWidth = 30; + this.up_LockPeriod.ThemeColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(161)))), ((int)(((byte)(226))))); + this.up_LockPeriod.ThemeForeColor = System.Drawing.Color.White; + // + // tog_AutoLock + // + this.tog_AutoLock.BackColor = System.Drawing.Color.Transparent; + this.tog_AutoLock.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_AutoLock.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_AutoLock.FalseText = ""; + this.tog_AutoLock.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_AutoLock.IsChecked = false; + this.tog_AutoLock.Location = new System.Drawing.Point(672, 229); + this.tog_AutoLock.Margin = new System.Windows.Forms.Padding(7, 13, 7, 13); + this.tog_AutoLock.Name = "tog_AutoLock"; + this.tog_AutoLock.Size = new System.Drawing.Size(88, 35); + this.tog_AutoLock.TabIndex = 17; + this.tog_AutoLock.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_AutoLock.TrueText = ""; + // + // tog_OpenMesModel + // + this.tog_OpenMesModel.BackColor = System.Drawing.Color.Transparent; + this.tog_OpenMesModel.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_OpenMesModel.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_OpenMesModel.FalseText = ""; + this.tog_OpenMesModel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_OpenMesModel.IsChecked = false; + this.tog_OpenMesModel.Location = new System.Drawing.Point(48, 568); + this.tog_OpenMesModel.Margin = new System.Windows.Forms.Padding(7, 13, 7, 13); + this.tog_OpenMesModel.Name = "tog_OpenMesModel"; + this.tog_OpenMesModel.Size = new System.Drawing.Size(88, 35); + this.tog_OpenMesModel.TabIndex = 27; + this.tog_OpenMesModel.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_OpenMesModel.TrueText = ""; + this.tog_OpenMesModel.CheckedChanged += new System.EventHandler(this.tog_OpenMesModel_CheckedChanged); + // + // tog_SwipeCardMode + // + this.tog_SwipeCardMode.BackColor = System.Drawing.Color.Transparent; + this.tog_SwipeCardMode.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_SwipeCardMode.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_SwipeCardMode.FalseText = ""; + this.tog_SwipeCardMode.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_SwipeCardMode.IsChecked = false; + this.tog_SwipeCardMode.Location = new System.Drawing.Point(63, 295); + this.tog_SwipeCardMode.Margin = new System.Windows.Forms.Padding(12, 37, 12, 37); + this.tog_SwipeCardMode.Name = "tog_SwipeCardMode"; + this.tog_SwipeCardMode.Size = new System.Drawing.Size(88, 35); + this.tog_SwipeCardMode.TabIndex = 31; + this.tog_SwipeCardMode.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_SwipeCardMode.TrueText = ""; + this.tog_SwipeCardMode.CheckedChanged += new System.EventHandler(this.tog_SwipeCardMode_CheckedChanged); + // + // tog_AutoLogin + // + this.tog_AutoLogin.BackColor = System.Drawing.Color.Transparent; + this.tog_AutoLogin.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_AutoLogin.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_AutoLogin.FalseText = ""; + this.tog_AutoLogin.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_AutoLogin.IsChecked = false; + this.tog_AutoLogin.Location = new System.Drawing.Point(367, 229); + this.tog_AutoLogin.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.tog_AutoLogin.Name = "tog_AutoLogin"; + this.tog_AutoLogin.Size = new System.Drawing.Size(88, 35); + this.tog_AutoLogin.TabIndex = 16; + this.tog_AutoLogin.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_AutoLogin.TrueText = ""; + // + // tog_AutoStart + // + this.tog_AutoStart.BackColor = System.Drawing.Color.Transparent; + this.tog_AutoStart.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_AutoStart.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_AutoStart.FalseText = ""; + this.tog_AutoStart.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_AutoStart.IsChecked = false; + this.tog_AutoStart.Location = new System.Drawing.Point(62, 231); + this.tog_AutoStart.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.tog_AutoStart.Name = "tog_AutoStart"; + this.tog_AutoStart.Size = new System.Drawing.Size(88, 35); + this.tog_AutoStart.TabIndex = 15; + this.tog_AutoStart.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_AutoStart.TrueText = ""; + // + // tog_GetMesParam + // + this.tog_GetMesParam.BackColor = System.Drawing.Color.Transparent; + this.tog_GetMesParam.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_GetMesParam.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_GetMesParam.FalseText = ""; + this.tog_GetMesParam.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_GetMesParam.IsChecked = false; + this.tog_GetMesParam.Location = new System.Drawing.Point(353, 580); + this.tog_GetMesParam.Margin = new System.Windows.Forms.Padding(9, 22, 9, 22); + this.tog_GetMesParam.Name = "tog_GetMesParam"; + this.tog_GetMesParam.Size = new System.Drawing.Size(88, 35); + this.tog_GetMesParam.TabIndex = 29; + this.tog_GetMesParam.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_GetMesParam.TrueText = ""; + this.tog_GetMesParam.CheckedChanged += new System.EventHandler(this.tog_GetMesParam_CheckedChanged); + // + // radio_O2 + // + this.radio_O2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.radio_O2.Checked = true; + this.radio_O2.Fill = System.Drawing.Color.FromArgb(((int)(((byte)(22)))), ((int)(((byte)(119)))), ((int)(((byte)(255))))); + this.radio_O2.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.radio_O2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.radio_O2.Location = new System.Drawing.Point(22, 36); + this.radio_O2.Name = "radio_O2"; + this.radio_O2.Size = new System.Drawing.Size(126, 23); + this.radio_O2.TabIndex = 91; + this.radio_O2.Text = "O2客户"; + // + // radio_other + // + this.radio_other.Fill = System.Drawing.Color.FromArgb(((int)(((byte)(22)))), ((int)(((byte)(119)))), ((int)(((byte)(255))))); + this.radio_other.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.radio_other.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.radio_other.Location = new System.Drawing.Point(143, 36); + this.radio_other.Name = "radio_other"; + this.radio_other.Size = new System.Drawing.Size(137, 23); + this.radio_other.TabIndex = 92; + this.radio_other.Text = "其他客户"; + // + // customGroupBox_customType + // + this.customGroupBox_customType.BorderColor = System.Drawing.Color.Gray; + this.customGroupBox_customType.Controls.Add(this.radio_O2); + this.customGroupBox_customType.Controls.Add(this.radio_other); + this.customGroupBox_customType.ForeColor = System.Drawing.Color.White; + this.customGroupBox_customType.Location = new System.Drawing.Point(1116, 469); + this.customGroupBox_customType.Name = "customGroupBox_customType"; + this.customGroupBox_customType.Size = new System.Drawing.Size(315, 76); + this.customGroupBox_customType.TabIndex = 93; + this.customGroupBox_customType.TabStop = false; + this.customGroupBox_customType.Text = "客户类型"; + this.customGroupBox_customType.Visible = false; + // + // txtBox_materialCode + // + this.txtBox_materialCode.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtBox_materialCode.Location = new System.Drawing.Point(877, 521); + this.txtBox_materialCode.Name = "txtBox_materialCode"; + this.txtBox_materialCode.Size = new System.Drawing.Size(173, 24); + this.txtBox_materialCode.TabIndex = 95; + this.txtBox_materialCode.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // lbl_materialCode + // + this.lbl_materialCode.AutoSize = true; + this.lbl_materialCode.BackColor = System.Drawing.Color.Transparent; + this.lbl_materialCode.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lbl_materialCode.ForeColor = System.Drawing.Color.White; + this.lbl_materialCode.Location = new System.Drawing.Point(877, 502); + this.lbl_materialCode.Name = "lbl_materialCode"; + this.lbl_materialCode.Size = new System.Drawing.Size(67, 16); + this.lbl_materialCode.TabIndex = 94; + this.lbl_materialCode.Text = "物料编号"; + // + // title_btw + // + this.title_btw.BackColor = System.Drawing.Color.Transparent; + this.title_btw.BackgroundImage = global::LargeSquareOne.Properties.Resources.Title; + this.title_btw.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.title_btw.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.title_btw.Location = new System.Drawing.Point(34, 335); + this.title_btw.Margin = new System.Windows.Forms.Padding(7, 13, 7, 13); + this.title_btw.Name = "title_btw"; + this.title_btw.Size = new System.Drawing.Size(207, 41); + this.title_btw.TabIndex = 96; + this.title_btw.TitleName = "打印模板路径配置"; + this.title_btw.Visible = false; + // + // label_container + // + this.label_container.AutoSize = true; + this.label_container.BackColor = System.Drawing.Color.Transparent; + this.label_container.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label_container.ForeColor = System.Drawing.Color.White; + this.label_container.Location = new System.Drawing.Point(60, 386); + this.label_container.Name = "label_container"; + this.label_container.Size = new System.Drawing.Size(157, 16); + this.label_container.TabIndex = 97; + this.label_container.Text = "普通客户箱唛模板路径"; + this.label_container.Visible = false; + // + // txtBox_containerPath + // + this.txtBox_containerPath.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtBox_containerPath.Location = new System.Drawing.Point(223, 383); + this.txtBox_containerPath.Name = "txtBox_containerPath"; + this.txtBox_containerPath.Size = new System.Drawing.Size(483, 24); + this.txtBox_containerPath.TabIndex = 98; + this.txtBox_containerPath.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtBox_containerPath.Visible = false; + // + // lbl_ConnectPrinter + // + this.lbl_ConnectPrinter.AutoSize = true; + this.lbl_ConnectPrinter.BackColor = System.Drawing.Color.Transparent; + this.lbl_ConnectPrinter.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lbl_ConnectPrinter.ForeColor = System.Drawing.Color.White; + this.lbl_ConnectPrinter.Location = new System.Drawing.Point(800, 382); + this.lbl_ConnectPrinter.Name = "lbl_ConnectPrinter"; + this.lbl_ConnectPrinter.Size = new System.Drawing.Size(157, 16); + this.lbl_ConnectPrinter.TabIndex = 112; + this.lbl_ConnectPrinter.Text = "连接打印贴标机服务器"; + this.lbl_ConnectPrinter.Visible = false; + // + // tog_ConnectPrinter + // + this.tog_ConnectPrinter.BackColor = System.Drawing.Color.Transparent; + this.tog_ConnectPrinter.ControlType = JinYuan.ControlLib.ControlType.Rectangle; + this.tog_ConnectPrinter.FalseColor = System.Drawing.Color.SteelBlue; + this.tog_ConnectPrinter.FalseText = ""; + this.tog_ConnectPrinter.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.tog_ConnectPrinter.IsChecked = false; + this.tog_ConnectPrinter.Location = new System.Drawing.Point(978, 367); + this.tog_ConnectPrinter.Margin = new System.Windows.Forms.Padding(7, 13, 7, 13); + this.tog_ConnectPrinter.Name = "tog_ConnectPrinter"; + this.tog_ConnectPrinter.Size = new System.Drawing.Size(88, 35); + this.tog_ConnectPrinter.TabIndex = 111; + this.tog_ConnectPrinter.TrueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232))))); + this.tog_ConnectPrinter.TrueText = ""; + this.tog_ConnectPrinter.Visible = false; + // + // label_pallet + // + this.label_pallet.AutoSize = true; + this.label_pallet.BackColor = System.Drawing.Color.Transparent; + this.label_pallet.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label_pallet.ForeColor = System.Drawing.Color.White; + this.label_pallet.Location = new System.Drawing.Point(60, 417); + this.label_pallet.Name = "label_pallet"; + this.label_pallet.Size = new System.Drawing.Size(157, 16); + this.label_pallet.TabIndex = 101; + this.label_pallet.Text = "普通客户栈板模板路径"; + this.label_pallet.Visible = false; + // + // txtBox_palletpath + // + this.txtBox_palletpath.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtBox_palletpath.Location = new System.Drawing.Point(224, 417); + this.txtBox_palletpath.Name = "txtBox_palletpath"; + this.txtBox_palletpath.Size = new System.Drawing.Size(482, 24); + this.txtBox_palletpath.TabIndex = 102; + this.txtBox_palletpath.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtBox_palletpath.Visible = false; + // + // btn_BrowseCatonBtw + // + this.btn_BrowseCatonBtw.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_BrowseCatonBtw.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_BrowseCatonBtw.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_BrowseCatonBtw.ForeColor = System.Drawing.Color.White; + this.btn_BrowseCatonBtw.Location = new System.Drawing.Point(723, 382); + this.btn_BrowseCatonBtw.Name = "btn_BrowseCatonBtw"; + this.btn_BrowseCatonBtw.Size = new System.Drawing.Size(47, 28); + this.btn_BrowseCatonBtw.TabIndex = 103; + this.btn_BrowseCatonBtw.Text = "..."; + this.btn_BrowseCatonBtw.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.btn_BrowseCatonBtw.UseVisualStyleBackColor = false; + this.btn_BrowseCatonBtw.Visible = false; + this.btn_BrowseCatonBtw.Click += new System.EventHandler(this.btn_BrowseCatonBtw_Click); + // + // btn_BrowsePalletBtw + // + this.btn_BrowsePalletBtw.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_BrowsePalletBtw.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_BrowsePalletBtw.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_BrowsePalletBtw.ForeColor = System.Drawing.Color.White; + this.btn_BrowsePalletBtw.Location = new System.Drawing.Point(723, 418); + this.btn_BrowsePalletBtw.Name = "btn_BrowsePalletBtw"; + this.btn_BrowsePalletBtw.Size = new System.Drawing.Size(47, 28); + this.btn_BrowsePalletBtw.TabIndex = 104; + this.btn_BrowsePalletBtw.Text = "..."; + this.btn_BrowsePalletBtw.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.btn_BrowsePalletBtw.UseVisualStyleBackColor = false; + this.btn_BrowsePalletBtw.Visible = false; + this.btn_BrowsePalletBtw.Click += new System.EventHandler(this.btn_BrowsePalletBtw_Click); + // + // label_6J + // + this.label_6J.AutoSize = true; + this.label_6J.BackColor = System.Drawing.Color.Transparent; + this.label_6J.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label_6J.ForeColor = System.Drawing.Color.White; + this.label_6J.Location = new System.Drawing.Point(1432, 405); + this.label_6J.Name = "label_6J"; + this.label_6J.Size = new System.Drawing.Size(128, 16); + this.label_6J.TabIndex = 107; + this.label_6J.Text = "O2客户6J模板路径"; + this.label_6J.Visible = false; + // + // txtBox_6J + // + this.txtBox_6J.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtBox_6J.Location = new System.Drawing.Point(1569, 400); + this.txtBox_6J.Name = "txtBox_6J"; + this.txtBox_6J.Size = new System.Drawing.Size(78, 24); + this.txtBox_6J.TabIndex = 108; + this.txtBox_6J.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtBox_6J.Visible = false; + // + // label_3S + // + this.label_3S.AutoSize = true; + this.label_3S.BackColor = System.Drawing.Color.Transparent; + this.label_3S.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label_3S.ForeColor = System.Drawing.Color.White; + this.label_3S.Location = new System.Drawing.Point(1432, 366); + this.label_3S.Name = "label_3S"; + this.label_3S.Size = new System.Drawing.Size(130, 16); + this.label_3S.TabIndex = 105; + this.label_3S.Text = "O2客户3S模板路径"; + this.label_3S.Visible = false; + // + // txtBox_3S + // + this.txtBox_3S.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtBox_3S.Location = new System.Drawing.Point(1568, 364); + this.txtBox_3S.Name = "txtBox_3S"; + this.txtBox_3S.Size = new System.Drawing.Size(79, 24); + this.txtBox_3S.TabIndex = 106; + this.txtBox_3S.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtBox_3S.Visible = false; + // + // label_printerName + // + this.label_printerName.AutoSize = true; + this.label_printerName.BackColor = System.Drawing.Color.Transparent; + this.label_printerName.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label_printerName.ForeColor = System.Drawing.Color.White; + this.label_printerName.Location = new System.Drawing.Point(799, 423); + this.label_printerName.Name = "label_printerName"; + this.label_printerName.Size = new System.Drawing.Size(142, 16); + this.label_printerName.TabIndex = 109; + this.label_printerName.Text = "箱唛标签打印机名称"; + this.label_printerName.Visible = false; + // + // combox_printer + // + this.combox_printer.BackColor = System.Drawing.Color.White; + this.combox_printer.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.combox_printer.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.combox_printer.ForeColor = System.Drawing.Color.Black; + this.combox_printer.FormattingEnabled = true; + this.combox_printer.Location = new System.Drawing.Point(978, 418); + this.combox_printer.Name = "combox_printer"; + this.combox_printer.Size = new System.Drawing.Size(365, 27); + this.combox_printer.TabIndex = 110; + this.combox_printer.Visible = false; + this.combox_printer.WatermarkText = ""; + this.combox_printer.SelectedIndexChanged += new System.EventHandler(this.combox_printer_SelectedIndexChanged); + // + // FrmSystemSet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.ClientSize = new System.Drawing.Size(1717, 929); + this.Controls.Add(this.combox_printer); + this.Controls.Add(this.label_printerName); + this.Controls.Add(this.tog_ConnectPrinter); + this.Controls.Add(this.lbl_ConnectPrinter); + this.Controls.Add(this.label_6J); + this.Controls.Add(this.txtBox_6J); + this.Controls.Add(this.label_3S); + this.Controls.Add(this.txtBox_3S); + this.Controls.Add(this.btn_BrowsePalletBtw); + this.Controls.Add(this.btn_BrowseCatonBtw); + this.Controls.Add(this.label_pallet); + this.Controls.Add(this.txtBox_palletpath); + this.Controls.Add(this.title_btw); + this.Controls.Add(this.label_container); + this.Controls.Add(this.txtBox_containerPath); + this.Controls.Add(this.txtBox_materialCode); + this.Controls.Add(this.lbl_materialCode); + this.Controls.Add(this.customGroupBox_customType); + this.Controls.Add(this.btnPlcConfig); + this.Controls.Add(this.lblAnemometer); + this.Controls.Add(this.txtAnemometer); + this.Controls.Add(this.lblCartonInfo); + this.Controls.Add(this.txtCartonInfo); + this.Controls.Add(this.lblEnergyConsumption); + this.Controls.Add(this.txtEnergyConsumption); + this.Controls.Add(this.lblDeviceAlarm); + this.Controls.Add(this.txtDeviceAlarm); + this.Controls.Add(this.lblDeviceStatus); + this.Controls.Add(this.lblDeviceParamChange); + this.Controls.Add(this.txtDeviceParamChange); + this.Controls.Add(this.lblDeviceParamRequest); + this.Controls.Add(this.txtDeviceParamRequest); + this.Controls.Add(this.lblBindingLabel); + this.Controls.Add(this.txtBindingLabel); + this.Controls.Add(this.lblPalletInfo); + this.Controls.Add(this.txtPalletInfo); + this.Controls.Add(this.txtDeviceStatus); + this.Controls.Add(this.lblEmployeeAuthCheck); + this.Controls.Add(this.txtEmployeeAuthCheck); + this.Controls.Add(this.tog_IsDebugMode); + this.Controls.Add(this.lblDebugMode); + this.Controls.Add(this.btAddPLC); + this.Controls.Add(this.up_QieHuanPeriod); + this.Controls.Add(this.label8); + this.Controls.Add(this.tog_AutoQieHuanM); + this.Controls.Add(this.titleSystemConfig); + this.Controls.Add(this.up_ShowSeriesCount); + this.Controls.Add(this.label7); + this.Controls.Add(this.tog_SaveThreadTime); + this.Controls.Add(this.titleMesConfig); + this.Controls.Add(this.label16); + this.Controls.Add(this.up_LockPeriod); + this.Controls.Add(this.btn_Cancel); + this.Controls.Add(this.label6); + this.Controls.Add(this.label9); + this.Controls.Add(this.label15); + this.Controls.Add(this.label17); + this.Controls.Add(this.tog_AutoLock); + this.Controls.Add(this.label3); + this.Controls.Add(this.tog_OpenMesModel); + this.Controls.Add(this.txtFactory_code); + this.Controls.Add(this.txtEqp_code); + this.Controls.Add(this.tog_SwipeCardMode); + this.Controls.Add(this.tog_AutoLogin); + this.Controls.Add(this.label4); + this.Controls.Add(this.label10); + this.Controls.Add(this.label14); + this.Controls.Add(this.label13); + this.Controls.Add(this.label11); + this.Controls.Add(this.tog_AutoStart); + this.Controls.Add(this.btn_Sure); + this.Controls.Add(this.label5); + this.Controls.Add(this.tog_GetMesParam); + this.Controls.Add(this.txtline_No); + this.Controls.Add(this.dgvPlcConfigs); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmSystemSet"; + this.Text = "系统设置"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + ((System.ComponentModel.ISupportInitialize)(this.dgvPlcConfigs)).EndInit(); + this.customGroupBox_customType.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button btn_Cancel; + private System.Windows.Forms.Button btn_Sure; + private JinYuan.ControlLib.Title titleSystemConfig; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label6; + private JinYuan.ControlLib.Toggle tog_AutoLock; + private JinYuan.ControlLib.Toggle tog_AutoLogin; + private JinYuan.ControlLib.UpDownLabel up_LockPeriod; + private JinYuan.ControlLib.UpDownLabel up_ShowSeriesCount; + private JinYuan.ControlLib.Toggle tog_SaveThreadTime; + private System.Windows.Forms.Label label8; + private JinYuan.ControlLib.Toggle tog_GetMesParam; + private System.Windows.Forms.Label label10; + private JinYuan.ControlLib.Toggle tog_OpenMesModel; + private System.Windows.Forms.Label label9; + private JinYuan.ControlLib.Toggle tog_AutoStart; + private System.Windows.Forms.Label label7; + private JinYuan.ControlLib.Toggle tog_SwipeCardMode; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox txtEqp_code; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txtline_No; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.TextBox txtFactory_code; + private System.Windows.Forms.Label label15; + private JinYuan.ControlLib.Title titleMesConfig; + private JinYuan.ControlLib.UpDownLabel up_QieHuanPeriod; + private JinYuan.ControlLib.Toggle tog_AutoQieHuanM; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.DataGridView dgvPlcConfigs; + private System.Windows.Forms.Button btAddPLC; + private JinYuan.ControlLib.Toggle tog_IsDebugMode; + private System.Windows.Forms.Label lblDebugMode; + private System.Windows.Forms.TextBox txtEmployeeAuthCheck; + private System.Windows.Forms.Label lblEmployeeAuthCheck; + private System.Windows.Forms.TextBox txtDeviceStatus; + private System.Windows.Forms.Label lblPalletInfo; + private System.Windows.Forms.TextBox txtPalletInfo; + private System.Windows.Forms.Label lblBindingLabel; + private System.Windows.Forms.TextBox txtBindingLabel; + private System.Windows.Forms.Label lblDeviceParamRequest; + private System.Windows.Forms.TextBox txtDeviceParamRequest; + private System.Windows.Forms.Label lblDeviceParamChange; + private System.Windows.Forms.TextBox txtDeviceParamChange; + private System.Windows.Forms.Label lblDeviceStatus; + private System.Windows.Forms.Label lblDeviceAlarm; + private System.Windows.Forms.TextBox txtDeviceAlarm; + private System.Windows.Forms.Label lblEnergyConsumption; + private System.Windows.Forms.TextBox txtEnergyConsumption; + private System.Windows.Forms.Label lblCartonInfo; + private System.Windows.Forms.TextBox txtCartonInfo; + private System.Windows.Forms.Label lblAnemometer; + private System.Windows.Forms.TextBox txtAnemometer; + private JinYuan.ControlLib.TButton btnPlcConfig; + private AntdUI.Radio radio_other; + private JinYuan.ControlLib.CustomGroupBox customGroupBox_customType; + public AntdUI.Radio radio_O2; + private System.Windows.Forms.TextBox txtBox_materialCode; + private System.Windows.Forms.Label lbl_materialCode; + private JinYuan.ControlLib.Title title_btw; + private System.Windows.Forms.Label lbl_ConnectPrinter; + private JinYuan.ControlLib.Toggle tog_ConnectPrinter; + private System.Windows.Forms.Label label_container; + private System.Windows.Forms.TextBox txtBox_containerPath; + private System.Windows.Forms.Label label_pallet; + private System.Windows.Forms.TextBox txtBox_palletpath; + private System.Windows.Forms.Button btn_BrowseCatonBtw; + private System.Windows.Forms.Button btn_BrowsePalletBtw; + private System.Windows.Forms.Label label_6J; + private System.Windows.Forms.TextBox txtBox_6J; + private System.Windows.Forms.Label label_3S; + private System.Windows.Forms.TextBox txtBox_3S; + private System.Windows.Forms.Label label_printerName; + private JinYuan.ControlLib.CustomComboBox combox_printer; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmParamSet.cs b/LargeSquareOne/FrmParamSet.cs new file mode 100644 index 0000000..ef2e539 --- /dev/null +++ b/LargeSquareOne/FrmParamSet.cs @@ -0,0 +1,1164 @@ +using JinYuan.ControlLib; +using JinYuan.MES.Models; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using Microsoft.Win32; +using MiniExcelLibs; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.Eventing.Reader; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using System.Drawing.Printing; + +namespace LargeSquareOne +{ + public partial class FrmSystemSet : MultiLanguageForm + { + private string devPath = string.Empty; + private string PlcConfigFilePath = "plc_config.xlsx"; + private List plcConfigs; + private string PlcCommunicationConfigPath; + private string variableConfigPath; + + private List PLCTypes = new List(); + + private bool isEditing = false; + private int editingRowIndex = -1; + private readonly string configFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config"); + + public FrmSystemSet(string devPath) + { + InitializeComponent(); + + + ////设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + + PlcConfigFilePath = Path.Combine(configFolderPath, "Device.xlsx"); + PlcCommunicationConfigPath = Path.Combine(configFolderPath, "Group.xlsx"); + variableConfigPath = Path.Combine(configFolderPath, "Variable.xlsx"); + devPath = Path.Combine(configFolderPath, "Configure.ini"); + + PLCTypes.AddRange(new string[] { "OmronFinsTCP", "OmronCipNet" }); + SetupDataGridView(); + LoadPLCConfig(); + + this.tog_AutoStart.IsChecked = CommonMethods.sysConfig.AutoStart; + this.tog_AutoLogin.IsChecked = CommonMethods.sysConfig.AutoLogin; + this.tog_AutoLock.IsChecked = CommonMethods.sysConfig.AutoLock; + this.up_LockPeriod.CurrentValue = CommonMethods.sysConfig.LockPeriod; + this.tog_AutoQieHuanM.IsChecked = CommonMethods.sysConfig.AutoQieHuanM; + this.up_QieHuanPeriod.CurrentValue = CommonMethods.sysConfig.QieHuanMPeriod; + this.up_ShowSeriesCount.CurrentValue = CommonMethods.sysConfig.ShowSeriesCount; + + + this.tog_IsDebugMode.IsChecked = CommonMethods.sysConfig.IsDebugMode; + this.tog_SwipeCardMode.IsChecked = CommonMethods.sysConfig.SwipeCardMode; + this.tog_OpenMesModel.IsChecked = CommonMethods.sysConfig.MesModeSwitching; + this.tog_GetMesParam.IsChecked = CommonMethods.sysConfig.GetMesParam; + this.tog_SaveThreadTime.IsChecked = CommonMethods.sysConfig.SaveThreadTime; + + this.tog_AutoStart.CheckedChanged += new System.EventHandler(this.tog_AutoStart_CheckedChanged); + this.tog_AutoLogin.CheckedChanged += new System.EventHandler(this.tog_AutoLogin_CheckedChanged); + this.tog_AutoLock.CheckedChanged += new System.EventHandler(this.tog_AutoLock_CheckedChanged); + this.up_LockPeriod.ValueChanged += new System.EventHandler(this.up_LockPeriod_ValueChanged); + + this.tog_AutoQieHuanM.CheckedChanged += new System.EventHandler(this.tog_AutoQieHuanM_CheckedChanged); + this.up_QieHuanPeriod.ValueChanged += new System.EventHandler(this.up_QieHuanPeriod_ValueChanged); + + this.up_ShowSeriesCount.ValueChanged += new System.EventHandler(this.up_ShowSeriesCount_ValueChanged); + + this.devPath = devPath; + + + this.txtFactory_code.Text = CommonMethods.mesConfig.siteCode; + this.txtline_No.Text = CommonMethods.mesConfig.lineCode; + this.txtEqp_code.Text = CommonMethods.mesConfig.equipNum; + this.txtBox_materialCode.Text = CommonMethods.mesConfig.MaterialCode; + + string customerType = CommonMethods.mesConfig.customerType; + switch (customerType) + { + case "O2": + this.radio_O2.Checked = true; + break; + default: + this.radio_other.Checked = true; + break; + } + + this.txtEmployeeAuthCheck.Text = CommonMethods.mesConfig.EmployeeAuthCheck; + this.txtCartonInfo.Text = CommonMethods.mesConfig.queryCartonUrl; + this.txtPalletInfo.Text = CommonMethods.mesConfig.queryPalletUrl; + this.txtDeviceParamRequest.Text = CommonMethods.mesConfig.DeviceParamRequest; + this.txtDeviceParamChange.Text = CommonMethods.mesConfig.DeviceParamChange; + this.txtDeviceAlarm.Text = CommonMethods.mesConfig.DeviceAlarm; + + this.txtDeviceStatus.Text = CommonMethods.mesConfig.DeviceStatus; + this.txtEnergyConsumption.Text = CommonMethods.mesConfig.EnergyConsumption; + this.txtAnemometer.Text = CommonMethods.mesConfig.Anemometer; + this.txtBindingLabel.Text = CommonMethods.mesConfig.bindingUrl; + + this.tog_ConnectPrinter.IsChecked = CommonMethods.btwConfig.IsConnectPrinter; + this.tog_ConnectPrinter.CheckedChanged += new System.EventHandler(this.tog_ConnectPrinter_CheckedChanged); + this.txtBox_containerPath.Text = CommonMethods.btwConfig.containerBTWPath; + this.txtBox_palletpath.Text = CommonMethods.btwConfig.palletBTWPath; + LoadPrintersToComboBox(CommonMethods.btwConfig.printerName); + + } + + /// + /// 加载打印机列表到ComboBox + /// + private void LoadPrintersToComboBox(string lastprinterName) + { + try + { + // 清空原有项 + this.combox_printer.Items.Clear(); + string systemDefaultPrinter = new PrinterSettings().PrinterName; + string targetDefaultPrinter = string.IsNullOrEmpty(lastprinterName) + ? systemDefaultPrinter + : lastprinterName; + + // 遍历所有打印机并添加到ComboBox + foreach (string printerName in PrinterSettings.InstalledPrinters) + { + string displayText = printerName == targetDefaultPrinter + ? $"{printerName} (默认)" + : printerName; + this.combox_printer.Items.Add(displayText); + } + + string finalSelectedPrinter = string.Empty; + if (this.combox_printer.Items.Count > 0) + { + bool isSelected = false; + string targetDisplayText = $"{targetDefaultPrinter} (默认)"; + for (int i = 0; i < combox_printer.Items.Count; i++) + { + if (combox_printer.Items[i].ToString() == targetDisplayText) + { + combox_printer.SelectedIndex = i; + isSelected = true; + finalSelectedPrinter = targetDefaultPrinter; + break; + } + } + + if (!isSelected) + { + for (int i = 0; i < combox_printer.Items.Count; i++) + { + if (combox_printer.Items[i].ToString() == targetDefaultPrinter) + { + combox_printer.SelectedIndex = i; + isSelected = true; + finalSelectedPrinter = targetDefaultPrinter; + break; + } + } + } + // 仍未选中则选第一个 + if (!isSelected) + { + combox_printer.SelectedIndex = 0; + finalSelectedPrinter = combox_printer.Items[0].ToString().Replace(" (默认)", "").Trim(); ; + } + CommonMethods.btwConfig.printerName = finalSelectedPrinter; + } + else + { + combox_printer.Items.Add("未检测到打印机"); + combox_printer.SelectedIndex = 0; + CommonMethods.btwConfig.printerName = string.Empty; + MessageBox.Show($"未检测到打印机, 请确认打印机的连接是否正常", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + catch (Exception ex) + { + MessageBox.Show($"加载打印机列表失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + + /// + /// 初始化DataGrid + /// + private void SetupDataGridView() + { + // 设置基本属性 + dgvPlcConfigs.AutoGenerateColumns = false; + dgvPlcConfigs.MultiSelect = false; + + // 添加数据列 + dgvPlcConfigs.Columns.AddRange(new DataGridViewColumn[] + { + new DataGridViewTextBoxColumn + { + Name = "PlcNum", + HeaderText = "PLC编号", + DataPropertyName = "PlcNum", + ReadOnly = true, + Width = 80, + ValueType = typeof(int) + }, + new DataGridViewComboBoxColumn + { + Name = "PLCType", + HeaderText = "PLC类型", + DataPropertyName = "PLCType", + DataSource = new List(PLCTypes), // 使用新列表避免引用问题 + Width = 160, + ValueType = typeof(string), + FlatStyle = FlatStyle.Flat, + DefaultCellStyle = new DataGridViewCellStyle + { + BackColor = Color.FromArgb(14, 23, 38), // 深色背景 + ForeColor = Color.White, // 白色文字 + SelectionBackColor = Color.FromArgb(0, 122, 204), // 选中时的背景色 + SelectionForeColor = Color.White, // 选中时的文字颜色 + Font = new Font("微软雅黑", 9F) // 字体设置 + } + }, + new DataGridViewTextBoxColumn + { + Name = "IPAddress", + HeaderText = "IP地址", + DataPropertyName = "IPAddress", + Width = 120, + ValueType = typeof(string) + }, + new DataGridViewTextBoxColumn + { + Name = "Port", + HeaderText = "端口号", + DataPropertyName = "Port", + Width = 80, + ValueType = typeof(string) + }, + new DataGridViewTextBoxColumn + { + Name = "HeartBeat", + HeaderText = "心跳地址", + DataPropertyName = "HeartBeat", + Width = 100, + ValueType = typeof(string) + }, + new DataGridViewCheckBoxColumn + { + Name = "IsHeartBeat", + HeaderText = "心跳状态", + DataPropertyName = "IsHeartBeat", + Width = 80, + ValueType = typeof(bool), + TrueValue = true, + FalseValue = false + }, + new DataGridViewCheckBoxColumn + { + Name = "IsActive", + HeaderText = "激活状态", + DataPropertyName = "IsActive", + Width = 80, + ValueType = typeof(bool), + TrueValue = true, + FalseValue = false + }, + new DataGridViewTextBoxColumn + { + Name = "Remark", + HeaderText = "备注", + DataPropertyName = "Remark", + Width = 150, + ValueType = typeof(string) + }, + new DataGridViewButtonColumn + { + Name = "Edit", + HeaderText = "操作", + Text = "修改".Translated(), + UseColumnTextForButtonValue = true, + Width = 80 + }, + + new DataGridViewButtonColumn + { + Name = "Delete", + HeaderText = "", + Text = "删除".Translated(), + UseColumnTextForButtonValue = true, + Width = 80 + }, + new DataGridViewButtonColumn + { + Name = "CommConfig", + HeaderText = "设置", + Text = "通信组".Translated(), + UseColumnTextForButtonValue = true, + Width = 80 + }, + new DataGridViewButtonColumn + { + Name = "VariableConfig", + HeaderText = "", + Text = "变量".Translated(), + UseColumnTextForButtonValue = true, + Width = 80 + }, + }); + + + // 设置列为只读 + SetColumnsReadOnly(false); + + // 绑定事件 + dgvPlcConfigs.CellClick += DgvPlcConfigs_CellClick; + dgvPlcConfigs.CellValidating += DgvPlcConfigs_CellValidating; + dgvPlcConfigs.CellValueChanged += DgvPlcConfigs_CellValueChanged; + dgvPlcConfigs.DataError += DgvPlcConfigs_DataError; + + // 设置自动调整行高 + dgvPlcConfigs.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; + dgvPlcConfigs.RowHeadersVisible = false; + } + + + private void SetColumnsReadOnly(bool readOnly) + { + foreach (DataGridViewColumn col in dgvPlcConfigs.Columns) + { + // PlcNum 列始终保持只读 + if (col.Name == "PlcNum") + { + col.ReadOnly = true; + continue; + } + + // 按钮列不需要设置 ReadOnly 属性 + if (col is DataGridViewButtonColumn) + continue; + + // 其他列根据参数设置 + col.ReadOnly = readOnly; + } + } + + + /// + /// 加载PLCConfig配置文件 + /// + private void LoadPLCConfig() + { + + try + { + if (File.Exists(PlcConfigFilePath)) + { + using (var stream = File.OpenRead(PlcConfigFilePath)) + { + var devices = MiniExcel.Query(stream).ToList(); + plcConfigs = devices.Select(device => new PLCConfig + { + PlcNum = device.PlcNum, + PLCType = device.PLCType, + IPAddress = device.IPAddress, + Port = device.Port.ToString(), + HeartBeat = device.HeartBeat, + IsHeartBeat = device.IsHeartBeat, + IsActive = device.IsActive, + Remark = device.Remark, + }).ToList(); + } + + } + else + { + plcConfigs = new List(); + } + + RefreshDataGridView(); + } + catch (Exception ex) + { + MessageBox.Show($"加载配置文件失败:{ex.Message}", "错误", + MessageBoxButtons.OK, MessageBoxIcon.Error); + plcConfigs = new List(); + } + } + + + private void DgvPlcConfigs_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) return; + + var columnName = dgvPlcConfigs.Columns[e.ColumnIndex].Name; + + // 如果正在编辑其他行,阻止操作 + if (isEditing && editingRowIndex != e.RowIndex) + { + MessageBox.Show("请先完成当前编辑操作", "提示", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + var plcConfig = plcConfigs[e.RowIndex]; + + switch (columnName) + { + case "Edit": + HandleEdit(e.RowIndex); + break; + case "CommConfig": + HandleCommConfig(plcConfig); + break; + case "VariableConfig": + HandleVariableConfig(plcConfig); + break; + case "Delete": + HandleDelete(e.RowIndex, plcConfig); + break; + } + } + + + private void HandleEdit(int rowIndex) + { + if (!isEditing) + { + // 开始编辑 + isEditing = true; + editingRowIndex = rowIndex; + SetColumnsReadOnly(false); // 设置其他列为可编辑 + + // 更改编辑按钮文本为"保存" + dgvPlcConfigs.Rows[rowIndex].Cells["Edit"].Value = "保存"; + + // 禁用其他行的按钮 + foreach (DataGridViewRow row in dgvPlcConfigs.Rows) + { + if (row.Index != rowIndex) + { + if (row.Cells["Edit"] is DataGridViewButtonCell editCell) + editCell.Value = ""; + if (row.Cells["CommConfig"] is DataGridViewButtonCell configCell) + configCell.Value = ""; + if (row.Cells["Delete"] is DataGridViewButtonCell deleteCell) + deleteCell.Value = ""; + } + } + + // 禁用添加按钮 + btAddPLC.Enabled = false; + } + else if (rowIndex == editingRowIndex) + { + // 保存更改 + if (ValidateRow(rowIndex)) + { + SaveChanges(rowIndex); + EndEditing(); + } + } + } + + + private void EndEditing() + { + isEditing = false; + editingRowIndex = -1; + SetColumnsReadOnly(true); + + // 恢复所有按钮文本和状态 + foreach (DataGridViewRow row in dgvPlcConfigs.Rows) + { + row.Cells["Edit"].Value = "编辑"; + row.Cells["CommConfig"].Value = "通信组"; + row.Cells["Delete"].Value = "删除"; + } + + // 启用添加按钮 + btAddPLC.Enabled = true; + } + + private void HandleCommConfig(PLCConfig config) + { + using (var commForm = new CommunicationEditForm(config.PlcNum)) + { + if (commForm.ShowDialog() == DialogResult.OK) + { + // 如果需要刷新主窗体数据 + RefreshDataGridView(); + } + } + } + + + + private void HandleVariableConfig(PLCConfig config) + { + using (var commForm = new VariableEditForm(config.PlcNum)) + { + if (commForm.ShowDialog() == DialogResult.OK) + { + // 如果需要刷新主窗体数据 + RefreshDataGridView(); + } + } + } + + + + private void HandleDelete(int rowIndex, PLCConfig config) + { + if (MessageBox.Show($"确定要删除 PLC {config.PlcNum} 吗?", "确认删除", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + plcConfigs.RemoveAt(rowIndex); + SavePLCConfig(); + RefreshDataGridView(); + } + } + + + private bool ValidateRow(int rowIndex) + { + var row = dgvPlcConfigs.Rows[rowIndex]; + + // IP地址验证 + string ipAddress = row.Cells["IPAddress"].Value?.ToString(); + if (!IsValidIPAddress(ipAddress)) + { + MessageBox.Show("请输入有效的IP地址", "验证错误", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + + // 端口验证 + string port = row.Cells["Port"].Value?.ToString(); + if (!IsValidPort(port)) + { + MessageBox.Show("端口号必须在0-65535之间", "验证错误", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + + // PLC类型验证 + string plcType = row.Cells["PLCType"].Value?.ToString(); + if (string.IsNullOrWhiteSpace(plcType)) + { + MessageBox.Show("请选择PLC类型", "验证错误", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + + return true; + } + + private void SaveChanges(int rowIndex) + { + try + { + var row = dgvPlcConfigs.Rows[rowIndex]; + var config = plcConfigs[rowIndex]; + + // 更新配置对象 + config.PLCType = row.Cells["PLCType"].Value?.ToString() ?? ""; + config.IPAddress = row.Cells["IPAddress"].Value?.ToString() ?? ""; + config.Port = row.Cells["Port"].Value?.ToString() ?? ""; + config.HeartBeat = row.Cells["HeartBeat"].Value?.ToString() ?? ""; + config.IsHeartBeat = row.Cells["IsHeartBeat"].Value != null && + Convert.ToBoolean(row.Cells["IsHeartBeat"].Value); + config.IsActive = row.Cells["IsActive"].Value != null && + Convert.ToBoolean(row.Cells["IsActive"].Value); + config.Remark = row.Cells["Remark"].Value?.ToString() ?? ""; + + // 保存更改 + SavePLCConfig(); + MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + // 这里只显示错误信息,不再抛出异常 + MessageBox.Show($"保存失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + + private void DgvPlcConfigs_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) + { + if (e.RowIndex < 0 || !isEditing || e.RowIndex != editingRowIndex) return; + + string newValue = e.FormattedValue.ToString(); + var column = dgvPlcConfigs.Columns[e.ColumnIndex]; + + switch (column.Name) + { + case "IPAddress": + if (!IsValidIPAddress(newValue)) + { + e.Cancel = true; + dgvPlcConfigs.Rows[e.RowIndex].ErrorText = "请输入有效的IP地址"; + } + break; + + case "Port": + if (!IsValidPort(newValue)) + { + e.Cancel = true; + dgvPlcConfigs.Rows[e.RowIndex].ErrorText = "请输入有效的端口号(0-65535)"; + } + break; + } + } + + + private void DgvPlcConfigs_CellValueChanged(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) return; + dgvPlcConfigs.Rows[e.RowIndex].ErrorText = string.Empty; + } + + + private void DgvPlcConfigs_DataError(object sender, DataGridViewDataErrorEventArgs e) + { + e.ThrowException = false; + string columnName = dgvPlcConfigs.Columns[e.ColumnIndex].HeaderText; + MessageBox.Show($"'{columnName}'列的输入数据格式不正确", "数据错误", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + + /// + /// 验证IP地址 + /// + /// + /// + private bool IsValidIPAddress(string ip) + { + if (string.IsNullOrWhiteSpace(ip)) + return false; + + try + { + // 分割IP地址 + string[] parts = ip.Split('.'); + if (parts.Length != 4) + return false; + + // 验证每个部分 + foreach (string part in parts) + { + if (!int.TryParse(part, out int number)) + return false; + + if (number < 0 || number > 255) + return false; + } + + return true; + } + catch + { + return false; + } + } + + private bool IsValidPort(string port) + { + if (string.IsNullOrWhiteSpace(port)) + return false; + + return int.TryParse(port, out int portNum) && portNum >= 0 && portNum <= 65535; + } + + private void SavePLCConfig() + { + try + { + // 创建备份 + if (File.Exists(PlcConfigFilePath)) + { + string backupFile = $"{PlcConfigFilePath}.bak"; + File.Copy(PlcConfigFilePath, backupFile, true); + } + + // 直接保存到目标文件 + MiniExcel.SaveAs(PlcConfigFilePath, plcConfigs, overwriteFile: true); + } + catch (IOException ex) + { + MessageBox.Show($"保存文件时发生IO错误:{ex.Message}\n请确保文件未被其他程序占用。", + "保存错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw; + } + catch (UnauthorizedAccessException ex) + { + MessageBox.Show($"没有足够的权限保存文件:{ex.Message}\n请确保有写入权限。", + "权限错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw; + } + catch (Exception ex) + { + MessageBox.Show($"保存配置时发生错误:{ex.Message}", + "保存错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw; + } + } + + private void RefreshDataGridView() + { + dgvPlcConfigs.DataSource = null; + dgvPlcConfigs.DataSource = new BindingList(plcConfigs); + } + + + protected override void OnFormClosing(FormClosingEventArgs e) + { + base.OnFormClosing(e); + + if (isEditing) + { + var result = MessageBox.Show("当前有未保存的更改,是否保存?", "保存确认", + MessageBoxButtons.YesNoCancel, + MessageBoxIcon.Question); + + switch (result) + { + case DialogResult.Yes: + if (ValidateRow(editingRowIndex)) + { + SaveChanges(editingRowIndex); + EndEditing(); + } + else + { + e.Cancel = true; + } + break; + case DialogResult.Cancel: + e.Cancel = true; + break; + } + } + } + + /// + /// 添加PLC + /// + /// + /// + private void btAddPLC_Click(object sender, EventArgs e) + { + if (isEditing) + { + MessageBox.Show("请先完成当前编辑操作", "提示", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + var maxPlcNum = plcConfigs.Count > 0 ? plcConfigs.Max(p => p.PlcNum) : 0; + + var newConfig = new PLCConfig + { + PlcNum = maxPlcNum + 1, + PLCType = "", + IPAddress = "", + Port = "", + HeartBeat = "", + IsHeartBeat = false, + IsActive = false, + Remark = "" + }; + + plcConfigs.Add(newConfig); + RefreshDataGridView(); + + // 自动开始编辑新行 + int newRowIndex = dgvPlcConfigs.Rows.Count - 1; + HandleEdit(newRowIndex); + } + + + private void BtnSaveAll_Click(object sender, EventArgs e) + { + try + { + SavePLCConfig(); + MessageBox.Show("所有配置已保存", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show($"保存失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + + #region 系统相关配置 + private void tog_AutoLogin_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveAutoLogin(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改软件自动登录方式".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + + private void tog_AutoStart_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveAutoStart(((Toggle)sender).IsChecked)) + { + //写入注册表 + AutoStart(((Toggle)sender).IsChecked); + CommonMethods.AddOPLog(false, "修改软件自动启动方式".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + + private void tog_AutoLock_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveAutoLock(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改无操作自动锁屏方式".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + + private void tog_ConnectPrinter_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveConnectPrinter(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改是否连接打印机服务器标记".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetBtwConfig(); + } + } + + private void up_LockPeriod_ValueChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveLockPeriod(Convert.ToInt32(((UpDownLabel)sender).CurrentValue))) + { + CommonMethods.AddOPLog(false, "修改锁屏间隔时间".Translated() + ":" + ((UpDownLabel)sender).CurrentValue.ToString()); + CommonMethods.GetSysConfig(); + } + } + + + private void tog_AutoQieHuanM_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveAutoQieHuanM(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改无操作自动切换监控界面方式".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + + private void tog_IsDebugMod_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveIsDebug(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改调试模式".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + + + + private void up_QieHuanPeriod_ValueChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveQieHuanMPeriod(Convert.ToInt32(((UpDownLabel)sender).CurrentValue))) + { + CommonMethods.AddOPLog(false, "修改切换监控界面间隔时间".Translated() + ":" + ((UpDownLabel)sender).CurrentValue.ToString()); + CommonMethods.GetSysConfig(); + } + } + + + private void up_ShowSeriesCount_ValueChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveShowSeriesCount(Convert.ToInt32(((UpDownLabel)sender).CurrentValue))) + { + CommonMethods.AddOPLog(false, "修改曲线显示数量".Translated() + ":" + ((UpDownLabel)sender).CurrentValue.ToString()); + CommonMethods.GetSysConfig(); + } + } + + + private void tog_SwipeCardMode_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveSwipeCardMode(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改刷卡模式".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + if (CommonMethods.sysConfig.SwipeCardMode && CommonMethods.IsLoginOk) + { + DialogResult dialogResult1 = new FrmMsgBoxWithAck("当前已登录".Translated() + "," + "是否切换刷卡模式".Translated(), "提示".Translated()).ShowDialog(); + if (dialogResult1 == DialogResult.OK) + { + CommonMethods.AddOPLog(false, $"切换刷卡模式成功".Translated() + "," + "当前用户已注销".Translated()); + CommonMethods.IsLoginOk = false; + CommonMethods.sysConfig.SwipeCardMode = true; + this.tog_SwipeCardMode.IsChecked = CommonMethods.sysConfig.SwipeCardMode; + CommonMethods.SaveSwipeCardMode(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + //切屏 + CommonMethods.sysConfig.ScreenCutting = true; + } + else + { + CommonMethods.IsLoginOk = true; + CommonMethods.sysConfig.SwipeCardMode = false; + this.tog_SwipeCardMode.IsChecked = CommonMethods.sysConfig.SwipeCardMode; + CommonMethods.SaveSwipeCardMode(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + } + } + } + } + + + private void tog_OpenMesModel_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.plcDevices[0].IsConnected && CommonMethods.sysConfig.MesModeSwitching) + { + CommonMethods.sysConfig.MesModeSwitching = true; + this.tog_OpenMesModel.IsChecked = CommonMethods.sysConfig.MesModeSwitching; + CommonMethods.SaveOpenMesModel(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + new FrmMsgBoxOutWithAck(2, "先停止运行再切换MES".Translated(), "提示".Translated()).ShowDialog(); + return; + } + if (CommonMethods.plcDevices[0].IsConnected && !CommonMethods.sysConfig.MesModeSwitching) + { + CommonMethods.sysConfig.MesModeSwitching = false; + this.tog_OpenMesModel.IsChecked = CommonMethods.sysConfig.MesModeSwitching; + CommonMethods.SaveOpenMesModel(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + new FrmMsgBoxOutWithAck(2, "先停止运行再切换MES".Translated(), "提示".Translated()).ShowDialog(); + return; + } + if (CommonMethods.SaveOpenMesModel(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改MES/非MES模式切换".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + if (CommonMethods.sysConfig.MesModeSwitching) + { + FrmLoginMes frmLoginMes = new FrmLoginMes(); + if (frmLoginMes.ShowDialog() != DialogResult.OK) + { + CommonMethods.sysConfig.MesModeSwitching = false; + this.tog_OpenMesModel.IsChecked = CommonMethods.sysConfig.MesModeSwitching; + CommonMethods.SaveOpenMesModel(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + } + } + else + { + DialogResult dialogResult = new FrmMsgBoxWithAck("是否关闭MES模式".Translated(), "提示".Translated()).ShowDialog(); + if (dialogResult == DialogResult.OK) + { + CommonMethods.AddOPLog(false, "关闭MES模式成功".Translated() + "," + "MES用户已注销".Translated()); + CommonMethods.sysConfig.MesModeSwitching = false; + this.tog_OpenMesModel.IsChecked = CommonMethods.sysConfig.MesModeSwitching; + CommonMethods.SaveOpenMesModel(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + } + else + { + CommonMethods.sysConfig.MesModeSwitching = true; + this.tog_OpenMesModel.IsChecked = CommonMethods.sysConfig.MesModeSwitching; + CommonMethods.SaveOpenMesModel(((Toggle)sender).IsChecked); + CommonMethods.GetSysConfig(); + } + } + } + } + + private void tog_GetMesParam_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveGetMesParam(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改获取MES参数".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + + private void tog_SaveThreadTime_CheckedChanged(object sender, EventArgs e) + { + if (CommonMethods.SaveSaveThreadTime(((Toggle)sender).IsChecked)) + { + CommonMethods.AddOPLog(false, "修改线程耗时日志保存".Translated() + ":" + ((Toggle)sender).IsChecked.ToString()); + CommonMethods.GetSysConfig(); + } + } + /// + /// 修改程序在注册表的 键值 + /// + /// + private void AutoStart(bool isAuto = true) + { + if (isAuto == true) + { + RegistryKey R_local = Registry.CurrentUser; + RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\windows\CurrentVersion\Run"); + R_run.SetValue("KYJPro", System.Windows.Forms.Application.ExecutablePath); + R_run.Close(); + R_local.Close(); + } + else + { + RegistryKey R_local = Registry.CurrentUser; + RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\windows\CurrentVersion\Run"); + R_run.DeleteSubKey("KYJPro", false); + R_run.Close(); + R_local.Close(); + } + } + + #endregion + + private void btn_Sure_Click(object sender, EventArgs e) + { + + CommonMethods.Configxml["MES_CONFIG"]["SiteCode"] = this.txtFactory_code.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["LineCode"] = this.txtline_No.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["EquipNum"] = this.txtEqp_code.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["EmployeeAuthCheck"] = this.txtEmployeeAuthCheck.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["QueryCartonUrl"] = this.txtCartonInfo.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["DeviceParamRequest"] = this.txtDeviceParamRequest.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["DeviceParamChange"] = this.txtDeviceParamChange.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["QueryPalletUrl"] = this.txtPalletInfo.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["BindingUrl"] = this.txtBindingLabel.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["DeviceAlarm"] = this.txtDeviceAlarm.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["DeviceStatus"] = this.txtDeviceStatus.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["EnergyConsumption"] = this.txtEnergyConsumption.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["Anemometer"] = this.txtAnemometer.Text.Trim(); + CommonMethods.Configxml["MES_CONFIG"]["MaterialCode"] = this.txtBox_materialCode.Text.Trim(); + + string customerType = this.radio_O2.Checked ? "O2" : "other"; + CommonMethods.Configxml["MES_CONFIG"]["CustomerType"] = customerType; + + CommonMethods.Configxml["BTW_CONFIG"]["IsConnectPrinter"] = this.tog_ConnectPrinter.Text.Trim(); + CommonMethods.Configxml["BTW_CONFIG"]["ContainerBTWPath"] = this.txtBox_containerPath.Text.Trim(); + CommonMethods.Configxml["BTW_CONFIG"]["PalletBTWPath"] = this.txtBox_palletpath.Text.Trim(); + if (combox_printer.SelectedItem != null && combox_printer.SelectedItem.ToString() != "未检测到打印机") + { + string selectedPrinter = combox_printer.SelectedItem.ToString(); + CommonMethods.Configxml["BTW_CONFIG"]["PrinterName"] = selectedPrinter; + } + CommonMethods.WriteXmlFile(CommonMethods.Configxml, CommonMethods.xmlFilePath); + + CommonMethods.mesConfig = CommonMethods.GetMesConfig(); + + DialogResult dialogResult = new FrmMsgBoxOutWithAck(1, "参数修改成功", "参数设置").ShowDialog(); + } + + /// + /// 取消 + /// + /// + /// + private void btn_Cancel_Click(object sender, EventArgs e) + { + this.txtFactory_code.Text = CommonMethods.mesConfig.siteCode; + this.txtline_No.Text = CommonMethods.mesConfig.lineCode; + this.txtEqp_code.Text = CommonMethods.mesConfig.equipNum; + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + + + + + + + #endregion + + + + private void btnPlcConfig_Click(object sender, EventArgs e) + { + this.dgvPlcConfigs.Visible = true; + } + + private void btn_BrowseCatonBtw_Click(object sender, EventArgs e) + { + using (System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog()) + { + openFileDialog.Filter = "Bartender 模板文件 (*.btw)|*.btw"; + openFileDialog.Title = "请选择 .btw 格式的模板文件"; + openFileDialog.Multiselect = false; + openFileDialog.RestoreDirectory = true; + openFileDialog.CheckFileExists = true; + openFileDialog.CheckPathExists = true; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + string selectedBtwFilePath = openFileDialog.FileName; + this.txtBox_containerPath.Text = selectedBtwFilePath; + string fileNameOnly = openFileDialog.SafeFileName; + CommonMethods.Configxml["BTW_CONFIG"]["ContainerBTWPath"] = this.txtBox_containerPath.Text.Trim(); + CommonMethods.WriteXmlFile(CommonMethods.Configxml, CommonMethods.xmlFilePath); + } + } + } + + private void btn_BrowsePalletBtw_Click(object sender, EventArgs e) + { + using (System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog()) + { + openFileDialog.Filter = "Bartender 模板文件 (*.btw)|*.btw"; + openFileDialog.Title = "请选择 .btw 格式的模板文件"; + openFileDialog.Multiselect = false; + openFileDialog.RestoreDirectory = true; + openFileDialog.CheckFileExists = true; + openFileDialog.CheckPathExists = true; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + string selectedBtwFilePath = openFileDialog.FileName; + this.txtBox_palletpath.Text = selectedBtwFilePath; + string fileNameOnly = openFileDialog.SafeFileName; + CommonMethods.Configxml["BTW_CONFIG"]["PalletBTWPath"] = this.txtBox_palletpath.Text.Trim(); + CommonMethods.WriteXmlFile(CommonMethods.Configxml, CommonMethods.xmlFilePath); + } + } + } + + private void combox_printer_SelectedIndexChanged(object sender, EventArgs e) + { + if (combox_printer.SelectedItem != null && combox_printer.SelectedItem.ToString() != "未检测到打印机") + { + string selectedPrinter = combox_printer.SelectedItem.ToString(); + // 移除"(默认)"后缀(如果有),只保存原始打印机名称 + selectedPrinter = selectedPrinter.Replace(" (默认)", "").Trim(); + CommonMethods.btwConfig.printerName = selectedPrinter; + Console.WriteLine($"选中打印机:{selectedPrinter}"); + + // 保存到配置文件 + CommonMethods.Configxml["BTW_CONFIG"]["PrinterName"] = selectedPrinter; + CommonMethods.WriteXmlFile(CommonMethods.Configxml, CommonMethods.xmlFilePath); + } + } + + } +} diff --git a/LargeSquareOne/FrmParamSet.resx b/LargeSquareOne/FrmParamSet.resx new file mode 100644 index 0000000..6fa5cbd --- /dev/null +++ b/LargeSquareOne/FrmParamSet.resx @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAGgAAAAbCAYAAACQqsrOAAAABGdBTUEAALGPC/xhBQAABT9JREFUaEPt + mmtsFUUUx/8XKiDykkoQfCGiBAUUFp8khhgNMZrgB1AxRiMfQCXGGLVZaYyPSNIEAtVQE0uioOhVPhSM + FJ98KwKNpquxjVKVNgSJTWjBhnpauvM3Mzu3XuZOKyVt7W364ZczZ0/v5sz5d2dmdwYQoheM91zLe4Iw + GrTkJNsDsyB8H8KLjN/JYnRyZxcxdxa0dn4+se7UycLqE6cWFv/wexBGvw1z3hwIwmiCK0J3XAzhdghv + N34H16CdRAdpbKbdQabaFGe/Xc8gjIY5f1QQRkvP9QkqgPBNCB8xfhuXoE21428SbRplbcKo4+3PBmE0 + c5hesygIo2YrUElvhrgQwmIIU2jlTLSyCa0k/iKNzbQTNnt+P+hxx/3/gVQQRrutOPuDMCrIxHKSdXgY + wnIIR6NZjUeL+hEtpKFZEc3aWlr4JVo40nOPQY+nYAONHnW0OPoJuio7lpNsFnq+2Q3hFDQxhSZ+iiay + Gw6jSU303CMv8BRsIAmCMGq3884yN56TrOVqCL+A8AbjH+N6HFNMYJY1nMQf6jrPPfIGtygDyIQgjH61 + T89bnrhXoAkQ7oLwPuM3cCUalEKDoqGRiW0wthONXOq5R17hFmUASVtxvg/CaJQnniOQnkPegfA549er + m1HP06hXTGBiD2d8lfxdnuMWZYBYbcU5FYTRLE/c4Cb7EoRlEI5ArZqOOnUUtSRqFVGnEmva1LzrdjRf + cYsyAMwLwui0FWilJ95FdqIPQvgZhONQwzGI1EFEioaaLJJr+1GjRrkdzVfcovQzY4MwqrPilHviZ5FJ + 8hYID0B4pfGr1QeoVkygRRGHzLWjqFZT3E7mM25R+pn3rDg/WbHc+FnoBC+H8CCEd5iEq1QRqkhUKR+n + UaVucjuY77hF6UceteLo4W2OJ56DTvAJO7SNxD5VgH3qCPYpdsNet3NDAbco/cTsIIxarUCrPHEvOkG9 + ctsB4VMm4Uq1GJXqDCoVsVcRlXFi/2WN28F8xy1KPzAmCKMaK84OT7xbMklOhfBbCBcaf5cqwi5FQ4Um + ttbQhoqhNcy5RekHyqw4vwRhNN4T75bsRJdA+DWEE5FWKaTjPUgrGj62Nh1b1M9IqyGzeecWpY9ZbsWR + IIwWeOI94iZbBOEm096uCrEtbsS2mIbtGasy7Y/cjuYrblH6kBlBGLVYgdZ64v+Jm+wFEKYhXGH8rWox + tqoOlMdEuUrYqm3Gj4fEfOQWpY/Qn24OWXEqPPFzIidZCK+A8BsIrzX+lrgIZTGxRdHYs1BtKIvzfj5y + i9JHbLDiHAnCaJInfk7kJGu5F8JPIByD0jiF0ngPSmOiVNHYzbqdMGLzmca5xXWPBWG0YpgunrfbBx1B + GN3mFr03uMJk8zKE60x7Y1yIDXEjNsQ0bLTWMvmNE/o/ZZhcXnQL3ltcUbK5EMIPIbzb+CXxXJTEq7NJ + lXQ+OfW1P7+a9urx7+avq9VbtjuH6WKT3crOKXpvcEVx0Uet9N7QdE9syOAWZTCRk6yHZRBugXABhDdC + OB/CeXa39XoI50A4G0K9q6oXFlrUmXZXdob9AKsXHpdZoadBeKl9OdYfXS+BsBDCyRBOMu9hyaahfs8a + Z8/hjbVP9GiL/pKuV5z6xJH+EqIZYQ62JLh96BFy8JKTrAfd4bUQrofwdQhfsad89GmfF+zm3jMQPg3h + aghXQfi4Pab1EITLIXwAwvvt4uMeCO+C8E4IF0N4K4SLINSrQS28Fl0Lfo0VWQushdWiakG1mFpILWJG + PC1aRjAtlNuHHnGLMpj4B8KdgnJQ8bVpAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/LargeSquareOne/FrmRecipe.Designer.cs b/LargeSquareOne/FrmRecipe.Designer.cs new file mode 100644 index 0000000..01b4655 --- /dev/null +++ b/LargeSquareOne/FrmRecipe.Designer.cs @@ -0,0 +1,444 @@ +namespace LargeSquareOne +{ + partial class FrmRecipe + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.dgvProdModel = new System.Windows.Forms.DataGridView(); + this.ModelName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.MaterialCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.dgvPara = new System.Windows.Forms.DataGridView(); + this.CGName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ParaValueMin = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ParaValueMax = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Uint = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn48 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.txtMaterialCode = new System.Windows.Forms.TextBox(); + this.btnDelProductModel = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.txtProductModel = new System.Windows.Forms.TextBox(); + this.lb_curModel = new System.Windows.Forms.Label(); + this.btn_Save = new System.Windows.Forms.Button(); + this.lb_Model = new System.Windows.Forms.Label(); + this.btn_Add = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvProdModel)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPara)).BeginInit(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.Color.Transparent; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.dgvProdModel); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(1874, 818); + this.splitContainer1.SplitterDistance = 334; + this.splitContainer1.SplitterWidth = 1; + this.splitContainer1.TabIndex = 0; + // + // dgvProdModel + // + this.dgvProdModel.AllowUserToAddRows = false; + this.dgvProdModel.AllowUserToDeleteRows = false; + this.dgvProdModel.AllowUserToResizeRows = false; + this.dgvProdModel.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgvProdModel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.dgvProdModel.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvProdModel.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgvProdModel.ColumnHeadersHeight = 40; + this.dgvProdModel.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvProdModel.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.ModelName, + this.MaterialCode, + this.Column1}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvProdModel.DefaultCellStyle = dataGridViewCellStyle2; + this.dgvProdModel.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvProdModel.EnableHeadersVisualStyles = false; + this.dgvProdModel.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvProdModel.Location = new System.Drawing.Point(0, 0); + this.dgvProdModel.Name = "dgvProdModel"; + this.dgvProdModel.ReadOnly = true; + this.dgvProdModel.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvProdModel.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgvProdModel.RowHeadersWidth = 55; + this.dgvProdModel.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvProdModel.RowTemplate.Height = 40; + this.dgvProdModel.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvProdModel.Size = new System.Drawing.Size(334, 818); + this.dgvProdModel.TabIndex = 27; + this.dgvProdModel.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvProdModel_CellClick); + this.dgvProdModel.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvProdModel_RowPostPaint); + // + // ModelName + // + this.ModelName.DataPropertyName = "ModelName"; + this.ModelName.FillWeight = 136.0544F; + this.ModelName.HeaderText = "生产型号"; + this.ModelName.Name = "ModelName"; + this.ModelName.ReadOnly = true; + this.ModelName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // MaterialCode + // + this.MaterialCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.MaterialCode.DataPropertyName = "MaterialCode"; + this.MaterialCode.FillWeight = 63.94557F; + this.MaterialCode.HeaderText = "物料编码"; + this.MaterialCode.Name = "MaterialCode"; + this.MaterialCode.ReadOnly = true; + // + // Column1 + // + this.Column1.DataPropertyName = "Remark"; + this.Column1.HeaderText = "备注"; + this.Column1.Name = "Column1"; + this.Column1.ReadOnly = true; + this.Column1.Visible = false; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer2.IsSplitterFixed = true; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.dgvPara); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.txtMaterialCode); + this.splitContainer2.Panel2.Controls.Add(this.btnDelProductModel); + this.splitContainer2.Panel2.Controls.Add(this.label4); + this.splitContainer2.Panel2.Controls.Add(this.txtProductModel); + this.splitContainer2.Panel2.Controls.Add(this.lb_curModel); + this.splitContainer2.Panel2.Controls.Add(this.btn_Save); + this.splitContainer2.Panel2.Controls.Add(this.lb_Model); + this.splitContainer2.Panel2.Controls.Add(this.btn_Add); + this.splitContainer2.Panel2.Controls.Add(this.label2); + this.splitContainer2.Size = new System.Drawing.Size(1539, 818); + this.splitContainer2.SplitterDistance = 1258; + this.splitContainer2.SplitterWidth = 1; + this.splitContainer2.TabIndex = 0; + // + // dgvPara + // + this.dgvPara.AllowUserToAddRows = false; + this.dgvPara.AllowUserToDeleteRows = false; + this.dgvPara.AllowUserToResizeRows = false; + this.dgvPara.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgvPara.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.dgvPara.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle4.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle4.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(11)))), ((int)(((byte)(20)))), ((int)(((byte)(36))))); + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPara.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + this.dgvPara.ColumnHeadersHeight = 40; + this.dgvPara.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgvPara.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.CGName, + this.ParaValueMin, + this.ParaValueMax, + this.Uint, + this.dataGridViewTextBoxColumn48}); + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle5.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle5.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPara.DefaultCellStyle = dataGridViewCellStyle5; + this.dgvPara.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgvPara.EnableHeadersVisualStyles = false; + this.dgvPara.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgvPara.Location = new System.Drawing.Point(0, 0); + this.dgvPara.Name = "dgvPara"; + this.dgvPara.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle6.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle6.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgvPara.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.dgvPara.RowHeadersWidth = 55; + this.dgvPara.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgvPara.RowTemplate.Height = 40; + this.dgvPara.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dgvPara.Size = new System.Drawing.Size(1261, 818); + this.dgvPara.TabIndex = 26; + this.dgvPara.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvPara_RowPostPaint); + // + // CGName + // + this.CGName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.CGName.DataPropertyName = "Remark"; + this.CGName.HeaderText = "参数项名称"; + this.CGName.Name = "CGName"; + this.CGName.ReadOnly = true; + // + // ParaValueMin + // + this.ParaValueMin.DataPropertyName = "ParaValueMin"; + this.ParaValueMin.HeaderText = "最小值"; + this.ParaValueMin.Name = "ParaValueMin"; + this.ParaValueMin.Width = 120; + // + // ParaValueMax + // + this.ParaValueMax.DataPropertyName = "ParaValueMax"; + this.ParaValueMax.HeaderText = "最大值"; + this.ParaValueMax.Name = "ParaValueMax"; + this.ParaValueMax.Width = 120; + // + // Uint + // + this.Uint.DataPropertyName = "Uint"; + this.Uint.HeaderText = "单位"; + this.Uint.Name = "Uint"; + this.Uint.ReadOnly = true; + // + // dataGridViewTextBoxColumn48 + // + this.dataGridViewTextBoxColumn48.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.dataGridViewTextBoxColumn48.HeaderText = "备注"; + this.dataGridViewTextBoxColumn48.Name = "dataGridViewTextBoxColumn48"; + this.dataGridViewTextBoxColumn48.ReadOnly = true; + this.dataGridViewTextBoxColumn48.Visible = false; + // + // txtMaterialCode + // + this.txtMaterialCode.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtMaterialCode.Location = new System.Drawing.Point(24, 151); + this.txtMaterialCode.Name = "txtMaterialCode"; + this.txtMaterialCode.Size = new System.Drawing.Size(132, 24); + this.txtMaterialCode.TabIndex = 26; + // + // btnDelProductModel + // + this.btnDelProductModel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btnDelProductModel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDelProductModel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btnDelProductModel.ForeColor = System.Drawing.Color.White; + this.btnDelProductModel.Location = new System.Drawing.Point(146, 396); + this.btnDelProductModel.Name = "btnDelProductModel"; + this.btnDelProductModel.Size = new System.Drawing.Size(101, 36); + this.btnDelProductModel.TabIndex = 23; + this.btnDelProductModel.Text = "删除型号"; + this.btnDelProductModel.UseVisualStyleBackColor = false; + this.btnDelProductModel.Click += new System.EventHandler(this.btnDelProductModel_Click); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label4.ForeColor = System.Drawing.Color.White; + this.label4.Location = new System.Drawing.Point(19, 126); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(82, 16); + this.label4.TabIndex = 25; + this.label4.Text = "物料编码:"; + // + // txtProductModel + // + this.txtProductModel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.txtProductModel.Location = new System.Drawing.Point(23, 79); + this.txtProductModel.Name = "txtProductModel"; + this.txtProductModel.Size = new System.Drawing.Size(132, 24); + this.txtProductModel.TabIndex = 20; + // + // lb_curModel + // + this.lb_curModel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lb_curModel.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lb_curModel.ForeColor = System.Drawing.Color.White; + this.lb_curModel.Location = new System.Drawing.Point(24, 340); + this.lb_curModel.Name = "lb_curModel"; + this.lb_curModel.Size = new System.Drawing.Size(223, 30); + this.lb_curModel.TabIndex = 19; + this.lb_curModel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btn_Save + // + this.btn_Save.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Save.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Save.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_Save.ForeColor = System.Drawing.Color.White; + this.btn_Save.Location = new System.Drawing.Point(26, 396); + this.btn_Save.Name = "btn_Save"; + this.btn_Save.Size = new System.Drawing.Size(101, 36); + this.btn_Save.TabIndex = 22; + this.btn_Save.Text = "保存参数"; + this.btn_Save.UseVisualStyleBackColor = false; + this.btn_Save.Click += new System.EventHandler(this.btn_Save_Click); + // + // lb_Model + // + this.lb_Model.AutoSize = true; + this.lb_Model.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.lb_Model.ForeColor = System.Drawing.Color.White; + this.lb_Model.Location = new System.Drawing.Point(29, 314); + this.lb_Model.Name = "lb_Model"; + this.lb_Model.Size = new System.Drawing.Size(86, 21); + this.lb_Model.TabIndex = 17; + this.lb_Model.Text = "当前型号"; + // + // btn_Add + // + this.btn_Add.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Add.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Add.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.btn_Add.ForeColor = System.Drawing.Color.White; + this.btn_Add.Location = new System.Drawing.Point(21, 193); + this.btn_Add.Name = "btn_Add"; + this.btn_Add.Size = new System.Drawing.Size(226, 36); + this.btn_Add.TabIndex = 21; + this.btn_Add.Text = "添加型号"; + this.btn_Add.UseVisualStyleBackColor = false; + this.btn_Add.Click += new System.EventHandler(this.btn_Add_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(19, 56); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(82, 16); + this.label2.TabIndex = 18; + this.label2.Text = "生产型号:"; + // + // FrmRecipe + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.ClientSize = new System.Drawing.Size(1874, 818); + this.Controls.Add(this.splitContainer1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmRecipe"; + this.Text = "参数设置"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Load += new System.EventHandler(this.FrmRecipe_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvProdModel)).EndInit(); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvPara)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TextBox txtProductModel; + private System.Windows.Forms.Label lb_curModel; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lb_Model; + private System.Windows.Forms.Button btnDelProductModel; + private System.Windows.Forms.Button btn_Save; + private System.Windows.Forms.Button btn_Add; + private System.Windows.Forms.TextBox txtMaterialCode; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.DataGridView dgvProdModel; + private System.Windows.Forms.DataGridView dgvPara; + private System.Windows.Forms.DataGridViewTextBoxColumn CGName; + private System.Windows.Forms.DataGridViewTextBoxColumn ParaValueMin; + private System.Windows.Forms.DataGridViewTextBoxColumn ParaValueMax; + private System.Windows.Forms.DataGridViewTextBoxColumn Uint; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn48; + private System.Windows.Forms.DataGridViewTextBoxColumn ModelName; + private System.Windows.Forms.DataGridViewTextBoxColumn MaterialCode; + private System.Windows.Forms.DataGridViewTextBoxColumn Column1; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmRecipe.cs b/LargeSquareOne/FrmRecipe.cs new file mode 100644 index 0000000..d44f3ed --- /dev/null +++ b/LargeSquareOne/FrmRecipe.cs @@ -0,0 +1,273 @@ +using HML; +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using SqlSugar; +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 LargeSquareOne +{ + public partial class FrmRecipe : MultiLanguageForm + { + public FrmRecipe() + { + InitializeComponent(); + + ////设置控件样式,去除缓冲 + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.SetStyle(ControlStyles.Selectable, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + #endregion + + Dictionary disOldValue = new System.Collections.Generic.Dictionary(); + + /// + /// 定义DataGridView数据源 + /// + private BindingList blPLCConfigBaseList = new BindingList(); + + private void FrmRecipe_Load(object sender, EventArgs e) + { + this.dgvPara.AutoGenerateColumns = false; + this.dgvPara.DataSource = blPLCConfigBaseList; + GetProdModel(); + + GetProductParam(0); + } + + + + private void GetProdModel() + { + try + { + var productList = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetProdTypeSql()); + dgvProdModel.DataSource = productList; + //更新主界面下拉列表 + CommonMethods.DropDownItemList.Clear(); + for (int i = 0; i < productList.Count; i++) + { + CommonMethods.DropDownItemList.Add(new DropDownListPlusItem() { Text = productList[i].ModelName, Tag = productList[i].MaterialCode }); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + + #region 选择产品型号 + /// + /// 点击单元格 + /// + /// + /// + private void dgvProdModel_CellClick(object sender, DataGridViewCellEventArgs e) + { + int row = dgvProdModel.CurrentCell.RowIndex; + GetProductParam(row); + } + + + public void GetProductParam(int row) + { + try + { + if (dgvProdModel.Rows.Count > 0) + { + string strModelType = dgvProdModel.Rows[row].Cells["ModelName"].Value.ToString(); + lb_curModel.Text = strModelType; + var list = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetProductParaByProdModel(strModelType)); + disOldValue.Clear(); + for (int i = 0; i < list.Count; i++) + { + if (!disOldValue.ContainsKey(list[i].Remark)) + { + disOldValue.Add(list[i].Remark, $"{list[i].ParaValueMin},{list[i].ParaValueMax}"); + } + } + dgvPara.DataSource = list; + } + } + catch (Exception ex) + { + MessageBox.Show("加载数据失败" + ex.Message); + } + } + + #endregion + + /// + /// 添加数据 + /// + /// + /// + private void btn_Add_Click(object sender, EventArgs e) + { + var productModel = new ProductModel(); + productModel.ModelName = txtProductModel.Text; + productModel.MaterialCode = txtMaterialCode.Text; + productModel.Remark = txtProductModel.Text; + if (string.IsNullOrEmpty(productModel.ModelName)) + { + new FrmMsgBoxOutWithAck(2, "产品型号不能为空!".Translated(), "添加型号".Translated()).Show(); + return; + } + if (string.IsNullOrEmpty(productModel.MaterialCode)) + { + new FrmMsgBoxOutWithAck(2, "型号对应的物料编码不能为空!".Translated(), "添加型号".Translated()).Show(); + return; + } + try + { + bool b = CommonMethods.db.AddReturnBool(productModel); + if (b) + { + GetProdModel(); + CommonMethods.ChangeParamData(); + new FrmMsgBoxOutWithAck(1, "添加成功!".Translated(), "添加型号".Translated()).Show(); + } + else + { + new FrmMsgBoxOutWithAck(3, "添加失败!".Translated(), "添加型号".Translated()).Show(); + } + } + catch (Exception ex) + { + if (ex.Message.Contains("重复键")) + { + LogHelper.Instance.WriteEX(ex); + new FrmMsgBoxOutWithAck(3, "添加失败:已存在改型号,重复新增!".Translated(), "添加型号".Translated()).Show(); + } + else + { + LogHelper.Instance.WriteEX(ex); + new FrmMsgBoxOutWithAck(3, "添加失败:".Translated()+$"{ex.Message}", "添加型号".Translated()).Show(); + } + } + + //同步刷新主界面的类型选项 + //sendParamIN(); + } + + private void btn_Save_Click(object sender, EventArgs e) + { + if (dgvProdModel.Rows.Count > 0 && dgvProdModel.CurrentCell.RowIndex > -1) + { + int row = dgvProdModel.CurrentCell.RowIndex; + string strModelType = dgvProdModel.Rows[row].Cells["ModelName"].Value.ToString(); + if (string.IsNullOrEmpty(strModelType) || dgvPara.Rows.Count <= 0) + { + + new FrmMsgBoxOutWithAck(2, "产品型号和参数列表不能为空!".Translated(), "保存参数".Translated()).Show(); + return; + } + try + { + List list = (List)dgvPara.DataSource; + + int f = CommonMethods.db.Delete(t => t.ModelName == strModelType); + if (f >= 0) + { + bool b = CommonMethods.db.AddReturnBool(list); + if (b) + { + GetProdModel(); + CommonMethods.ChangeParamData(); + new FrmMsgBoxOutWithAck(1, "保存成功!".Translated(), "保存参数".Translated()).Show(); + } + else + { + new FrmMsgBoxOutWithAck(3, "保存失败!".Translated(), "保存参数".Translated()).Show(); + } + } + } + catch (Exception ex) + { + + new FrmMsgBoxOutWithAck(3, "保存失败".Translated(), "保存参数".Translated()).Show(); + + } + } + else + { + new FrmMsgBoxOutWithAck(1, "请选择产品型号".Translated(), "保存参数".Translated()).Show(); + } + } + + + private void btnDelProductModel_Click(object sender, EventArgs e) + { + if (dgvProdModel.Rows.Count > 0 && dgvProdModel.CurrentCell.RowIndex > -1) + { + int row = dgvProdModel.CurrentCell.RowIndex; + string strModelType = dgvProdModel.Rows[row].Cells["ModelName"].Value.ToString(); + if (string.IsNullOrEmpty(strModelType)) + { + + new FrmMsgBoxOutWithAck(2, "选择要删除的生产型号".Translated(), "删除型号".Translated()).Show(); + return; + } + DialogResult dialogResult = new FrmMsgBoxWithAck("是否要删除型号".Translated() + $"【{strModelType}】", "删除型号".Translated()).ShowDialog(); + if (dialogResult == DialogResult.OK) + { + try + { + int f = CommonMethods.db.Delete(t => t.ModelName == strModelType); + if (f > 0) + { + GetProdModel(); + CommonMethods.ChangeParamData(); + } + + new FrmMsgBoxOutWithAck(1, "删除成功".Translated(), "删除型号".Translated()).Show(); + + } + catch (Exception ex) + { + new FrmMsgBoxOutWithAck(1, "删除失败:".Translated()+$"{ex.Message}", "删除型号".Translated()).Show(); + + } + } + } + } + + private void dgvProdModel_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgvProdModel, e); + } + + private void dgvPara_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgvPara, e); + } + + + } +} diff --git a/LargeSquareOne/FrmRecipe.resx b/LargeSquareOne/FrmRecipe.resx new file mode 100644 index 0000000..3a8a01d --- /dev/null +++ b/LargeSquareOne/FrmRecipe.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/LargeSquareOne/FrmUserManage.Designer.cs b/LargeSquareOne/FrmUserManage.Designer.cs new file mode 100644 index 0000000..4af335a --- /dev/null +++ b/LargeSquareOne/FrmUserManage.Designer.cs @@ -0,0 +1,673 @@ +namespace LargeSquareOne +{ + partial class FrmUserManage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmUserManage)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + this.panelEnhanced1 = new JinYuan.ControlLib.PanelEnhanced(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.txtICCard = new System.Windows.Forms.TextBox(); + this.lblICCard = new System.Windows.Forms.Label(); + this.cmbUserLevel = new JinYuan.ControlLib.FlatComboBox(); + this.lblUserIssion = new System.Windows.Forms.Label(); + this.chk_SystemLog = new JinYuan.ControlLib.CheckBoxExt(); + this.longTitleStyle21 = new JinYuan.ControlLib.LongTitleStyle2(); + this.btn_Clear = new System.Windows.Forms.Button(); + this.longTitleStyle22 = new JinYuan.ControlLib.LongTitleStyle2(); + this.btn_Delete = new System.Windows.Forms.Button(); + this.btn_SelectAll = new System.Windows.Forms.Button(); + this.btn_Modify = new System.Windows.Forms.Button(); + this.txt_LoginName = new System.Windows.Forms.TextBox(); + this.btn_Add = new System.Windows.Forms.Button(); + this.lblUserInfo = new System.Windows.Forms.Label(); + this.longTitleStyle23 = new JinYuan.ControlLib.LongTitleStyle2(); + this.txt_LoginPwd = new System.Windows.Forms.TextBox(); + this.chk_CPK = new JinYuan.ControlLib.CheckBoxExt(); + this.lblUserPwd = new System.Windows.Forms.Label(); + this.chk_HistorySelect = new JinYuan.ControlLib.CheckBoxExt(); + this.txt_LoginPwd2 = new System.Windows.Forms.TextBox(); + this.chk_UserManage = new JinYuan.ControlLib.CheckBoxExt(); + this.lblPwd = new System.Windows.Forms.Label(); + this.chk_Paramset = new JinYuan.ControlLib.CheckBoxExt(); + this.chk_SystemSet = new JinYuan.ControlLib.CheckBoxExt(); + this.dgv_Main = new System.Windows.Forms.DataGridView(); + this.LoginName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.LoginPwd = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.LoginUid = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.LoginLevel = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.SystemLog = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CpkData = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.HistoryData = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ParamSet = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.SystemSet = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.UserManage = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.panelEnhanced1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).BeginInit(); + this.SuspendLayout(); + // + // panelEnhanced1 + // + this.panelEnhanced1.BackgroundImage = global::LargeSquareOne.Properties.Resources.BackGround; + this.panelEnhanced1.Controls.Add(this.splitContainer1); + this.panelEnhanced1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelEnhanced1.Location = new System.Drawing.Point(0, 0); + this.panelEnhanced1.Name = "panelEnhanced1"; + this.panelEnhanced1.Size = new System.Drawing.Size(1874, 818); + this.panelEnhanced1.TabIndex = 0; + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.Color.Transparent; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.splitContainer1.Panel1.Controls.Add(this.txtICCard); + this.splitContainer1.Panel1.Controls.Add(this.lblICCard); + this.splitContainer1.Panel1.Controls.Add(this.cmbUserLevel); + this.splitContainer1.Panel1.Controls.Add(this.lblUserIssion); + this.splitContainer1.Panel1.Controls.Add(this.chk_SystemLog); + this.splitContainer1.Panel1.Controls.Add(this.longTitleStyle21); + this.splitContainer1.Panel1.Controls.Add(this.btn_Clear); + this.splitContainer1.Panel1.Controls.Add(this.longTitleStyle22); + this.splitContainer1.Panel1.Controls.Add(this.btn_Delete); + this.splitContainer1.Panel1.Controls.Add(this.btn_SelectAll); + this.splitContainer1.Panel1.Controls.Add(this.btn_Modify); + this.splitContainer1.Panel1.Controls.Add(this.txt_LoginName); + this.splitContainer1.Panel1.Controls.Add(this.btn_Add); + this.splitContainer1.Panel1.Controls.Add(this.lblUserInfo); + this.splitContainer1.Panel1.Controls.Add(this.longTitleStyle23); + this.splitContainer1.Panel1.Controls.Add(this.txt_LoginPwd); + this.splitContainer1.Panel1.Controls.Add(this.chk_CPK); + this.splitContainer1.Panel1.Controls.Add(this.lblUserPwd); + this.splitContainer1.Panel1.Controls.Add(this.chk_HistorySelect); + this.splitContainer1.Panel1.Controls.Add(this.txt_LoginPwd2); + this.splitContainer1.Panel1.Controls.Add(this.chk_UserManage); + this.splitContainer1.Panel1.Controls.Add(this.lblPwd); + this.splitContainer1.Panel1.Controls.Add(this.chk_Paramset); + this.splitContainer1.Panel1.Controls.Add(this.chk_SystemSet); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.dgv_Main); + this.splitContainer1.Size = new System.Drawing.Size(1874, 818); + this.splitContainer1.SplitterDistance = 407; + this.splitContainer1.TabIndex = 49; + // + // txtICCard + // + this.txtICCard.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.txtICCard.Font = new System.Drawing.Font("微软雅黑", 15F); + this.txtICCard.ForeColor = System.Drawing.Color.White; + this.txtICCard.ImeMode = System.Windows.Forms.ImeMode.Off; + this.txtICCard.Location = new System.Drawing.Point(146, 168); + this.txtICCard.Name = "txtICCard"; + this.txtICCard.ShortcutsEnabled = false; + this.txtICCard.Size = new System.Drawing.Size(230, 34); + this.txtICCard.TabIndex = 52; + this.txtICCard.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtICCard_KeyDown); + this.txtICCard.KeyUp += new System.Windows.Forms.KeyEventHandler(this.txtICCard_KeyUp); + // + // lblICCard + // + this.lblICCard.AutoSize = true; + this.lblICCard.BackColor = System.Drawing.Color.Transparent; + this.lblICCard.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblICCard.ForeColor = System.Drawing.Color.White; + this.lblICCard.Location = new System.Drawing.Point(10, 180); + this.lblICCard.Name = "lblICCard"; + this.lblICCard.Size = new System.Drawing.Size(65, 16); + this.lblICCard.TabIndex = 51; + this.lblICCard.Text = "IC卡号:"; + // + // cmbUserLevel + // + this.cmbUserLevel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.cmbUserLevel.BorderColor = System.Drawing.Color.White; + this.cmbUserLevel.ButtonColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.cmbUserLevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbUserLevel.Font = new System.Drawing.Font("微软雅黑", 15F); + this.cmbUserLevel.ForeColor = System.Drawing.Color.White; + this.cmbUserLevel.FormattingEnabled = true; + this.cmbUserLevel.Items.AddRange(new object[] { + "操作员", + "工程师", + "管理员"}); + this.cmbUserLevel.Location = new System.Drawing.Point(146, 127); + this.cmbUserLevel.Name = "cmbUserLevel"; + this.cmbUserLevel.Size = new System.Drawing.Size(230, 35); + this.cmbUserLevel.TabIndex = 12; + this.cmbUserLevel.SelectedIndexChanged += new System.EventHandler(this.cmbUserLevel_SelectedIndexChanged); + // + // lblUserIssion + // + this.lblUserIssion.AutoSize = true; + this.lblUserIssion.BackColor = System.Drawing.Color.Transparent; + this.lblUserIssion.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblUserIssion.ForeColor = System.Drawing.Color.White; + this.lblUserIssion.Location = new System.Drawing.Point(10, 139); + this.lblUserIssion.Name = "lblUserIssion"; + this.lblUserIssion.Size = new System.Drawing.Size(82, 16); + this.lblUserIssion.TabIndex = 50; + this.lblUserIssion.Text = "用户权限:"; + // + // chk_SystemLog + // + this.chk_SystemLog.BackColor = System.Drawing.Color.Transparent; + this.chk_SystemLog.CheckBackColor = System.Drawing.Color.White; + this.chk_SystemLog.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_SystemLog.DefultCheckButtonWidth = 20; + this.chk_SystemLog.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chk_SystemLog.ForeColor = System.Drawing.Color.White; + this.chk_SystemLog.Location = new System.Drawing.Point(13, 390); + this.chk_SystemLog.Name = "chk_SystemLog"; + this.chk_SystemLog.Size = new System.Drawing.Size(147, 27); + this.chk_SystemLog.TabIndex = 49; + this.chk_SystemLog.Text = "日志报警"; + this.chk_SystemLog.UseVisualStyleBackColor = false; + // + // longTitleStyle21 + // + this.longTitleStyle21.BackColor = System.Drawing.Color.Transparent; + this.longTitleStyle21.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("longTitleStyle21.BackgroundImage"))); + this.longTitleStyle21.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.longTitleStyle21.Font = new System.Drawing.Font("Cambria", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.longTitleStyle21.Location = new System.Drawing.Point(23, 27); + this.longTitleStyle21.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); + this.longTitleStyle21.Name = "longTitleStyle21"; + this.longTitleStyle21.Size = new System.Drawing.Size(366, 40); + this.longTitleStyle21.TabIndex = 0; + this.longTitleStyle21.TitleName = "用户信息"; + // + // btn_Clear + // + this.btn_Clear.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.btn_Clear.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Clear.Font = new System.Drawing.Font("Cambria", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_Clear.ForeColor = System.Drawing.Color.White; + this.btn_Clear.Location = new System.Drawing.Point(238, 738); + this.btn_Clear.Name = "btn_Clear"; + this.btn_Clear.Size = new System.Drawing.Size(151, 51); + this.btn_Clear.TabIndex = 48; + this.btn_Clear.Text = "清空信息"; + this.btn_Clear.UseVisualStyleBackColor = false; + this.btn_Clear.Click += new System.EventHandler(this.btn_Clear_Click); + // + // longTitleStyle22 + // + this.longTitleStyle22.BackColor = System.Drawing.Color.Transparent; + this.longTitleStyle22.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("longTitleStyle22.BackgroundImage"))); + this.longTitleStyle22.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.longTitleStyle22.Font = new System.Drawing.Font("Cambria", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.longTitleStyle22.Location = new System.Drawing.Point(13, 338); + this.longTitleStyle22.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.longTitleStyle22.Name = "longTitleStyle22"; + this.longTitleStyle22.Size = new System.Drawing.Size(374, 40); + this.longTitleStyle22.TabIndex = 1; + this.longTitleStyle22.TitleName = "权限配置"; + // + // btn_Delete + // + this.btn_Delete.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.btn_Delete.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Delete.Font = new System.Drawing.Font("Cambria", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_Delete.ForeColor = System.Drawing.Color.White; + this.btn_Delete.Location = new System.Drawing.Point(22, 737); + this.btn_Delete.Name = "btn_Delete"; + this.btn_Delete.Size = new System.Drawing.Size(151, 51); + this.btn_Delete.TabIndex = 47; + this.btn_Delete.Text = "删除用户"; + this.btn_Delete.UseVisualStyleBackColor = false; + this.btn_Delete.Click += new System.EventHandler(this.btn_Delete_Click); + // + // btn_SelectAll + // + this.btn_SelectAll.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.btn_SelectAll.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_SelectAll.Font = new System.Drawing.Font("Cambria", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_SelectAll.ForeColor = System.Drawing.Color.White; + this.btn_SelectAll.Location = new System.Drawing.Point(183, 508); + this.btn_SelectAll.Name = "btn_SelectAll"; + this.btn_SelectAll.Size = new System.Drawing.Size(193, 36); + this.btn_SelectAll.TabIndex = 34; + this.btn_SelectAll.Text = "全选/不选"; + this.btn_SelectAll.UseVisualStyleBackColor = false; + this.btn_SelectAll.Click += new System.EventHandler(this.btn_SelectAll_Click); + // + // btn_Modify + // + this.btn_Modify.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.btn_Modify.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Modify.Font = new System.Drawing.Font("Cambria", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_Modify.ForeColor = System.Drawing.Color.White; + this.btn_Modify.Location = new System.Drawing.Point(238, 658); + this.btn_Modify.Name = "btn_Modify"; + this.btn_Modify.Size = new System.Drawing.Size(151, 51); + this.btn_Modify.TabIndex = 46; + this.btn_Modify.Text = "修改用户"; + this.btn_Modify.UseVisualStyleBackColor = false; + this.btn_Modify.Click += new System.EventHandler(this.btn_Modify_Click); + // + // txt_LoginName + // + this.txt_LoginName.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.txt_LoginName.Font = new System.Drawing.Font("微软雅黑", 15F); + this.txt_LoginName.ForeColor = System.Drawing.Color.White; + this.txt_LoginName.Location = new System.Drawing.Point(146, 87); + this.txt_LoginName.Name = "txt_LoginName"; + this.txt_LoginName.Size = new System.Drawing.Size(230, 34); + this.txt_LoginName.TabIndex = 33; + // + // btn_Add + // + this.btn_Add.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.btn_Add.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Add.Font = new System.Drawing.Font("Cambria", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_Add.ForeColor = System.Drawing.Color.White; + this.btn_Add.Location = new System.Drawing.Point(22, 657); + this.btn_Add.Name = "btn_Add"; + this.btn_Add.Size = new System.Drawing.Size(151, 51); + this.btn_Add.TabIndex = 45; + this.btn_Add.Text = "添加用户"; + this.btn_Add.UseVisualStyleBackColor = false; + this.btn_Add.Click += new System.EventHandler(this.btn_Add_Click); + // + // lblUserInfo + // + this.lblUserInfo.AutoSize = true; + this.lblUserInfo.BackColor = System.Drawing.Color.Transparent; + this.lblUserInfo.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblUserInfo.ForeColor = System.Drawing.Color.White; + this.lblUserInfo.Location = new System.Drawing.Point(10, 98); + this.lblUserInfo.Name = "lblUserInfo"; + this.lblUserInfo.Size = new System.Drawing.Size(82, 16); + this.lblUserInfo.TabIndex = 32; + this.lblUserInfo.Text = "用户信息:"; + // + // longTitleStyle23 + // + this.longTitleStyle23.BackColor = System.Drawing.Color.Transparent; + this.longTitleStyle23.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("longTitleStyle23.BackgroundImage"))); + this.longTitleStyle23.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.longTitleStyle23.Font = new System.Drawing.Font("Cambria", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.longTitleStyle23.Location = new System.Drawing.Point(15, 593); + this.longTitleStyle23.Margin = new System.Windows.Forms.Padding(5, 8, 5, 8); + this.longTitleStyle23.Name = "longTitleStyle23"; + this.longTitleStyle23.Size = new System.Drawing.Size(374, 40); + this.longTitleStyle23.TabIndex = 44; + this.longTitleStyle23.TitleName = "用户操作"; + // + // txt_LoginPwd + // + this.txt_LoginPwd.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.txt_LoginPwd.Font = new System.Drawing.Font("微软雅黑", 15F); + this.txt_LoginPwd.ForeColor = System.Drawing.Color.White; + this.txt_LoginPwd.Location = new System.Drawing.Point(146, 208); + this.txt_LoginPwd.Name = "txt_LoginPwd"; + this.txt_LoginPwd.Size = new System.Drawing.Size(230, 34); + this.txt_LoginPwd.TabIndex = 36; + // + // chk_CPK + // + this.chk_CPK.BackColor = System.Drawing.Color.Transparent; + this.chk_CPK.CheckBackColor = System.Drawing.Color.White; + this.chk_CPK.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_CPK.DefultCheckButtonWidth = 20; + this.chk_CPK.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chk_CPK.ForeColor = System.Drawing.Color.White; + this.chk_CPK.Location = new System.Drawing.Point(210, 455); + this.chk_CPK.Name = "chk_CPK"; + this.chk_CPK.Size = new System.Drawing.Size(147, 27); + this.chk_CPK.TabIndex = 43; + this.chk_CPK.Text = "CPK计算"; + this.chk_CPK.UseVisualStyleBackColor = false; + this.chk_CPK.Visible = false; + // + // lblUserPwd + // + this.lblUserPwd.AutoSize = true; + this.lblUserPwd.BackColor = System.Drawing.Color.Transparent; + this.lblUserPwd.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblUserPwd.ForeColor = System.Drawing.Color.White; + this.lblUserPwd.Location = new System.Drawing.Point(10, 221); + this.lblUserPwd.Name = "lblUserPwd"; + this.lblUserPwd.Size = new System.Drawing.Size(82, 16); + this.lblUserPwd.TabIndex = 35; + this.lblUserPwd.Text = "用户密码:"; + // + // chk_HistorySelect + // + this.chk_HistorySelect.BackColor = System.Drawing.Color.Transparent; + this.chk_HistorySelect.CheckBackColor = System.Drawing.Color.White; + this.chk_HistorySelect.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_HistorySelect.DefultCheckButtonWidth = 20; + this.chk_HistorySelect.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chk_HistorySelect.ForeColor = System.Drawing.Color.White; + this.chk_HistorySelect.Location = new System.Drawing.Point(13, 423); + this.chk_HistorySelect.Name = "chk_HistorySelect"; + this.chk_HistorySelect.Size = new System.Drawing.Size(147, 27); + this.chk_HistorySelect.TabIndex = 42; + this.chk_HistorySelect.Text = "数据追溯"; + this.chk_HistorySelect.UseVisualStyleBackColor = false; + // + // txt_LoginPwd2 + // + this.txt_LoginPwd2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.txt_LoginPwd2.Font = new System.Drawing.Font("微软雅黑", 15F); + this.txt_LoginPwd2.ForeColor = System.Drawing.Color.White; + this.txt_LoginPwd2.Location = new System.Drawing.Point(146, 248); + this.txt_LoginPwd2.Name = "txt_LoginPwd2"; + this.txt_LoginPwd2.Size = new System.Drawing.Size(230, 34); + this.txt_LoginPwd2.TabIndex = 38; + // + // chk_UserManage + // + this.chk_UserManage.BackColor = System.Drawing.Color.Transparent; + this.chk_UserManage.CheckBackColor = System.Drawing.Color.White; + this.chk_UserManage.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_UserManage.DefultCheckButtonWidth = 20; + this.chk_UserManage.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chk_UserManage.ForeColor = System.Drawing.Color.White; + this.chk_UserManage.Location = new System.Drawing.Point(211, 419); + this.chk_UserManage.Name = "chk_UserManage"; + this.chk_UserManage.Size = new System.Drawing.Size(147, 27); + this.chk_UserManage.TabIndex = 41; + this.chk_UserManage.Text = "用户管理"; + this.chk_UserManage.UseVisualStyleBackColor = false; + // + // lblPwd + // + this.lblPwd.AutoSize = true; + this.lblPwd.BackColor = System.Drawing.Color.Transparent; + this.lblPwd.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPwd.ForeColor = System.Drawing.Color.White; + this.lblPwd.Location = new System.Drawing.Point(10, 262); + this.lblPwd.Name = "lblPwd"; + this.lblPwd.Size = new System.Drawing.Size(82, 16); + this.lblPwd.TabIndex = 37; + this.lblPwd.Text = "确认密码:"; + // + // chk_Paramset + // + this.chk_Paramset.BackColor = System.Drawing.Color.Transparent; + this.chk_Paramset.CheckBackColor = System.Drawing.Color.White; + this.chk_Paramset.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_Paramset.DefultCheckButtonWidth = 20; + this.chk_Paramset.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chk_Paramset.ForeColor = System.Drawing.Color.White; + this.chk_Paramset.Location = new System.Drawing.Point(210, 386); + this.chk_Paramset.Name = "chk_Paramset"; + this.chk_Paramset.Size = new System.Drawing.Size(147, 27); + this.chk_Paramset.TabIndex = 40; + this.chk_Paramset.Text = "参数设置"; + this.chk_Paramset.UseVisualStyleBackColor = false; + // + // chk_SystemSet + // + this.chk_SystemSet.BackColor = System.Drawing.Color.Transparent; + this.chk_SystemSet.CheckBackColor = System.Drawing.Color.White; + this.chk_SystemSet.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_SystemSet.DefultCheckButtonWidth = 20; + this.chk_SystemSet.Font = new System.Drawing.Font("Cambria", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chk_SystemSet.ForeColor = System.Drawing.Color.White; + this.chk_SystemSet.Location = new System.Drawing.Point(13, 455); + this.chk_SystemSet.Name = "chk_SystemSet"; + this.chk_SystemSet.Size = new System.Drawing.Size(147, 27); + this.chk_SystemSet.TabIndex = 39; + this.chk_SystemSet.Text = "系统设置"; + this.chk_SystemSet.UseVisualStyleBackColor = false; + // + // dgv_Main + // + this.dgv_Main.AllowUserToAddRows = false; + this.dgv_Main.AllowUserToDeleteRows = false; + this.dgv_Main.AllowUserToResizeColumns = false; + this.dgv_Main.AllowUserToResizeRows = false; + this.dgv_Main.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgv_Main.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv_Main.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgv_Main.ColumnHeadersHeight = 45; + this.dgv_Main.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.LoginName, + this.LoginPwd, + this.LoginUid, + this.LoginLevel, + this.SystemLog, + this.CpkData, + this.HistoryData, + this.ParamSet, + this.SystemSet, + this.UserManage, + this.Column5}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Main.DefaultCellStyle = dataGridViewCellStyle2; + this.dgv_Main.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgv_Main.EnableHeadersVisualStyles = false; + this.dgv_Main.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_Main.Location = new System.Drawing.Point(0, 0); + this.dgv_Main.MultiSelect = false; + this.dgv_Main.Name = "dgv_Main"; + this.dgv_Main.ReadOnly = true; + this.dgv_Main.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 10.5F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(20)))), ((int)(((byte)(80))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgv_Main.RowHeadersWidth = 80; + this.dgv_Main.RowTemplate.Height = 40; + this.dgv_Main.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_Main.Size = new System.Drawing.Size(1463, 818); + this.dgv_Main.TabIndex = 10; + this.dgv_Main.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_Main_CellContentClick); + this.dgv_Main.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgv_Main_CellFormatting); + this.dgv_Main.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Main_RowPostPaint); + // + // LoginName + // + this.LoginName.DataPropertyName = "LoginName"; + this.LoginName.HeaderText = "用户名"; + this.LoginName.Name = "LoginName"; + this.LoginName.ReadOnly = true; + this.LoginName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.LoginName.Width = 200; + // + // LoginPwd + // + this.LoginPwd.DataPropertyName = "LoginPwd"; + this.LoginPwd.HeaderText = "用户密码"; + this.LoginPwd.Name = "LoginPwd"; + this.LoginPwd.ReadOnly = true; + this.LoginPwd.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.LoginPwd.Width = 200; + // + // LoginUid + // + this.LoginUid.DataPropertyName = "LoginUid"; + this.LoginUid.HeaderText = "IC卡号"; + this.LoginUid.Name = "LoginUid"; + this.LoginUid.ReadOnly = true; + // + // LoginLevel + // + this.LoginLevel.DataPropertyName = "LoginLevel"; + this.LoginLevel.HeaderText = "用户权限"; + this.LoginLevel.Name = "LoginLevel"; + this.LoginLevel.ReadOnly = true; + this.LoginLevel.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // SystemLog + // + this.SystemLog.DataPropertyName = "SystemLog"; + this.SystemLog.HeaderText = "日志报警"; + this.SystemLog.Name = "SystemLog"; + this.SystemLog.ReadOnly = true; + this.SystemLog.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // CpkData + // + this.CpkData.DataPropertyName = "CpkData"; + this.CpkData.HeaderText = "数据分析"; + this.CpkData.Name = "CpkData"; + this.CpkData.ReadOnly = true; + this.CpkData.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // HistoryData + // + this.HistoryData.DataPropertyName = "HistoryData"; + this.HistoryData.HeaderText = "数据追溯"; + this.HistoryData.Name = "HistoryData"; + this.HistoryData.ReadOnly = true; + this.HistoryData.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // ParamSet + // + this.ParamSet.DataPropertyName = "ParamSet"; + this.ParamSet.HeaderText = "参数设置"; + this.ParamSet.Name = "ParamSet"; + this.ParamSet.ReadOnly = true; + this.ParamSet.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // SystemSet + // + this.SystemSet.DataPropertyName = "SystemSet"; + this.SystemSet.HeaderText = "系统设置"; + this.SystemSet.Name = "SystemSet"; + this.SystemSet.ReadOnly = true; + this.SystemSet.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // UserManage + // + this.UserManage.DataPropertyName = "UserManage"; + this.UserManage.HeaderText = "用户管理"; + this.UserManage.Name = "UserManage"; + this.UserManage.ReadOnly = true; + this.UserManage.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // Column5 + // + this.Column5.DataPropertyName = "LoginId"; + this.Column5.HeaderText = "LoginId"; + this.Column5.Name = "Column5"; + this.Column5.ReadOnly = true; + this.Column5.Visible = false; + // + // FrmUserManage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1874, 818); + this.Controls.Add(this.panelEnhanced1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmUserManage"; + this.Text = "用户管理"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Load += new System.EventHandler(this.FrmUserManage_Load); + this.panelEnhanced1.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private JinYuan.ControlLib.PanelEnhanced panelEnhanced1; + private JinYuan.ControlLib.LongTitleStyle2 longTitleStyle22; + private JinYuan.ControlLib.LongTitleStyle2 longTitleStyle21; + private System.Windows.Forms.Label lblUserInfo; + private System.Windows.Forms.TextBox txt_LoginName; + private System.Windows.Forms.Button btn_SelectAll; + private JinYuan.ControlLib.CheckBoxExt chk_SystemSet; + private System.Windows.Forms.Label lblPwd; + private System.Windows.Forms.TextBox txt_LoginPwd2; + private System.Windows.Forms.Label lblUserPwd; + private System.Windows.Forms.TextBox txt_LoginPwd; + private JinYuan.ControlLib.CheckBoxExt chk_UserManage; + private JinYuan.ControlLib.CheckBoxExt chk_Paramset; + private JinYuan.ControlLib.CheckBoxExt chk_HistorySelect; + private System.Windows.Forms.Button btn_Clear; + private System.Windows.Forms.Button btn_Delete; + private System.Windows.Forms.Button btn_Modify; + private System.Windows.Forms.Button btn_Add; + private JinYuan.ControlLib.LongTitleStyle2 longTitleStyle23; + private JinYuan.ControlLib.CheckBoxExt chk_CPK; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.DataGridView dgv_Main; + private JinYuan.ControlLib.CheckBoxExt chk_SystemLog; + private System.Windows.Forms.Label lblUserIssion; + private JinYuan.ControlLib.FlatComboBox cmbUserLevel; + private System.Windows.Forms.TextBox txtICCard; + private System.Windows.Forms.Label lblICCard; + private System.Windows.Forms.DataGridViewTextBoxColumn LoginName; + private System.Windows.Forms.DataGridViewTextBoxColumn LoginPwd; + private System.Windows.Forms.DataGridViewTextBoxColumn LoginUid; + private System.Windows.Forms.DataGridViewTextBoxColumn LoginLevel; + private System.Windows.Forms.DataGridViewTextBoxColumn SystemLog; + private System.Windows.Forms.DataGridViewTextBoxColumn CpkData; + private System.Windows.Forms.DataGridViewTextBoxColumn HistoryData; + private System.Windows.Forms.DataGridViewTextBoxColumn ParamSet; + private System.Windows.Forms.DataGridViewTextBoxColumn SystemSet; + private System.Windows.Forms.DataGridViewTextBoxColumn UserManage; + private System.Windows.Forms.DataGridViewTextBoxColumn Column5; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmUserManage.cs b/LargeSquareOne/FrmUserManage.cs new file mode 100644 index 0000000..dd6c5e3 --- /dev/null +++ b/LargeSquareOne/FrmUserManage.cs @@ -0,0 +1,331 @@ +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmUserManage : MultiLanguageForm + { + public FrmUserManage() + { + InitializeComponent(); + this.dgv_Main.AutoGenerateColumns = false; + UpdateSysAdminList(); + if (sysAdmins.Count > 0) + { + UpdateSysAdminInfo(sysAdmins[0]); + } + } + + /// + /// 当前用户中所有的用户集合 + /// + private List sysAdmins = new List(); + /// + /// 更新用户集合 + /// + private void UpdateSysAdminList() + { + try + { + sysAdmins = CommonMethods.db.QueryDataTable(CommonMethods.dBSQL.GetSysAdminSql()).ToDataList(); + sysAdmins.ForEach(c => c.LoginPwd = StringSecurityHelper.DESDecrypt(c.LoginPwd)); + this.dgv_Main.DataSource = null; + this.dgv_Main.DataSource = sysAdmins; + + } + catch (Exception ex) + { + new FrmMsgBoxWithAck("查询失败:".Translated() + ex.Message, "用户查询失败".Translated()).ShowDialog(); + } + } + + private void UpdateSysAdminInfo(SysAdmin sysAdmin) + { + this.txt_LoginName.Text = sysAdmin.LoginName; + this.txtICCard.Text = sysAdmin.LoginUid; + this.txt_LoginPwd.Text = sysAdmin.LoginPwd; + this.txt_LoginPwd2.Text = sysAdmin.LoginPwd; + this.cmbUserLevel.Text = sysAdmin.LoginLevel.Translated(); + this.chk_SystemLog.Checked = sysAdmin.SystemLog; + this.chk_CPK.Checked = sysAdmin.CpkData; + this.chk_HistorySelect.Checked = sysAdmin.HistoryData; + this.chk_SystemSet.Checked = sysAdmin.SystemSet; + this.chk_Paramset.Checked = sysAdmin.ParamSet; + this.chk_UserManage.Checked = sysAdmin.UserManage; + } + + private void FrmUserManage_Load(object sender, EventArgs e) + { + } + + private void cmbUserLevel_SelectedIndexChanged(object sender, EventArgs e) + { + CommonMethods.mesConfig.userLevel = cmbUserLevel.Text.ToString(); + } + + private void dgv_Main_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex >= 0) + { + int i = this.dgv_Main.SelectedRows[0].Index; + UpdateSysAdminInfo(sysAdmins[this.dgv_Main.SelectedRows[0].Index]); + } + } + + private void dgv_Main_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + //显示序列号 + DataGridViewHelper.DgvRowPostPaint(this.dgv_Main, e); + } + + private void dgv_Main_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.RowIndex >= 0 && e.ColumnIndex > 2) + { + string value = this.dgv_Main.Rows[e.RowIndex].Cells[e.ColumnIndex].Value?.ToString(); + if (value == "True") + { + e.Value = "启用".Translated(); + } + else + { + e.Value = "禁用".Translated(); + } + } + } + + private void btn_Add_Click(object sender, EventArgs e) + { + //数据验证 + if (this.txt_LoginName.Text.Length == 0) + { + new FrmMsgBoxWithAck("用户名不能为空", "添加用户").ShowDialog(); + return; + } + if (this.txt_LoginPwd.Text.Length == 0) + { + new FrmMsgBoxWithAck("用户密码不能为空", "添加用户").ShowDialog(); + return; + } + if (this.txt_LoginPwd2.Text.Length == 0) + { + new FrmMsgBoxWithAck("确认密码不能为空", "添加用户").ShowDialog(); + return; + } + if (this.txt_LoginPwd.Text != this.txt_LoginPwd2.Text) + { + new FrmMsgBoxWithAck("两次输入密码不一致", "添加用户").ShowDialog(); + return; + } + if (sysAdmins.Where(c => c.LoginName == this.txt_LoginName.Text.Trim()).ToList().Count > 0) + { + new FrmMsgBoxWithAck("该用户名已经存在", "添加用户").ShowDialog(); + return; + } + //封装数据 + SysAdmin sysAdmin = new SysAdmin() + { + LoginName = this.txt_LoginName.Text.Trim(), + LoginPwd = StringSecurityHelper.DESEncrypt(this.txt_LoginPwd.Text.Trim()), + LoginUid = this.txtICCard.Text.Trim(), + LoginLevel = CommonMethods.mesConfig.userLevel, + SystemLog = this.chk_SystemLog.Checked, + CpkData = this.chk_CPK.Checked, + HistoryData = this.chk_HistorySelect.Checked, + ParamSet = this.chk_Paramset.Checked, + SystemSet = this.chk_SystemSet.Checked, + UserManage = this.chk_UserManage.Checked + }; + + //调用方法 + try + { + if (CommonMethods.db.AddReturnBool(sysAdmin)) + { + UpdateSysAdminList(); + } + else + { + new FrmMsgBoxWithAck("添加用户失败", "添加用户").ShowDialog(); + + } + } + catch (Exception ex) + { + new FrmMsgBoxWithAck("添加用户失败:" + ex.Message, "添加用户").ShowDialog(); + } + } + + private void btn_Modify_Click(object sender, EventArgs e) + { + //数据验证 + if (this.txt_LoginName.Text.Length == 0) + { + new FrmMsgBoxWithAck("用户名不能为空", "修改用户").ShowDialog(); + return; + } + if (this.txt_LoginPwd.Text.Length == 0) + { + new FrmMsgBoxWithAck("用户密码不能为空", "修改用户").ShowDialog(); + return; + } + if (this.txt_LoginPwd2.Text.Length == 0) + { + new FrmMsgBoxWithAck("确认密码不能为空", "修改用户").ShowDialog(); + return; + } + if (this.txt_LoginPwd.Text != this.txt_LoginPwd2.Text) + { + new FrmMsgBoxWithAck("两次输入密码不一致", "修改用户").ShowDialog(); + return; + } + //如果修改用户名就需要进行判断用户名是否存在 + //if (sysAdmins[this.dgv_Main.SelectedRows[0].Index].LoginName != this.txt_LoginName.Text) + //{ + // if (sysAdmins.Where(c => c.LoginName == this.txt_LoginName.Text.Trim()).ToList().Count > 0) + // { + // new FrmMsgBoxWithAck("该用户名已经存在", "修改用户").ShowDialog(); + // return; + // } + //} + + //封装数据 + SysAdmin sysAdmin = new SysAdmin() + { + LoginId = sysAdmins[this.dgv_Main.SelectedRows[0].Index].LoginId, + LoginName = this.txt_LoginName.Text.Trim(), + LoginPwd = StringSecurityHelper.DESEncrypt(this.txt_LoginPwd.Text.Trim()), + LoginUid = this.txtICCard.Text.Trim(), + LoginLevel = CommonMethods.mesConfig.userLevel, + SystemLog = this.chk_SystemLog.Checked, + CpkData = this.chk_CPK.Checked, + HistoryData = this.chk_HistorySelect.Checked, + SystemSet = this.chk_SystemSet.Checked, + ParamSet = this.chk_Paramset.Checked, + UserManage = this.chk_UserManage.Checked + }; + + //调用方法 + try + { + if (CommonMethods.db.Update(sysAdmin, it => it.LoginId == sysAdmin.LoginId) == 1) + { + UpdateSysAdminList(); + } + else + { + new FrmMsgBoxWithAck("修改用户失败", "修改用户").ShowDialog(); + } + } + catch (Exception ex) + { + new FrmMsgBoxWithAck("修改用户失败:" + ex.Message, "修改用户").ShowDialog(); + } + } + + + + private void btn_Delete_Click(object sender, EventArgs e) + { + int loginId = sysAdmins[this.dgv_Main.SelectedRows[0].Index].LoginId; + string loginName = sysAdmins[this.dgv_Main.SelectedRows[0].Index].LoginName; + try + { + if (new FrmMsgBoxWithAck($"是否删除{loginName}用户!", "删除提示").ShowDialog() == DialogResult.OK) + { + if (CommonMethods.db.Delete(it => it.LoginId == loginId) == 1) + { + UpdateSysAdminList(); + } + else + { + new FrmMsgBoxWithAck("删除用户失败", "修改用户").ShowDialog(); + } + } + } + catch (Exception ex) + { + + new FrmMsgBoxWithAck("删除用户失败:" + ex.Message, "修改用户").ShowDialog(); + } + } + + private void btn_Clear_Click(object sender, EventArgs e) + { + this.txt_LoginName.Clear(); + this.txtICCard.Clear(); + this.txt_LoginPwd.Clear(); + this.txt_LoginPwd2.Clear(); + SetChecked(false); + } + + private void btn_SelectAll_Click(object sender, EventArgs e) + { + SetChecked(!this.chk_SystemSet.Checked); + } + + private void SetChecked(bool value) + { + this.chk_SystemLog.Checked = value; + this.chk_CPK.Checked = value; + this.chk_HistorySelect.Checked = value; + this.chk_SystemSet.Checked = value; + this.chk_Paramset.Checked = value; + this.chk_UserManage.Checked = value; + } + + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams parss = base.CreateParams; + parss.ExStyle |= 0x02000000; + return parss; + } + } + + + + + #endregion + + private void txtICCard_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.V) + { + e.Handled = true; + } + } + + DateTime dt1; + DateTime dt2; + private void txtICCard_KeyUp(object sender, KeyEventArgs e) + { + string Item = txtICCard.Text.Trim(); + if (txtICCard.TextLength == 1) + { + dt1 = System.DateTime.Now; + } + if (txtICCard.TextLength == 2) + { + dt2 = System.DateTime.Now; + TimeSpan _ts = dt2.Subtract(dt1); + if (_ts.Milliseconds > 50) + { + new FrmMsgBoxWithAck("禁止手动输入,请使用厂牌扫描录入", "IC卡号").ShowDialog(); + txtICCard.Clear(); + } + } + } + + } +} diff --git a/LargeSquareOne/FrmUserManage.resx b/LargeSquareOne/FrmUserManage.resx new file mode 100644 index 0000000..f2f9956 --- /dev/null +++ b/LargeSquareOne/FrmUserManage.resx @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/LargeSquareOne/FrmVariableConfig.Designer.cs b/LargeSquareOne/FrmVariableConfig.Designer.cs new file mode 100644 index 0000000..a74965e --- /dev/null +++ b/LargeSquareOne/FrmVariableConfig.Designer.cs @@ -0,0 +1,643 @@ +namespace LargeSquareOne +{ + partial class FrmVariableConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + this.panelExt1 = new JinYuan.ControlLib.PanelExt(); + this.txt_Start = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.txt_VarAddress = new System.Windows.Forms.TextBox(); + this.num_Offset = new System.Windows.Forms.NumericUpDown(); + this.label9 = new System.Windows.Forms.Label(); + this.num_Scale = new System.Windows.Forms.NumericUpDown(); + this.label8 = new System.Windows.Forms.Label(); + this.chk_NegAlarm = new JinYuan.ControlLib.CheckBoxExt(); + this.chk_PosAlarm = new JinYuan.ControlLib.CheckBoxExt(); + this.cmb_DataType = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.dgv_Main = new System.Windows.Forms.DataGridView(); + this.VarName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Start = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OffsetOrLenght = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.DataType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Scale = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Offset = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PosAlarm = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.NegAlarm = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.GroupName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Remark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.btn_Modify = new System.Windows.Forms.Button(); + this.btn_Delete = new System.Windows.Forms.Button(); + this.btn_Add = new System.Windows.Forms.Button(); + this.txt_Remark = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.cmb_GroupName = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.num_OffsetOrLenght = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.txt_VarName = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.topPanel = new System.Windows.Forms.Panel(); + this.btn_Close = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.panelExt1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.num_Offset)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.num_Scale)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.num_OffsetOrLenght)).BeginInit(); + this.topPanel.SuspendLayout(); + this.SuspendLayout(); + // + // panelExt1 + // + this.panelExt1.BackColor = System.Drawing.Color.Transparent; + this.panelExt1.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(79)))), ((int)(((byte)(150))))); + this.panelExt1.BordeWidth = 2; + this.panelExt1.BottomGap = 0; + this.panelExt1.Controls.Add(this.txt_Start); + this.panelExt1.Controls.Add(this.label10); + this.panelExt1.Controls.Add(this.txt_VarAddress); + this.panelExt1.Controls.Add(this.num_Offset); + this.panelExt1.Controls.Add(this.label9); + this.panelExt1.Controls.Add(this.num_Scale); + this.panelExt1.Controls.Add(this.label8); + this.panelExt1.Controls.Add(this.chk_NegAlarm); + this.panelExt1.Controls.Add(this.chk_PosAlarm); + this.panelExt1.Controls.Add(this.cmb_DataType); + this.panelExt1.Controls.Add(this.label7); + this.panelExt1.Controls.Add(this.dgv_Main); + this.panelExt1.Controls.Add(this.btn_Modify); + this.panelExt1.Controls.Add(this.btn_Delete); + this.panelExt1.Controls.Add(this.btn_Add); + this.panelExt1.Controls.Add(this.txt_Remark); + this.panelExt1.Controls.Add(this.label6); + this.panelExt1.Controls.Add(this.cmb_GroupName); + this.panelExt1.Controls.Add(this.label5); + this.panelExt1.Controls.Add(this.num_OffsetOrLenght); + this.panelExt1.Controls.Add(this.label4); + this.panelExt1.Controls.Add(this.label3); + this.panelExt1.Controls.Add(this.txt_VarName); + this.panelExt1.Controls.Add(this.label2); + this.panelExt1.Controls.Add(this.topPanel); + this.panelExt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt1.LeftGap = 0; + this.panelExt1.Location = new System.Drawing.Point(0, 0); + this.panelExt1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.panelExt1.Name = "panelExt1"; + this.panelExt1.RightGap = 0; + this.panelExt1.Size = new System.Drawing.Size(1024, 636); + this.panelExt1.TabIndex = 0; + this.panelExt1.TopGap = 0; + // + // txt_Start + // + this.txt_Start.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txt_Start.Location = new System.Drawing.Point(721, 57); + this.txt_Start.Name = "txt_Start"; + this.txt_Start.Size = new System.Drawing.Size(87, 29); + this.txt_Start.TabIndex = 27; + this.txt_Start.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.ForeColor = System.Drawing.Color.White; + this.label10.Location = new System.Drawing.Point(458, 60); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(74, 21); + this.label10.TabIndex = 26; + this.label10.Text = "变量地址"; + // + // txt_VarAddress + // + this.txt_VarAddress.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txt_VarAddress.Location = new System.Drawing.Point(533, 57); + this.txt_VarAddress.Name = "txt_VarAddress"; + this.txt_VarAddress.Size = new System.Drawing.Size(94, 29); + this.txt_VarAddress.TabIndex = 25; + this.txt_VarAddress.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // num_Offset + // + this.num_Offset.DecimalPlaces = 1; + this.num_Offset.Location = new System.Drawing.Point(903, 102); + this.num_Offset.Name = "num_Offset"; + this.num_Offset.Size = new System.Drawing.Size(92, 29); + this.num_Offset.TabIndex = 23; + this.num_Offset.Value = new decimal(new int[] { + 10, + 0, + 0, + 65536}); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.ForeColor = System.Drawing.Color.White; + this.label9.Location = new System.Drawing.Point(840, 107); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(58, 21); + this.label9.TabIndex = 22; + this.label9.Text = "偏移量"; + // + // num_Scale + // + this.num_Scale.DecimalPlaces = 1; + this.num_Scale.Location = new System.Drawing.Point(722, 108); + this.num_Scale.Name = "num_Scale"; + this.num_Scale.Size = new System.Drawing.Size(86, 29); + this.num_Scale.TabIndex = 21; + this.num_Scale.Value = new decimal(new int[] { + 10, + 0, + 0, + 65536}); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.ForeColor = System.Drawing.Color.White; + this.label8.Location = new System.Drawing.Point(642, 113); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(74, 21); + this.label8.TabIndex = 20; + this.label8.Text = "线性系数"; + // + // chk_NegAlarm + // + this.chk_NegAlarm.CheckBackColor = System.Drawing.Color.White; + this.chk_NegAlarm.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_NegAlarm.DefultCheckButtonWidth = 20; + this.chk_NegAlarm.ForeColor = System.Drawing.Color.White; + this.chk_NegAlarm.Location = new System.Drawing.Point(367, 110); + this.chk_NegAlarm.Name = "chk_NegAlarm"; + this.chk_NegAlarm.Size = new System.Drawing.Size(120, 25); + this.chk_NegAlarm.TabIndex = 19; + this.chk_NegAlarm.Text = "下降沿报警"; + this.chk_NegAlarm.UseVisualStyleBackColor = true; + // + // chk_PosAlarm + // + this.chk_PosAlarm.CheckBackColor = System.Drawing.Color.White; + this.chk_PosAlarm.CheckColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(25)))), ((int)(((byte)(66))))); + this.chk_PosAlarm.DefultCheckButtonWidth = 20; + this.chk_PosAlarm.ForeColor = System.Drawing.Color.White; + this.chk_PosAlarm.Location = new System.Drawing.Point(241, 110); + this.chk_PosAlarm.Name = "chk_PosAlarm"; + this.chk_PosAlarm.Size = new System.Drawing.Size(120, 25); + this.chk_PosAlarm.TabIndex = 18; + this.chk_PosAlarm.Text = "上升沿报警"; + this.chk_PosAlarm.UseVisualStyleBackColor = true; + // + // cmb_DataType + // + this.cmb_DataType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmb_DataType.FormattingEnabled = true; + this.cmb_DataType.Location = new System.Drawing.Point(105, 107); + this.cmb_DataType.Name = "cmb_DataType"; + this.cmb_DataType.Size = new System.Drawing.Size(125, 29); + this.cmb_DataType.TabIndex = 17; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.ForeColor = System.Drawing.Color.White; + this.label7.Location = new System.Drawing.Point(8, 113); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(74, 21); + this.label7.TabIndex = 16; + this.label7.Text = "数据类型"; + // + // dgv_Main + // + this.dgv_Main.AllowUserToAddRows = false; + this.dgv_Main.AllowUserToDeleteRows = false; + this.dgv_Main.AllowUserToResizeRows = false; + this.dgv_Main.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.dgv_Main.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.dgv_Main.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dgv_Main.ColumnHeadersHeight = 45; + this.dgv_Main.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgv_Main.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.VarName, + this.Column1, + this.Start, + this.OffsetOrLenght, + this.DataType, + this.Scale, + this.Offset, + this.PosAlarm, + this.NegAlarm, + this.GroupName, + this.Remark}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Main.DefaultCellStyle = dataGridViewCellStyle2; + this.dgv_Main.EnableHeadersVisualStyles = false; + this.dgv_Main.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.dgv_Main.Location = new System.Drawing.Point(3, 217); + this.dgv_Main.Name = "dgv_Main"; + this.dgv_Main.ReadOnly = true; + this.dgv_Main.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_Main.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgv_Main.RowHeadersWidth = 45; + this.dgv_Main.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.dgv_Main.RowTemplate.Height = 40; + this.dgv_Main.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dgv_Main.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_Main.Size = new System.Drawing.Size(1018, 416); + this.dgv_Main.TabIndex = 15; + //this.dgv_Main.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_Main_CellClick); + this.dgv_Main.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgv_Main_CellFormatting); + this.dgv_Main.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgv_Main_RowPostPaint); + // + // VarName + // + this.VarName.DataPropertyName = "VarName"; + this.VarName.HeaderText = "变量名称"; + this.VarName.Name = "VarName"; + this.VarName.ReadOnly = true; + this.VarName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.VarName.Width = 130; + // + // Column1 + // + this.Column1.DataPropertyName = "VarAddress"; + this.Column1.HeaderText = "变量地址"; + this.Column1.Name = "Column1"; + this.Column1.ReadOnly = true; + // + // Start + // + this.Start.DataPropertyName = "Start"; + this.Start.HeaderText = "起始索引"; + this.Start.Name = "Start"; + this.Start.ReadOnly = true; + this.Start.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.Start.Width = 80; + // + // OffsetOrLenght + // + this.OffsetOrLenght.DataPropertyName = "OffsetOrLenght"; + this.OffsetOrLenght.HeaderText = "位偏移/长度"; + this.OffsetOrLenght.Name = "OffsetOrLenght"; + this.OffsetOrLenght.ReadOnly = true; + this.OffsetOrLenght.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.OffsetOrLenght.Width = 110; + // + // DataType + // + this.DataType.DataPropertyName = "DataType"; + this.DataType.HeaderText = "数据类型"; + this.DataType.Name = "DataType"; + this.DataType.ReadOnly = true; + this.DataType.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.DataType.Width = 80; + // + // Scale + // + this.Scale.DataPropertyName = "Scale"; + this.Scale.HeaderText = "线性系数"; + this.Scale.Name = "Scale"; + this.Scale.ReadOnly = true; + this.Scale.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.Scale.Width = 80; + // + // Offset + // + this.Offset.DataPropertyName = "Offset"; + this.Offset.HeaderText = "偏移量"; + this.Offset.Name = "Offset"; + this.Offset.ReadOnly = true; + this.Offset.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.Offset.Width = 80; + // + // PosAlarm + // + this.PosAlarm.DataPropertyName = "PosAlarm"; + this.PosAlarm.HeaderText = "上升沿"; + this.PosAlarm.Name = "PosAlarm"; + this.PosAlarm.ReadOnly = true; + this.PosAlarm.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.PosAlarm.Width = 80; + // + // NegAlarm + // + this.NegAlarm.DataPropertyName = "NegAlarm"; + this.NegAlarm.HeaderText = "下降沿"; + this.NegAlarm.Name = "NegAlarm"; + this.NegAlarm.ReadOnly = true; + this.NegAlarm.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.NegAlarm.Width = 80; + // + // GroupName + // + this.GroupName.DataPropertyName = "GroupName"; + this.GroupName.HeaderText = "通信组"; + this.GroupName.Name = "GroupName"; + this.GroupName.ReadOnly = true; + this.GroupName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // Remark + // + this.Remark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Remark.DataPropertyName = "Remark"; + this.Remark.HeaderText = "备注说明"; + this.Remark.Name = "Remark"; + this.Remark.ReadOnly = true; + this.Remark.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // btn_Modify + // + this.btn_Modify.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Modify.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Modify.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Modify.ForeColor = System.Drawing.Color.White; + this.btn_Modify.Location = new System.Drawing.Point(829, 154); + this.btn_Modify.Name = "btn_Modify"; + this.btn_Modify.Size = new System.Drawing.Size(86, 36); + this.btn_Modify.TabIndex = 14; + this.btn_Modify.Text = "修改变量"; + this.btn_Modify.UseVisualStyleBackColor = false; + this.btn_Modify.Click += new System.EventHandler(this.btn_Modify_Click); + // + // btn_Delete + // + this.btn_Delete.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Delete.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Delete.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Delete.ForeColor = System.Drawing.Color.White; + this.btn_Delete.Location = new System.Drawing.Point(693, 154); + this.btn_Delete.Name = "btn_Delete"; + this.btn_Delete.Size = new System.Drawing.Size(86, 36); + this.btn_Delete.TabIndex = 13; + this.btn_Delete.Text = "删除变量"; + this.btn_Delete.UseVisualStyleBackColor = false; + this.btn_Delete.Click += new System.EventHandler(this.btn_Delete_Click); + // + // btn_Add + // + this.btn_Add.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.btn_Add.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Add.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.btn_Add.ForeColor = System.Drawing.Color.White; + this.btn_Add.Location = new System.Drawing.Point(557, 154); + this.btn_Add.Name = "btn_Add"; + this.btn_Add.Size = new System.Drawing.Size(86, 36); + this.btn_Add.TabIndex = 12; + this.btn_Add.Text = "新增变量"; + this.btn_Add.UseVisualStyleBackColor = false; + this.btn_Add.Click += new System.EventHandler(this.btn_Add_Click); + // + // txt_Remark + // + this.txt_Remark.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txt_Remark.Location = new System.Drawing.Point(105, 158); + this.txt_Remark.Name = "txt_Remark"; + this.txt_Remark.Size = new System.Drawing.Size(405, 29); + this.txt_Remark.TabIndex = 11; + this.txt_Remark.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.ForeColor = System.Drawing.Color.White; + this.label6.Location = new System.Drawing.Point(8, 163); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(74, 21); + this.label6.TabIndex = 10; + this.label6.Text = "备注说明"; + // + // cmb_GroupName + // + this.cmb_GroupName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmb_GroupName.FormattingEnabled = true; + this.cmb_GroupName.Location = new System.Drawing.Point(105, 55); + this.cmb_GroupName.Name = "cmb_GroupName"; + this.cmb_GroupName.Size = new System.Drawing.Size(125, 29); + this.cmb_GroupName.TabIndex = 9; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.ForeColor = System.Drawing.Color.White; + this.label5.Location = new System.Drawing.Point(240, 59); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(74, 21); + this.label5.TabIndex = 8; + this.label5.Text = "变量名称"; + // + // num_OffsetOrLenght + // + this.num_OffsetOrLenght.Location = new System.Drawing.Point(931, 55); + this.num_OffsetOrLenght.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.num_OffsetOrLenght.Name = "num_OffsetOrLenght"; + this.num_OffsetOrLenght.Size = new System.Drawing.Size(64, 29); + this.num_OffsetOrLenght.TabIndex = 7; + this.num_OffsetOrLenght.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.ForeColor = System.Drawing.Color.White; + this.label4.Location = new System.Drawing.Point(828, 60); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(97, 21); + this.label4.TabIndex = 6; + this.label4.Text = "位偏移/长度"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(642, 61); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 21); + this.label3.TabIndex = 4; + this.label3.Text = "起始索引"; + // + // txt_VarName + // + this.txt_VarName.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txt_VarName.Location = new System.Drawing.Point(320, 56); + this.txt_VarName.Name = "txt_VarName"; + this.txt_VarName.Size = new System.Drawing.Size(134, 29); + this.txt_VarName.TabIndex = 3; + this.txt_VarName.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(8, 60); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(90, 21); + this.label2.TabIndex = 2; + this.label2.Text = "通信组名称"; + // + // topPanel + // + this.topPanel.Controls.Add(this.btn_Close); + this.topPanel.Controls.Add(this.label1); + this.topPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.topPanel.Location = new System.Drawing.Point(0, 0); + this.topPanel.Name = "topPanel"; + this.topPanel.Size = new System.Drawing.Size(1024, 49); + this.topPanel.TabIndex = 0; + this.topPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.topPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // btn_Close + // + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(29)))), ((int)(((byte)(84))))); + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(989, 7); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 1; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = true; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(15, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 21); + this.label1.TabIndex = 0; + this.label1.Text = "变量配置"; + // + // FrmVariableConfig + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(1024, 636); + this.Controls.Add(this.panelExt1); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("微软雅黑", 12F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.Name = "FrmVariableConfig"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmGroupConfig"; + this.panelExt1.ResumeLayout(false); + this.panelExt1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.num_Offset)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.num_Scale)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_Main)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.num_OffsetOrLenght)).EndInit(); + this.topPanel.ResumeLayout(false); + this.topPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private JinYuan.ControlLib.PanelExt panelExt1; + private System.Windows.Forms.Panel topPanel; + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txt_Remark; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox cmb_GroupName; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.NumericUpDown num_OffsetOrLenght; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txt_VarName; + private System.Windows.Forms.DataGridView dgv_Main; + private System.Windows.Forms.Button btn_Modify; + private System.Windows.Forms.Button btn_Delete; + private System.Windows.Forms.Button btn_Add; + private System.Windows.Forms.NumericUpDown num_Offset; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.NumericUpDown num_Scale; + private System.Windows.Forms.Label label8; + private JinYuan.ControlLib.CheckBoxExt chk_NegAlarm; + private JinYuan.ControlLib.CheckBoxExt chk_PosAlarm; + private System.Windows.Forms.ComboBox cmb_DataType; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox txt_VarAddress; + private System.Windows.Forms.TextBox txt_Start; + private System.Windows.Forms.DataGridViewTextBoxColumn VarName; + private System.Windows.Forms.DataGridViewTextBoxColumn Column1; + private System.Windows.Forms.DataGridViewTextBoxColumn Start; + private System.Windows.Forms.DataGridViewTextBoxColumn OffsetOrLenght; + private System.Windows.Forms.DataGridViewTextBoxColumn DataType; + private System.Windows.Forms.DataGridViewTextBoxColumn Scale; + private System.Windows.Forms.DataGridViewTextBoxColumn Offset; + private System.Windows.Forms.DataGridViewTextBoxColumn PosAlarm; + private System.Windows.Forms.DataGridViewTextBoxColumn NegAlarm; + private System.Windows.Forms.DataGridViewTextBoxColumn GroupName; + private System.Windows.Forms.DataGridViewTextBoxColumn Remark; + } +} \ No newline at end of file diff --git a/LargeSquareOne/FrmVariableConfig.cs b/LargeSquareOne/FrmVariableConfig.cs new file mode 100644 index 0000000..4b6f8a1 --- /dev/null +++ b/LargeSquareOne/FrmVariableConfig.cs @@ -0,0 +1,381 @@ + + +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using MiniExcelLibs; +using PLC; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class FrmVariableConfig : MultiLanguageForm + { + public FrmVariableConfig() + { + InitializeComponent(); + + this.cmb_DataType.DataSource = Enum.GetNames(typeof(DataType)); + + this.dgv_Main.AutoGenerateColumns = false; + + List TotalGroups = GetALLGroups(); + + TotalVariables = GetALLVariables(); + + this.cmb_GroupName.SelectedIndexChanged += Cmb_GroupName_SelectedIndexChanged; + + if (TotalGroups.Count > 0) + { + + foreach (var item in TotalGroups) + { + this.cmb_GroupName.Items.Add(item.GroupName); + } + this.cmb_GroupName.SelectedIndex = 0; + } + } + + private void Cmb_GroupName_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshVariable(); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + + private string groupPath = CommonMethods.groupConfigPath;// Application.StartupPath + $"\\Config\\Group_{CommonMethods.sysConfig.StationNo}.xlsx"; + + private string variablePath = CommonMethods.variableConfigPath;// Application.StartupPath + $"\\Config\\Variable_{CommonMethods.sysConfig.StationNo}.xlsx"; + + /// + /// 总变量地址 + /// + private List TotalVariables = new List(); + + /// + /// 单一通信组地址 + /// + private List SignelVariables = new List(); + + /// + /// 获取所有通信组 + /// + /// + private List GetALLGroups() + { + try + { + return MiniExcel.Query(groupPath).ToList(); + } + catch (Exception) + { + + return new List(); + } + + } + + /// + /// 获取所有变量 + /// + /// + private List GetALLVariables() + { + try + { + return MiniExcel.Query(variablePath).ToList(); + } + catch (Exception) + { + + return new List(); + } + + } + + #region 根据通信组名称筛选 + private List GetVariablesByGroupName(string groupName) + { + if (groupName.Length == 0) + { + return TotalVariables; + } + else + { + return TotalVariables.FindAll(x => x.GroupName == groupName).ToList(); + } + } + #endregion + + /// + /// 更新变量集合 + /// + private void RefreshVariable() + { + var list = GetVariablesByGroupName(this.cmb_GroupName.Text.Trim()); + this.dgv_Main.DataSource = null; + if (list != null && list.Count > 0) + { + SignelVariables = list; + this.dgv_Main.DataSource = list; + } + } + + /// + /// 判断变量名称是否存在 + /// + /// + /// + private bool IsVariableNameExits(string variableName) + { + return TotalVariables.FindAll(c => c.VarName == variableName).ToList().Count < 0; + } + + #region 增删改通信组 + /// + /// 增加 + /// + /// + /// + private void btn_Add_Click(object sender, EventArgs e) + { + string varName = this.txt_VarName.Text.Trim(); + if (varName.Length == 0) + { + new FrmMsgBoxOutWithAck(2, "变量名称不能为空!", "添加变量").Show(); + return; + } + + if (IsVariableNameExits(varName)) + { + new FrmMsgBoxOutWithAck(2, "变量名称已存在!", "添加变量").Show(); + return; + } + + TotalVariables.Add(new Variable() + { + VarName = varName, + VarAddress = this.txt_VarAddress.Text, + Start = this.txt_Start.Text.Trim(), + OffsetOrLenght = Convert.ToUInt16(this.num_OffsetOrLenght.Value), + DataType = this.cmb_DataType.Text.Trim(), + GroupName = this.cmb_GroupName.Text.Trim(), + PosAlarm = this.chk_PosAlarm.Checked, + NegAlarm = this.chk_NegAlarm.Checked, + Scale = Convert.ToSingle(this.num_Scale.Value), + Offset = Convert.ToSingle(this.num_Offset.Value), + Remark = this.txt_Remark.Text.Trim() + }); + + try + { + MiniExcel.SaveAs(variablePath, TotalVariables, overwriteFile: true); + + //刷新数据 + RefreshVariable(); + } + catch (Exception ex) + { + new FrmMsgBoxOutWithAck(3, "添加变量失败:" + ex.Message, "添加变量").Show(); + } + + } + + /// + /// 删除 + /// + /// + /// + private void btn_Delete_Click(object sender, EventArgs e) + { + string varName = this.txt_VarName.Text.Trim(); + + if (varName.Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请选择需要删除的变量!", "删除变量").Show(); + return; + } + if (IsVariableNameExits(varName)) + { + new FrmMsgBoxOutWithAck(2, "变量名称不存在!", "变量信组").Show(); + return; + } + + TotalVariables.RemoveAll(c => c.VarName == varName); + try + { + MiniExcel.SaveAs(variablePath, TotalVariables, overwriteFile: true); + + //刷新数据 + RefreshVariable(); + } + catch (Exception ex) + { + + new FrmMsgBoxOutWithAck(3, "删除变量失败:" + ex.Message, "删除变量").Show(); + } + } + + /// + /// 修改 + /// + /// + /// + private void btn_Modify_Click(object sender, EventArgs e) + { + string varName = this.txt_VarName.Text.Trim(); + if (varName.Length == 0) + { + new FrmMsgBoxOutWithAck(2, "请选择需要修改的变量!", "修改变量").Show(); + return; + } + + if (IsVariableNameExits(varName)) + { + new FrmMsgBoxOutWithAck(2, "变量名称已存在!", "修改变量").Show(); + return; + } + + var variable = TotalVariables.Find(c => c.VarName == varName); + + variable.VarAddress = this.txt_VarAddress.Text.Trim(); + variable.Start = this.txt_Start.Text.Trim(); + variable.OffsetOrLenght = Convert.ToUInt16(this.num_OffsetOrLenght.Value); + variable.DataType = this.cmb_DataType.Text.Trim(); + variable.GroupName = this.cmb_GroupName.Text.Trim(); + variable.PosAlarm = this.chk_PosAlarm.Checked; + variable.NegAlarm = this.chk_NegAlarm.Checked; + variable.Scale = Convert.ToSingle(this.num_Scale.Value); + variable.Offset = Convert.ToSingle(this.num_Offset.Value); + variable.Remark = this.txt_Remark.Text.Trim(); + + + try + { + MiniExcel.SaveAs(variablePath, TotalVariables, overwriteFile: true); + + //刷新数据 + RefreshVariable(); + } + catch (Exception ex) + { + + new FrmMsgBoxOutWithAck(3, "修改变量失败:" + ex.Message, "修改变量").Show(); + } + + } + + #endregion + + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + + + /// + /// 行号 + /// + /// + /// + private void dgv_Main_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + DataGridViewHelper.DgvRowPostPaint((DataGridView)sender, e); + } + + + /// + /// 默认为空显示特定字符 + /// + /// + /// + private void dgv_Main_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.ColumnIndex >= 0 && e.RowIndex >= 0) + { + object value = this.dgv_Main.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; + + if (e.ColumnIndex == 6 || e.ColumnIndex == 7) + { + if (value != null) + { + e.Value = value.ToString() == "True" ? "启用".Translated() : "禁用".Translated(); + } + } + + if (value == null || value.ToString().Length == 0) + { + e.Value = "---"; + } + } + } + + + /// + /// 选中行显示 + /// + /// + /// + private void dgv_Main_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex >= 0) + { + + int index = e.RowIndex; + UpdateVariable(SignelVariables[e.RowIndex]); //Variable variable + + } + } + + private void UpdateVariable(Variable variable) + { + if (variable != null) + { + this.cmb_GroupName.Text = variable.GroupName; + this.txt_VarName.Text = variable.VarName; + this.txt_VarAddress.Text = variable.VarAddress; + this.txt_Start.Text = variable.Start; + this.num_OffsetOrLenght.Value = variable.OffsetOrLenght; + this.cmb_DataType.Text = variable.DataType; + this.chk_NegAlarm.Checked = variable.NegAlarm; + this.chk_PosAlarm.Checked = variable.PosAlarm; + this.num_Scale.Value = Convert.ToDecimal(variable.Scale); + this.num_Offset.Value = Convert.ToDecimal(variable.Offset); + this.txt_Remark.Text = variable.Remark; + } + } + } +} diff --git a/LargeSquareOne/FrmVariableConfig.resx b/LargeSquareOne/FrmVariableConfig.resx new file mode 100644 index 0000000..af1b76e --- /dev/null +++ b/LargeSquareOne/FrmVariableConfig.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/LargeSquareOne/LargeSquareOne.csproj b/LargeSquareOne/LargeSquareOne.csproj new file mode 100644 index 0000000..e9cf5c0 --- /dev/null +++ b/LargeSquareOne/LargeSquareOne.csproj @@ -0,0 +1,584 @@ + + + + + Debug + AnyCPU + {29E1F0D0-43DC-4077-A136-F25477E56881} + WinExe + LargeSquareOne + LargeSquareOne + v4.8 + 512 + 10.0 + true + true + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + x64 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + LargeSquareOne.Program + + + 电池.ico + + + + ..\packages\AntdUI.1.8.4\lib\net48\AntdUI.dll + + + ..\packages\Portable.BouncyCastle.1.9.0\lib\net40\BouncyCastle.Crypto.dll + + + ..\packages\BouncyCastle.Cryptography.2.3.1\lib\net461\BouncyCastle.Cryptography.dll + + + ..\packages\CsvHelper.33.0.1\lib\net48\CsvHelper.dll + + + ..\packages\Google.Protobuf.3.26.1\lib\net45\Google.Protobuf.dll + + + False + Lib\HML.dll + + + False + Lib\HML.ComplexityPropertys.dll + + + ..\packages\K4os.Compression.LZ4.1.3.8\lib\net462\K4os.Compression.LZ4.dll + + + ..\packages\K4os.Compression.LZ4.Streams.1.3.8\lib\net462\K4os.Compression.LZ4.Streams.dll + + + ..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll + + + ..\packages\MathNet.Numerics.5.0.0\lib\net48\MathNet.Numerics.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + + ..\packages\MiniExcel.1.36.1\lib\net45\MiniExcel.dll + + + ..\packages\MySql.Data.9.1.0\lib\net48\MySql.Data.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + False + Lib\PLCCommunication.dll + + + + + ..\packages\SeeSharpTools.JY.GUI.1.4.4.533\lib\net40\SeeSharpTools.JY.GUI.dll + + + ..\packages\SqlSugar.5.1.4.175\lib\SqlSugar.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + ..\packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll + + + + + + ..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll + + + + ..\packages\System.IO.Pipelines.7.0.0\lib\net462\System.IO.Pipelines.dll + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + ..\packages\System.Security.AccessControl.6.0.0\lib\net461\System.Security.AccessControl.dll + + + ..\packages\System.Security.Permissions.7.0.0\lib\net462\System.Security.Permissions.dll + + + ..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll + + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + ..\packages\ZstdSharp.Port.0.8.0\lib\net462\ZstdSharp.dll + + + + + Form + + + CustomMessageBox.cs + + + Form + + + FrmCpkCount.cs + + + Form + + + FrmAlarmLog.cs + + + Form + + + FrmDataMonitor.cs + + + Form + + + CommunicationEditForm.cs + + + Form + + + FrmHelper.cs + + + Form + + + FrmLogin.cs + + + Form + + + FrmLoginMes.cs + + + Form + + + FrmMesParamMsgBoxWithAck.cs + + + Form + + + FrmMain.cs + + + Form + + + VariableEditForm.cs + + + Form + + + FrmVariableConfig.cs + + + Form + + + FrmGroupConfig.cs + + + Form + + + FrmMsgBoxOutWithAck.cs + + + Form + + + FrmMsgBoxWithAck.cs + + + Form + + + FrmUserManage.cs + + + Form + + + FrmHistory.cs + + + Form + + + FrmRecipe.cs + + + Form + + + FrmParamSet.cs + + + Form + + + FrmMonitor.cs + + + + + True + True + Resources.resx + + + Form + + + ShutdownProgressForm.cs + + + UserControl + + + trw.cs + + + + + CustomMessageBox.cs + + + FrmCpkCount.cs + + + FrmAlarmLog.cs + + + FrmDataMonitor.cs + Designer + + + CommunicationEditForm.cs + + + FrmHelper.cs + + + FrmLogin.cs + + + FrmLoginMes.cs + + + FrmMesParamMsgBoxWithAck.cs + + + FrmMain.cs + Designer + + + VariableEditForm.cs + + + FrmVariableConfig.cs + + + FrmGroupConfig.cs + + + FrmMsgBoxOutWithAck.cs + + + FrmMsgBoxWithAck.cs + + + FrmUserManage.cs + + + FrmHistory.cs + + + FrmRecipe.cs + Designer + + + FrmParamSet.cs + + + FrmMonitor.cs + Designer + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + ShutdownProgressForm.cs + + + trw.cs + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Always + + + + + + + + {1d0fa5a4-07f0-4621-b6bb-683aec91e658} + JinYuan.ControlCenters + + + {1bb7ed33-d2cb-4cdd-ab39-f7f9ae948ca2} + JinYuan.ControlLib + + + {114aa012-29c9-418c-a2d6-3173c5341f51} + JinYuan.DAL + + + {258d0ab7-2b4f-4d8f-a3cd-7a8cb4a85360} + JinYuan.Helper + + + {530B6426-08E7-461C-91DC-787F876620FC} + JinYuan.MES + + + {4c0bcb84-5cd7-4846-8363-c4c10d46e391} + JinYuan.Models + + + {2ab7e380-7795-448a-933c-0f6a081b5e7e} + JinYuan.VirtualDataLibrary + + + {292a5c9c-7a82-4d25-a885-ddcedc93f03c} + Language + + + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7} + PLC + + + + + Always + + + Always + + + Always + + + Always + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.7.2 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/LargeSquareOne/Lib/HML.ComplexityPropertys.dll b/LargeSquareOne/Lib/HML.ComplexityPropertys.dll new file mode 100644 index 0000000..93081a9 Binary files /dev/null and b/LargeSquareOne/Lib/HML.ComplexityPropertys.dll differ diff --git a/LargeSquareOne/Lib/HML.ComplexityPropertys.xml b/LargeSquareOne/Lib/HML.ComplexityPropertys.xml new file mode 100644 index 0000000..2c0b304 --- /dev/null +++ b/LargeSquareOne/Lib/HML.ComplexityPropertys.xml @@ -0,0 +1,732 @@ + + + + HML.ComplexityPropertys + + + + + 上下内边距 + + + + + 全部 + + + + + 上边内边距 + + + + + 下边内边距 + + + + + + + 全部边距 + + + + + + 上边内边距 + 下边内边距 + + + + 判断两个边距对象设置是否一样 + + + + + + + + 判断两个边距对象设置是否不一样 + + + + + + + + 获取该对象的哈希值(参考源码) + + + + + + 判断是否和该对象的引用是一样 + + + + + + + 把该对象转换成字符串 + + + + + + 计算哈希值(参考源码) + + + + + + + + 是否应该使用All设置初始化对象 + + + + + + 上下内边距转换器 + + + + + 字符串转对象 + + + + + + + + + 对象转字符串 + + + + + + + + + + 上下外边距 + + + + + 全部 + + + + + 上边外边距 + + + + + 下边外边距 + + + + + + + 全部边距 + + + + + + 上边外边距 + 下边外边距 + + + + 判断两个边距对象设置是否一样 + + + + + + + + 判断两个边距对象设置是否不一样 + + + + + + + + 获取该对象的哈希值(参考源码) + + + + + + 判断是否和该对象的引用是一样 + + + + + + + 把该对象转换成字符串 + + + + + + 计算哈希值(参考源码) + + + + + + + + 是否应该使用All设置初始化对象 + + + + + + 上下外边距转换器 + + + + + 字符串转对象 + + + + + + + + + 对象转字符串 + + + + + + + + + + 左右内边距 + + + + + 全部 + + + + + 左边内边距 + + + + + 右边内边距 + + + + + + + 全部边距 + + + + + + 左边内边距 + 右边内边距 + + + + 判断两个边距对象设置是否一样 + + + + + + + + 判断两个边距对象设置是否不一样 + + + + + + + + 获取该对象的哈希值(参考源码) + + + + + + 判断是否和该对象的引用是一样 + + + + + + + 把该对象转换成字符串 + + + + + + 计算哈希值(参考源码) + + + + + + + + 是否应该使用All设置初始化对象 + + + + + + 左右内边距转换器 + + + + + 字符串转对象 + + + + + + + + + 对象转字符串 + + + + + + + + + + 左右外边距 + + + + + 全部 + + + + + 左边外边距 + + + + + 右边外边距 + + + + + + + 全部边距 + + + + + + 左边外边距 + 右边外边距 + + + + 判断两个边距对象设置是否一样 + + + + + + + + 判断两个边距对象设置是否不一样 + + + + + + + + 获取该对象的哈希值(参考源码) + + + + + + 判断是否和该对象的引用是一样 + + + + + + + 把该对象转换成字符串 + + + + + + 计算哈希值(参考源码) + + + + + + + + 是否应该使用All设置初始化对象 + + + + + + 左右外边距转换器 + + + + + 字符串转对象 + + + + + + + + + 对象转字符串 + + + + + + + + + + MultidropSlide滑杆停靠外边距 + + + + + 全部 + + + + + 滑杆为提示标题保留外边距 + + + + + 滑杆开始坐标外边距 + + + + + 滑杆结束坐标外边距 + + + + + + + 全部 + + + + + + 滑杆为提示标题保留外边距 + 滑杆开始坐标外边距 + 滑杆结束坐标外边距 + + + + 判断两个滑杆停靠外边距对象设置是否一样 + + + + + + + + 判断两个滑杆停靠外边距对象设置是否不一样 + + + + + + + + 获取该对象的哈希值(参考源码) + + + + + + 判断是否和该对象的引用是一样 + + + + + + + 把该对象转换成字符串 + + + + + + 计算哈希值(参考源码) + + + + + + + + 是否应该使用All设置初始化对象 + + + + + + MultidropSlide滑杆停靠外边距转换器 + + + + + 字符串转对象 + + + + + + + + + 对象转字符串 + + + + + + + + + + 表示在二维平面中定义点的浮点 x 和 y 坐标的有序对。 + + + + + System.Drawing.PointF 转换成 PointFR + + + + + + PointFR 转换成 System.Drawing.PointF + + + + + + PointFR转换器 + + + + + 对属性进行排序 + + + + + 当该属性为展开属性选型时,属性编辑器删除该属性的描述 + + + + + + + + + + 属性排序 序号比较器 + + + + + 类别名称 + + + + + + + 类别名称 + 序号 + + + + 属性排序(升序) + + + + + 序号 + + + + + + + 序号 + + + + 圆角 + + + + + 全部 + + + + + 左上角 + + + + + 右上角 + + + + + 右下角 + + + + + 左下角 + + + + + + + 全部圆角 + + + + + + 左上角 + 右上角 + 右下角 + 左下角 + + + + 判断两个圆角对象设置是否一样 + + + + + + + + 判断两个圆角对象设置是否不一样 + + + + + + + + 获取该对象的哈希值(参考源码) + + + + + + 判断是否和该对象的引用是一样 + + + + + + + 把该对象转换成字符串 + + + + + + 计算哈希值(参考源码) + + + + + + + + 是否应该使用All设置初始化对象 + + + + + + 圆角转换器 + + + + + 字符串转对象 + + + + + + + + + 对象转字符串 + + + + + + + + + diff --git a/LargeSquareOne/Lib/HML.dll b/LargeSquareOne/Lib/HML.dll new file mode 100644 index 0000000..4e82da3 Binary files /dev/null and b/LargeSquareOne/Lib/HML.dll differ diff --git a/LargeSquareOne/Lib/HML.xml b/LargeSquareOne/Lib/HML.xml new file mode 100644 index 0000000..886e2b4 --- /dev/null +++ b/LargeSquareOne/Lib/HML.xml @@ -0,0 +1,16284 @@ + + + + HML + + + + + ImageList图片集合Index、Key管理器 + + + + + 要管理的图片集合 + + + + + 存放独立设置图片 + get: 返回优先级 独立设置Image>当Image==null根据最后一次赋值时是Index还是Key,初始默认为Index; + set: 赋值后,当value!=null时index=-1、key=string.Empty; + + + + + 图片Key + get: 返回图片Key,没有设置的返回"" ; + set: 赋值后,当value!=(null||string.Empty)时index=-1、image=null; + + + + + 图片索引 + get: 返回图片索引,没有设置的返回-1; + set: 赋值后,value!=-1时key=string.Empty、image=null; + + + + + 获取ActualIndex属性值时是否应该根据Index属性返回索引,否则就根据Key从ImageList中返回索引 + + + + + ImageList修改后应同步ImageIndexer,当value!=null时image = null; + + ImageList + + + + 判断独立设置Image是否一样 + + 要判断独立设置Image + + + + + 判断Key是否一样 + + 要判断Key + + + + + 判断Index是否一样 + + 要判断Index + + + + + 获取图片索引,没有设置的返回-1(根据最后一次赋值时是Index还是Key,初始默认为Index) + + + + + 数字调整文本控件 + + + + + 文本对齐方式 + + + + + 文本颜色(关联控件获取焦点时) + + + + + 文本颜色(关联控件失去焦点时) + + + + + 关联控件 + + + + + 关联控件关联属性的最大值属性名称 + + + + + 关联控件关联属性的最小值属性名称 + + + + + 关联控件的关联属性名称 + + + + + 调整大小(单位像素对应大小) + + + + + 否根据内容自动调整控件的大小。 + + + + + 鼠标是否按下 + + + + + 鼠标按下时坐标 + + + + + 鼠标按下时对应控件值 + + + + + 鼠标按下时对应控件值类型 + + + + + 控件要求Width + + + + + 控件要求Height + + + + + AutoSize切换中 + + + + + 更新控件size + + + + + 获取文本size + + + + + + 关联控件是否允许调整(根据:Enabled、ReadOnly ) + + + + + + 关联控件焦点事件 + + + + + + + NumeralAdjustLabel控件设计模式行为 + + + + + VHalvingLine控件设计模式行为 + + + + + HeadTag控件设计模式行为 + + + + + 绘制提示文本 + + + + + + Procedure控件设计模式行为 + + + + + 绘制提示文本 + + + + + + PaginationBar控件设计模式行为 + + + + + DropDownListPlus控件设计模式行为 + + + + + AngleLabel控件设计模式行为 + + + + + HGradualPercentage控件设计模式行为 + + + + + CommandButton控件设计模式行为 + + + + + ImageCropper控件设计模式行为 + + + + + 绘制提示文本 + + + + + + TextSlide控件设计模式行为 + + + + + 绘制虚线边框 + + + + + + 绘制提示文本 + + + + + + AnnulusProgress控件设计模式行为 + + + + + AnomalyButton控件设计模式行为 + + + + + 鼠标左键在路径圆点按下时鼠标的坐标 + + + + + 鼠标左键在路径圆点按下时圆点的索引 + + + + + 鼠标左键在路径圆点按下时圆点的坐标 + + + + + 鼠标右键在路径圆点按下时圆点的索引 + + + + + 鼠标进入路径圆点时圆点的索引 + + + + + 当前要处理要路径圆点 + + + + + 右键菜单集合 + + + + + 工具箱拖放创建新控件实例 + + + + + + 试图设计器初始化控件实例 + + + + + + 当设计器正在管理的控件绘制了它的图面时接收调用,这样设计器就可以在控件顶部绘制任意附加装饰 + + + + + + 指示该控件是否应处理在指定点单击鼠标的操作 + + + + + + + 在每次需要设置光标时接收调用 + + + + + 处理 Windows 消息,并可以选择将其路由到控件。 + + + + + + 绘制编辑模式下路劲和圆点 + + + + + + + 控件失去焦点 + + + + + + + 鼠标在控件可视区域按下左键 + + + + + 鼠标在控件可视区域按下右键 + + + + + 鼠标在控件可视区域按下左键后释放 + + + + + 鼠标在控件可视区域按下右键后释放 + + + + + 鼠标移动 + + + + + 右键菜单删除选中路径点 + + + + + + + 右键菜单新增一个点到选中的路径点的左边 + + + + + + + 右键菜单新增一个点到选中的路径点的右边 + + + + + + + AnomalyButton焦点渐变坐标移动编辑器 + + + + + 编辑窗体 + + + + + 鼠标按下后的坐标 + + + + + 鼠标按下后要操作对象 + + + + + 鼠标按下后要操作对象所在point + + + + + 移动功能按下 + + + + + + + 移动功能按下释放 + + + + + + + 移动功能移动中 + + + + + + + 停靠功能 + + + + + + + AnomalyButton焦点渐变半径比例编辑器 + + + + + 编辑窗体 + + + + + AnomalyButton焦点渐变半径比例编辑器窗体 + + + + + AnomalyButton移动编辑器窗体 + + + + + AnomalyButton移动编辑器窗体操作类型 + + + + + AnomalyButton形状路径坐标移动编辑器 + + + + + 编辑窗体 + + + + + 鼠标按下后的坐标 + + + + + 鼠标按下后要操作路径点集合 + + + + + 鼠标按下后要操作路径点集合所在rect + + + + + 移动功能按下 + + + + + + + 移动功能按下释放 + + + + + + + 移动功能移动中 + + + + + + + 停靠功能 + + + + + + + AnomalyButton文本坐标移动编辑器 + + + + + 编辑窗体 + + + + + 鼠标按下后的坐标 + + + + + 鼠标按下后要操作对象 + + + + + 鼠标按下后要操作对象所在point + + + + + 移动功能按下 + + + + + + + 移动功能按下释放 + + + + + + + 移动功能移动中 + + + + + + + 停靠功能 + + + + + + + ArcProgress控件设计模式行为 + + + + + CheckBoxPlusDesigner控件设计模式行为 + + + + + DateInput控件设计模式行为 + + + + + DatePicker控件设计模式行为 + + + + + VGradualPercentage控件设计模式行为 + + + + + GroupPanelPlus控件设计模式行为 + + + + + HHalvingLine控件设计模式行为 + + + + + ImageSlide控件设计模式行为 + + + + + 绘制虚线边框 + + + + + + 绘制提示文本 + + + + + + LineProgress控件设计模式行为 + + + + + LoadWait控件设计模式行为 + + + + + Meter控件设计模式行为 + + + + + MultidropSlide控件设计模式行为 + + + + + MultidropSlideLump集合属性编辑窗口 + + + + + BreadcrumbBar控件设计模式行为 + + + + + PatternLock控件设计模式行为 + + + + + GifBox控件设计模式行为 + + + + + 绘制提示文本 + + + + + + PieceProgress控件设计模式行为 + + + + + 绘制虚线边框 + + + + + + 绘制提示文本 + + + + + + RadioButtonPlus控件设计模式行为 + + + + + SingleAccordion节点集合属性编辑器 + + + + + SingleAccordion集合属性编辑窗体 + + + + + 选中节点更改 + + + + + + + 属性面板值更改 + + + + + + + 添加标签节点 + + + + + + + 添加根类别节点 + + + + + + + 添加根内容节点 + + + + + + + 添加子内容节点 + + + + + + + 展开所有节点 + + + + + + + 折叠所有节点 + + + + + + + 上移选中节点 + + + + + + + 下移选中节点 + + + + + + + 移除选中节点 + + + + + + + 确认修改 + + + + + + + 定义一种检索服务对象的机制,服务对象是为其他对象提供自定义支持的对象。 + + + + + SingleAccordion控件设计模式行为 + + + + + 鼠标左键按下节点 + + + + + 试图设计器初始化控件实例 + + + + + + 指示该控件是否应处理在指定点单击鼠标的操作 + + + + + + + 处理 Windows 消息,并可以选择将其路由到控件。 + + + + + + 控件失去焦点 + + + + + + + HRuler控件设计模式行为 + + + + + VRuler控件设计模式行为 + + + + + ToggleSwitch控件设计模式行为 + + + + + TabControlPlus子控件集合属性编辑窗口扩展 + + + + + TabControlPlus的设计模式行为 + + + + + 获取一个值,该值指示选择的控件是否重新设置为父级。 + + + + + 获取一个值,该值指示在拖动操作期间 System.Windows.Forms.Design.ControlDesigner 是否允许按对齐线对齐。 + + + + + 智能标记 + + + + + 指示指定的控件是否可以是由此设计器管理的控件的子级。 + + + + + + + 指示该控件是否应处理在指定点单击鼠标的操作。 + + + + + + + 视图设计器创建TabControlPlus控件 + + + + + + + + + + + + + 创建时添加默认选项 + + + + + + 绘制边框 + + + + + + 右键菜单 + + + + + + 组件更改后事件 + + + + + + + 视图设计器选中控件更改事件 + + + + + + + 添加一个选项卡事件 + + + + + + + 移除一个选项卡事件 + + + + + + + 获取视图设计器TabControlPlus选中的TabPagePlus + + + + + + + + 获取选中的TabPagePlus的TabPagePlusDesigner设计器 + + + + + + TabPagePlus的设计模式行为 + + + + + 公开鼠标拖载数据方法 + + + + + + 公开鼠标拖载数据方法 + + + + + + 公开鼠标拖载数据方法 + + + + + + 公开鼠标拖载数据方法 + + + + + + 公开鼠标拖载数据方法 + + + + + + TrackBarPlus控件设计模式行为 + + + + + 水波纹控件设计模式行为 + + + + + 透明度颜色编辑器 + + + + + 编辑窗体 + + + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + + 透明度颜色编辑器窗体 + + + + + 颜色 + + + + + 颜色透明度 + + + + + 必需的设计器变量。 + + + + + 清理所有正在使用的资源。 + + 如果应释放托管资源,为 true;否则为 false。 + + + + 设计器支持所需的方法 - 不要修改 + 使用代码编辑器修改此方法的内容。 + + + + + 系统颜色列表控件 + + + + + 系统颜色 + + + + + 通过反射获取系统颜色 + + + + + + + 系统颜色排序 + + + + + 根据系统颜色名称进行排序 + + + + + + + + 透明颜色预览效果控件 + + + + + 颜色 + + + + + 颜色透明度 + + + + + + 颜色 + + + + + 渐变框图片 + + + + + 渐变框rect信息 + + + + + 渐变框选中坐标 + + + + + 渐变栏图片 + + + + + 渐变栏rect信息 + + + + + 渐变栏滑块rect信息 + + + + + 渐变栏滑块颜色值 + + + + + 当前颜色R的rect信息 + + + + + 当前颜色R滑块的rect信息 + + + + + 当前颜色G的rect信息 + + + + + 当前颜色G滑块的rect信息 + + + + + 当前颜色B的rect信息 + + + + + 当前颜色B滑块的rect信息 + + + + + 当前颜色预览rect信息 + + + + + 当前鼠标状态 + + + + + 初始化控件布局 + + + + + 更新渐变框图片 + + + + + 更新渐变框选中点坐标值 + + 鼠标坐标 + + + + 更新渐变栏图片 + + + + + 更新渐变栏滑块rect + + 鼠标坐标 + + + + 更新RGB滑块rect + + + + + 获取渐变框坐标颜色 + + + + + 获取渐变栏滑块颜色 + + + + + 获取R滑块值 + + 鼠标坐标 + + + + 获取G滑块值 + + 鼠标坐标 + + + + 获取B滑块值 + + 鼠标坐标 + + + + 鼠标按下类型 + + + + + 空 + + + + + 渐变框按下 + + + + + 渐变栏按下 + + + + + R按下 + + + + + G按下 + + + + + B按下 + + + + + Web颜色列表控件 + + + + + Web颜色 + + + + + 通过反射获取Web颜色 + + + + + + + Web颜色排序 + + + + + 根据Web颜色名称进行排序( 透明度>色调>饱和度>亮度 ) + + + + + + + + 自定义颜色面板控件 + + + + + 选项单击事件 + + + + + 已选中颜色选项索引 + + + + + 自定义颜色 + + + + + 已选中颜色选项索引 + + + + + 获取焦点颜色选项索引 + + + + + 当前鼠标已按下的对象索引 + + + + + 初始化控件rect + + + + + 设置自定义颜色面板鼠标焦点 + + 焦点偏移量 + + + + 自定义颜色选项 + + + + + 颜色 + + + + + rect + + + + + 集合属性编辑窗口扩展(显示属性详细描述信息) + + + + + 绘制虚线边框 + + + + + 绘制虚线边框 + + + + + + 展开属性选型去除描述 + + + + + 当该属性为展开属性选型时,属性编辑器删除该属性的描述 + + + + + + + + + + 集合属性编辑器(显示Text文本、显示属性详细描述信息) + + + + + Int 0-360角度编辑器 + + + + + 编辑窗体 + + + + + 关联控件 + + + + + 关联属性 + + + + + 必需的设计器变量。 + + + + + 清理所有正在使用的资源。 + + 如果应释放托管资源,为 true;否则为 false。 + + + + 设计器支持所需的方法 - 不要修改 + 使用代码编辑器修改此方法的内容。 + + + + + 一个强类型的资源类,用于查找本地化的字符串等。 + + + + + 返回此类使用的缓存的 ResourceManager 实例。 + + + + + 重写当前线程的 CurrentUICulture 属性,对 + 使用此强类型资源类的所有资源查找执行重写。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + DropDownListPlus选项绘制前事件参数 + + + + + 选项 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + + + + + 选项区域(包含:内容) + + + + + 是否选中 + + + + + 鼠标是否进入选项 + + + + + 选项图片区域 + + + + + 选项文本区域 + + + + + 选项背景色画笔 + + + + + 选项前景色画笔 + + + + + 选项分隔线画笔 + + + + + 选项绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + + + + 选项 + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + 选项区域(包含:内容) + 是否选中 + 鼠标是否进入选项 + 选项图片区域 + 选项文本区域 + 选项背景色画笔 + 选项前景色画笔 + 选项分隔线画笔 + 选项绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + DropDownListPlus选项绘制后事件参数 + + + + + 选项 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + + + + + 选项区域(包含:内容) + + + + + 是否选中 + + + + + 鼠标是否进入选项 + + + + + 选项图片区域 + + + + + 选项文本区域 + + + + + 选项背景色画笔 + + + + + 选项前景色画笔 + + + + + 选项分隔线画笔 + + + + + + + 选项 + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + 选项区域(包含:内容) + 是否选中 + 鼠标是否进入选项 + 选项图片区域 + 选项文本区域 + 选项背景色画笔 + 选项前景色画笔 + 选项分隔线画笔 + + + + HalvingLine分割线风格 + + + + + 指定实线 + + + + + 划线段组成的直线 + + + + + 由点构成的直线 + + + + + 由重复的划线点图案构成的直线 + + + + + 由重复的划线点点图案构成的直线 + + + + + 分割线文本布局方式 + + + + + 左边 + + + + + 居中 + + + + + 右边 + + + + + 纵向分割线控件 + + + + + 显示风格 + + + + + 线条厚度 + + + + + 线条颜色 + + + + + 文本对齐方式 + + + + + 文本位置偏移量(正数从左边开始偏移,负数由右边开始偏移) + + + + + 根据字体计算控件宽度 + + + + + + 获取显示风格 + + + + + + 蒙版弹层NativeWindow + + 提供窗口句柄和窗口过程的低级封装 + 使用分层窗体为例能绘制透明。 + + + + + 控件当前缩放Dpi + + + + + 蒙版弹层的显示状态 + + + + + 控件大小 + + + + + 控件位置 + + + + + 控件大小和位置 + + + + + 蒙版拥有者 + + + + + 显示蒙版弹层 + + + + + 显示蒙版弹层 + + + + + + 隐藏蒙版弹层 + + + + + 绘制分层窗体 + + + + + 蒙版弹层拥有者Resize事件 + + + + + + + 蒙版弹层拥有者所在控件链LocationChanged事件 + + + + + + + 蒙版弹层拥有者所在控件链VisibleChanged事件 + + + + + + + 蒙版弹层拥有者所在控件链ParentChanged事件 + + + + + + + 蒙版弹层拥有者所在控件链Dispose事件 + + + + + + + 显式调用 + + + + + PaginationBar当前页码更改事件参数 + + + + + 将要切换到的页码(1开始) + + + + + + + 将要切换到的页码(1开始) + + + + 按钮控件 + + + + + 控件激活的虚线框颜色 + + + + + 是否启用圆角 + + + + + 边框颜色 + + + + + 背景色(正常) + + + + + 前景色(正常) + + + + + 背景色(鼠标进入) + + + + + 前景色(鼠标进入) + + + + + 文本对齐方式 + + + + + 标识符以指示对话框的返回值 + + + + + 是否显示图标 + + + + + 图标对齐方式 + + + + + 图标Size + + + + + 获取在控件上显示的图像的ImageList + + + + + 图标 + + + + + 图标Index + + + + + 图标Key + + + + + 鼠标按下类型 + + + + + 鼠标已进入对象 + + + + + 鼠标单击动画是否进行中 + + + + + 鼠标单击动画动画总时间 + + + + + 鼠标单击动画已使用时间 + + + + + 鼠标单击动画圆心坐标 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 设置控件形状 + + + + + ImageList更改后刷新控件 + + + + + + + ImageList释放时解绑清除清除引用 + + + + + + + 页码导航控件 + + + + + 当前页码更改事件 + + + + + 内容区内边距 + + + + + 显示风格文本(有7个|分隔开来,[*]代表记录总数量。格式错误则采用默认配置) + 例子:“当前共有[*]条|首页|上一页|...|...|下一页|尾页|共[*]页” + + + + + 是否显示(首页、尾页)按钮 + + + + + 是否显示(上一页、下一页)按钮 + + + + + 是否显示(上一组页码、下一组页码)按钮 + + + + + 按钮背景颜色(正常) + + + + + 按钮文本颜色(正常) + + + + + 按钮背景颜色(鼠标进入) + + + + + 按钮文本颜色(鼠标进入) + + + + + 是否显示记录数描述 + + + + + 记录数描述文本颜色 + + + + + 是否显示页数描述 + + + + + 页数描述文本颜色 + + + + + 页码背景颜色(正常) + + + + + 页码文本颜色(正常) + + + + + 页码背景颜色(鼠标进入) + + + + + 页码文本颜色(鼠标进入) + + + + + 页码背景颜色(当前) + + + + + 页码文本颜色(当前) + + + + + 导航一次最多显示多少个页码(建议为奇数,最小值为5) + + + + + 总记录数 + + + + + 多少条记录为一页 + + + + + 总页数 + + + + + 当前页码(1开始) + + + + + 当前鼠标已按下的对象 + + + + + 当前鼠标已进入的对象 + + + + + 页码显示默认文本 + + + + + 元素信息 + + + + + 设置页码导航 + + 导航一次最多显示多少个页码(建议为奇数,最小值为5) + 总记录数 + 多少条记录为一页 + 当前页码索引(1开始) + + + + 初始化Rectangle + + + + + 绘制Rectangle 1个像素边框(圆角边框半径为3个像素) + + 要绘制边框的控件画布 + 要绘制rect + 页码背景色 + 控件背景色(圆角边框平滑过度颜色) + 通用画笔 + 通用画笔 + + + + 获取页码显示文本 + + + + + + 根据设置计算控件高度 + + + + + + 记录数描述 + + + + + 首页 + + + + + 上一页 + + + + + 上一组 + + + + + 下一组 + + + + + 下一页 + + + + + 尾页 + + + + + + + + + + 页数描述 + + + + + 页码索引元素 + + + + + 元素文本 + + + + + 元素文本Size + + + + + 元素rect + + + + + 页码按钮元素 + + + + + 元素类型 + + + + + 是否显示 + + + + + 元素文本 + + + + + 元素文本Size + + + + + 元素rect + + + + + 页码按钮元素类型 + + + + + 首页 + + + + + 上一页 + + + + + 上一组 + + + + + 下一组 + + + + + 下一页 + + + + + 尾页 + + + + + 描述 + + + + + 一个强类型的资源类,用于查找本地化的字符串等。 + + + + + 返回此类使用的缓存的 ResourceManager 实例。 + + + + + 重写当前线程的 CurrentUICulture 属性,对 + 使用此强类型资源类的所有资源查找执行重写。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + SingleAccordion标签节点样式(通用) + + + + + 是否启用节点鼠标动画 + + + + + 鼠标动画总时间(毫秒) + + + + + 左右滑动动画距离 + + + + + 高度 + + + + + 上下外边距 + + + + + 文本左右外边距 + + + + + 背景颜色(正常) + + + + + 文本颜色(正常) + + + + + 背景颜色(鼠标进入) + + + + + 文本颜色(鼠标进入) + + + + + 分割线颜色 + + + + + 是否显示图片 + + + + + 图片左右外边距 + + + + + 图片Size + + + + + 图片(通用) + + + + + 刷新控件 + + + + + 重新计算控件并刷新控件 + + + + + SingleAccordion标签节点 + + + + + 复制节点 + + 是否复制子节点 + + + + + 获取节点鼠标动画启用状态(节点未添加到控件返回 false) + + + + + + 获取节点鼠标动画总时间(节点未添加到控件返回0) + + + + + + 节点鼠标动画效果是否启用 + + + + + 采用控件通用设置 + + + + + 启用 + + + + + 禁用 + + + + + SingleAccordion自定义动画 + + + + + 动画类型标识 + + + + + 动画目标 + + + + + 自定义动画已使用时间 + + + + + 自定义动画总时间 + + + + + 自定义动画是否涉及控件内部布局计算 + + + + + 动画自定义数据 + + + + + + + 动画类型标识 + 动画目标 + 自定义动画已使用时间 + 自定义动画总时间 + 自定义动画是否涉及控件内部布局计算 + 动画自定义数据 + + + + SingleAccordionNode节点图片是否显示 + + + + + 采用控件通用设置 + + + + + 显示 + + + + + 不显示 + + + + + SingleAccordion节点绘制前事件参数 + + + + + 节点 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + + + + + 滚动条Y坐标 + + + + + 节点区域(包含:内容)(不包含滚动条Y坐标) + + + + + 背景画笔 + + + + + 是否显示图片 + + + + + 图片区域(包含:内容) + + + + + 图片 + + + + + 文本区域(包含:内容) + + + + + 文本画笔 + + + + + 是否显示折叠图标 + + + + + 折叠图标区域(包含:内容) + + + + + 折叠图标画笔 + + + + + 折叠图标旋转角度 + + + + + 是否显示分隔线 + + + + + 分隔线区域(包含:内容) + + + + + 分隔线画笔 + + + + + 节点绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + + + + 节点 + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + 滚动条Y坐标 + 节点区域(包含:内容)(不包含滚动条Y坐标) + 背景画笔 + 是否显示图片 + 图片区域(包含:内容) + 图片 + 文本区域(包含:内容) + 文本画笔 + 是否显示折叠图标 + 折叠图标区域(包含:内容) + 折叠图标旋转角度 + 折叠图标画笔 + 是否显示分隔线 + 分隔线区域(包含:内容) + 分隔线画笔 + 节点绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + SingleAccordion节点背景绘制后事件参数 + + + + + 节点 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + + + + + 滚动条Y坐标 + + + + + 节点区域(包含:内容)(不包含滚动条Y坐标) + + + + + 背景画笔 + + + + + 是否显示图片 + + + + + 图片区域(包含:内容) + + + + + 图片 + + + + + 文本区域(包含:内容) + + + + + 文本画笔 + + + + + 是否显示折叠图标 + + + + + 折叠图标区域(包含:内容) + + + + + 折叠图标旋转角度 + + + + + 折叠图标画笔 + + + + + 是否显示分隔线 + + + + + 分隔线区域(包含:内容) + + + + + 分隔线画笔 + + + + + + + 节点 + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + 滚动条Y坐标 + 节点区域(只包含:内容)(不包含滚动条Y坐标) + 背景画笔 + 是否显示图片 + 图片区域(包含:内容) + 图片 + 文本区域(包含:内容) + 文本画笔 + 是否显示折叠图标 + 折叠图标区域(包含:内容) + 折叠图标旋转角度 + 折叠图标画笔 + 是否显示分隔线 + 分隔线区域(包含:内容) + 分隔线画笔 + + + + 背景绘制前事件参数 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + + + + + 控件区域(只包含:内容) + + + + + 背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + + + + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=Bounds_C ) + 控件区域(只包含:内容) + 背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + 一个强类型的资源类,用于查找本地化的字符串等。 + + + + + 返回此类使用的缓存的 ResourceManager 实例。 + + + + + 重写当前线程的 CurrentUICulture 属性,对 + 使用此强类型资源类的所有资源查找执行重写。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + TabItem背景绘制前事件参数 + + + + + TabPage + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + + + + + 导航栏区域 (包含:内边距、内容) + + + + + 导航栏区域 (包含:内容) + + + + + 允许显示所有选项的总剪辑区域 (包含:内容) + + + + + 当前选项区域(包含:外边距、内边距、内容) + + + + + 当前选项区域(包含:内边距、内容) + + + + + 当前选项区域(只包含:内容) + + + + + 当前选项剪辑区域(包含:内边距、内容) + + + + + 当前选项背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + + + + TabPage + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + 导航栏区域 (包含:内边距、内容) + 导航栏区域 (包含:内容) + 允许显示所有选项的总剪辑区域 (包含:内容) + 当前选项区域(包含:外边距、内边距、内容) + 当前选项区域(包含:内边距、内容) + 当前选项区域(只包含:内容) + 当前选项剪辑区域(包含:内边距、内容) + 当前选项背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + 一个强类型的资源类,用于查找本地化的字符串等。 + + + + + 返回此类使用的缓存的 ResourceManager 实例。 + + + + + 重写当前线程的 CurrentUICulture 属性,对 + 使用此强类型资源类的所有资源查找执行重写。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 动画工具类 + + + + + 变速 + + 已进行动画时间/总动画时间 + 动画曲线幂(默认值3.0) + + + + + 变速 + + 动画已进行时间 + 动画总时间 + 动画曲线幂(默认值3.0) + + + + + 变速 + + 已进行动画时间/总动画时间 + 动画曲线幂(默认值3.0) + + + + + 收缩 + + 已进行动画时间/总动画时间 + 动画曲线幂(默认值3.0) + 收缩与相关联的幅度动画。此值必须大于或等于 0。 默认值为 1。 + + + + + 收缩 + + 已进行动画时间/总动画时间 + 动画曲线幂(默认值3.0) + 收缩与相关联的幅度动画。此值必须大于或等于 0。 默认值为 1.0。 + + + + + 收缩 + + 已进行动画时间/总动画时间 + 动画曲线幂(默认值3.0) + 收缩与相关联的幅度动画。此值必须大于或等于 0。 默认值为 1.0。 + + + + + 二次 + + 已进行动画时间/总动画时间 + + + + + 二次 + + 已进行动画时间/总动画时间 + + + + + 监控信息管理 + + + + + 动画定时器状态 + + + + + 当前要处理动画数量 + + + + + 当前要处理空动画数量 + + + + + 获取蒙版弹层数量 + + + + + 获取蒙版弹层定时器状态 + + + + + DropDownListPlus下拉列表弹层鼠标钩子数量 + + + + + 控件工具类 + + + + + 获取指定窗口(包括非工作区)的Graphics + + 指定窗口的handle + 返回g + 返回hDC + + + + 获取指定窗口(只包括工作区)的Graphics + + 指定窗口的handle + 返回g + 返回hDC + + + + 绘制Rectangle 1个像素边框(圆角边框半径为3个像素) + + 要绘制边框的控件 + 要绘制边框的控件画布 + 是否为圆角边框(圆角边框半径为3个像素) + 边框颜色 + 父控件背景色(圆角边框平滑过度颜色) + 控件背景色(圆角边框平滑过度颜色) + + + + 计算Rectangle 1个像素圆角形状路径(圆角边框半径为3个像素) + + rect + + + + + 计算点到矩形的最大圆形最大半径 + + 矩形 + 点 + + + + + 转换成圆角 + + 要转换的rect + 圆角半径的大小 + + + + + 转换成圆角 + + 要转换的rect + 左上角 + 右上角 + 右下角 + 左下角 + + + + + 转换成圆角 + + 要转换的rect + 左上角 + 右上角 + 右下角 + 左下角 + + + + + 根据画笔大小计算出真是rectf + + 要转换的rectf + 画笔大小大小 + 画笔对齐方式 + + + + + 根据画笔大小计算出真是rectf + + 要转换的rect + 画笔大小大小 + 画笔对齐方式 + + + + + 获取字体顶部空格 + + + + + + 获取字体真实高度 + + + + + + 计算指定角度的坐标 + + 圆心坐标 + 圆半径 + 角度 + + + + + 计算两个坐标的夹角 + + 坐标1 + 坐标2 + + + + + 获取Size旋转指定角度后新的Size + + 源Size + 指定角度 + 新的Size + + + + 根据画笔大小转换rectf + + 要转换的rectf + 画笔大小大小 + + + + + 转换成灰色颜色值 + + 要转换的颜色 + + + + + 根据控件Enabled状态转换成对应颜色值 + + 颜色所属的控件 + 要转换的颜色 + + + + + 根据状态转换成对应颜色值 + + 是否为禁用状态 + 要转换的颜色 + + + + + 转换成动画效果颜色值 + + 要转换的颜色 + + + + + 根据控件Enabled状态和背景色转换文本字体对应颜色值 + + 颜色所属的控件 + 背景色 + 前景色 + + + + + 根据状态和背景色转换文本字体对应颜色值 + + 是否为禁用状态 + 背景色 + 前景色 + + + + + 根据指定颜色Brightness转换成有对比颜色 + + 指定颜色 + + + + + 检查RGB值ed有效范围 + + + + + + + 用于创建禁用状态灰色图片(NET源码拷贝) + + + + + 创建禁用状态灰色图片(NET源码拷贝) + + 要处理的图片 + + + + + 缩放图片 + + 源图片 + 目标Size + + + + + 保留指定位数小数 + + 要处理数 + 要保留小数位数 + + + + 保留指定位数小数 + + 要处理数 + 要保留小数位数 + + + + 保留指定位数小数 + + 要处理数 + 要保留小数位数 + + + + DropDownListPlus选项区域选项风格 + + + + + 选项边框颜色 + + + + + 选项背景颜色 + + + + + 选项文本颜色 + + + + + 选项是否显示清除按钮 + + + + + 清除按钮背景颜色 + + + + + 清除按钮前景颜色 + + + + + 刷新控件 + + + + + 重新计算控件刷新控件 + + + + + DropDownListPlus下拉按钮 + + + + + 下拉按钮的有效区域是否为整个控件(只限于单选模式) + + + + + 下拉按钮背景色(正常) + + + + + 下拉按钮前景色(正常) + + + + + 下拉按钮背景色(鼠标进入) + + + + + 下拉按钮前景色(鼠标进入) + + + + + 刷新控件 + + + + + DropDownListPlus清除按钮 + + + + + 是否显示清除按钮 + + + + + 清除按钮背景色(正常) + + + + + 清除按钮前景色(正常) + + + + + 清除按钮背景色(鼠标进入) + + + + + 清除按钮前景色(鼠标进入) + + + + + 刷新控件 + + + + + 重新计算控件并刷新控件 + + + + + 下拉列表控件 + + + + + 数据源更改事件 + + + + + 选项选中更改事件 + + + + + 选项自定义绘制前事件 + + + + + 选项自定义绘制后事件 + + + + + 控件激活的虚线框颜色 + + + + + 边框颜色 + + + + + 是否启用圆角 + + + + + 选项区域上下内边距(只限于单选模式) + + + + + 显示风格 + + + + + 是否只读 + + + + + 是否允许多个选中 + + + + + 空值提示文本 + + + + + 空值提示文本颜色 + + + + + 选项集合 + + + + + 选项区域风格 + + + + + 清除按钮 + + + + + 下拉按钮 + + + + + 下拉列表选项风格 + + + + + 已选中选项集合 (多选模式) + + + + + 已选中选项 (单选模式) + + + + + 控件激活显示状态(配合Focused 、ShowFocusCues、activatedIndex使用) + + + + + 控件激活状态选项索引(-1 没有、0 下拉按钮、1 清除按钮 ) + + + + + 当前鼠标已按下的对象 + + + + + 鼠标进入对象 + + + + + 清空按钮对象 + + + + + 下拉按钮对象 + + + + + 内容区域rect(排除上下边框、内边距 。但包含左右边框、内边距) + + + + + 清空按钮rect + + + + + 下拉按钮rect + + + + + 下拉列表弹层 + + + + + 边框 + + + + + 绑定数据源 + + 要绑定数据源 + + + + 绑定数据源 + + 要绑定数据源 + 设置已选中选项(不会触发SelectedItemsChanged事件) + + + + 绑定数据源 + + 要绑定数据源 + 设置已选中选项集合(不会触发SelectedItemsChanged事件) + + + + 初始化控件信息 + + + + + 更新控件元素rect + + + + + 同步Item到ItemInfo + + + + + 重新计算选中选项文本Size + + + + + 根据设置获取控件高度 + + + + + + 获取控件单行高度 + + + + + + 设置控件形状 + + + + + 计算控件形状路径 + + + + + 绘制Rectangle 1个像素边框(圆角边框半径为3个像素) + + 要绘制边框的控件画布 + 边框颜色 + 父控件背景色(圆角边框平滑过度颜色) + 控件背景色(圆角边框平滑过度颜色) + + + + 判断两个集合是否一致(不包括顺序) + + 集合1 + 集合2 + + + + + 显示下拉列表弹层(同时安装钩子) + + + + + 隐藏下拉列表弹层(同时同步下拉列表选中选项和取消钩子) + + + + + 下拉列表弹层NativeWindow + + 提供窗口句柄和窗口过程的低级封装 + NativeWindow 使用局部鼠标钩子来处理鼠标事件,放弃原有鼠标默认鼠标事件,因为要添加窗体自动消失功能, + 使用分层窗体为例能绘制透明,同时在工作区域模拟非工作区部分。 + + + + + + 下拉列表弹层的显示状态 + + + + + 控件大小和位置(包括其非工作区元素) + + + + + 控件工作区域大小和位置(模仿) + + + + + 控件工作区域(模仿) + + + + + 控件当前滚动条是否显示 + + + + + 下拉列表弹层已选中集合 + + + + + 下拉列表弹层拥有者 + + + + + 下拉列表弹层四边阴影图片缓存 + + + + + 鼠标钩子拥有者 + + + + + 鼠标钩子回调函数 + + + + + 钩子id集合 + + + + + 钩子id + + + + + 鼠标钩子回调委托 + + + + + + + + + 鼠标钩子返回信息结构体 + + + + + 鼠标钩子坐标 + + + + + 鼠标是否在控件模拟工作区范围内 (WndProc消息) + + + + + 鼠标是否在控件模拟工作区范围内按下过 (WndProc消息) + + + + + 当前鼠标已按下的对象(-2 滚动条、-1没有、>=0 下拉列表选项) + + + + + 鼠标按下功能坐标 + + + + + 鼠标按下滚动条时菜单真实区的Y坐标 + + + + + 鼠标进入对象 + + + + + 滑条Rect + + + + + + 滑块Y轴距离(存放内容Y轴真实距离) + + + + + 显示下拉列表弹层(同时安装钩子) + + + + + 隐藏下拉列表弹层(同时取消钩子) + + + + + 绘制下拉列表弹层 + + + + + 设置滚动条滑块Y轴距离 + + + + + + 将指定屏幕点的位置计算成工作区坐标 + + + + + + + 将指定工作区点的位置计算成屏幕坐标 + + + + + + + 显式调用 + + + + + 计算下拉列表弹层显示区域Bounds + + + + + 更新下拉列表弹层滚动条Rect + + + + + 获取列表真实高度 + + + + + + 获取进入工作区的第一个选项索引 + + + + + + 根据坐标查找选项索引 + + 相对于控件模拟工作区坐标 + + + + + 隐藏窗体(只隐藏不作任何其他处理) + + + + + 创建带阴影边框图片 + + + + + + + + EaseIn动画函数 + + 进度百分值 + 曲线幂 + + + + + EaseBoth动画函数 + + 进度百分值 + 曲线幂 + + + + + 开始监听钩子 + + + + + 结束监听钩子 + + + + + 利用钩子处理鼠标事件 + + + + + + + + + 获取控件鼠标钩子鼠标坐标(相对于屏幕) + + + + + + 鼠标进入 + + + + + + + 鼠标离开 + + + + + + + 鼠标按下 + + + + + + + 鼠标释放 + + + + + + + 鼠标移动 + + + + + + + 鼠标滚轮滚动 + + + + + + + 下拉列表弹层关闭 + + + + + + + 绘制(模仿非工作区) + + + + + + + 绘制(模仿工作区) + + + + + + + 绘制(边框) + + + + + + + DropDownListPlus选项临时信息对象 + + + + + 选项 + + + + + 选项文本Size + + + + + 选项rect + + + + + 选项图片rect + + + + + 选项文本rect + + + + + 选项删除按钮 + + + + + DropDownListPlus下拉列表弹层 + + + + + 圆角Size + + + + + 边框颜色 + + + + + 背景颜色 + + + + + 四周阴影颜色 + + + + + 下拉框最大高度(0为自动计算) + + + + + 空数据源提示文本 + + + + + 空数据源提示背景颜色 + + + + + 空数据源提示文本颜色 + + + + + 已选中选项是否显示定位 + + + + + 已选中选项定位颜色 + + + + + 选项高度 + + + + + 左右内边距 + + + + + 选项分隔线颜色 + + + + + 选项背景颜色(正常) + + + + + 选项文本颜色(正常) + + + + + 选项背景颜色(鼠标进入) + + + + + 选项文本颜色(鼠标进入) + + + + + 选项背景颜色(选中) + + + + + 选项文本颜色(选中) + + + + + 选项背景颜色(禁止) + + + + + 选项文本颜色(禁止) + + + + + 是否显示选项图片 + + + + + 选项图片Size + + + + + 选项图片左右外边距 + + + + + 选项图片 + + + + + 滑条厚度 + + + + + 滑块最小高度 + + + + + 滑条颜色 + + + + + 滑块颜色 + + + + + 刷新控件 + + + + + 重新计算控件刷新控件 + + + + + DropDownListPlus选项 + + + + + 选项是否启用 + + + + + 选项文本 + + + + + 选项图片 + + + + + 选项自定义数据 + + + + + 选项所属的列表 + + + + + 浅度复制 + + + + + + DropDownListPlus选项集合 + + + + + DropDownListPlus风格 + + + + + 没有 + + + + + 垂直线风格 + + + + + 直线风格 + + + + + 渐变线风格 + + + + + 系统缩放比例 + + + + + 获取控件对应的系统缩放比例 + + + + + + + 获取控件对应的系统缩放比例 + + + + + + + Win32 + + + + + 检索指定窗口的边界矩形的尺寸。 尺寸以相对于屏幕左上角的屏幕坐标提供。 + + 窗口的句柄 + 指向 RECT 结构的指针,用于接收窗口左上角和右下角的屏幕坐标 + + + + + 激活指定窗口 + + 窗口的句柄 + + + + + 获得的设备环境覆盖了整个窗口(包括非客户区) + + + + + + + 用于获得hWnd参数所指定窗口的客户区域的一个设备环境 + + + + + + + DPI的缩放由程序自己处理 + + + + + + 高16位(无符号) + + + + + + + 高16位(无符号) + + + + + + + 低16位(无符号) + + + + + + + 低16位(无符号) + + + + + + + 高16位(有符号) + + + + + + + 高16位(有符号) + + + + + + + 低16位(有符号) + + + + + + + 低16位(有符号) + + + + + + + 结构转指针 + + 结构类型 + + + + + + 指针转结构 + + 结构类型 + + + + + + 角度文本控件 + + + + + Angle值更改事件 + + + + + 文本旋转角度 + + + + + 文本呈现的质量 + + + + + 是否正在旋转计算中 + + + + + 控件文本Size + + + + + 控件Size + + + + + 根据设置计算文本Size + + + + + + 根据设置更新控件大小 + + + + + 缩放控件接口 + + + + + Dpi + + + + + CommandButton文本对齐方式 + + + + + 左边对齐 + + + + + 中间对齐 + + + + + 右边对齐 + + + + + CommandButton命令 + + + + + 按钮命令(必须唯一,可用于索引) + + + + + 按钮文本 + + + + + 按钮启用状态 + + + + + 按钮是否显示 + + + + + 自定义数据 + + + + + 选项所属的控件 + + + + + 按钮rect + + + + + 文本Size + + + + + 刷新控件 + + + + + 控件重新初始化和重绘 + + + + + 复制选项 + + + + + + CommandButton命令集合 + + + + + CommandButton命令选中更改中事件参数 + + + + + 将要取消选中的按钮选项 + + + + + 将要选中的按钮选项 + + + + + + + 将要取消选中的按钮选项 + 将要选中的按钮选项 + + + + ImageCropper拖放类型 + + + + + 没有操作 + + + + + 左上角拉伸 + + + + + 右上角拉伸 + + + + + 右下角拉伸 + + + + + 左下角拉伸 + + + + + 顶部拉伸 + + + + + 右边拉伸 + + + + + 底部拉伸 + + + + + 左边拉伸 + + + + + 剪切区移动 + + + + + 图源移动 + + + + + ImageCropper剪切的形状 + + + + + 矩形 + + + + + 圆形 + + + + + 图片裁剪控件 + + + + + 剪切区域Rectangle更改事件 + + + + + 是否显示透明背景网格 + + + + + 透明背景网格Size + + + + + 剪切的形状 + + + + + 剪切的形状比例(宽:高 null为任意尺寸) + + + + + 剪切区域拇指Size + + + + + 剪切区域拇指Size + + + + + 剪切区域拇指边框颜色 + + + + + 剪切区域拇指背景颜色 + + + + + 蒙层颜色 + + + + + 图片 + + + + + 图片缩放比例(1-100) + + + + + 内容区rect + + + + + 剪切区rect + + + + + 图片区rect + + + + + 剪切区path + + + + + 剪切区拇指信息集合 + + + + + 鼠标已按下对象 + + + + + 鼠标按下时对象rect + + + + + 鼠标按下坐标 + + + + + 网格图片缓存 + + + + + 图片缓存 + + + + + 重置信息 + + + + + 剪切当前选中区域图片 + + 是否按缩放后大小进行剪切 + + + + + 获取缩放状态剪切区域Rectangle + + + + + + 初始化rect + + + + + 初始化内容区默认rect + + + + + 初始化图片区域为默认rect + + + + + 更新剪切区rect + + 剪切区rect + + + + 获取剪切区拇指半径 + + + + + + 获取剪切区默认rect + + + + + + 把缩放rect转换成真实rect + + 缩放rect + + + + + 更新图片缓存 + + + + + 更新背景网格图片缓存 + + + + + ImageSlide图例栏 + + + + + 是否显示图例栏 + + + + + 图例Size + + + + + 图例边框颜色 + + + + + 图例背景颜色(正常) + + + + + 图例背景颜色(当前索引) + + + + + 刷新控件 + + + + + LineProgress值文本对齐方式 + + + + + 靠左边 + + + + + 居中 + + + + + 靠右边 + + + + + 跟随Vallue值 + + + + + 命令组按钮控件 + + + + + 选中命令更改中事件 + + + + + 选中命令更改后事件 + + + + + 控件激活的虚线框颜色 + + + + + 边框颜色 + + + + + 是否启用圆角 + + + + + 是否允许鼠标键盘取消当前选中的命令 + + + + + 命令集合 + + + + + 已选中命令 + + + + + 命令自动宽度模式 + + + + + 命令最小宽度(自动宽度模式下) + + + + + 命令固定宽度 + + + + + 命令文本外边距 + + + + + 命令文本对齐方式 + + + + + 命令背景颜色(未选中、正常) + + + + + 命令文本颜色(未选中、正常) + + + + + 命令背景颜色(未选中、鼠标进入) + + + + + 命令文本颜色(未选中、鼠标进入) + + + + + 命令背景颜色(已选中、正常) + + + + + 命令文本颜色(已选中、正常) + + + + + 命令背景颜色(已选中、鼠标进入) + + + + + 命令文本颜色(已选中、鼠标进入) + + + + + 控件激活显示状态(配合Focused 、ShowFocusCues、activatedIndex使用) + + + + + 控件激活状态选项索引 + + + + + 当前鼠标已按下的对象 + + + + + 当前鼠标已进入的对象 + + + + + 动画rect + + + + + 动画坐标 + + + + + 动画总时间 + + + + + 动画已使用的时间 + + + + + 边框 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 更新选中命令(不会触发 Selecting、Selected 事件) + + 要选中命令 + + + + 初始化控件Rectangle + + + + + 更新选项文本Size + + + + + 更新选项Rectangle + + + + + 根据设置获取控件Size + + + + + + 设置控件形状 + + + + + 鼠标键盘设置选中命令 + + 将要选中命令 + + + + 获取允许激活命令索引集合 + + + + + + 开关按钮控件 + + + + + 开关状态更改事件 + + + + + 控件激活的虚线框颜色 + + + + + 是否启用圆角 + + + + + 单击时是否自动更改控件状态 + + + + + 开关状态 + + + + + 边框颜色(未选中) + + + + + 边框颜色(已选中) + + + + + 背景颜色(未选中、正常) + + + + + 文本颜色(未选中、正常) + + + + + 背景颜色(未选中、鼠标进入) + + + + + 文本颜色(未选中、鼠标进入) + + + + + 背景颜色(已选中、正常) + + + + + 文本颜色(已选中、正常) + + + + + 背景颜色(已选中、鼠标进入) + + + + + 文本颜色(已选中、鼠标进入) + + + + + 文本对齐方式 + + + + + 是否显示图标 + + + + + 图标对齐方式 + + + + + 图标Size + + + + + 获取在控件上显示的图像的ImageList + + + + + 图标 (未选中) + + + + + 图标Index (未选中) + + + + + 图标Key (未选中) + + + + + 图标 (已选中) + + + + + 图标Index (已选中) + + + + + 图标Key (已选中) + + + + + 鼠标按下类型 + + + + + 鼠标已进入对象 + + + + + 鼠标单击动画是否进行中 + + + + + 鼠标单击动画动画总时间 + + + + + 鼠标单击动画已使用时间 + + + + + 鼠标单击动画圆心坐标 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 设置控件形状 + + + + + ImageList更改后刷新控件 + + + + + + + ImageList释放时解绑清除清除引用 + + + + + + + 文本滚动控件 + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 文本滚动方向 + + + + + 触发动画单位时间(单位毫秒>=10) + + + + + 文本移动速度(动画单位时间内移动像素) + + + + + 文本size + + + + + 文本偏移量 + + + + + 动画累加时间 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 根据设置计算文本Size + + + + + + 复位文本偏移量 + + + + + TextSlide文本滚动方向 + + + + + 从左往右 + + + + + 从右往左 + + + + + 缩放容器控件基类 + + + + + 控件当前缩放Dpi + + + + + 控件DPI更改后重新初始化控件Rectangle信息 + + + + + 缩放窗体基类 + + + + + 控件当前缩放Dpi + + + + + 控件DPI更改后重新初始化控件Rectangle信息 + + + + + 缩放控件基类 + + + + + 控件当前缩放Dpi + + + + + 控件DPI更改后重新初始化控件Rectangle信息 + + + + + 主线程动画控件基类,不能时耗时操作,该定时器时UI线程计时器。耗时长对导致画面卡顿。 + + + + + 动画控件集合锁 + + + + + 动画控件集合 + + + + + 动画定时器锁 + + + + + 定时器间隔 + + + + + 动画控件动画中要处理的内容(不能时耗时操作,该定时器为UI线程计时器。耗时长对导致画面卡顿) + + 动画定时器间隔时间 + + + + 定时器事件 + + + + + + + 开始指定控件动画 + + + + + + 停止指定控件动画 + + + + + + 圆环进度控件 + + + + + Value值更改事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 进度条圆环厚度百分比(相对于控件宽度) + + + + + 开始角度 + + + + + 进度条颜色 + + + + + 进度条当前值颜色 + + + + + 进度值(0-100) + + + + + 是否显示进度值文本 + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 内容内边距 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 不规则形状按钮 + + + + + 控件Checked状态更改事件 + + + + + 控件激活的虚线框颜色 + + + + + 自定义形状路径显示风格 + + + + + 边框厚度 + + + + + 边框颜色 + + + + + 是否为开启checkButton功能 + + + + + 单击时是否自动更改控件状态 + + + + + 控件是否选中 + + + + + 自定义形状坐标集合(不包含系统缩放比例), 格式: {x,y}{x,y}....{x,y} + + + + + 文本坐标位置 + + + + + 背景颜色(未选中状态正常) + + + + + 文本颜色(未选中状态正常) + + + + + 背景颜色(未选中状态鼠标进入) + + + + + 文本颜色(未选中状态态鼠标进入) + + + + + 背景颜色(未选中状态鼠标按下) + + + + + 文本颜色(未选中状态鼠标按下) + + + + + 背景颜色(已选中状态正常) + + + + + 文本颜色(已选中状态正常) + + + + + 背景颜色(已选中状态鼠标进入) + + + + + 文本颜色(已选中状态鼠标进入) + + + + + 背景颜色(已选中状态鼠标按下) + + + + + 文本颜色(已选中状态鼠标按下) + + + + + 是否启用焦点渐变 + + + + + 焦点渐变坐标位置 + + + + + 焦点渐变半径 + + + + + 焦点渐变颜色(未选中状态正常) + + + + + 焦点渐变颜色(未选中状态鼠标进入) + + + + + 焦点渐变颜色(未选中状态鼠标按下) + + + + + 焦点渐变颜色(已选中状态正常) + + + + + 焦点渐变颜色(已选中状态鼠标进入) + + + + + 焦点渐变颜色(已选中状态鼠标按下) + + + + + 启用自定义形状编辑功能 + + + + + 自定义形状布局整体调整: 1.单击 四周按钮停靠路径位置。 2. 拖动 中间按钮修改路径位置。 + + + + + 自定义形状编辑路径颜色 + + + + + 自定义形状编辑点半径 + + + + + 自定义形状编辑点背景颜色(正常) + + + + + 自定义形状编辑点背景颜色(鼠标进入) + + + + + 启用自定义形状编辑点提示 + + + + + 自定义形状编辑路径文本颜色 + + + + + 鼠标按下类型 + + + + + 鼠标已进入对象 + + + + + [不包含系统缩放比例坐标字符串] 转换成 [包含系统缩放比例坐标对象] + + 不包含系统缩放比例坐标字符串 + 缩放比例 + 包含系统缩放比例坐标对象 + + + + [不包含系统缩放比例坐标字符串] 转换成 [不包含系统缩放比例坐标对象] + + 不包含系统缩放比例坐标字符串 + 不包含系统缩放比例坐标对象 + + + + [包含系统缩放比例坐标对象] 转换成 [不包含系统缩放比例坐标字符串] + + 包含系统缩放比例坐标对象 + 缩放比例 + 包含系统缩放比例坐标字符串 + + + + [不包含系统缩放比例坐标对象] 转换成 [不包含系统缩放比例坐标字符串] + + 不包含系统缩放比例坐标对象 + 不包含系统缩放比例坐标字符串 + + + + 初始化控件Rectangle + + + + + AnomalyButton路径显示风格 + + + + + 直线 + + + + + 贝塞尔 + + + + + 圆弧进度控件 + + + + + Value值更改事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 进度条圆弧厚度百分比(相对于控件宽度) + + + + + 进度条弧度大小 + + + + + 进度条颜色 + + + + + 进度条当前值颜色 + + + + + 进度值(0-100) + + + + + 是否显示进度值文本 + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 内容内边距 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 根据字体计算控件高度 + + + + + + 自动根据设置更新控件Size + + 是否刷新控件 + + + + + 复选框控件 + + + + + 控件Checked状态更改事件 + + + + + 控件CheckState状态更改事件 + + + + + 控件激活的虚线框颜色 + + + + + 显示风格 是按正常Check复选框风格显示,还是按Button按钮风格显示 + + + + + 控件是否为三种选择状态(否则为两种选择状态) + + + + + 单击时是否自动更改控件状态 + + + + + 是否已选中 + + + + + 选中状态 + + + + + 在Check显示风格下鼠标操作有效范围 + + + + + 在Check显示风格下复选框的对齐方式 + + + + + 复选框大小 + + + + + 复选框与文本的间距 + + + + + 复选框边框颜色 + + + + + 复选框背景色(未选中) + + + + + 复选框前景色(未选中) + + + + + 复选框背景色(部分选中) + + + + + 复选框前景色(部分选中) + + + + + 复选框背景色(已选中) + + + + + 复选框前景色(已选中) + + + + + 在Check显示风格下复选框的风格 + + + + + 获取在控件上显示的图像的ImageList + + + + + 未选中状态复选框图片 + + + + + 未选中状态复选框图片Index + + + + + 未选中状态复选框图片Key + + + + + 部分选中状态复选框图片 + + + + + 部分中状态复选框图片Index + + + + + 部分中状态复选框图片Key + + + + + 已选中状态复选框图片 + + + + + 已选中状态复选框图片Index + + + + + 已选中状态复选框图片Key + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 背景颜色(未选中、正常) + + + + + 文本颜色(未选中、正常) + + + + + 背景颜色(未选中、鼠标进入) + + + + + 文本颜色(未选中、鼠标进入) + + + + + 背景颜色(部分选中、正常) + + + + + 文本颜色(部分选中、正常) + + + + + 背景颜色(部分选中、鼠标进入) + + + + + 文本颜色(部分选中、鼠标进入) + + + + + 背景颜色(已选中、正常) + + + + + 文本颜色(已选中、正常) + + + + + 背景颜色(已选中、鼠标进入) + + + + + 文本颜色(已选中、鼠标进入) + + + + + 否根据内容自动调整控件的大小。 + + + + + 内边距限于AutoSize + + + + + 在Check显示风格下背景颜色 + + + + + 在Check显示风格下文本颜色 + + + + + 文本字体 + + + + + 文本 + + + + + 鼠标按下类型 + + + + + 鼠标已进入对象 + + + + + 复选框rect + + + + + 文本rect + + + + + 控件要求Width + + + + + 控件要求Height + + + + + AutoSize切换中 + + + + + 初始化Rectangle + + + + + 更新控件size + + + + + 获取文本size + + + + + + 指定坐标是否在控件有效范围内 + + 指定坐标 + + + + + 设置控件状态 + + + + + ImageList更改后刷新控件 + + + + + + + ImageList释放时解绑清除清除引用 + + + + + + + CheckBoxPlus控件显示方式 + + + + + 按正常Check复选框方式显示 + + + + + 按Button按钮方式显示 + + + + + CheckBoxPlus在Check显示方式下复选框的对齐方式 + + + + + 左边 + + + + + 顶部 + + + + + 右边 + + + + + 底部 + + + + + 中间 + + + + + CheckBoxPlus在Check显示方式下鼠标操作有效范围 + + + + + 鼠标在整个控件区域内操作有效 + + + + + 鼠标只在复选框内操作有效 + + + + + 鼠标只在复选框和文本内操作有效 + + + + + CheckBoxPlus在Check显示方式下复选框的风格 + + + + + 默认 + + + + + 自定义图片 + + + + + 日期输入框控件 + + + + + 边框颜色 + + + + + 边框与内容内的距离 + + + + + 是否只读 + + + + + 日期操作模式 + + + + + 是否显示清除按钮 + + + + + 清除按钮对齐方式(相对于DateImage) + + + + + 清除按钮前景色 + + + + + 日期图片 + + + + + 日期图片对齐方式 + + + + + 日期空值提示文本 + + + + + 日期空值提示文本颜色 + + + + + 日期文本对齐方式 + + + + + 日期文本颜色(正常) + + + + + 日期文本背景颜色(高亮)(空值采用系统默认配置) + + + + + 日期文本颜色(高亮)(空值采用系统默认配置) + + + + + 日期符号格式 + + + + + 日期符号颜色 + + + + + 是否显示星期 + + + + + 星期文本颜色 + + + + + 日期选择面板 + + + + + 当前鼠标按下的功能区 + + + + + 时间文本与图片的间距 + + + + + 存放生成禁用状态图片 + + + + + 存放时间元素信息 + + + + + 日期面板显示状态 + + + + + 边框厚度 + + + + + 日期控件内容允许选中的元素(已排好序) + + + + + 更新时间符号文本 + + + + + 计算时间各部分元素的Size(一般由 this.Font、this.DateSymbolFormats、this.DatePicker.DateDisplayType 的更改触发) + + + + + 计算控件各部分元素的rect + + + + + 更新DatePicker源时间到控件文本上 + + + + + 根据dateBody时间值更新日期面板DateValue 值触发值更改事件 + + + + + 键盘数字键修改dateBody时间文本值 + + 键盘数字 + + + + 文本由选中高亮到取消选中时验证时间 + + 时间文本选中高亮部分 + + + + 更新日期控件内容允许选中的元素 + + + + + 是否显示是否日期指定部分 + + 日期指定部分 + + + + + 获取指定日期所属星期文本 + + 指定日期 + + + + + 根据字体计算控件高度 + + + + + + 隐藏日期面板弹层事件 + + + + + + + 日期面板清除事件 + + + + + + + 日期面板现在时间事件 + + + + + + + 日期面板确定事件 + + + + + + + 日期面板时间值更改事件 + + + + + + + 日期面板日期格式更改事件 + + + + + + + 显示日期面板 + + + + + 存放时间元素信息 + + + + + 日期控件内容选中类型索引 + + + + + 内容Rect + + + + + 图片Rect + + + + + 清除按钮Rect + + + + + 时间值Rect + + + + + 年文本 + + + + + 年文本Size + + + + + 年文本Rect + + + + + 年单位文本 + + + + + 年单位文本Size + + + + + 年单位文本Rect + + + + + 年月分隔符文本 + + + + + 年月分隔符文本Size + + + + + 年月分隔符文本Rect + + + + + 月文本 + + + + + 月文本Size + + + + + 月文本Rect + + + + + 月单位文本 + + + + + 月单位文本Size + + + + + 月单位文本Rect + + + + + 月日分隔符文本 + + + + + 月日分隔符文本Size + + + + + 月日分隔符文本Rect + + + + + 日文本 + + + + + 日文本Size + + + + + 日文本Rect + + + + + 日单位文本 + + + + + 日单位文本Size + + + + + 日单位文本Rect + + + + + 日时分隔符文本 + + + + + 日时分隔符文本Size + + + + + 日时分隔符文本Rect + + + + + 时文本 + + + + + 时文本Size + + + + + 时文本Rect + + + + + 时单位文本 + + + + + 时单位文本Size + + + + + 时单位文本Rect + + + + + 时分分隔符文本 + + + + + 时分分隔符文本Size + + + + + 时分分隔符文本Rect + + + + + 分文本 + + + + + 分文本Size + + + + + 分文本Rect + + + + + 分单位文本 + + + + + 分单位文本Size + + + + + 分单位文本Rect + + + + + 分秒分隔符文本 + + + + + 分秒分隔符文本Size + + + + + 分秒分隔符文本Rect + + + + + 秒文本 + + + + + 秒文本Size + + + + + 秒文本Rect + + + + + 秒单位文本 + + + + + 秒单位文本Size + + + + + 秒单位文本Rect + + + + + 秒星期分隔符文本 + + + + + 秒星期分隔符文本Size + + + + + 秒星期分隔符文本Rect + + + + + 星期文本 + + + + + 星期文本Size + + + + + 星期文本Rect + + + + + 当前日期文本显示包含指定部分 + + + + + 年 + + + + + 月 + + + + + 日 + + + + + 时 + + + + + 分 + + + + + 秒 + + + + + 星期 + + + + + 日期控件内容允许选中的元素 + + + + + 没选中 + + + + + 图标 + + + + + 清除按钮 + + + + + 年 + + + + + 月 + + + + + 日 + + + + + 时 + + + + + 分 + + + + + 秒 + + + + + 当前鼠标按下的功能区 + + + + + 没有 + + + + + 整个控件 + + + + + 图片 + + + + + 清除按钮 + + + + + 日期文本 + + + + + 日期输入框 清除按钮对齐方式 + + + + + 靠近日期图片 + + + + + 远离日期图片 + + + + + 日期输入框 日期图片对齐方式 + + + + + 左边 + + + + + 右边 + + + + + 日期操作模式 + + + + + 可编辑 + + + + + 只能日期面板选择 + + + + + 日期输入框 日期符号格式 + + + + + 格式 yyyy-MM-dd HH:mm:ss + + + + + 格式 yyyy/MM/dd HH:mm:ss + + + + + 格式 yyyy.MM.dd HH:mm:ss + + + + + 格式 yyyy年MM月dd日 HH时mm分ss秒 + + + + + 日期输入框 文本对齐方式 + + + + + 左边 + + + + + 右边 + + + + + 日期面板控件 + + + + + 底部工具栏清除选中单击事件 + + + + + 底部工具栏现在单击事件 + + + + + 底部工具栏确认单击事件 + + + + + 日期值更改事件 + + + + + 日期显示格式更改事件 + + + + + 控件激活的虚线框颜色 + + + + + 是否只读 + + + + + 日期显示格式(自动截取到显示部分) + + + + + 最小日期(只比较日期部分) + + + + + 最大日期(只比较日期部分) + + + + + 日期 (获取时自动根据 DateFormat 属性对日期时间进行截取) + + + + + 顶部工具栏背景颜色 + + + + + 顶部工具栏按钮字体颜色(正常) + + + + + 顶部工具栏按钮字体颜色(鼠标进入) + + + + + 分割线颜色 + + + + + 主面板背景颜色 + + + + + 日期面板日期标题字体颜色 + + + + + 日期面板日期字体颜色(禁用) + + + + + 日期面板非本月日期字体颜色(正常) + + + + + 日期面板正常日期字体颜色(正常) + + + + + 日期面板日期背景颜色(鼠标进入) + + + + + 日期面板日期背景颜色(选中) + + + + + 日期面板日期字体颜色(选中) + + + + + 是否显示最小值最大值限制提示信息 + + + + + 日期最小最大限制提示字体颜色 + + + + + 滚动条背景颜色 + + + + + 滚动条滑块颜色 + + + + + 激活选项索引: + 年面板.激活选项索引(年功能下:-2至14)(年月功能下: -3至14)(年月日功能下:-6至14) + 月面板.激活选项索引(年月功能下: -3至14)(年月日功能下:-6至14) + 日面板.激活选项索引(年月日功能下:-6至44) + + + + + 激活选项区域 + + + + + 激活选项是否显示 + + + + + 最小日期 + + + + + 最大日期 + + + + + 顶部工具栏高度 + + + + + 主体面板宽度 + + + + + 主体面板高度 + + + + + 底部工具栏高度 + + + + + 年选项宽度 + + + + + 年选项高度 + + + + + 月选项宽度 + + + + + 月选项高度 + + + + + 日选项宽度 + + + + + 日选项高度 + + + + + 日期面板和时间面板间隔 + + + + + 时间选项宽度 + + + + + 时间选项高度 + + + + + 时间滚动条厚度 + + + + + 存放日期元素信息对象 + + + + + 当前显示的日期面板 + + + + + 鼠标按下对象 + + + + + 鼠标按下坐标 + + + + + 鼠标进入对象 + + + + + 清除 + + + + + + 现在 + + + + + + 确认 + + + + + + 日期值更改 + + + + + + 日期显示格式更改 + + + + + + 根据DateValue初始化画面并刷新画面 + + + + + 设置日期值(但不会触发 DateValueChanged 事件) + + 日期 + + + + 初始化控件布局 + + + + + 初始化时间滚动条布局 + + 时间滚动条对象 + 时间选项显示区域 + 时间选项总数 + 时间选项高度 + + + + 更新顶部画面文本信息 + + + + + 更新年月日画面文本信息 + + + + + 更新底部画面文本信息 + + + + + 当前设置格式是否包含日期指定部分 + + 日期指定部分 + + + + + 日期指定部分面板是否在当前面板显示 + + 日期指定部分面板 + + + + + 当前面板切换到指定面板 + + 指定面板 + + + + 让选中的时间选垂直项居中显示 + + + + + 键盘方向键更新激活索引 + + 键盘方向键 Keys.Left、Keys.Right、Keys.Up、Keys.Down + + + + 指定激活选项单击 + + + + + + 根据设置获取控件大小 + + + + + + 获取指定年份的年面板第一个开始的年份 + + 指定年份 + + + + + 获取时间选项列表Rect的开始Y坐标 + + + + + + + 绘制时间滚动条 + + + 时间滚动条对象 + 滚动条背景画笔 + 滚动条滑块画笔 + + + + 上一年 + + + + + + 上一月 + + + + + + 年月切换面板 + + + + + + 显示月面板 + + + + + + 显示年面板 + + + + + + 下一月 + + + + + + 下一年 + + + + + + 年面板年选项单击 + + + + + + 月面板月选项单击 + + + + + + 日月面板日选项单击 + + + + + + 绘制Rectangle左边圆角(圆角边框半径为3个像素) + + 要绘制边框的控件画布 + 要绘制边框的rect + 背景色 + 背景色平滑过度颜色 + + + + 绘制Rectangle右边圆角(圆角边框半径为3个像素) + + 要绘制边框的控件画布 + 要绘制边框的rect + 背景色 + 背景色平滑过度颜色 + + + + 日期存放信息 + ] + + + + 顶部工具栏rect + + + + + 顶部工具栏日期rect + + + + + 顶部工具栏.上一年按钮 + + + + + 顶部工具栏.上一月按钮 + + + + + 顶部工具栏.年范围描述 + + + + + 顶部工具栏.年、月面板年按钮 + + + + + 顶部工具栏.月按钮 + + + + + 顶部工具栏.年按钮 + + + + + 顶部工具栏.下一月按钮 + + + + + 顶部工具栏.下一年按钮 + + + + + 顶部工具栏时间rect + + + + + 时标题rect + + + + + 分标题rect + + + + + 秒标题rect + + + + + 主面板.rect + + + + + 年面板.rect + + + + + 年面板.选项列表 + + + + + 月面板.rect + + + + + 月面板.选项列表 + + + + + 日面板.rect + + + + + 日面板.标题列表 + + + + + 日面板.选项列表 + + + + + 时间面板rect + + + + + 时间面板时区域 + + + + + 时间面板分区域 + + + + + 时间面板秒区域 + + + + + 底部工具栏rect + + + + + 底部工具栏最小时间最大时间线 + + + + + 底部工具栏最小时间文本 + + + + + 底部工具栏最大时间文本 + + + + + 底部工具栏清除按钮 + + + + + 底部工具栏现在按钮 + + + + + 底部工具栏确认按钮 + + + + + 已选择年 + + + + + 已选择月 + + + + + 已选择日 + + + + + 已选择时 + + + + + 已选择分 + + + + + 已选择秒 + + + + + 当前年份面板(画面上切换到指定年份的日期提供用户选择) + + + + + 当前月份面板(画面上切换到指定月份的日期提供用户选择) + + + + + 顶部工具栏面板选项 + + + + + 顶部工具栏选项rect + + + + + 顶部工具栏选项文本 + + + + + 顶部工具栏选项按钮图形路径 + + + + + 顶部工具栏选项按钮图形路径 + + + + + 年、月、日 选项 + + + + + 选项rect + ] + + + + 年、月、日 选项值(存储格式:[10yyyy]、[10yyyyMM]、[10yyyyMMdd] ) + + + + + 日选项类型(只适用日选项) + + + + + 日期标题 + + + + + 日标题.rect + ] + + + + 日标题.文本 + + + + + 时间面板指定区域 + + + + + + + 选项数量 + + + + 区域Rect + + + + + 区域选项列表 + + + + + 区域滚动条 + + + + + 时间选项 + + + + + 选项rect + + + + + 选项值 + + + + + 时间滚动条 + + + + + 滚动条背景.rect + + + + + 滚动条滑块.rect + + + + + 内容显示区rect + + + + + 内容真实区rect + + + + + 判断是否需要更新滚动条UI根据滚动条滑块偏移量 + + 滚动条滑块偏移量 + 是否要刷新 + + + + 底部工具栏面板选项 + + + + + 底部工具栏选项rect + + + + + 底部工具栏选项文本 + + + + + 底部工具栏选项按钮图形路径 + + + + + 组成日期的元素 + + + + + 年 + + + + + 月 + + + + + 日 + + + + + 时 + + + + + 分 + + + + + 秒 + + + + + 在指定显示功能类型下面板显示状态 + + + + + 年功能中(年面板) + + + + + 年月功能中(年面板) + + + + + 年月功能中(月面板) + + + + + 年月日功能中(年面板) + + + + + 年月日功能中(月面板) + + + + + 年月日功能中(日面板) + + + + + 日选项类型 + + + + + 不在最大最小值范围的日期 + + + + + 在日期最大最小值范围,但非本月的日期 + + + + + 在日期最大最小值范围,本月的日期 + + + + + 日期面板 日期格式 + + + + + 年 + + + + + 年月 + + + + + 年月日 + + + + + 年月日时 + + + + + 年月日时分 + + + + + 年月日时分秒 + + + + + GradualPercentage渐变颜色 + + + + + 渐变范围值 0-1 + + + + + 渐变范围值对应颜色 + + + + + GradualPercentage渐变颜色集合 + + + + + 横向渐变百分比控件 + + + + + Value值更改事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 网格大小(像素) + + + + + 网格颜色 + + + + + 渐变颜色集合 + + + + + 百分比(0-100) + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 纵向渐变百分比控件 + + + + + Value值更改事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 网格大小(像素) + + + + + 网格颜色 + + + + + 渐变颜色集合 + + + + + 百分比(0-100) + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 该控件显示围绕一组具有可选标题的控件的框架 + + + + + 边框厚度 + + + + + 标题栏文本上下外边距 + + + + + 标题栏背景颜色 + + + + + 是否显示图标 + + + + + 标题栏图标大小 + + + + + 标题栏图标 + + + + + 标题栏对齐方式 + + + + + 内容区背景颜色 + + + + + 标题栏文本 + + + + + 标题栏文本字体 + + + + + 标题栏文本颜色 + + + + + 在移动或改变大小后的新坐标 + + + + + 在移动或改变大小前的坐标 + + + + + 移动或改变大小前的客户区坐标 + + + + + 绘制非工作区域 + + + + + 重新绘制非工作区 + + + + + 发送非工作区绘制信息 + + + + + 发送要求重新计算非工作区和绘制信息 + + + + + GroupPanelPlus标题对齐方式 + + + + + 左边 + + + + + 右边 + + + + + 居中 + + + + + 横向分割线控件 + + + + + 显示风格 + + + + + 线条厚度 + + + + + 线条颜色 + + + + + 文本对齐方式 + + + + + 文本位置偏移量(正数从左边开始偏移,负数由右边开始偏移) + + + + + 根据字体计算控件高度 + + + + + + 获取显示风格 + + + + + + 分割线文本布局方式 + + + + + 顶部 + + + + + 居中 + + + + + 底部 + + + + + 图片幻灯片控件 + + + + + 图片轮播索引更改事件 + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 图片滑动播放方向 + + + + + 鼠标进入时是否停止自动切换 + + + + + 标题栏 + + + + + 导航栏 + + + + + 图例栏 + + + + + 图片框Size + + + + + 显示区要显示的图片框数量 + + + + + 图片框滑动总时间(单位毫秒) + + + + + 图片框停留间隔时间(单位毫秒) + + + + + 图片选项集合 + + + + + 图片开始的索引(负向第一个为最左边、正向第一个为最右边) + + + + + 当前鼠标已按下的对象 + + + + + 图片框集合 + + + + + 滑动动画已使用的时间累计 + + + + + 滑动动画的间隔时间累计 + + + + + 是否暂停滑动动画的间隔时间累计 + + + + + 当前滑动方向 + + + + + 图片框当前滑动进度 + + + + + 当前动画状态 + + + + + 控件是否处于失效状态 + + + + + 是否在Stop状态下利用导航栏进行一次切换 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 开始播放 + + + + + 停止播放 + + + + + 初始化Rectangle + + + + + 初始化导航栏Rectangle + + + + + 更新图片框信息 (当前显示区的开始图片的索引:负向第一个为最左边、正向第一个为最右边) + + + + + 加载图片框集合 + + + + + 根据滑动方向切换到下一个图片 + + + + + 还原当前滑动方向到Orientation设置的滑动方向 + + + + + 获取当前滑动方向的图片框滑动距离 + + + + + 根据控件失效状态自动更新控件动画 + + + + + 设置默认图片索引 + + + + + 验证图片索引 + + 图片索引 + + + + + 图片选项是否在图片框中 + + 图片选项 + + + + 是否横向滑动(LeftToRight、RightToLeft) + + + + + + + 是否负方向滑动(RightToLeft、BottomToTop) + + + + + + + 图片框 + + + + + 原图片索引 + + + + + 缩放后图片 + + + + + 动画状态 + + + + + 停止 + + + + + 间隔等待中 + + + + + 滑动中 + + + + + ImageSlide选项 + + + + + 图片标题文本 + + + + + 图片 + + + + + 自定义数据 + + + + + 选项所属的控件 + + + + + 刷新控件 + + + + + 复制选项 + + + + + + ImageSlide选项集合 + + + + + ImageSlide导航栏 + + + + + 导航栏按钮显示方式 + + + + + 按钮Size + + + + + 按钮线条厚度 + + + + + 边框颜色 + + + + + 导航栏按钮背景颜色(正常) + + + + + 导航栏按钮线条颜色(正常) + + + + + 导航栏按钮背景颜色(鼠标进入) + + + + + 导航栏按钮线条颜色(鼠标进入) + + + + + 导航栏当前显示状态 + + + + + 上一个按钮对象 + + + + + 上一个按钮rectf + + + + + 上一个按钮线条点集合 + + + + + 鼠标是否已进入上一个按钮 + + + + + 下一个按钮对象 + + + + + 下一个按钮rectf + + + + + 下一个按钮线条点集合 + + + + + 鼠标是否已进入下一个按钮 + + + + + 刷新控件 + + + + + 重新计算导航栏并刷新控件 + + + + + ImageSlide导航栏显示方式 + + + + + 不显示 + + + + + 一直显示 + + + + + 鼠标进入才显示 + + + + + ImageSlide图片播放方向 + + + + + 由右往左 + + + + + 由左往右 + + + + + 由下往上 + + + + + 由上往下 + + + + + ImageSlide标题栏 + + + + + 是否显示 + + + + + 内边距 + + + + + 边框颜色 + + + + + 背景颜色 + + + + + 文本颜色 + + + + + 文本字体 + + + + + 刷新控件 + + + + + Int角度控件 + + + + + Angle值更改事件 + + + + + 是否只读 + + + + + 是否显示角度文本 + + + + + 角度值 + + + + + 是否允许鼠标循环移动修改角度值 + + + + + 表盘背景颜色 + + + + + 表盘背景玻璃颜色 + + + + + 表盘背景玻璃颜色角度 + + + + + + 角度针颜色 + + + + + 是否显示参考角度线 + + + + + 参考角度线Size + + + + + 参考角度线颜色 + + + + + 角度针参考角度 (x轴开始) + + + + + 当前鼠标已按下的对象 + + + + + 当前鼠标已按下的角度针角度差距 + + + + + 角度针上一次所在区域 + + + + + 角度针当前所在区域 + + + + + 当前锁定区域(用于防止越过最大最小值,0为没有任何区域要锁定) + + + + + 内容内边距 + + + + + 获取角度针所在区域(由参考角度开始,90度为一个区,一个四个区域) + + 相对于参考角度的角度值 + + + + + 条形进度控件 + + + + + Value值更改事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 进度条厚度 + + + + + 进度条颜色 + + + + + 进度条当前值颜色 + + + + + 进度值(0-100) + + + + + 是否显示进度值文本 + + + + + 进度值文本对齐方式 + + + + + 进度值文本字体 + + + + + 进度值文本颜色 + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 内容内边距 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 根据字体计算控件高度 + + + + + + 自动根据设置更新控件Size + + 是否刷新控件 + + + + + 加载等待控件 + + + + + 激活状态更改事件 + + + + + 是否已激活 + + + + + 显示风格 + + + + + 画笔直径大小 + + + + + 画笔颜色 + + + + + 开始画笔索引 + + + + + 画笔的数量 + + + + + 画笔角度 + + + + + 画笔颜色 + + + + + 控件内边距 + + + + + 动画已使用的时间 + + + + + 动画时间间隔(毫秒) + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 初始化选项角度 + + + + + + 初始化选项颜色 + + + + + + 根据画笔大小计算控件高度 + + + + + + LoadWait显示风格 + + + + + 直线 + + + + + 圆球 + + + + + 蒙版弹层 + + + + + 加载等待蒙版全局配置 + + + + + 存放蒙版信息集合 + + + + + 画笔的数量 + + + + + 旋转定时器 + + + + + 在指定窗体上显示蒙版弹层 + + 蒙版弹层拥有者 + + + + 在指定窗体上显示蒙版弹层 + + 蒙版弹层拥有者 + 文本 + + + + 在指定窗体上显示蒙版弹层 + + 蒙版弹层拥有者 + 蒙版弹层配置 + + + + 在指定窗体上显示蒙版弹层 + + 蒙版弹层拥有者 + 文本 + 蒙版弹层配置 + + + + 隐藏所有蒙版弹层 + + + + + 隐藏指定蒙版弹层 + + 蒙版弹层拥有者 + + + + 隐藏指定蒙版弹层 + + 蒙版弹层信息存储对象 + + + + 隐藏蒙版弹层集合 + + 蒙版弹层信息存储对象集合 + + + + 更改蒙版弹层文本 + + 蒙版弹层拥有者 + 文本 + + + + 蒙版弹层拥有者所在控件链添加事件 + + 蒙版弹层拥有者 + 蒙版弹层信息存储对象 + + + + 旋转动画定时器事件 + + + + + + + 蒙版弹层信息存储对象 + + + + + 蒙版弹层 + + + + + 蒙版弹层拥有者 + + + + + 蒙版弹层事件监听的控件链(蒙版弹层拥有者为第一个) + + + + + 蒙版弹层配置 + + + + + 文本 + + + + + 加载动画已累加的时间 + + + + + 加载动画画笔开始索引 + + + + + 蒙版弹层配置 + + + + + 蒙版弹层显示风格 + + + + + 蒙版弹层拥有者内边距(相对于拥有者工作区) + + + + + 蒙版弹层背景颜色 + + + + + 加载动画画笔颜色 + + + + + 加载动画画笔大小 + + + + + 文本 + + + + + 文本对齐方式 + + + + + 文本字体 + + + + + 文本颜色 + + + + + 加载动画画笔角度集合 + + + + + 加载动画画笔颜色集合 + + + + + + + 蒙版弹层显示风格 + 蒙版弹层拥有者内边距(相对于拥有者工作区) + 蒙版弹层背景颜色 + 加载动画画笔颜色 + 文本 + 文本对齐方式 + 文本字体 + 文本颜色 + + + + 初始化画笔角度 + + + + + + 初始化画笔颜色 + + + + + + 蒙版弹层显示风格 + + + + + 直线 + + + + + 圆点 + + + + + 蒙版弹层文本对齐方式 + + + + + 右边 + + + + + 底部 + + + + + 仪表控件 + + + + + Value值更改事件 + + + + + Value值溢出事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 最大值 + + + + + 最小值 + + + + + 值 + + + + + 是否允许Value值溢出显示 + + + + + 风格 + + + + + 仪表盘外边框厚度 + + + + + 仪表盘外边框颜色 + + + + + 仪表盘内边框厚度 + + + + + 仪表盘内边框颜色 + + + + + 仪表盘背景颜色 + + + + + 仪表盘背景玻璃颜色 + + + + + 仪表弧度大小 (只限于 MeterStyles.None 风格) + + + + + 是否显示值弧 + + + + + 值弧厚度 + + + + + 值弧厚度背景颜色 + + + + + 值弧前景颜色 + + + + + 是否显示渐变弧 + + + + + 渐变弧厚度 + + + + + 渐变弧渐变颜色集合 + + + + + 主刻度线间的位置 + + + + + 主刻度线Size + + + + + 主刻度线颜色 + + + + + 主刻度值文本保留位数 + + + + + 主刻度文本外边距 + + + + + 主刻度文本字体 + + + + + 主刻度文本颜色 + + + + + 一个主刻度分割成多少个子刻度 + + + + + 子刻度颜色 + + + + + 指针Size + + + + + 指针颜色 + + + + + 针帽颜色 + + + + + 针帽玻璃颜色 + + + + + 是否显示值文本 + + + + + 值文本坐标垂直方向偏移量 + + + + + 值文本保留位数 + + + + + 值文本字体 + + + + + 值文本颜色 + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 获取仪表上半高度高度 + + + + + + 获取仪表下半高度高度 + + + + + + 转换文本坐标 + + 文本原始坐标 + 文本Size + 文本所在角度 + + + + + Meter渐变颜色 + + + + + 渐变范围值 0-1 + + + + + 渐变范围值对应颜色 + + + + + Meter渐变颜色集合 + + + + + Meter背景风格 + + + + + 圆盘 (圆弧固定位270度) + + + + + 仪表 (圆弧固定位180度) + + + + + 空(圆弧由ArcAngleSize 决定) + + + + + 多点滑块控件 + + + + + 滑块值更改事件 + + + + + 滑块值格式化事件 + + + + + 滑块激活的虚线框颜色(通用) + + + + + 显示方位 + + + + + 滑块集合 + + + + + 最大值 + + + + + 最小值 + + + + + 键盘Up、Down 或 鼠标滚轮上下键移动 最小间隔值 + + + + + 滑杆是否为圆角 + + + + + 滑杆厚度 + + + + + 滑杆停靠外边距 + + + + + 滑杆背景颜色 + + + + + 滑块是否启用受影响功能(可以通过键盘Ctrl+UpDown 或鼠标右键拖动 同时对多个滑块同时更改值) + + + + + 滑块直径 + + + + + 滑块边框颜色(通用) + + + + + 滑块背景颜色 + + + + + 滑块锁定颜色 + + + + + 是否显示标题提示 + + + + + 标题提示与滑块间距 + + + + + 标题提示文本字体 + + + + + 标题提示背景颜色 + + + + + 标题提示文本颜色 + + + + + 是否显示值提示 + + + + + 值提示与滑块间距 + + + + + 值提示文本字体 + + + + + 值提示背景颜色 + + + + + 值提示文本颜色 + + + + + 控件激活显示状态(配合Focused 、ShowFocusCues、activatedIndex使用) + + + + + 控件激活状态选项索引 + + + + + 当前鼠标已按下的对象索引 + + + + + 当前鼠标已按下的对象的value + + + + + 当前鼠标已按下的坐标 + + + + + 内容内边距 + + + + + 滑杆的开始坐标(以滑块矩形中心点为参考点) + + + + + 滑杆的结束坐标(以滑块矩形中心点为参考点) + + + + + 标题提示间距 + + + + + 值提示间距 + + + + + 初始化所有滑块Rectangle + + + + + 初始化指定滑块Rectangle + + 指定滑块 + 指定滑块的索引 + 最大最小值的值间距 + 内容区域 + MultidropSlide滑杆停靠外边距 + 滑块半径 + 滑块直径 + + + + 初始化指定滑块Rectangle + + 指定滑块 + + + + 滑块 + + + + + 滑块Key(必须唯一,可用于索引) + + + + + 滑块标题 + + + + + 滑块值(只修改自己值和触发自己事件,不影响其他滑块值) + + + + + 滑块值(修改自己值和触发自己事件,同时影响其他滑块值,直到遇到已锁滑块才终止影响) + + + + + 滑块激活的虚线框颜色(空值通用通用配置) + + + + + 滑块边框颜色(空值通用通用配置) + + + + + 滑块颜色(空值通用通用配置) + + + + + 滑块是否已锁定 + + + + + 滑块锁颜色(空值通用通用配置) + + + + + 提示标题背景颜色(空值通用通用配置) + + + + + 提示标题文本颜色(空值通用通用配置) + + + + + 提示值背景颜色(空值通用通用配置) + + + + + 提示值文本颜色(空值通用通用配置) + + + + + 选项所属的控件 + + + + + 滑块rect + + + + + 滑块开始坐标(滑块中心为参考点) + + + + + 滑块结束坐标(滑块中心为参考点) + + + + + 提示标题rect + + + + + 提示标题连线的开始坐标 + + + + + 提示标题连线的结束坐标 + + + + + 提示值rect + + + + + 提示值连线的开始坐标 + + + + + 提示值连线的结束坐标 + + + + + 修改滑块值,但不会触发任何事情 + + + + + + 修改滑块值(只修改自己值和触发自己事件,不影响其他滑块值) + + 要修改的滑块值 + 是否忽略自己的滑块锁 + + + + + 修改滑块值(修改自己值和触发自己事件,同时影响其他滑块值,直到遇到已锁滑块才终止影响) + + 要修改的滑块值 + 是否忽略自己的滑块锁 + + + + + 复制滑块 + + + + + + 滑块集合 + + + + + MultidropSlide显示方位 + + + + + 水平放置靠近上边 + + + + + 水平放置靠近下边 + + + + + 垂直放置靠近左边 + + + + + 垂直放置靠近右边 + + + + + 滑块值更改事件参数 + + + + + 触发ValueChanged的滑块 + + + + + 正处于ValueChanged的滑块 + + + + + 受ValueChanged影响的的其他滑块集合 + + + + + + + 触发ValueChanged的滑块 + 正处于ValueChanged的滑块 + 受ValueChanged影响的的其他滑块集合 + + + + 滑块值格式化事件参数 + + + + + 当前滑块 + + + + + 格式化后的值文本 + + + + + + + 当前滑块 + 格式化后的值文本 + + + + 面包屑导航控件 + + + + + 导航选项取消选中时事件 + + + + + 导航选项取消选中后事件 + + + + + 导航选项选中时事件 + + + + + 导航选项选中后事件 + + + + + 导航选项选中索引更改后事件 + + + + + 控件激活的虚线框颜色 + + + + + 分隔符号颜色(只限于 Symbol、ObliqueLine) + + + + + 风格 + + + + + 选项集合 + + + + + 选项是否自动宽度 + + + + + 选项固定宽度 + + + + + 选项最小宽度(自动宽度模式下) + + + + + 选项最大宽度(自动宽度模式下) + + + + + 第一个选项是否填满(只限于 Arrows、Parallelogram、RoundCap、Leaf) + + + + + 选项间隔距离 + + + + + 选项文本垂直方向间距 + + + + + 选项背景颜色(正常) + + + + + 选项文本颜色(正常) + + + + + 选项背景颜色(鼠标进入) + + + + + 选项文本颜色(鼠标进入) + + + + + 选项背景颜色(选中) + + + + + 选项文本颜色(选中) + + + + + 已选中选项索引 + + + + + 已选中选项 + + + + + 选项文本字体 + + + + + 控件激活显示状态(配合Focused 、ShowFocusCues、activatedIndex使用) + + + + + 控件激活状态选项索引(-1 没有、>=0 选项) + + + + + 当前鼠标已按下的对象 + + + + + 当前鼠标已进入的对象 + + + + + 开启抗锯齿功能xy都会增大1px + + + + + 初始化rect + + + + + + 根据字体计算控件高度 + + + + + + 面包屑导航选项 + + + + + 文本 + + + + + 选项背景颜色(正常)(空值表示采用通用设置) + + + + + 选项文本颜色(正常)(空值表示采用通用设置) + + + + + 选项背景颜色(鼠标进入)(空值表示采用通用设置) + + + + + 选项文本颜色(鼠标进入)(空值表示采用通用设置) + + + + + 选项背景颜色(选中)(空值表示采用通用设置) + + + + + 选项文本颜色(选中)(空值表示采用通用设置) + + + + + 自定义数据 + + + + + 选项所属的控件 + + + + + 选项背景RectF + + + + + 选项文字SizeF + + + + + 符号RectF + + + + + 不规则图形路径 + + + + + 刷新控件 + + + + + 重新计算并刷新控件 + + + + + 复制选项 + + + + + + 面包屑导航选项集合 + + + + + 面包屑导航选项操作后事件参数 + + + + + 导航选项 + + + + + + + 导航选项 + + + + 面包屑导航选项操作时事件参数 + + + + + 导航选项 + + + + + + + 导航选项 + + + + 面包屑导航选项风格 + + + + + 箭头 + + + + + 平行四边形 + + + + + 圆帽 + + + + + 叶子 + + + + + 四边形 + + + + + 符号 + + + + + 斜线 + + + + + 图案手势控件 + + + + + 手势完成事件 + + + + + 是否显示手势轨迹 + + + + + 图案颜色(正常) + + + + + 图案颜色(错误) + + + + + 当前鼠标已按下的对象 + + + + + 当前鼠标已按下的坐标 + + + + + 操作状态 + + + + + 已选中选项 + + + + + 选项集合 + + + + + 重置控件状态 + + + + + 初始化Rectangle + + + + + 操作完成触发 + + + + + 解锁图案选项 + + + + + 图案外rect + + + + + 图案内rect + + + + + 图案path + + + + + 图案中心point + + + + + 值 + + + + + PatternLock操作状态 + + + + + 正常(无任何操作) + + + + + 手势滑动中 + + + + + 手势刚完成 + + + + + 错误(无任何操作) + + + + + PatternLock手势完成事件参数 + + + + + 手势操作结果 + + + + + 返回操作结果(影响控件状态) + + + + + + + 手势操作结果 + 返回操作结果(影响控件状态) + + + + 动态图片显示控件 + + + + + 图片更改事件 + + + + + 活动帧的索引更改事件 + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 是否为动态图片 + + + + + 要显示的图片 + + + + + 图片总帧数 + + + + + 当前播放的帧索引 + + + + + 图像的框架维度的属性 + + + + + 是否已开启动画播放 + + + + + 开始循环播放动态图片 + + + + + 停止循环播放动态图片 + + + + + 当前帧更改事件 + + + + + + + 重置图片信息 + + + + + GifBox图片帧的索引更改事件参数 + + + + + 当前帧的索引 + + + + + 分块进度控件 + + + + + 块状态更改事件 + + + + + 块大小(像素) + + + + + 块数量 + + + + + 块颜色(正常) + + + + + 块颜色(处理中) + + + + + 块颜色(成功) + + + + + 块颜色(失败) + + + + + 网格颜色 + + + + + 块集合 + + + + + 获取指定块的状态 + + 块索引 + + + + 设置指定块的状态 + + 块索引 + 要设置块状态 + + + + 设置指定块的状态 + + 块索引集合 + 要设置块状态 + + + + 设置指定块的状态 + + 块索引集合 + 要设置块状态集合 + + + + 设置所有块为统一状态 + + 要设置的状态 + + + + 获取指定状态的块索引集合 + + 指定状态 + + + + + 获取指定状态的块总数 + + 指定状态 + + + + + 根据指定数量创建块集合 + + + + + + PieceProgress块状态更改事件参数 + + + + + 是否统一设置 + + + + + 块索引 + + + + + 块更改前状态 + + + + + 块更改后状态 + + + + + + + 是否统一设置 + 块索引集合 + 块更改前状态集合 + 块更改后状态集合 + + + + PieceProgress块状态 + + + + + 正常 + + + + + 处理中 + + + + + 成功 + + + + + 错误 + + + + + 步骤流程控件 + + + + + 已激活到的流程索引更改事件 + + + + + 流程节点方向位置 + + + + + 已激活到的流程节点索引 + + + + + 流程节点集合 + + + + + 流程节点Size + + + + + 流程节点间隔线Size + + + + + 流程节点间隔线颜色(正常) + + + + + 流程节点间隔线颜色(已激活) + + + + + 流程节点背景颜色(正常) + + + + + 流程节点背景颜色(已激活) + + + + + 是否显示流程节点索引 + + + + + 流程节点索引颜色(正常) + + + + + 流程节点索引颜色(已激活) + + + + + 流程节点文本间距偏移量 + + + + + 流程节点文本字体 + + + + + 流程节点文本颜色 + + + + + 是否显示提示信息 + + + + + 提示信息最大Size + + + + + 提示信息最小Size + + + + + 提示信息背景颜色 + + + + + 提示信息背景颜色 + + + + + 提示信息文本颜色 + + + + + 提示信息文本字体 + + + + + 提示信息 + + + + + 当前提示信息索引 + + + + + 文本格式 + + + + + 初始化流程节点rect + + + + + + 初始化流程节点rect + + + + + + 获取鼠标进入的流程节点索引 + + 当前鼠标坐标 + + + + + 显示指定索引流程提示信息 + + 指定流程索引 + + + + 隐藏提示 + + + + + 步骤流程节点 + + + + + 流程节点文本 + + + + + 步骤流程节点提示信息 + + + + + 选项所属的控件 + + + + + 流程节点rectf + + + + + 流程节点Path + + + + + 刷新控件 + + + + + 复制选项 + + + + + + 步骤流程节点集合 + + + + + Procedure布局方向 + + + + + 水平放置靠近上边 + + + + + 水平放置靠近下边 + + + + + 垂直放置靠近左边 + + + + + 垂直放置靠近右边 + + + + + 单选按钮控件 + + + + + 控件Checked状态更改事件 + + + + + 控件激活的虚线框颜色 + + + + + 控件显示风格 是按正常Check复选框风格显示,还是按Button按钮风格显示 + + + + + 单击时是否自动更改控件状态 + + + + + 是否已选中 + + + + + 在Check显示风格下鼠标操作有效范围 + + + + + 在Check显示风格下复选框的对齐方式 + + + + + 复选框大小 + + + + + 复选框与文本的间距 + + + + + 复选框背景色(未选中) + + + + + 复选框前景色(未选中) + + + + + 复选框背景色(已选中) + + + + + 复选框前景色(已选中) + + + + + 在Check显示风格下复选框的风格 + + + + + 获取在控件上显示的图像的ImageList + + + + + 未选中状态复选框图片 + + + + + 未选中状态复选框图片Index + + + + + 未选中状态复选框图片Key + + + + + 已选中状态复选框图片 + + + + + 已选中状态复选框图片Index + + + + + 已选中状态复选框图片Key + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 背景颜色(未选中、正常) + + + + + 文本颜色(未选中、正常) + + + + + 背景颜色(未选中、鼠标进入) + + + + + 文本颜色(未选中、鼠标进入) + + + + + 背景颜色(已选中、正常) + + + + + 文本颜色(已选中、正常) + + + + + 背景颜色(已选中、鼠标进入) + + + + + 文本颜色(已选中、鼠标进入) + + + + + 否根据内容自动调整控件的大小 + + + + + 内边距限于AutoSize + + + + + 在Check显示风格下背景颜色 + + + + + 在Check显示风格下文本颜色 + + + + + 文本字体 + + + + + 文本 + + + + + 鼠标按下类型 + + + + + 鼠标已进入对象 + + + + + 复选框rect + + + + + 文本rect + + + + + 控件要求Width + + + + + 控件要求Height + + + + + AutoSize切换中 + + + + + 初始化Rectangle + + + + + 更新控件size + + + + + 获取文本size + + + + + + 设置自己为选中状态,引发自己更改事件,并同步兄弟控件状态和引发更改事件 + + + + + 设置自己为未选中状态,引发自己更改事件,但不更改兄弟控件的状态 + + + + + 指定坐标是否在控件有效范围内 + + 指定坐标 + + + + + ImageList更改后刷新控件 + + + + + + + ImageList释放时解绑清除清除引用 + + + + + + + RadioButtonPlus控件显示方式 + + + + + 按正常Check复选框方式显示 + + + + + 按Button按钮方式显示 + + + + + RadioButtonPlus在Check显示方式下复选框的对齐方式 + + + + + 左边 + + + + + 顶部 + + + + + 右边 + + + + + 底部 + + + + + 中间 + + + + + RadioButtonPlus在Check显示方式下鼠标操作有效范围 + + + + + 鼠标在整个控件区域内操作有效 + + + + + 鼠标只在复选框内操作有效 + + + + + 鼠标只在复选框和文本内操作有效 + + + + + RadioButtonPlus在Check显示方式下复选框的风格 + + + + + 默认 + + + + + 符号 + + + + + 自定义图片 + + + + + 圆角容器 + + + + + 边框厚度 + + + + + 边框颜色 + + + + + 内容背景色(渐变开始) + + + + + 内容背景色(渐变结束) + + + + + 渐变开始色角度 + + + + + 圆角Size + + + + + 是否剪切为不规则形状 + + + + + 设置控件形状 + + + + + 手风琴菜单控件 + + + + + 背景绘制前事件 + + + + + 节点绘制前事件 + + + + + 节点绘制后事件 + + + + + 节点单击事件 + + + + + 选中节点更改事件 + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 是否允许多个同时展开 + + + + + 内容对其方式 + + + + + 节点集合(SingleAccordionCategoryNode、SingleAccordionLabelNode、SingleAccordionContentNode) + + + + + 标签节点样式(通用) + + + + + 类别节点样式(通用) + + + + + 内容节点样式(通用) + + + + + 滚动条 + + + + + 选中的内容节点 + + + + + 鼠标动画节点列表 + + + + + 展开折叠节点列表 + + + + + 自定义动画节点列表 + + + + + 菜单显示区 + + + + + 菜单真实区(不包含滚动条) + + + + + 菜单真实区Y偏移量 + + + + + 鼠标按下功能类型(-1空 、1节点按下、2滚动条按下) + + + + + 鼠标按下功能对象 + + + + + 鼠标按下功能坐标 + + + + + 鼠标按下滚动条时菜单真实区的Y坐标 + + + + + 鼠标进入的节点 + + + + + 控件正在初始化布局中 + + + + + 滚动条当前显示状态 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 展开或折叠所有节点 (Multiple=True 时展开才生效) + + 是否展开 + + + + 展开或折叠指定节点 + + 指定节点 + 是否展开 + 是否有动画效果 + + + + 查找已展开的节点 + + + + + + 添加自定义动画(key、target 组合作为索引) + + 动画类型标识 + 动画作用目标 + 自定义动画已使用时间 + 自定义动画总时间 + 自定义动画是否涉及控件内部布局计算 + 动画自定义数据 + + + + 移除自定义动画 + + 动画类型标识 + 动画作用目标 + + + + 查找自定义动画 + + 动画类型标识 + 动画作用目标 + + + + 设置指定内容节点为选中节点(但不触发SelectedNodeChanged事件) + + 内容节点 + + + + 根据鼠标坐标获取节点 + + 鼠标坐标(相对于控件) + 没有返回null + + + + 获取滚动条位置 + + + + + + 获取指定节点鼠标动画启用状态 + + 指定节点 + + + + + 获取指定节点鼠标动画总时间 + + 指定节点 + + + + + 获取指定节点左右滑动动画距离 + + 指定节点 + + + + + 获取指定节点上下外边距 + + 指定节点 + + + + + 获取指定节点文本外左右外边距 + + 指定节点 + + + + + 获取指定节点背景颜色 + + 指定节点 + + + + + 获取指定节点文本颜色 + + 指定节点 + + + + + 获取指定节点折叠按钮颜色 + + 指定节点 + + + + + 获取指定节点分隔线颜色 + + 指定节点 + + + + + 获取指定节点是否显示图片(根据显示状态、内容对齐方式) + + 指定节点 + + + + + 获取指定节点图片左右外边距(根据显示状态、内容对齐方式) + + 指定节点 + + + + + 获取指定节点图片Size(根据显示状态、内容对齐方式) + + 指定节点 + + + + + 获取指定节点图片 + + 指定节点 + + + + + 获取折叠图标显示状态(根据内容对齐方式) + + + + + + 获取折叠图标左右外边距(根据显示状态、内容对齐方式) + + + + + + 获取折叠图标Size(根据显示状态、内容对齐方式) + + + + + + 初始化控件Rect + + + + + 更新菜单真实区Rect + + + + + + 更新所有节点Rect + + + + + 更新滚动条Rect + + + + + 绘制标签节点 + + 画布 + 标签节点 + 标签节点背景画笔 + 标签节点文本画笔> + 分隔线画笔 + + + + 绘制类别节点 + + 画布 + 类别节点 + 类别节点背景画笔 + 类别节点文本画笔> + 折叠图标画笔 + 分隔线画笔 + + + + 绘制内容节点 + + 画布 + 内容节点 + 内容节点背景画笔 + 内容节点文本画笔> + 分隔线画笔 + + + + 根据左右动画状态获获取节点文本Rectangle + + + 节点 + 左右滑动动画距离 + 图片外左右边距 + 图片Size + 文本外左右边距 + 字体顶部补回空隙 + + + + + 获取类别节点容器高度 + + 类别节点 + + + + + 获取类别节点展开折叠图标旋转角度 + + 类别节点 + + + + + 获取鼠标进入节点 + + + + + + 查找并添加符合条件的节点到鼠标动画中 + + 这是鼠标坐标 + + + + 查找并移除符合条件的节点从鼠标动画中 + + + + + 开始动画计时器 + + + + + 停止动画计时器 + + + + + 获取滚动条显示状态 + + + + + + 滚动条命中测试(设计器使用) + + 坐标(相对于控件) + 返回是否在滚动条区域中 + + + + 类别节点命中测试(设计器使用) + + 坐标(相对于控件) + + + + + SingleAccordion对齐方式 + + + + + 左边 + + + + + 右边 + + + + + 居中 + + + + + SingleAccordion节点集合 + + + + + 添加节点 + + 节点(类型应该为 SingleAccordionLabelNode、SingleAccordionCategoryNode、SingleAccordionContentNode) + + + + + 添加节点 + + (类型应该为 SingleAccordionLabelNode、SingleAccordionCategoryNode、SingleAccordionContentNode) + + + + + 添加节点 + + 节点集合(类型应该为 SingleAccordionLabelNode、SingleAccordionCategoryNode、SingleAccordionContentNode) + + + + + 添加节点 + + 插入索引 + 节点(类型应该为 SingleAccordionLabelNode、SingleAccordionCategoryNode、SingleAccordionContentNode) + + + + 移除节点 + + 节点(类型应该为 SingleAccordionLabelNode、SingleAccordionCategoryNode、SingleAccordionContentNode) + + + + 移除节点 + + 节点(类型应该为 SingleAccordionLabelNode、SingleAccordionCategoryNode、SingleAccordionContentNode) + + + + SingleAccordion类别节点 + + + + + 折叠图标颜色(正常) + + + + + 折叠图标颜色(鼠标进入) + + + + + 节点是否展开 + + + + + 节点展开折叠动画状态 + + + + + 节点展开折叠已使用时间 + + + + + 内容节点集合 + + + + + 节点容器Rect + + + + + 复制节点 + + 是否复制子节点 + + + + + 获取节点鼠标动画启用状态(节点未添加到控件返回 false) + + + + + + 获取节点鼠标动画总时间(节点未添加到控件返回0) + + + + + + SingleAccordion类别节点样式(通用) + + + + + 展开折叠动画总时间(毫秒) + + + + + 是否启用节点鼠标动画 + + + + + 鼠标动画总时间(毫秒) + + + + + 左右滑动动画距离 + + + + + 高度 + + + + + 上下外边距 + + + + + 文本左右外边距 + + + + + 背景颜色(正常) + + + + + 文本颜色(正常) + + + + + 背景颜色(鼠标进入) + + + + + 文本颜色(鼠标进入) + + + + + 分割线颜色 + + + + + 是否显示图片 + + + + + 图片左右外边距 + + + + + 图片Size + + + + + 图片(通用) + + + + + 是否显示折叠图标 + + + + + 折叠按钮左右外边距 + + + + + 折叠图标Size + + + + + 折叠箭头方向是否往内 + + + + + 折叠图标颜色(正常) + + + + + 折叠图标颜色(鼠标进入) + + + + + 刷新控件 + + + + + 重新计算控件并刷新控件 + + + + + 内容节点集合 + + + + + 添加节点 + + 插入索引 + 节点(类型应该为 SingleAccordionContentNode) + + + + 移除节点 + + 节点(类型应该为 SingleAccordionContentNode) + + + + SingleAccordion内容节点 + + + + + 背景颜色(选中) + + + + + 文本颜色(选中) + + + + + 复制节点 + + 是否复制子节点 + + + + + 获取节点鼠标动画启用状态(节点未添加到控件返回 false) + + + + + + 获取节点鼠标动画总时间(节点未添加到控件返回0) + + + + + + SingleAccordion内容节点样式(通用) + + + + + 是否启用节点鼠标动画 + + + + + 鼠标动画总时间(毫秒) + + + + + 左右滑动动画距离 + + + + + 高度 + + + + + 上下外边距 + + + + + 文本左右外边距 + + + + + 背景颜色(正常) + + + + + 文本颜色(正常) + + + + + 背景颜色(鼠标进入) + + + + + 文本颜色(鼠标进入) + + + + + 背景颜色(选中) + + + + + 文本颜色(选中) + + + + + 分割线颜色 + + + + + 是否显示图片 + + + + + 图片左右外边距 + + + + + 图片Size + + + + + 图片(通用) + + + + + 刷新控件 + + + + + 重新计算控件并刷新控件 + + + + + SingleAccordion节点 + + + + + 是否启用节点鼠标动画(Auto采用通用设置) + + + + + 左右滑动动画距离(-1采用通用设置) + + + + + 上下外边距 + + + + + 文本左右外边距 (-1采用通用设置) + + + + + 节点文本 + + + + + 节点标识 + + + + + 节点自定义数据 + + + + + 背景颜色(正常) + + + + + 文本颜色(正常) + + + + + 背景颜色(鼠标进入) + + + + + 文本颜色(鼠标进入) + + + + + 是否显示分隔线 + + + + + 分隔线颜色 + + + + + 是否显示图片(Auto采用通用设置) + + + + + 图片左右外边距 + + + + + 图片Size + + + + + 图片 + + + + + 父节点(SingleAccordionCategoryNode) + + + + + 获取节点所属的控件 + + + + + 获取节点等级深度(0开始) + + + + + 鼠标是否进入节点 + + + + + 节点Rect + + + + + 节点鼠标动画状态 + + + + + 节点鼠标动画已使用时间 + + + + + 刷新控件 + + + + + 重新计算控件并刷新控件 + + + + + 复制节点 + + 是否复制子节点 + + + + + 获取节点鼠标动画启用状态 + + + + + + 获取节点鼠标动画总时间 + + + + + + SingleAccordion节点展开折叠动画状态 + + + + + 折叠中 + + + + + 已折叠 + + + + + 展开中 + + + + + 已展开 + + + + + SingleAccordion节点事件参数 + + + + + 当前节点 + + + + + + + 当前节点 + + + + SingleAccordion节点鼠标动画状态 + + + + + 鼠标已离开 + + + + + 鼠标离开中 + + + + + 鼠标已进入 + + + + + 鼠标进入中 + + + + + SingleAccordion滚动条 + + + + + 是否自动隐藏 + + + + + 滚动条厚度 + + + + + 滑条背景颜色 + + + + + 滑块最小Size + + + + + 滑块是否为圆角 + + + + + 滑块颜色(正常) + + + + + 滑块颜色(鼠标进入) + + + + + 滑条Rect + + + + + 滑块rect + + + + + 刷新控件 + + + + + 头像标签控件 + + + + + 边框颜色 + + + + + 背景颜色 + + + + + 头像图片 + + + + + 边框 + + + + + 设置控件形状 + + + + + 横向尺子控件 + + + + + 尺子缩放比例(真实像素/显示像素) + + + + + 主刻度倍数(主刻度为该数的倍数) + + + + + 零刻度线的开始坐标(像素) + + + + + 单位主刻度预设多少个像素 + + + + + 文本与次刻度间距 + + + + + 主刻度文本正负符号 + + + + + 主刻度文本颜色 + + + + + 主刻度线颜色 + + + + + 次刻度线颜色 + + + + + 是否显示高亮线 + + + + + 高亮线颜色 + + + + + 高亮线坐标(像素) + + + + + 设置高亮线坐标 + + x轴(像素) + + + + 设置高亮线坐标 + + 是否显示高亮线 + x轴(像素) + + + + 根据字体计算控件高度 + + + + + + 纵向尺子控件 + + + + + 尺子缩放比例(真实像素/显示像素) + + + + + 主刻度倍数(主刻度为该数的倍数) + + + + + 零刻度线的开始坐标(像素) + + + + + 单位主刻度预设多少个像素 + + + + + 文本与次刻度间距 + + + + + 主刻度文本正负符号 + + + + + 主刻度文本颜色 + + + + + 主刻度线颜色 + + + + + 次刻度线颜色 + + + + + 是否显示高亮线 + + + + + 高亮线颜色 + + + + + 高亮线坐标(像素) + + + + + 设置高亮线坐标 + + y轴(像素) + + + + 设置高亮线坐标 + + 是否显示高亮线 + y轴(像素) + + + + 根据字体计算控件宽度 + + + + + + 开关控件 + + + + + 开关状态更改中事件 + + + + + 开关状态更改后事件 + + + + + 控件激活的虚线框颜色 + + + + + 开关按钮风格 + + + + + 是否只读 + + + + + 开关状态 + + + + + 关闭状态文本 + + + + + 滑条颜色(关闭) + + + + + 滑块颜色(关闭) + + + + + 开启状态文本 + + + + + 滑条颜色(开启) + + + + + 滑块颜色(开启) + + + + + 鼠标按下类型 + + + + + 存放Switch信息 + + + + + 动画中 + + + + + 动画已使用的时间 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 设置相反状态 + + + + + 更改开关状态(不会触发 Toggleing、Toggled 事件) + + 是否为开启状态 + + + + 初始化控件Rectangle + + + + + 根据设置获取控件size + + + + + + 设置控件状态 + + + + + 存放ToggleSwitch信息 + + + + + 滑条rect + + + + + 滑块关闭rect + + + + + 滑块开启rect + + + + + 滑块当前rect + + + + + 滑块动画前rect + + + + + 开关按钮风格 + + + + + 默认 + + + + + 圆角对错符号 + + + + + 圆角缩放 + + + + + 平面矩形带文本 + + + + + TabControlPlus(TabControl增强版) + + + + + 菜单背景绘制前事件 + + + + + 菜单背景绘制后事件 + + + + + 导航按钮点击时事件 + + + + + 导航按钮点击后事件 + + + + + TabItem取消选中事件 + + + + + TabItem取消选后事件 + + + + + TabItem选中时事件 + + + + + TabItem选中后事件 + + + + + TabItem选中索引更改后事件 + + + + + TabItem启用状态更改事件 + + + + + 两个TabItem位置互换时事件 + + + + + 两个TabItem位置互换后事件 + + + + + TabItem背景绘制前事件 + + + + + TabItem背景绘制后事件 + + + + + TabItem生成选项自定义路径事件 + + + + + 菜单布局 + + + + + 菜单区域内边距 + + + + + 菜单背景颜色 + + + + + 是否显示导航栏 + + + + + 上一个按钮 + + + + + 下一个按钮 + + + + + 全局自定义按钮集合 + + + + + 是否启用通过鼠标交换TabItem位置 + + + + + 是否允许切换到已禁用的TabItem + + + + + TabItem是否纵向布局(限于左右两边) + + + + + TabItemSize(通用) + + + + + TabItem是否自动宽度(通用) + + + + + TabItem自动宽度模式下最小宽度(通用) + + + + + TabItem左右外边距(通用) + + + + + TabItem左右内边距(通用) + + + + + TabItem内容上下方向布局偏移量 + + + + + TabItem是否启用圆角抗锯齿功能 + + + + + TabItem圆角 + + + + + 在tabitem显示的总区域中要显示的第一个tabitem的索引 + + + + + TabItem文本对齐方式 + + + + + TabItem字体 + + + + + TabItem背景颜色(正常) + + + + + TabItem文本颜色(正常) + + + + + TabItem背景颜色(鼠标进入) + + + + + TabItem文本颜色(鼠标进入) + + + + + TabItem背景颜色(选中) + + + + + TabItem文本颜色(选中) + + + + + TabItem图标是否显示(通用) + + + + + TabItem图标Size + + + + + TabItem图标左右外边距 + + + + + TabItem关闭按钮是否显示(通用) + + + + + TabItem关闭按钮对齐方式 + + + + + TabItem关闭按钮Size + + + + + TabItem关闭按钮左右外边距 + + + + + TabItem按钮背景颜色(正常) + + + + + TabItem按钮背景颜色(鼠标进入) + + + + + TabItem按钮前景颜色(正常) + + + + + TabItem按钮前景颜色(鼠标进入) + + + + + 内容区域边框厚度 + + + + + 内容区域框边框颜色 + + + + + 内容区域背景色 + + + + + 内容区域Rect(排除外边框) + + + + + TabPage集合 + + + + + TabPage总数 + + + + + 已选中TabPage索引 + + + + + 已选中TabPage + + + + + 提示信息背景颜色 + + + + + 提示信息文本颜色 + + + + + 下拉面板 + + + + + 菜单rect(包含:内边距、内容) + + + + + 菜单rect(包含:内容) + + + + + 全局自定义按钮rect(包含:内容) + + + + + 导航栏rect(包含:内容) + + + + + tabitem显示的总区域(菜单rect减去全局自定义按钮rect减去导航栏rect) + + + + + 内容区域(包含:内容) + + + + + 在tabitem显示的总区域中要显示的第一个tabitem的索引 + + + + + 视觉上当前导航栏是否显示 + + + + + 用于存放TabPage数组 + + + + + 鼠标已按下的对象 + + + + + 鼠标已进入的对象 + + + + + 鼠标已进入的对象子选项 + + + + + 鼠标已进入要提示的对象 + + + + + 提示信息弹层 + + + + + 提示信息弹层拥有者 + + + + + 下拉面板 + + + + + 下拉面板浮层 + + + + + 下拉面板浮层容器 + + + + + 尾部添加TabPage页 + + 要添加的TabPage + + + + + 添加TabPage到指定索引位置 + + 指定索引位置 + 要添加的TabPage + + + + 移除所有TabPage + + + + + 移除指定索引的TabPage + + 指定索引 + + + + 设置指定索引的TabPage + + 指定索引 + 要设置的TabPage页 + + + + 设置指定索引TabPage为选中 + + 指定索引 + + + + 设置指定TabPage为选中 + + 指定TabPage + + + + 设置指定Name属性值的TabPage为选中 + + 指定Name属性值 + + + + 取消指定索引TabPage的选中状态 + + 指定索引 + + + + 取消指定TabPage的选中状态 + + 指定TabPage + + + + 取消指定Name属性值的TabPage的选中状态 + + 指定Name属性值 + + + + 查找指定TabPage的索引 + + 指定TabPage + 找不到返回-1 + + + + 调换两个TabItem的位置 + + 当前要移动的TabPage + 当前要移动的目标TabPage + + + + 根据指定索引返回TabPage + + 指定索引 + + + + + 根据指定索引返回TabPage + + 指定索引 + + + + + 获取TabPage数组 + + + + + + 获取TabPage数组 + + + + + + 鼠标是否进入指定选项 + + 指定TabPage + + + + + 判断坐标是否在导航栏按钮中(设计器使用) + + + + + + + 判断坐标是否在选卡项中(设计器使用) + + 坐标 + + + + + 获取指定选项是否为自动宽度 + + 指定TabPage + + + + + 获取指定选项自动宽度最小宽度 + + 指定TabPage + + + + + 获取指定TabPage左边外边距 + + 指定TabPage + + + + + + 获取指定TabPage左边内边距 + + 指定选项 + + + + + 获取指定TabPage右边内边距 + + 指定TabPage + + + + + 获取指定TabPage的背景颜色 + + 指定TabPage + + + + + 获取指定TabPage的文本颜色 + + 指定TabPage + + + + + 获取指定TabPage是否显示图标 + + 指定TabPage + + + + + 获取指定TabPage图标 + + 指定TabPage + 返回ico图片 + 返回ico图片是否为临时(如果是,用完需要手动释放) + + + + 获取指定TabPage是否显示关闭按钮 + + 指定TabPage + + + + + 获取指定TabPage自定义按钮的图片 + + 指定TabPage + 自定义按钮 + 返回按钮图片 + 返回按钮图片是否为临时(如果是,用完需要手动释放) + + + + 显示下拉面板 + + 相对于TabControlPlus控件RectangleF + + + + 隐藏下拉面板 + + + + + 初始化Rectangle + + + + + 更新每一个tabitem选项size + + + + + 更新菜单区域M_Rectangle(包含外边距)、C_Rectangle(排除外边距、边框、内边距) + + + + + + 根据ItemStartIndex更新每个TabItem的Rectangle信息 + + + + + 自动把左边需要显示tabitem显示在tabitem总显示区域中 + + + + + 自动把已选中tabitem显示在tabitem总显示区域中 + + + + + 根据tabitems总显示区更新主体Rectangle信息 + + + + + 设置TabPage的DisplayRectangle + + 要设置的TabPage + + + + 更新TabStop激活的控件 + + + + + 绘制菜单背景 + + + + + + 绘制全局按钮 + + + + + + 绘制导航栏 + + + + + + 绘制选项 + + + + + + 绘制选项背景 + + + 选项 + 选项剪切区域(包含:内边距、内容) + 背景画笔 + 背景画笔是否通用 + + + + 绘制选项图标 + + + 选项 + 选项剪切区域(包含:内容) + + + + 绘制选项文本 + + + 选项 + 选项剪切区域(包含:内容) + 文本画笔 + 文本画笔是否通用 + 字体顶部补回空隙 + 文本布局样式 + + + + 绘制选项自定义按钮 + + + 选项 + 选项剪切区域(包含:内容) + + + + 绘制选项关闭按钮 + + + 选项 + 选项剪切区域(包含:内容) + 关闭按钮背景色通用画笔(正常) + 关闭按钮背景色通用画笔(鼠标进入) + 关闭按钮背景色通用画笔(禁用) + 关闭按钮前景色通用画笔(正常) + 关闭按钮前景色通用画笔(鼠标进入) + 关闭按钮前景色通用画笔(禁用) + + + + 绘制内容区域 + + + + + + 获取视觉上全局自定义按钮是否显示 + + + + + + 获取全局自定义按钮的图片 + + 全局自定义按钮 + 返回按钮图片 + 返回按钮图片是否为临时(如果是,用完需要手动释放) + + + + 获取导航栏上一页按钮的颜色 + + 背景色 + 前景色 + + + + 获取导航栏上一页按钮的图片 + + 返回按钮图片 + 返回按钮图片是否为临时(如果是,用完需要手动释放) + + + + 获取导航栏下一页按钮的颜色 + + 背景色 + 前景色 + + + + 获取导航栏下一页按钮的图片 + + 返回按钮图片 + 返回按钮图片是否为临时(如果是,用完需要手动释放) + + + + 获取指定TabPage笔刷 + + 指定TabPage + + + + + + + + + + + + + + + + + + 视觉上TabItem是否正在tabtop_items_display_rect区域显示 + + 指定TabItem + + + + 判断指定TabPage是否选中 + + 指定TabPage + + + + + 设置指定索引TabPage为激活页 + + 要激活的TabPage + + + + 隐藏提示信息 + + + + + 显示提示信息 + + 要隐藏的部件 + + + + 重写TabControlPlus只允许添加TabPagePlus类型的子控件 + + + + + 全局自定义按钮 + + + + + 全局自定义按钮单击事件 + + + + + 按钮Key(必须唯一,可用于索引) + + + + + 按钮是否显示 + + + + + 按钮启用状态 + + + + + 按钮Size + + + + + 按钮左右外边距 + + + + + 按钮提示文本 + + + + + 按钮图片(正常) + + + + + 按钮图片(鼠标进入) + + + + + 按钮自定义保存数据 + + + + + 按钮rect(包含:外边距、内边距、内容) + + + + + 按钮rect(只包含:内容) + + + + + 全局自定义按钮所属TabControl + + + + + 控件重绘 + + + + + 控件重新初始化和重绘 + + + + + 设置全局自定义按钮所属的控件 + + 设置全局自定义按钮所属的控件 + + + + 获取按钮Rectangle信息(只包含:内容) + + + + + + 全局自定义按钮集合 + + + + + 全局自定义按钮集合 + + + + + 全局自定义按钮所属TabControl + + + + + + + 全局自定义按钮所属TabControl + + + + 全局自定义按钮事件参数 + + + + + 全局自定义按钮 + + + + + + + 全局自定义按钮 + + + + 菜单背景绘制后事件参数 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + + + + + 菜单区域(包含:内边距、内容) + + + + + 菜单区域(只包含:内容) + + + + + 菜单剪辑区域(包含:内边距、内容) + + + + + + + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + 当前选项区域(包含:内边距、内容) + 当前选项区域(只包含:内容) + 当前选项剪辑区域(包含:内边距、内容) + + + + 菜单背景绘制前事件参数 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + + + + + 菜单区域(包含:内边距、内容) + + + + + 菜单区域(只包含:内容) + + + + + 菜单剪辑区域(包含:内边距、内容) + + + + + 菜单背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + + + + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + 当前选项区域(包含:内边距、内容) + 当前选项区域(只包含:内容) + 当前选项剪辑区域(包含:内边距、内容) + 当前选项背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + 菜单布局 + + + + + 控件的顶部 + + + + + 控件的底部 + + + + + 控件的左边 + + + + + 控件的右边 + + + + + 导航栏按钮操作后事件参数 + + + + + 导航栏按钮类型 + + + + + 当前选项卡左边出现的第一个选项索引 + + + + + + + 当前选项卡左边出现的第一个选项索引 + + + + 导航栏按钮操作时事件参数 + + + + + 导航栏按钮类型 + + + + + 当前选项卡左边出现的第一个选项索引 + + + + + 当前选项卡左边出现的第一个选项要切换到的索引 + + + + + + + 导航栏按钮类型 + 当前选项卡左边出现的第一个选项的索引 + 当前选项卡左边出现的第一个选项要切换到的索引 + 是否取消操作 + + + + 导航栏按钮 + + + + + 导航栏按钮风格 + + + + + 导航栏按钮左右外边距 + + + + + 导航栏按钮Size + + + + + 导航栏按钮背景颜色(正常) + + + + + 导航栏按钮背景颜色(鼠标进入) + + + + + 导航栏按钮前景颜色(正常) + + + + + 导航栏按钮前景颜色(鼠标进入) + + + + + 导航栏按钮图片(正常) + + + + + 导航栏按钮图片(鼠标进入) + + + + + 导航栏按钮rect(包括外边距) + + + + + 导航栏按钮rect(不包括外边距、边框、内边距) + + + + + 导航栏按钮所属TabControl + + + + + 导航栏按钮所属TabControl + + + + + + 控件重新初始化和重绘 + + + + + 控件重绘 + + + + + 导航栏按钮风格 + + + + + 默认 + + + + + 图片 + + + + + 导航栏按钮类型 + + + + + 上一页 + + + + + 下一页 + + + + + TabControlPlus下拉面板 + + + + + 列表区域Rect + + + + + 真实列表区域Rect + + + + + 鼠标按下对象 + + + + + 鼠标按下对象的坐标 + + + + + 鼠标进入对象 + + + + + 代表滚动条对象 + + + + + 所属控件 + + + + + 初始化控件Rect + + + + + 初始化列表区域Rect + + + + + 初始化真实列表区域Rect + + + + + 初始化滚动条Rect + + + + + 初始化控件状态 + + + + + 更新滑块的RectLocation + + + + + 获取滚动条当前显示状态 + + + + + + 更新所有选项Rect + + + + + 根据坐标查找鼠标所在的选项 + + 坐标 + 没有为null + + + + 滚动条移动或鼠标滚轮移动 + + + + + + 下拉框选项分割线风格 + + + + + 没有 + + + + + 普通线条 + + + + + 渐变线 + ] + + + + TabControlPlus下拉面板配置 + + + + + 下拉框边框颜色 + + + + + 下拉框最大Size + + + + + 是否显示选项图标 + + + + + 下拉框选项高度 + + + + + 下拉框选项左右内边距 + + + + + 下拉框选项字体 + + + + + 下拉框选项背景颜色(正常) + + + + + 下拉框选项文本颜色(正常) + + + + + 下拉框选项背景颜色(鼠标进入) + + + + + 下拉框选项文本颜色(鼠标进入) + + + + + 下拉框选项分割线风格 + + + + + 下拉框选项分割线颜色 + + + + + 下拉框滚动条滑条厚度 + + + + + 下拉框滚动条滑条背景颜色 + + + + + 下拉框滚动条滑块最小高度 + + + + + 下拉框滚动条滑块背景颜色(正常) + + + + + 下拉框滚动条滑块背景颜色(鼠标进入) + + + + + 下拉框滚动条滑条Rect + + + + + 下拉框滚动条滑块rect + + + + + TabItem自动宽度模式 + + + + + 采用控件通用设置 + + + + + 显示 + + + + + 不显示 + + + + + TabItem关闭后事件参数 + + + + + 关闭按钮所属的TabPage + + + + + 关闭按钮 + + + + + + + 关闭按钮所属的TabPage + 关闭按钮 + + + + TabItem关闭时事件参数 + + + + + 关闭按钮所属的TabPage + + + + + 关闭按钮 + + + + + + + 关闭按钮所属的TabPage + 关闭按钮 + 是否取消关闭 + + + + TabItem关闭按钮绘制前事件参数 + + + + + 关闭按钮所属的TabPage + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面( 当前 Clip=ItemClipBounds_C ) + + + + + 关闭按钮背景颜色画笔(会自动释放) + + + + + 关闭按钮前景颜色画笔(会自动释放) + + + + + 导航栏区域 (包含:内边距、内容) + + + + + 导航栏区域 (包含:内容) + + + + + 当前选项剪辑区域 (包含:内容) + + + + + 关闭按钮区域(包含:外边距、内容) + + + + + 关闭按钮区域(只包含:内容) + + + + + 关闭按钮剪辑区域(包含:内容) + + + + + 关闭按钮背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + + + + 关闭按钮所属的TabPage + 系统缩放比例 + 封装一个GDI+绘图图面( 当前 Clip=ItemClipBounds_C ) + 关闭按钮背景颜色画笔(会自动释放) + 关闭按钮前景颜色画笔(会自动释放) + 导航栏区域 (包含:内边距、内容) + 导航栏区域 (包含:内容) + 当前选项剪辑区域 (包含:内容 + 关闭按钮区域(包含:外边距、内边距、内容) + 关闭按钮区域(只包含:内容) + 关闭按钮剪辑区域(包含:内边距、内容) + 关闭按钮背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + TabItem关闭按钮 + + + + + TabItem关闭按钮是否显示(Auto表示采用控件通用设置) + + + + + TabItem使用状态是否已启动 + + + + + TabItem按钮背景颜色(正常) + + + + + TabItem按钮背景颜色(鼠标进入) + + + + + TabItem按钮前景颜色(正常) + + + + + TabItem按钮前景颜色(鼠标进入) + + + + + 选项关闭按钮rect(包括外边距) + + + + + 选项关闭按钮rect(不包括内外边距) + + + + + 自定义保存数据 + + + + + TabItem关闭按钮所属TabPage + + + + + TabItem关闭按钮所属TabPage + + + + + + 控件重绘 + + + + + 控件重新初始化和重绘 + + + + + TabItem关闭按钮是否显示 + + + + + 采用控件通用设置 + + + + + 显示 + + + + + 不显示 + + + + + TabItem关闭按钮对齐方式(通用配置) + + + + + 左边 + + + + + 右边 + + + + + TabItem生成选项自定义路径前事件参数 + + + + + TabPage + + + + + 系统缩放比例 + + + + + 导航栏区域 (包含:内边距、内容) + + + + + 导航栏区域 (包含:内容) + + + + + 允许显示所有选项的总剪辑区域 (包含:内容) + + + + + 当前选项区域(包含:外边距、内边距、内容) + + + + + 当前选项区域(包含:内边距、内容) + + + + + 当前选项区域(只包含:内容) + + + + + 当前选项生成形状GraphicsPath路径 ( 一般用选项的 Bounds_P 范围生成 ) + + + + + 当前选项生成自定义路径是否处理完毕(True 将会跳过控件的默认生成) + + + + + + + TabPage + 系统缩放比例 + 导航栏区域 (包含:内边距、内容) + 导航栏区域 (包含:内容) + 允许显示所有选项的总剪辑区域 (包含:内容) + 当前选项区域(包含:外边距、内边距、内容) + 当前选项区域(包含:内边距、内容) + 当前选项区域(只包含:内容) + 当前选项背景绘制是否已处理完毕 (True 将会跳过控件的默认绘制) + + + + TabItem自定义按钮绘制后事件参数 + + + + + 自定义按钮所属的TabPage + + + + + 自定义按钮 + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面( 当前 Clip=ItemClipBounds_C ) + + + + + 导航栏区域 (包含:内边距、内容) + + + + + 导航栏区域 (包含:内容) + + + + + 当前选项剪辑区域 (包含:内容) + + + + + 自定义按钮区域(包含:外边距、内容) + + + + + 自定义按钮区域(只包含:内容) + + + + + 自定义按钮剪辑区域(只包含:内容) + + + + + + + 自定义按钮所属的TabPage + 自定义按钮 + 系统缩放比例 + 封装一个GDI+绘图图面( 当前 Clip=ClipBounds_P ) + 导航栏区域 (包含:内边距、内容) + 导航栏区域 (包含:内容) + 当前选项剪辑区域 (包含:内容) + 自定义按钮区域(包含:外边距、内容) + 自定义按钮区域(只包含:内容) + 自定义按钮剪辑区域(包含:内容) + + + + TabItem自定义按钮 + + + + + TabItem自定义按钮单击事件 + + + + + TabItem自定义按钮checked更改事件 + + + + + TabItem自定义按钮绘制后事件 + + + + + 按钮Key(必须唯一,可用于索引) + + + + + 按钮是否显示 + + + + + 按钮使用状态 + + + + + 按钮Size + + + + + 按钮左右外边距 + + + + + 按钮提示文本 + + + + + 按钮图片(正常) + + + + + 按钮图片(鼠标进入) + + + + + 按钮是否为check按钮 + + + + + 按钮为check按钮时是否选中 + + + + + 按钮图片(已选中正常) + + + + + 按钮图片(已选中鼠标进入) + + + + + 按钮rect(包含:外边距、内边距、内容) + + + + + 按钮rect(只包含:内容) + + + + + 自定义保存数据 + + + + + TabItem自定义按钮所属TabPage + + + + + 设置自定义按钮所属的TabPage + + 设置自定义按钮所属的TabPage + + + + 控件重绘 + + + + + 控件重新初始化和重绘 + + + + + TabItem自定义按钮集合 + + + + + TabItem自定义按钮集合 + + + + + 自定义按钮所属TabPage + + + + + + + 自定义按钮所属TabPage + + + + TabItem自定义按钮操作事件参数 + + + + + 自定义按钮所属的TabPage + + + + + 自定义按钮 + + + + + + + 当前单击的TabPageBaseExt + 当前单击的自定义按钮 + + + + TabItem背景绘制后事件参数 + + + + + TabPage + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + + + + + 导航栏区域 (包含:内边距、内容) + + + + + 导航栏区域 (包含:内容) + + + + + 允许显示所有选项的总剪辑区域 (包含:内容) + + + + + 当前选项区域(包含:外边距、内边距、内容) + + + + + 当前选项区域(包含:内边距、内容) + + + + + 当前选项区域(只包含:内容) + + + + + 当前选项剪辑区域(包含:内边距、内容) + + + + + + + TabPage + 系统缩放比例 + 封装一个GDI+绘图图面 ( 当前 Clip=ClipBounds_P ) + 导航栏区域 (包含:内边距、内容) + 导航栏区域 (包含:内容) + 允许显示所有选项的总剪辑区域 (包含:内容) + 当前选项区域(包含:外边距、内边距、内容) + 当前选项区域(包含:内边距、内容) + 当前选项区域(只包含:内容) + 当前选项剪辑区域(包含:内边距、内容) + + + + TabItem图标绘制后事件参数 + + + + + 图标所属的TabPage + + + + + 系统缩放比例 + + + + + 封装一个GDI+绘图图面( 当前 Clip=ItemClipBounds_C ) + + + + + 导航栏区域 (包含:内边距、内容) + + + + + 导航栏区域 (包含:内容) + + + + + 当前选项剪辑区域 (包含:内容) + + + + + 图标区域(包含:外边距、内容) + + + + + 图标区域(只包含:内容) + + + + + 图标剪辑区域(包含:内容) + + + + + + + 图标所属的TabPage + 系统缩放比例 + 封装一个GDI+绘图图面( 当前 Clip=ClipBounds_P ) + 导航栏区域 (包含:内边距、内容) + 导航栏区域 (包含:内容) + 当前选项剪辑区域 (包含:内容) + 图标区域(包含:外边距、内容) + 图标区域(只包含:内容) + 图标剪辑区域(包含:内容) + + + + TabItem图标是否显示 + + + + + 采用控件通用设置 + + + + + 显示 + + + + + 不显示 + + + + + 两个TabItem位置互换后事件参数 + + + + + 当前要移动的TabPage + + + + + 当前要移动的目标TabPage + + + + + + + 当前要移动的TabPage + 当前要移动的目标TabPage + + + + 两个TabItem位置互换时事件参数 + + + + + 当前要移动的TabPage + + + + + 当前要移动的目标TabPage + + + + + + + 当前要移动的TabPage + 当前要移动的目标TabPage + 是否取消操作 + + + + TabItem操作后事件参数 + + + + + TabPage + + + + + + + TabPage + + + + TabItem操作时事件参数 + + + + + TabPage + + + + + + + TabPage + 是否取消操作 + + + + TabPagePlus(TabPage增强版) + + + + + TabItem图标绘制后事件 + + + + + TabItem关闭时事件 + + + + + TabItem关闭后事件 + + + + + TabItem关闭按钮绘制前事件 + + + + + TabItem启用状态 + + + + + TabItem是否为自动宽度 + + + + + TabItem自动宽度最小宽度(-1表示采用通用设置) + + + + + TabItem固定宽度(-1表示采用通用设置) + + + + + TabItem左右外边距(-1, -1表示采用通用设置) + + + + + TabItem左右内边距(-1, -1表示采用通用设置) + + + + + TabItem文本是否垂直布局(限于左右两边) + + + + + TabItem文本超出范围是否使用省略号代替 + + + + + TabItem背景颜色(正常) + + + + + TabItem背景颜色(鼠标进入) + + + + + TabItem背景颜色(选中) + + + + + TabItem文本颜色(正常) + + + + + TabItem文本颜色(鼠标进入) + + + + + TabItem文本颜色(选中) + + + + + 鼠标是否已进入该选项 + + + + + TabItem图标是否显示 + + + + + TabItem图标 + + + + + TabItem关闭按钮 + + + + + TabItem自定义按钮集合 + + + + + 选项rect(包含:外边距、内边距、内容) + + + + + 选项rect(包含:内边距、内容) + + + + + 选项rect(只包含:内容) + + + + + 选项Size(只包含:内容) + + + + + 选项GraphicsPath(一般用选项的NoClipPaddingBounds范围生成) + + + + + 选项图标Size + + + + + 选项图标rect(不包括内外边距) + + + + + 选项图标rect(包括外边距) + + + + + 下拉面板选项文本Size + + + + + 选项文本Size + + + + + 选项文本rect(排除外边距、边框、内边距) + + + + + 文本的垂直布局字符串 + + + + + 下拉面板选项Rect + + + + + + + TabItem文本 + + + + + + TabItem名称(可用于索引,必须唯一) + TabItem文本 + + + + 更新垂直方向文本 + + + + + TabPagePlus集合 + + + + + TabPagePlus子控件集合 + + + + + 温度计控件 + + + + + Value值更改事件 + + + + + Value改变时是否采用动画方式 + + + + + Value改变时使用动画的时间(毫秒) + + + + + 最大值 + + + + + 最小值 + + + + + 值 + + + + + 玻璃管直径 + + + + + 玻璃管边框厚度 + + + + + + 玻璃管边框颜色 + + + + + 玻璃管内背景颜色 + + + + + 玻璃管值颜色 + + + + + 是否显示刻度线 + + + + + 主刻度线间的位置 + + + + + 刻度线对齐方式 + + + + + 主刻度线长度 + + + + + 主刻度线颜色 + + + + + 是否显示主刻度线文本 + + + + + 主刻度线文本字体 + + + + + 主刻度线文本颜色 + + + + + 一个主刻度分割成多少个子刻度 + + + + + 子刻度颜色 + + + + + 玻璃管rect(排除顶部圆角和底部玻璃球部分) + + + + + 玻璃球rect + + + + + 动画开始值 + + + + + 动画结束值 + + + + + 动画当前值 + + + + + 动画已使用的时间 + + + + + 内容内边距 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 初始化Rectangle + + + + + Thermometer刻度线对齐方式 + + + + + 左 + + + + + 右 + + + + + 毫秒级别计时器 + + + + + 计时器间隔引发事件 + + + + + 获取或设置在相对于上一次发生的Tick 事件引发的时间(以毫秒为单位)。 + + + + + 获取或设置计时器是否正在运行。 + + + + + 计时器分辨率的信息 + + + + + 计时器分辨率的信息 + + + + + 作为fptc参数的函数指针 + + + + + 计时器标识 + + + + + 查询计时器设备以确定其分辨率成功 + + + + + 当计时器到期时,系统将调用fptc参数指向的函数。 + + + + + 此结构包含有关计时器分辨率的信息。单位是ms + + + + + 支持的最小期限。 + + + + + 支持的最大期限。 + + + + + 此函数启动指定的计时器事件。 + + 事件延迟,以毫秒为单位。如果该值不在计时器支持的最小和最大事件延迟范围内,则该函数返回错误。 + 计时器事件的分辨率,以毫秒为单位。分辨率越高,分辨率越高;零分辨率表示周期性事件应该以最大可能的精度发生。但是,为减少系统开销,应使用适合您的应用程序的最大值。 + 如果fuEvent指定TIME_CALLBACK_EVENT_SET或TIME_CALLBACK_EVENT_PULSE标志,则fptc参数将解释为事件对象的句柄。事件将在单个事件完成时设置或发出脉冲,或者在周期性事件完成时定期设置或触发。对于fuEvent的任何其他值,fptc参数将被解释为函数指针。 + 用户提供的回调数据。 + 计时器事件类型。下表显示了fuEvent参数可以包含的值。 + + + + + 此功能取消指定的计时器事件。 + + 要取消的计时器事件的标识符。此标识符由timeSetEvent函数返回,该函数启动指定的计时器事件。 + + + + + 此函数查询计时器设备以确定其分辨率。 + + 指向TIMECAPS结构的指针。该结构充满了有关计时器设备分辨率的信息。 + TIMECAPS结构的大小(以字节为单位)。 + 如果成功,则返回TIMERR_NOERROR,如果未能返回计时器设备功能,则返回TIMERR_STRUCT。 + + + + 启动定时器 + + + + + 暂停定时器 + + + + + 重新开始定时器 + + + + + ToolTipPlus提示控件 + + + + + 提示框出现位置 + + + + + 提示框出现位置与拥有者的距离(只限于 Show 方法有效) + + + + + 最大Size + + + + + 最小Size + + + + + 文本字体 + + + + + 是否显示边框 + + + + + 边框颜色 + + + + + 是否显示标题 + + + + + 提示框标题布局 + + + + + 标题 + + + + + 标题背景颜色 + + + + + 标题文本颜色 + + + + + 内容内边距 + + + + + 设置与指定控件关联的工具提示文本,然后在指定的相对位置以模式方式显示该工具提示。 + + 包含新工具提示文本的 System.String。 + 要为其显示工具提示的 System.Windows.Forms.Control。 + 重新定义关联控件窗口的rect信息( Rectangle.Empty 值时不会重新定义) + 工具提示的位置 + + + + 设置与指定控件关联的工具提示文本,然后在指定的相对位置以模式方式显示该工具提示。 + + 包含新工具提示文本的 System.String。 + 要为其显示工具提示的 System.Windows.Forms.Control。 + 重新定义关联控件窗口的rect信息 + 工具提示的位置 + 包含工具提示持续显示时间(以毫秒为单位)的 System.Int32。 + + + + 通过文本计算工具提示大小(text为null时根据control的提示文本计算) + + 要为其检索 System.Windows.Forms.ToolTip 文本的 System.Windows.Forms.Control。 + 要计算的指定文本 + 要计算的标题 + + + + + 提示框出现位置 + + + + + 顶部居中 + + + + + 左边居中 + + + + + 右边居中 + + + + + 下边居中 + + + + + 提示框标题布局 + + + + + 顶部 + + + + + 左边 + + + + + 右边 + + + + + 下边 + + + + + 滑块控件 + + + + + Value值更改事件 + + + + + 滑块激活的虚线框颜色 + + + + + 显示方位 + + + + + 显示风格 + + + + + 最大值 + + + + + 最小值 + + + + + 值 + + + + + 键盘Up、Down 或 鼠标滚轮上下键移动 最小间隔值 + + + + + 是否启用鼠标单击滑杆修改值功能 + + + + + 滑杆厚度 + + + + + 滑杆背景颜色 + + + + + 滑杆背景渐变颜色集合 + + + + + 滑杆值颜色 + + + + + 滑杆值渐变颜色集合 + + + + + 滑块直径 (只限于 Excircle、Square 风格) + + + + + 滑块边框颜色 + + + + + 滑块背景颜色 + + + + + 是否显示刻度 + + + + + 刻度线厚度 + + + + + 刻度线是否加粗 + + + + + 刻度线颜色 + + + + + 刻度线间的位置数 + + + + + 当前鼠标已按下的对象 + + + + + 当前鼠标已按下的对象的value + + + + + 当前鼠标已按下的坐标 + + + + + 控件内边距 + + + + + 滑杆rect + + + + + 滑块rect + + + + + 滑块Path + + + + + 滑块开始坐标(滑块中心为参考点) + + + + + 滑块结束坐标(滑块中心为参考点) + + + + + 初始化Rectangle + + + + + 根据设置计算控件高度 + + + + + + 自动根据设置更新控件Size + + + + + 获取渐变画笔 + + 渐变颜色集合 + 要渐变区域 + 渐变角度 + + + + + TrackBarPlus渐变颜色 + + + + + 渐变范围值 0-1 + + + + + 渐变范围值对应颜色 + + + + + TrackBarPlus渐变颜色集合 + + + + + TrackBarPlus显示方位 + + + + + 水平放置靠近上边 + + + + + 水平放置靠近下边 + + + + + 垂直放置靠近左边 + + + + + 垂直放置靠近右边 + + + + + TrackBarPlus显示风格 + + + + + 外圆 + + + + + 内圆 + + + + + 方形 + + + + + 水波纹控件 + + + + + 值更改事件 + + + + + 动画是否启动 + + + + + 外观风格 + + + + + 边框厚度 + + + + + 边框颜色 + + + + + 水波纹Size + + + + + 水波纹移动速度(特定时间内移动像素) + + + + + 水波纹背景颜色 + + + + + 水波纹后方颜色 + + + + + 水波纹前方颜色 + + + + + 是否显示进度值 + + + + + 进度值(0-100) + + + + + 进度值颜色 + + + + + 水波纹移动距离 + + + + + 前面水波纹坐标 + + + + + 后面水波纹坐标 + + + + + 水波纹动画累加时间 + + + + + 动画控件动画中要处理的内容(不能时耗时操作) + + 动画定时器间隔时间 + + + + 初始化水波纹Rectangle + + + + + 设置控件形状 + + + + + 水波纹风格 + + + + + 四边形 + + + + + 圆形 + + + + diff --git a/LargeSquareOne/Lib/PLCCommunication.dll b/LargeSquareOne/Lib/PLCCommunication.dll new file mode 100644 index 0000000..1993b11 Binary files /dev/null and b/LargeSquareOne/Lib/PLCCommunication.dll differ diff --git a/LargeSquareOne/NLog.config b/LargeSquareOne/NLog.config new file mode 100644 index 0000000..16f7a46 --- /dev/null +++ b/LargeSquareOne/NLog.config @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LargeSquareOne/Program.cs b/LargeSquareOne/Program.cs new file mode 100644 index 0000000..a2319cb --- /dev/null +++ b/LargeSquareOne/Program.cs @@ -0,0 +1,148 @@ +using JinYuan.ControlCenters; +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + internal static class Program + { + #region 调用系统API + + [DllImport("User32.dll")] + private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); + + [DllImport("User32.dll")] + private static extern bool SetForegroundWindow(IntPtr hWnd); + + private const int SW_MAXIMIZE = 3; + + #endregion 调用系统API + + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + string strname = Process.GetCurrentProcess().ProcessName; + int a = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Count(); + if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Count() > 1) + { + MessageBox.Show("软件已经启动,请在后台确认。"); + Thread.Sleep(1000); + Environment.Exit(0); + return; + } + + Process instance = GetRunningInstance(); + if (instance == null) + { + AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + ClearMemoryHelper.ClearMemory(); + ReadConfig(); + try + { + //if (!CommonMethods.sysConfig.SwipeCardMode) + { + FrmLogin frm = new FrmLogin(); + if (frm.ShowDialog() == DialogResult.OK) + { + Application.Run(new FrmMain()); + } + } + + } + catch (Exception ex) + { + MessageBox.Show($"退出异常:{ex.Message}\n{ex.StackTrace}", "退出告警"); + } + } + else + { + // 激活以前的实例 + HandleRunningInstance(instance); + } + } + + /// + /// 配置,数据库初始化 + /// + public static void ReadConfig() + { + //LogHelper.Instance.InitLog(Application.StartupPath + "\\Logs\\"); + LogHelper.Instance.InitLog("D:\\APILog\\Logs\\"); + // 读取 XML 文件 + CommonMethods.Configxml = CommonMethods.ReadXmlConfig(CommonMethods.xmlFilePath); + string MySlqconnString1 = ConfigurationManager.ConnectionStrings["mysql"].ToString();//本地 + string MySlqconnString2 = ConfigurationManager.ConnectionStrings["mysql2"].ToString();//远端 + string strDBType = ConfigurationManager.AppSettings["DefaultDb"].ToString(); + var connDbType = (SqlSugar.DbType)Enum.Parse(typeof(SqlSugar.DbType), strDBType); + CommonMethods.db.SetConnectionStr(MySlqconnString1, SqlSugar.DbType.MySql); + CommonMethods.dbServer.SetConnectionStr(MySlqconnString2, SqlSugar.DbType.MySql); + CommonMethods.sysConfig.SwipeCardMode = Convert.ToBoolean(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "EnableCardMode", "false"));//开启刷卡模式? + } + + + /// + /// 当某个异常未被捕获时出现,回调方法 + /// + /// + /// + private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + try + { + Exception ex = (Exception)e.ExceptionObject; + + LogHelper.Instance.WriteEX(ex); + MessageBox.Show($"程序出现大异常,请联系 【金源自动化软件设计部】。\r\n异常信息: {ex.Message}\r\n异常堆栈:{ex.StackTrace}", + "致命错误", MessageBoxButtons.OK, MessageBoxIcon.Stop); + } + finally + { + Application.Exit(); + } + } + + /// + /// 返回正在运行的程序进程 + /// + /// + public static Process GetRunningInstance() + { + Process current = Process.GetCurrentProcess(); + Process[] processes = Process.GetProcessesByName(current.ProcessName); + + foreach (Process process in processes) + { + if (process.Id != current.Id) + if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) + return process; + } + return null; + } + + /// + /// 已经有了就把它激活,并将其窗口放置最前端 + /// + /// + public static void HandleRunningInstance(Process instance) + { + ShowWindowAsync(instance.MainWindowHandle, SW_MAXIMIZE); + SetForegroundWindow(instance.MainWindowHandle); + } + } +} diff --git a/LargeSquareOne/Properties/AssemblyInfo.cs b/LargeSquareOne/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..11fd554 --- /dev/null +++ b/LargeSquareOne/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("LargeSquareOne")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LargeSquareOne")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("29e1f0d0-43dc-4077-a136-f25477e56881")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/LargeSquareOne/Properties/Resources.Designer.cs b/LargeSquareOne/Properties/Resources.Designer.cs new file mode 100644 index 0000000..83a4882 --- /dev/null +++ b/LargeSquareOne/Properties/Resources.Designer.cs @@ -0,0 +1,591 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace LargeSquareOne.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("LargeSquareOne.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap _25_密码 { + get { + object obj = ResourceManager.GetObject("25_密码", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Alarm { + get { + object obj = ResourceManager.GetObject("Alarm", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Alarm1 { + get { + object obj = ResourceManager.GetObject("Alarm1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap BackGround { + get { + object obj = ResourceManager.GetObject("BackGround", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Blink { + get { + object obj = ResourceManager.GetObject("Blink", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Current { + get { + object obj = ResourceManager.GetObject("Current", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap error { + get { + object obj = ResourceManager.GetObject("error", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap eve { + get { + object obj = ResourceManager.GetObject("eve", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Exit { + get { + object obj = ResourceManager.GetObject("Exit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Exit1 { + get { + object obj = ResourceManager.GetObject("Exit1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Fault { + get { + object obj = ResourceManager.GetObject("Fault", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Green { + get { + object obj = ResourceManager.GetObject("Green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap info { + get { + object obj = ResourceManager.GetObject("info", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Left { + get { + object obj = ResourceManager.GetObject("Left", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftSelected { + get { + object obj = ResourceManager.GetObject("LeftSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap LeftUnSelected { + get { + object obj = ResourceManager.GetObject("LeftUnSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Login { + get { + object obj = ResourceManager.GetObject("Login", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Login11 { + get { + object obj = ResourceManager.GetObject("Login11", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Main { + get { + object obj = ResourceManager.GetObject("Main", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Red { + get { + object obj = ResourceManager.GetObject("Red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Right { + get { + object obj = ResourceManager.GetObject("Right", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightSelected { + get { + object obj = ResourceManager.GetObject("RightSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap RightUnSelected { + get { + object obj = ResourceManager.GetObject("RightUnSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Run { + get { + object obj = ResourceManager.GetObject("Run", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Spare { + get { + object obj = ResourceManager.GetObject("Spare", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找类似 <svg t="1737110574910" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6992" width="200" height="200"><path d="M512 62.389956c-248.312412 0-449.610044 201.297632-449.610044 449.610044s201.297632 449.610044 449.610044 449.610044 449.610044-201.297632 449.610044-449.610044S760.312412 62.389956 512 62.389956zM786.507004 786.507004c-35.672454 35.672454-77.196173 63.672158-123.416867 83.222423-47.821145 20.22667-98.655927 30.482245-151.09116 30.482245-52.435233 0-103.2 [字符串的其余部分被截断]"; 的本地化字符串。 + /// + internal static string StartPLC { + get { + return ResourceManager.GetString("StartPLC", resourceCulture); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Stop { + get { + object obj = ResourceManager.GetObject("Stop", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找类似 <svg t="1737111620791" class="icon" viewBox="0 0 1030 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9733" width="200" height="200"><path d="M511.999996 0C229.260123 0-4.0e-06 229.238701-4.0e-06 512c0 282.782725 229.238701 512 512 512 282.782725 0 512-229.217275 512-512C1024.021422 229.238701 794.804147 0 511.999996 0zM511.999996 958.842986c-246.786743 0-446.82156-200.056244-446.82156-446.842986 0-246.786743 200.056244-446.82156 446.82156-446.82156 246.829595 0 446.842986 200.034818 446.842986 [字符串的其余部分被截断]"; 的本地化字符串。 + /// + internal static string StopPLC { + get { + return ResourceManager.GetString("StopPLC", resourceCulture); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Title { + get { + object obj = ResourceManager.GetObject("Title", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap title2222 { + get { + object obj = ResourceManager.GetObject("title2222", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap TitleBG { + get { + object obj = ResourceManager.GetObject("TitleBG", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap titleBG2 { + get { + object obj = ResourceManager.GetObject("titleBG2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap User { + get { + object obj = ResourceManager.GetObject("User", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap UserManage { + get { + object obj = ResourceManager.GetObject("UserManage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap warning { + get { + object obj = ResourceManager.GetObject("warning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap yiweidongli { + get { + object obj = ResourceManager.GetObject("yiweidongli", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 中国国旗 { + get { + object obj = ResourceManager.GetObject("中国国旗", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 匈牙利国旗 { + get { + object obj = ResourceManager.GetObject("匈牙利国旗", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 导航栏 { + get { + object obj = ResourceManager.GetObject("导航栏", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 开机时间 { + get { + object obj = ResourceManager.GetObject("开机时间", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 数据查询 { + get { + object obj = ResourceManager.GetObject("数据查询", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 日志查询 { + get { + object obj = ResourceManager.GetObject("日志查询", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 星球地球科技蓝色转动动图压缩86_9 { + get { + object obj = ResourceManager.GetObject("星球地球科技蓝色转动动图压缩86_9", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 标题样式一 { + get { + object obj = ResourceManager.GetObject("标题样式一", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 标题样式一1 { + get { + object obj = ResourceManager.GetObject("标题样式一1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 用户 { + get { + object obj = ResourceManager.GetObject("用户", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 组_178_拷贝1 { + get { + object obj = ResourceManager.GetObject("组_178_拷贝1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 美国国旗 { + get { + object obj = ResourceManager.GetObject("美国国旗", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 蓝色 { + get { + object obj = ResourceManager.GetObject("蓝色", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 订单查询 { + get { + object obj = ResourceManager.GetObject("订单查询", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 资源_6 { + get { + object obj = ResourceManager.GetObject("资源_6", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 马来西亚国旗 { + get { + object obj = ResourceManager.GetObject("马来西亚国旗", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 黄色_警告 { + get { + object obj = ResourceManager.GetObject("黄色_警告", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/LargeSquareOne/Properties/Resources.resx b/LargeSquareOne/Properties/Resources.resx new file mode 100644 index 0000000..158eede --- /dev/null +++ b/LargeSquareOne/Properties/Resources.resx @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\25_密码.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Alarm.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Alarm.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\BackGround.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Blink.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Current.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\eve.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Exit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Exit1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Fault.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\info.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LeftUnSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Login.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Login11.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Main.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RightSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\RightUnSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Run.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Spare.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + <svg t="1737110574910" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6992" width="200" height="200"><path d="M512 62.389956c-248.312412 0-449.610044 201.297632-449.610044 449.610044s201.297632 449.610044 449.610044 449.610044 449.610044-201.297632 449.610044-449.610044S760.312412 62.389956 512 62.389956zM786.507004 786.507004c-35.672454 35.672454-77.196173 63.672158-123.416867 83.222423-47.821145 20.22667-98.655927 30.482245-151.09116 30.482245-52.435233 0-103.270015-10.255575-151.09116-30.482245-46.220694-19.549242-87.744413-47.549969-123.416867-83.222423-35.672454-35.672454-63.672158-77.196173-83.222423-123.416867-20.22667-47.821145-30.482245-98.655927-30.482245-151.090137 0-52.435233 10.255575-103.270015 30.482245-151.09116 19.549242-46.220694 47.549969-87.744413 83.222423-123.416867 35.672454-35.672454 77.196173-63.672158 123.416867-83.222423 47.821145-20.22667 98.654904-30.482245 151.09116-30.482245 52.435233 0 103.268992 10.255575 151.09116 30.482245 46.220694 19.549242 87.744413 47.549969 123.416867 83.222423 35.672454 35.672454 63.672158 77.196173 83.222423 123.416867 20.22667 47.821145 30.482245 98.655927 30.482245 151.09116 0 52.435233-10.255575 103.268992-30.482245 151.090137C850.179163 709.310831 822.179458 750.83455 786.507004 786.507004z" p-id="6993"></path><path d="M727.558427 506.975567l-334.355067-252.891707c-3.868097-2.232854-8.702196 0.558725-8.702196 5.024433l0 505.782392c0 4.465708 4.834098 7.257288 8.702196 5.024433l334.355067-252.890684C731.426525 514.791579 731.426525 509.208421 727.558427 506.975567z" p-id="6994"></path></svg> + + + ..\Resources\Stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + <svg t="1737111620791" class="icon" viewBox="0 0 1030 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9733" width="200" height="200"><path d="M511.999996 0C229.260123 0-4.0e-06 229.238701-4.0e-06 512c0 282.782725 229.238701 512 512 512 282.782725 0 512-229.217275 512-512C1024.021422 229.238701 794.804147 0 511.999996 0zM511.999996 958.842986c-246.786743 0-446.82156-200.056244-446.82156-446.842986 0-246.786743 200.056244-446.82156 446.82156-446.82156 246.829595 0 446.842986 200.034818 446.842986 446.82156C958.864408 758.786743 758.829591 958.842986 511.999996 958.842986z" p-id="9734"></path><path d="M365.102105 328.52762l85.70472 0 0 385.671242-85.70472 0 0-385.671242Z" p-id="9735"></path><path d="M536.511546 328.52762l107.130901 0 0 385.671242-107.130901 0 0-385.671242Z" p-id="9736"></path></svg> + + + ..\Resources\Title.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\title2222.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TitleBG.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\titleBG2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\User.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\UserManage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\yiweidongli.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\中国国旗1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\匈牙利国旗1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\导航栏.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\开机时间.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\数据查询.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\日志查询.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\星球地球科技蓝色转动动图压缩86.9.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\标题样式一.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\标题样式一1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\用户.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\组 178 拷贝1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\美国国旗.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\蓝色.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\订单查询.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\资源 6.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\马来西亚国旗1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\黄色-警告.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/LargeSquareOne/Properties/Settings.Designer.cs b/LargeSquareOne/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5b2b8e7 --- /dev/null +++ b/LargeSquareOne/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace LargeSquareOne.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/LargeSquareOne/Properties/Settings.settings b/LargeSquareOne/Properties/Settings.settings new file mode 100644 index 0000000..8e615f2 --- /dev/null +++ b/LargeSquareOne/Properties/Settings.settings @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/LargeSquareOne/Resources/25_密码.png b/LargeSquareOne/Resources/25_密码.png new file mode 100644 index 0000000..e48122f Binary files /dev/null and b/LargeSquareOne/Resources/25_密码.png differ diff --git a/LargeSquareOne/Resources/Alarm.jpg b/LargeSquareOne/Resources/Alarm.jpg new file mode 100644 index 0000000..3731eda Binary files /dev/null and b/LargeSquareOne/Resources/Alarm.jpg differ diff --git a/LargeSquareOne/Resources/Alarm.png b/LargeSquareOne/Resources/Alarm.png new file mode 100644 index 0000000..06f6132 Binary files /dev/null and b/LargeSquareOne/Resources/Alarm.png differ diff --git a/LargeSquareOne/Resources/BackGround.png b/LargeSquareOne/Resources/BackGround.png new file mode 100644 index 0000000..04d2375 Binary files /dev/null and b/LargeSquareOne/Resources/BackGround.png differ diff --git a/LargeSquareOne/Resources/Blink.gif b/LargeSquareOne/Resources/Blink.gif new file mode 100644 index 0000000..7cd0fed Binary files /dev/null and b/LargeSquareOne/Resources/Blink.gif differ diff --git a/LargeSquareOne/Resources/Current.png b/LargeSquareOne/Resources/Current.png new file mode 100644 index 0000000..2a7798d Binary files /dev/null and b/LargeSquareOne/Resources/Current.png differ diff --git a/LargeSquareOne/Resources/Exit.png b/LargeSquareOne/Resources/Exit.png new file mode 100644 index 0000000..3fb07a3 Binary files /dev/null and b/LargeSquareOne/Resources/Exit.png differ diff --git a/LargeSquareOne/Resources/Exit1.png b/LargeSquareOne/Resources/Exit1.png new file mode 100644 index 0000000..1237f7d Binary files /dev/null and b/LargeSquareOne/Resources/Exit1.png differ diff --git a/LargeSquareOne/Resources/Fault.png b/LargeSquareOne/Resources/Fault.png new file mode 100644 index 0000000..673de50 Binary files /dev/null and b/LargeSquareOne/Resources/Fault.png differ diff --git a/LargeSquareOne/Resources/Green.png b/LargeSquareOne/Resources/Green.png new file mode 100644 index 0000000..783d0fb Binary files /dev/null and b/LargeSquareOne/Resources/Green.png differ diff --git a/LargeSquareOne/Resources/IndustryAquaGauge2/Reflection.jpg b/LargeSquareOne/Resources/IndustryAquaGauge2/Reflection.jpg new file mode 100644 index 0000000..8879b3c Binary files /dev/null and b/LargeSquareOne/Resources/IndustryAquaGauge2/Reflection.jpg differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/垂直关.png b/LargeSquareOne/Resources/IndustrySwitch/垂直关.png new file mode 100644 index 0000000..e616e8b Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/垂直关.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/垂直关1.png b/LargeSquareOne/Resources/IndustrySwitch/垂直关1.png new file mode 100644 index 0000000..ef1815b Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/垂直关1.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/垂直开.png b/LargeSquareOne/Resources/IndustrySwitch/垂直开.png new file mode 100644 index 0000000..25e723b Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/垂直开.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/垂直开2.png b/LargeSquareOne/Resources/IndustrySwitch/垂直开2.png new file mode 100644 index 0000000..fc8541e Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/垂直开2.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/按钮关.png b/LargeSquareOne/Resources/IndustrySwitch/按钮关.png new file mode 100644 index 0000000..c27a30d Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/按钮关.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/按钮开.png b/LargeSquareOne/Resources/IndustrySwitch/按钮开.png new file mode 100644 index 0000000..86ed634 Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/按钮开.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/水平关.png b/LargeSquareOne/Resources/IndustrySwitch/水平关.png new file mode 100644 index 0000000..deef293 Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/水平关.png differ diff --git a/LargeSquareOne/Resources/IndustrySwitch/水平开.png b/LargeSquareOne/Resources/IndustrySwitch/水平开.png new file mode 100644 index 0000000..d3dd333 Binary files /dev/null and b/LargeSquareOne/Resources/IndustrySwitch/水平开.png differ diff --git a/LargeSquareOne/Resources/Left.png b/LargeSquareOne/Resources/Left.png new file mode 100644 index 0000000..bc79997 Binary files /dev/null and b/LargeSquareOne/Resources/Left.png differ diff --git a/LargeSquareOne/Resources/LeftSelected.png b/LargeSquareOne/Resources/LeftSelected.png new file mode 100644 index 0000000..09cfb6d Binary files /dev/null and b/LargeSquareOne/Resources/LeftSelected.png differ diff --git a/LargeSquareOne/Resources/LeftUnSelected.png b/LargeSquareOne/Resources/LeftUnSelected.png new file mode 100644 index 0000000..b024137 Binary files /dev/null and b/LargeSquareOne/Resources/LeftUnSelected.png differ diff --git a/LargeSquareOne/Resources/Login.jpg b/LargeSquareOne/Resources/Login.jpg new file mode 100644 index 0000000..976cd85 Binary files /dev/null and b/LargeSquareOne/Resources/Login.jpg differ diff --git a/LargeSquareOne/Resources/Login1.jpg b/LargeSquareOne/Resources/Login1.jpg new file mode 100644 index 0000000..466ace5 Binary files /dev/null and b/LargeSquareOne/Resources/Login1.jpg differ diff --git a/LargeSquareOne/Resources/Login1.png b/LargeSquareOne/Resources/Login1.png new file mode 100644 index 0000000..1d0b3c7 Binary files /dev/null and b/LargeSquareOne/Resources/Login1.png differ diff --git a/LargeSquareOne/Resources/Login11.png b/LargeSquareOne/Resources/Login11.png new file mode 100644 index 0000000..1d0b3c7 Binary files /dev/null and b/LargeSquareOne/Resources/Login11.png differ diff --git a/LargeSquareOne/Resources/Main.jpg b/LargeSquareOne/Resources/Main.jpg new file mode 100644 index 0000000..bc2f65e Binary files /dev/null and b/LargeSquareOne/Resources/Main.jpg differ diff --git a/LargeSquareOne/Resources/Red.png b/LargeSquareOne/Resources/Red.png new file mode 100644 index 0000000..6fc76cd Binary files /dev/null and b/LargeSquareOne/Resources/Red.png differ diff --git a/LargeSquareOne/Resources/Right.png b/LargeSquareOne/Resources/Right.png new file mode 100644 index 0000000..cc6bcf4 Binary files /dev/null and b/LargeSquareOne/Resources/Right.png differ diff --git a/LargeSquareOne/Resources/RightSelected.png b/LargeSquareOne/Resources/RightSelected.png new file mode 100644 index 0000000..819cf76 Binary files /dev/null and b/LargeSquareOne/Resources/RightSelected.png differ diff --git a/LargeSquareOne/Resources/RightUnSelected.png b/LargeSquareOne/Resources/RightUnSelected.png new file mode 100644 index 0000000..9196206 Binary files /dev/null and b/LargeSquareOne/Resources/RightUnSelected.png differ diff --git a/LargeSquareOne/Resources/Run.png b/LargeSquareOne/Resources/Run.png new file mode 100644 index 0000000..7f66c74 Binary files /dev/null and b/LargeSquareOne/Resources/Run.png differ diff --git a/LargeSquareOne/Resources/Spare.png b/LargeSquareOne/Resources/Spare.png new file mode 100644 index 0000000..5bf48e9 Binary files /dev/null and b/LargeSquareOne/Resources/Spare.png differ diff --git a/LargeSquareOne/Resources/Stop.png b/LargeSquareOne/Resources/Stop.png new file mode 100644 index 0000000..0bae605 Binary files /dev/null and b/LargeSquareOne/Resources/Stop.png differ diff --git a/LargeSquareOne/Resources/Tank/JYTank.png b/LargeSquareOne/Resources/Tank/JYTank.png new file mode 100644 index 0000000..85e74c1 Binary files /dev/null and b/LargeSquareOne/Resources/Tank/JYTank.png differ diff --git a/LargeSquareOne/Resources/Title.png b/LargeSquareOne/Resources/Title.png new file mode 100644 index 0000000..38a87f7 Binary files /dev/null and b/LargeSquareOne/Resources/Title.png differ diff --git a/LargeSquareOne/Resources/TitleBG.png b/LargeSquareOne/Resources/TitleBG.png new file mode 100644 index 0000000..903f163 Binary files /dev/null and b/LargeSquareOne/Resources/TitleBG.png differ diff --git a/LargeSquareOne/Resources/User.png b/LargeSquareOne/Resources/User.png new file mode 100644 index 0000000..fd275d9 Binary files /dev/null and b/LargeSquareOne/Resources/User.png differ diff --git a/LargeSquareOne/Resources/UserManage.png b/LargeSquareOne/Resources/UserManage.png new file mode 100644 index 0000000..5ccb6bf Binary files /dev/null and b/LargeSquareOne/Resources/UserManage.png differ diff --git a/LargeSquareOne/Resources/error.png b/LargeSquareOne/Resources/error.png new file mode 100644 index 0000000..7333a6c Binary files /dev/null and b/LargeSquareOne/Resources/error.png differ diff --git a/LargeSquareOne/Resources/eve.png b/LargeSquareOne/Resources/eve.png new file mode 100644 index 0000000..c94b849 Binary files /dev/null and b/LargeSquareOne/Resources/eve.png differ diff --git a/LargeSquareOne/Resources/info.png b/LargeSquareOne/Resources/info.png new file mode 100644 index 0000000..1669eac Binary files /dev/null and b/LargeSquareOne/Resources/info.png differ diff --git a/LargeSquareOne/Resources/title2222.png b/LargeSquareOne/Resources/title2222.png new file mode 100644 index 0000000..3fba385 Binary files /dev/null and b/LargeSquareOne/Resources/title2222.png differ diff --git a/LargeSquareOne/Resources/titleBG2.png b/LargeSquareOne/Resources/titleBG2.png new file mode 100644 index 0000000..d29ec56 Binary files /dev/null and b/LargeSquareOne/Resources/titleBG2.png differ diff --git a/LargeSquareOne/Resources/warning.png b/LargeSquareOne/Resources/warning.png new file mode 100644 index 0000000..408f134 Binary files /dev/null and b/LargeSquareOne/Resources/warning.png differ diff --git a/LargeSquareOne/Resources/yiweidongli.png b/LargeSquareOne/Resources/yiweidongli.png new file mode 100644 index 0000000..861e3c3 Binary files /dev/null and b/LargeSquareOne/Resources/yiweidongli.png differ diff --git a/LargeSquareOne/Resources/中国国旗1.png b/LargeSquareOne/Resources/中国国旗1.png new file mode 100644 index 0000000..0082515 Binary files /dev/null and b/LargeSquareOne/Resources/中国国旗1.png differ diff --git a/LargeSquareOne/Resources/匈牙利国旗1.png b/LargeSquareOne/Resources/匈牙利国旗1.png new file mode 100644 index 0000000..48b72af Binary files /dev/null and b/LargeSquareOne/Resources/匈牙利国旗1.png differ diff --git a/LargeSquareOne/Resources/导航栏.png b/LargeSquareOne/Resources/导航栏.png new file mode 100644 index 0000000..8a20afa Binary files /dev/null and b/LargeSquareOne/Resources/导航栏.png differ diff --git a/LargeSquareOne/Resources/开机时间.png b/LargeSquareOne/Resources/开机时间.png new file mode 100644 index 0000000..20dd0e9 Binary files /dev/null and b/LargeSquareOne/Resources/开机时间.png differ diff --git a/LargeSquareOne/Resources/数据查询.png b/LargeSquareOne/Resources/数据查询.png new file mode 100644 index 0000000..de155b1 Binary files /dev/null and b/LargeSquareOne/Resources/数据查询.png differ diff --git a/LargeSquareOne/Resources/日志查询.png b/LargeSquareOne/Resources/日志查询.png new file mode 100644 index 0000000..0a106d7 Binary files /dev/null and b/LargeSquareOne/Resources/日志查询.png differ diff --git a/LargeSquareOne/Resources/星球地球科技蓝色转动动图压缩86.9.gif b/LargeSquareOne/Resources/星球地球科技蓝色转动动图压缩86.9.gif new file mode 100644 index 0000000..f913149 Binary files /dev/null and b/LargeSquareOne/Resources/星球地球科技蓝色转动动图压缩86.9.gif differ diff --git a/LargeSquareOne/Resources/标题样式一.png b/LargeSquareOne/Resources/标题样式一.png new file mode 100644 index 0000000..4aa4084 Binary files /dev/null and b/LargeSquareOne/Resources/标题样式一.png differ diff --git a/LargeSquareOne/Resources/标题样式一1.png b/LargeSquareOne/Resources/标题样式一1.png new file mode 100644 index 0000000..3304a26 Binary files /dev/null and b/LargeSquareOne/Resources/标题样式一1.png differ diff --git a/LargeSquareOne/Resources/用户.png b/LargeSquareOne/Resources/用户.png new file mode 100644 index 0000000..f247245 Binary files /dev/null and b/LargeSquareOne/Resources/用户.png differ diff --git a/LargeSquareOne/Resources/组 178 拷贝1.png b/LargeSquareOne/Resources/组 178 拷贝1.png new file mode 100644 index 0000000..08ce660 Binary files /dev/null and b/LargeSquareOne/Resources/组 178 拷贝1.png differ diff --git a/LargeSquareOne/Resources/美国国旗.png b/LargeSquareOne/Resources/美国国旗.png new file mode 100644 index 0000000..20be9bd Binary files /dev/null and b/LargeSquareOne/Resources/美国国旗.png differ diff --git a/LargeSquareOne/Resources/蓝色.png b/LargeSquareOne/Resources/蓝色.png new file mode 100644 index 0000000..17a67a4 Binary files /dev/null and b/LargeSquareOne/Resources/蓝色.png differ diff --git a/LargeSquareOne/Resources/订单查询.png b/LargeSquareOne/Resources/订单查询.png new file mode 100644 index 0000000..feb9dfc Binary files /dev/null and b/LargeSquareOne/Resources/订单查询.png differ diff --git a/LargeSquareOne/Resources/资源 6.png b/LargeSquareOne/Resources/资源 6.png new file mode 100644 index 0000000..2f40e11 Binary files /dev/null and b/LargeSquareOne/Resources/资源 6.png differ diff --git a/LargeSquareOne/Resources/马来西亚国旗1.png b/LargeSquareOne/Resources/马来西亚国旗1.png new file mode 100644 index 0000000..cf824f8 Binary files /dev/null and b/LargeSquareOne/Resources/马来西亚国旗1.png differ diff --git a/LargeSquareOne/Resources/黄色-警告.png b/LargeSquareOne/Resources/黄色-警告.png new file mode 100644 index 0000000..6b35f72 Binary files /dev/null and b/LargeSquareOne/Resources/黄色-警告.png differ diff --git a/LargeSquareOne/ShutdownProgressForm.Designer.cs b/LargeSquareOne/ShutdownProgressForm.Designer.cs new file mode 100644 index 0000000..58edf58 --- /dev/null +++ b/LargeSquareOne/ShutdownProgressForm.Designer.cs @@ -0,0 +1,46 @@ +namespace LargeSquareOne +{ + partial class ShutdownProgressForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ShutdownProgressForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(379, 250); + this.Name = "ShutdownProgressForm"; + this.Text = "ShutdownProgressForm"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/LargeSquareOne/ShutdownProgressForm.cs b/LargeSquareOne/ShutdownProgressForm.cs new file mode 100644 index 0000000..afbbf72 --- /dev/null +++ b/LargeSquareOne/ShutdownProgressForm.cs @@ -0,0 +1,125 @@ +using Language; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class ShutdownProgressForm : MultiLanguageForm + { + private Panel contentPanel; + private Label messageLabel; + private ProgressBar progressBar; + + public ShutdownProgressForm() + { + // 确保先初始化组件 + InitializeComponents(); + } + + private void InitializeComponents() + { + // 首先创建 messageLabel + messageLabel = new Label + { + Text = "正在关闭程序,请稍候...", + AutoSize = false, + TextAlign = ContentAlignment.MiddleCenter, + Dock = DockStyle.Top, + Height = 30, + Font = new Font("Microsoft YaHei", 9F, FontStyle.Regular), + BackColor = Color.Transparent + }; + + // 设置窗体属性 + this.FormBorderStyle = FormBorderStyle.None; + this.StartPosition = FormStartPosition.CenterScreen; + this.Size = new Size(300, 100); + this.BackColor = Color.Black; + this.Opacity = 0.5; + this.ShowInTaskbar = false; + + // 创建内容面板 + contentPanel = new Panel + { + BackColor = Color.FromArgb(240, 240, 240), + Size = new Size(280, 80), + Dock = DockStyle.None, + Region = new Region(GetRoundedRect(new RectangleF(0, 0, 280, 80), 8)) + }; + + contentPanel.Location = new Point( + (this.ClientSize.Width - contentPanel.Width) / 2, + (this.ClientSize.Height - contentPanel.Height) / 2 + ); + + progressBar = new ProgressBar + { + Style = ProgressBarStyle.Marquee, + MarqueeAnimationSpeed = 30, + Height = 20, + Dock = DockStyle.None, + Width = 250 + }; + + progressBar.Location = new Point( + (contentPanel.ClientSize.Width - progressBar.Width) / 2, + messageLabel.Bottom + 10 + ); + + // 确保按正确的顺序添加控件 + contentPanel.Controls.Add(messageLabel); + contentPanel.Controls.Add(progressBar); + this.Controls.Add(contentPanel); + + this.Click += (s, e) => { }; + } + + private GraphicsPath GetRoundedRect(RectangleF rect, float radius) + { + GraphicsPath path = new GraphicsPath(); + path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90); + path.AddArc(rect.Width - radius * 2 + rect.X, rect.Y, radius * 2, radius * 2, 270, 90); + path.AddArc(rect.Width - radius * 2 + rect.X, rect.Height - radius * 2 + rect.Y, radius * 2, radius * 2, 0, 90); + path.AddArc(rect.X, rect.Height - radius * 2 + rect.Y, radius * 2, radius * 2, 90, 90); + path.CloseFigure(); + return path; + } + + public void UpdateMessage(string message) + { + // 添加空值检查 + if (messageLabel == null) return; + + if (this.InvokeRequired) + { + this.Invoke(new Action(() => { + if (messageLabel != null) // 再次检查,以确保线程安全 + messageLabel.Text = message; + })); + } + else + { + messageLabel.Text = message; + } + } + + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x80000; // WS_EX_LAYERED + cp.ExStyle |= 0x20; // WS_EX_TRANSPARENT + return cp; + } + } + } +} diff --git a/LargeSquareOne/ShutdownProgressForm.resx b/LargeSquareOne/ShutdownProgressForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/ShutdownProgressForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/VariableEditForm.Designer.cs b/LargeSquareOne/VariableEditForm.Designer.cs new file mode 100644 index 0000000..9464b02 --- /dev/null +++ b/LargeSquareOne/VariableEditForm.Designer.cs @@ -0,0 +1,213 @@ +namespace LargeSquareOne +{ + partial class VariableEditForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = 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(); + this.panelExt1 = new JinYuan.ControlLib.PanelExt(); + this.variableTable = new System.Windows.Forms.DataGridView(); + this.topPanel = new System.Windows.Forms.Panel(); + this.BtnSave = new System.Windows.Forms.Button(); + this.BtnAdd = new System.Windows.Forms.Button(); + this.btn_Close = new System.Windows.Forms.Button(); + this.lblTitle = new System.Windows.Forms.Label(); + this.panelExt1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.variableTable)).BeginInit(); + this.topPanel.SuspendLayout(); + this.SuspendLayout(); + // + // panelExt1 + // + this.panelExt1.BackColor = System.Drawing.Color.Transparent; + this.panelExt1.BordeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(79)))), ((int)(((byte)(150))))); + this.panelExt1.BordeWidth = 2; + this.panelExt1.BottomGap = 0; + this.panelExt1.Controls.Add(this.variableTable); + this.panelExt1.Controls.Add(this.topPanel); + this.panelExt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelExt1.LeftGap = 0; + this.panelExt1.Location = new System.Drawing.Point(0, 0); + this.panelExt1.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.panelExt1.Name = "panelExt1"; + this.panelExt1.RightGap = 0; + this.panelExt1.Size = new System.Drawing.Size(1024, 636); + this.panelExt1.TabIndex = 0; + this.panelExt1.TopGap = 0; + // + // variableTable + // + this.variableTable.AllowUserToAddRows = false; + this.variableTable.AllowUserToDeleteRows = false; + this.variableTable.AllowUserToResizeRows = false; + this.variableTable.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.variableTable.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.variableTable.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.variableTable.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.variableTable.ColumnHeadersHeight = 45; + this.variableTable.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.variableTable.DefaultCellStyle = dataGridViewCellStyle2; + this.variableTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.variableTable.EnableHeadersVisualStyles = false; + this.variableTable.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(21)))), ((int)(((byte)(77)))), ((int)(((byte)(147))))); + this.variableTable.Location = new System.Drawing.Point(0, 49); + this.variableTable.Name = "variableTable"; + this.variableTable.ReadOnly = true; + this.variableTable.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(40)))), ((int)(((byte)(86))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.variableTable.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.variableTable.RowHeadersWidth = 45; + this.variableTable.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + this.variableTable.RowTemplate.Height = 40; + this.variableTable.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.variableTable.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.variableTable.Size = new System.Drawing.Size(1024, 587); + this.variableTable.TabIndex = 15; + // + // topPanel + // + this.topPanel.Controls.Add(this.BtnSave); + this.topPanel.Controls.Add(this.BtnAdd); + this.topPanel.Controls.Add(this.btn_Close); + this.topPanel.Controls.Add(this.lblTitle); + this.topPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.topPanel.Location = new System.Drawing.Point(0, 0); + this.topPanel.Name = "topPanel"; + this.topPanel.Size = new System.Drawing.Size(1024, 49); + this.topPanel.TabIndex = 0; + this.topPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseDown); + this.topPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseMove); + // + // BtnSave + // + this.BtnSave.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.BtnSave.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnSave.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.BtnSave.ForeColor = System.Drawing.Color.White; + this.BtnSave.Location = new System.Drawing.Point(755, 6); + this.BtnSave.Name = "BtnSave"; + this.BtnSave.Size = new System.Drawing.Size(105, 36); + this.BtnSave.TabIndex = 51; + this.BtnSave.Text = "保存变量"; + this.BtnSave.UseVisualStyleBackColor = false; + this.BtnSave.Click += new System.EventHandler(this.BtnSave_Click); + // + // BtnAdd + // + this.BtnAdd.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(27)))), ((int)(((byte)(78))))); + this.BtnAdd.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnAdd.Font = new System.Drawing.Font("微软雅黑", 11.5F); + this.BtnAdd.ForeColor = System.Drawing.Color.White; + this.BtnAdd.Location = new System.Drawing.Point(591, 6); + this.BtnAdd.Name = "BtnAdd"; + this.BtnAdd.Size = new System.Drawing.Size(105, 36); + this.BtnAdd.TabIndex = 50; + this.BtnAdd.Text = "添加变量"; + this.BtnAdd.UseVisualStyleBackColor = false; + this.BtnAdd.Click += new System.EventHandler(this.BtnAdd_Click); + // + // btn_Close + // + this.btn_Close.FlatAppearance.BorderSize = 0; + this.btn_Close.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(3)))), ((int)(((byte)(29)))), ((int)(((byte)(84))))); + this.btn_Close.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Close.Font = new System.Drawing.Font("微软雅黑", 15.5F); + this.btn_Close.ForeColor = System.Drawing.Color.White; + this.btn_Close.Location = new System.Drawing.Point(989, 7); + this.btn_Close.Name = "btn_Close"; + this.btn_Close.Size = new System.Drawing.Size(32, 32); + this.btn_Close.TabIndex = 1; + this.btn_Close.Text = "X"; + this.btn_Close.UseVisualStyleBackColor = true; + this.btn_Close.Click += new System.EventHandler(this.btn_Close_Click); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.ForeColor = System.Drawing.Color.White; + this.lblTitle.Location = new System.Drawing.Point(15, 14); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(74, 21); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "变量配置"; + // + // VariableEditForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(14)))), ((int)(((byte)(23)))), ((int)(((byte)(38))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(1024, 636); + this.Controls.Add(this.panelExt1); + this.Font = new System.Drawing.Font("微软雅黑", 12F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.Name = "VariableEditForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FrmGroupConfig"; + this.panelExt1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.variableTable)).EndInit(); + this.topPanel.ResumeLayout(false); + this.topPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private JinYuan.ControlLib.PanelExt panelExt1; + private System.Windows.Forms.Panel topPanel; + private System.Windows.Forms.Button btn_Close; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.DataGridView variableTable; + private System.Windows.Forms.Button BtnAdd; + private System.Windows.Forms.Button BtnSave; + } +} \ No newline at end of file diff --git a/LargeSquareOne/VariableEditForm.cs b/LargeSquareOne/VariableEditForm.cs new file mode 100644 index 0000000..e910b99 --- /dev/null +++ b/LargeSquareOne/VariableEditForm.cs @@ -0,0 +1,995 @@ +using JinYuan.Helper; +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using Language; +using MiniExcelLibs; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class VariableEditForm : MultiLanguageForm + { + private string variableConfigPath = CommonMethods.variableConfigPath; + private string groupConfigPath = CommonMethods.groupConfigPath; + private List groupNames = new List(); + + private List Variables = new List(); + private VariableConfig editingConfig; + private int PlcNum; + + public VariableEditForm(int plcNum) + { + PlcNum = plcNum; + InitializeComponent(); + + groupNames = GetGroupNames(PlcNum); + InitializeDataGridView(); + Variables = GetALLVariables(); + LoadVariables(); + } + + private void InitializeDataGridView() + { + variableTable.DataError += VariableTable_DataError; + + variableTable.AutoGenerateColumns = false; + variableTable.AllowUserToAddRows = false; + variableTable.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + variableTable.MultiSelect = false; + variableTable.ReadOnly = false; + variableTable.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; + variableTable.RowHeadersVisible = false; + variableTable.Columns.Clear(); + + // 添加列 + variableTable.Columns.AddRange(new DataGridViewColumn[] + { + new DataGridViewTextBoxColumn + { + Name = "PlcNum", + HeaderText = "PLC编号", + Width = 80, + ReadOnly = true, + DataPropertyName = "PlcNum" + }, + new DataGridViewComboBoxColumn + { + Name = "GroupName", + HeaderText = "组名", + Width = 100, + DataPropertyName = "GroupName", + ValueType = typeof(string), + ReadOnly = false, + DefaultCellStyle = new DataGridViewCellStyle + { + BackColor = Color.FromArgb(14, 23, 38), + ForeColor = Color.White, + SelectionBackColor = Color.FromArgb(0, 122, 204), + SelectionForeColor = Color.White, + Font = new Font("微软雅黑", 9F) + } + }, + new DataGridViewTextBoxColumn + { + Name = "VarName", + HeaderText = "变量名称", + Width = 200, + DataPropertyName = "VarName" + }, + new DataGridViewTextBoxColumn + { + Name = "VarAddress", + HeaderText = "变量地址", + Width = 100, + DataPropertyName = "VarAddress" + }, + new DataGridViewTextBoxColumn + { + Name = "Start", + HeaderText = "起始地址", + Width = 100, + DataPropertyName = "Start", + ReadOnly = true // Start列只读,由VarAddress自动生成 + }, + new DataGridViewComboBoxColumn + { + Name = "DataType", + HeaderText = "数据类型", + Width = 150, + DataPropertyName = "DataType", + ValueType = typeof(string), + DefaultCellStyle = new DataGridViewCellStyle + { + BackColor = Color.FromArgb(14, 23, 38), + ForeColor = Color.White, + SelectionBackColor = Color.FromArgb(0, 122, 204), + SelectionForeColor = Color.White, + Font = new Font("微软雅黑", 9F) + } + }, + new DataGridViewTextBoxColumn + { + Name = "OffsetOrLength", + HeaderText = "长度偏移", + Width = 80, + DataPropertyName = "OffsetOrLength" + }, + new DataGridViewTextBoxColumn + { + Name = "Remark", + HeaderText = "备注", + Width = 120, + DataPropertyName = "Remark", + Visible = false + }, + new DataGridViewButtonColumn + { + Name = "Edit", + HeaderText = "操作", + Width = 60, + Text = "修改".Translated(), + UseColumnTextForButtonValue = true + }, + new DataGridViewButtonColumn + { + Name = "Delete", + HeaderText = "", + Width = 60, + Text = "删除".Translated(), + UseColumnTextForButtonValue = true + } + }); + + // 设置ComboBox列数据源 + if (variableTable.Columns["GroupName"] is DataGridViewComboBoxColumn groupColumn) + { + groupColumn.Items.AddRange(groupNames.ToArray()); + } + + if (variableTable.Columns["DataType"] is DataGridViewComboBoxColumn typeColumn) + { + typeColumn.Items.AddRange(new string[] { "Bit", "Byte", "ByteArray", "Short", "Arrshort", "Word", "DWord", "Int", "DInt", "Real", "String" }); + } + + // 添加事件处理 + variableTable.CellBeginEdit += DataGridView_CellBeginEdit; + variableTable.CellEndEdit += DataGridView_CellEndEdit; + variableTable.CellContentClick += DataGridView_CellContentClick; + variableTable.CellValueChanged += DataGridView_CellValueChanged; + variableTable.EditingControlShowing += VariableTable_EditingControlShowing; + } + + /// + /// 处理DataGridView数据错误,避免弹出默认错误对话框 + /// + private void VariableTable_DataError(object sender, DataGridViewDataErrorEventArgs e) + { + e.ThrowException = false; + + // 修复ComboBox值无效的问题 + if (e.Exception is ArgumentException && variableTable.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) + { + var comboColumn = (DataGridViewComboBoxColumn)variableTable.Columns[e.ColumnIndex]; + var cell = variableTable.Rows[e.RowIndex].Cells[e.ColumnIndex]; + + if (cell.Value == null || !comboColumn.Items.Contains(cell.Value)) + { + if (comboColumn.Items.Count > 0) + { + cell.Value = comboColumn.Items[0]; + } + else + { + cell.Value = null; + } + } + } + } + + /// + /// 编辑控件显示时确保数据源正确 + /// + private void VariableTable_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) + { + if (variableTable.CurrentCell == null) return; + + // 组名ComboBox + if (variableTable.Columns[variableTable.CurrentCell.ColumnIndex].Name == "GroupName") + { + if (e.Control is ComboBox comboBox) + { + comboBox.Items.Clear(); + comboBox.Items.AddRange(groupNames.ToArray()); + comboBox.DropDownStyle = ComboBoxStyle.DropDownList; + } + } + // 数据类型ComboBox + else if (variableTable.Columns[variableTable.CurrentCell.ColumnIndex].Name == "DataType") + { + if (e.Control is ComboBox comboBox) + { + comboBox.DropDownStyle = ComboBoxStyle.DropDownList; + } + } + } + + /// + /// 单元格值变更事件(自动更新Start列) + /// + private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0 || e.ColumnIndex < 0) return; + + // 当VarAddress列值变更时,自动更新Start列 + if (variableTable.Columns[e.ColumnIndex].Name == "VarAddress") + { + var cellValue = variableTable["VarAddress", e.RowIndex].Value?.ToString(); + if (!string.IsNullOrEmpty(cellValue) && cellValue.StartsWith("D", StringComparison.OrdinalIgnoreCase) && + int.TryParse(cellValue.Substring(1), out int address)) + { + variableTable["Start", e.RowIndex].Value = address.ToString(); + variableTable.InvalidateRow(e.RowIndex); + variableTable.Update(); + } + } + } + + // 获取组名称(按PLC编号筛选) + private List GetGroupNames(int plcNum) + { + try + { + if (!File.Exists(groupConfigPath)) + { + // 创建默认组配置文件 + Directory.CreateDirectory(Path.GetDirectoryName(groupConfigPath)); + MiniExcel.SaveAs(groupConfigPath, new List { new PlcGroupConfig { PlcNum = plcNum, GroupName = "默认组".Translated() } }); + } + + var groups = MiniExcel.Query(groupConfigPath).ToList(); + var result = groups.Where(g => g.PlcNum == plcNum) + .Select(g => g.GroupName?.Trim() ?? "") + .Where(g => !string.IsNullOrEmpty(g)) + .Distinct() + .ToList(); + + if (result.Count == 0) + { + result.Add("默认组".Translated()); + } + + return result; + } + catch (Exception) + { + return new List { "默认组".Translated() }; + } + } + + /// + /// 获取所有变量 + /// + private List GetALLVariables() + { + try + { + if (!File.Exists(variableConfigPath)) + { + return new List(); + } + + var variables = MiniExcel.Query(variableConfigPath).ToList(); + + foreach (var variable in variables) + { + // 确保组名有效 + if (string.IsNullOrEmpty(variable.GroupName) || !groupNames.Contains(variable.GroupName)) + { + variable.GroupName = groupNames.Count > 0 ? groupNames[0] : "默认组".Translated(); + } + + // 确保数据类型有效 + if (string.IsNullOrEmpty(variable.DataType) || !ValidateDataType(variable.DataType)) + { + variable.DataType = "Short"; + } + + // 确保长度有效 + if (variable.OffsetOrLength <= 0) + { + variable.OffsetOrLength = 1; + } + + // Start地址 + if (string.IsNullOrEmpty(variable.Start) && !string.IsNullOrEmpty(variable.VarAddress) && + variable.VarAddress.StartsWith("D") && int.TryParse(variable.VarAddress.Substring(1), out int startAddr)) + { + variable.Start = startAddr.ToString(); + } + } + + return variables; + } + catch (Exception) + { + return new List(); + } + } + + /// + /// 加载当前PLC的变量到表格 + /// + private void LoadVariables() + { + try + { + variableTable.DataSource = null; + + var plcVariables = Variables.Where(g => g.PlcNum == PlcNum).ToList(); + variableTable.DataSource = plcVariables; + + // 刷新表格 + variableTable.Invalidate(); + } + catch (Exception ex) + { + ShowError($"加载变量失败: {ex.Message}"); + } + } + + /// + /// 开始编辑单元格 + /// + private void DataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) + { + if (e.RowIndex < 0) return; + + // 获取当前编辑的配置 + if (variableTable.Rows[e.RowIndex].DataBoundItem is VariableConfig config) + { + editingConfig = config; + } + + // 禁止编辑PLC编号和Start列 + string colName = variableTable.Columns[e.ColumnIndex].Name; + if (colName == "PlcNum" || colName == "Start") + { + e.Cancel = true; + return; + } + } + + /// + /// 结束编辑单元格 + /// + private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0 || e.RowIndex >= variableTable.Rows.Count) return; + + var row = variableTable.Rows[e.RowIndex]; + if (row.DataBoundItem is not VariableConfig config) return; + + var columnName = variableTable.Columns[e.ColumnIndex].Name; + var cellValue = row.Cells[e.ColumnIndex].Value; + + try + { + UpdateConfigValue(config, columnName, cellValue); + variableTable.InvalidateRow(e.RowIndex); + variableTable.Update(); + } + catch (Exception ex) + { + ShowError($"更新数据失败: {ex.Message}"); + // 回滚单元格值 + switch (columnName) + { + case "GroupName": row.Cells[e.ColumnIndex].Value = config.GroupName; break; + case "VarName": row.Cells[e.ColumnIndex].Value = config.VarName; break; + case "VarAddress": row.Cells[e.ColumnIndex].Value = config.VarAddress; break; + case "DataType": row.Cells[e.ColumnIndex].Value = config.DataType; break; + case "OffsetOrLength": row.Cells[e.ColumnIndex].Value = config.OffsetOrLength; break; + case "Remark": row.Cells[e.ColumnIndex].Value = config.Remark; break; + } + // 刷新行 + variableTable.InvalidateRow(e.RowIndex); + variableTable.Update(); + } + } + + /// + /// 更新配置值 + /// + private void UpdateConfigValue(VariableConfig config, string columnName, object value) + { + if (value == null && columnName != "Remark") + { + throw new Exception("值不能为空".Translated()); + } + + string strValue = value?.ToString().Trim() ?? ""; + + switch (columnName) + { + case "GroupName": + if (!groupNames.Contains(strValue)) + { + throw new Exception($"无效的组名,可选值:{string.Join(",", groupNames)}".Translated()); + } + config.GroupName = strValue; + break; + + case "VarName": + if (string.IsNullOrEmpty(strValue)) + { + throw new Exception("变量名不能为空".Translated()); + } + if (Variables.Any(v => v != config && + v.PlcNum == config.PlcNum && + v.VarName.Equals(strValue, StringComparison.OrdinalIgnoreCase))) + { + throw new Exception("变量名已存在".Translated()); + } + config.VarName = strValue; + break; + + case "VarAddress": + if (!ValidateVariableAddress(strValue)) + { + throw new Exception("地址格式不正确,应以'D'开头后跟数字".Translated()); + } + config.VarAddress = strValue; + // 自动更新Start列 + if (strValue.StartsWith("D") && int.TryParse(strValue.Substring(1), out int startAddr)) + { + config.Start = startAddr.ToString(); + } + break; + + case "DataType": + if (!ValidateDataType(strValue)) + { + throw new Exception("不支持的数据类型".Translated()); + } + config.DataType = strValue; + break; + + case "OffsetOrLength": + if (!int.TryParse(strValue, out int length) || length <= 0) + { + throw new Exception("长度必须是大于0的数字".Translated()); + } + config.OffsetOrLength = length; + break; + + case "Remark": + config.Remark = strValue; + break; + } + } + + /// + /// 按钮点击事件 + /// + private void DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0 || e.RowIndex >= variableTable.Rows.Count) return; + + var row = variableTable.Rows[e.RowIndex]; + if (row.DataBoundItem is not VariableConfig config) return; + + // 编辑按钮 + if (variableTable.Columns[e.ColumnIndex].Name == "Edit") + { + HandleEdit(config); + } + // 删除按钮 + else if (variableTable.Columns[e.ColumnIndex].Name == "Delete") + { + HandleDelete(config); + } + } + + /// + /// 处理单行编辑保存 + /// + private void HandleEdit(VariableConfig config) + { + try + { + var result = MessageBox.Show("是否保存修改的配置?".Translated(), "确认保存".Translated(), + MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result != DialogResult.Yes) return; + + if (!ValidateConfigAll(config)) return; + + // 找到原始数据并更新 + var originalIndex = Variables.FindIndex(v => + v.PlcNum == config.PlcNum && + v.VarAddress == config.VarAddress && + v.VarName == config.VarName); + + if (originalIndex >= 0) + { + Variables[originalIndex] = config; + } + else + { + Variables.Add(config); + } + + SaveConfigToExcel(); + LoadVariables(); + ShowSuccess("配置保存成功".Translated()); + } + catch (Exception ex) + { + ShowError($"保存失败: {ex.Message}"); + } + } + + /// + /// 处理单行删除 + /// + private void HandleDelete(VariableConfig config) + { + var result = MessageBox.Show( + $"确定要删除该变量吗?\n PLC编号: [{config.PlcNum}],通信组: [{config.GroupName}],变量名: [{config.VarName}]", + "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + try + { + // 从列表中移除 + Variables.RemoveAll(v => + v.PlcNum == config.PlcNum && + v.VarAddress == config.VarAddress && + v.VarName == config.VarName); + + SaveConfigToExcel(); + LoadVariables(); + ShowSuccess("删除成功".Translated()); + } + catch (Exception ex) + { + ShowError($"删除失败: {ex.Message}"); + } + } + } + + /// + /// 保存配置到Excel + /// + private void SaveConfigToExcel() + { + try + { + // 确保目录存在 + string configDir = Path.GetDirectoryName(variableConfigPath); + if (!Directory.Exists(configDir)) + { + Directory.CreateDirectory(configDir); + } + + string tempFilePath = Path.Combine(configDir, $"temp_{Guid.NewGuid()}_{Path.GetFileName(variableConfigPath)}"); + + // 保存到临时文件 + MiniExcel.SaveAs(tempFilePath, Variables); + + if (!File.Exists(tempFilePath)) + { + throw new Exception("创建临时文件失败".Translated()); + } + + // 替换原文件(处理文件占用) + File.Copy(tempFilePath, variableConfigPath, true); + + // 删除临时文件 + if (File.Exists(tempFilePath)) + { + File.Delete(tempFilePath); + } + } + catch (Exception ex) + { + throw new Exception($"保存Excel文件时发生错误: {ex.Message}", ex); + } + } + + /// + /// 添加新变量 + /// + private void BtnAdd_Click(object sender, EventArgs e) + { + try + { + if (groupNames.Count == 0) + { + ShowError("没有可用的组名,请先在Group.xlsx中添加组".Translated()); + return; + } + + string varName = GenerateNewVarName(); + string varAddress = FindNextAvailableAddress(); + int startAddr = int.Parse(varAddress.Substring(1)); + + var newVariable = new VariableConfig + { + VarName = varName, + VarAddress = varAddress, + Start = startAddr.ToString(), + DataType = "Short", + OffsetOrLength = 1, + PlcNum = PlcNum, + GroupName = groupNames[0], + Remark = "" + }; + + if (!ValidateConfigAll(newVariable)) + { + return; + } + + Variables.Add(newVariable); + SaveConfigToExcel(); + LoadVariables(); + ShowSuccess("新建变量成功".Translated()); + } + catch (Exception ex) + { + ShowError($"添加变量失败: {ex.Message}"); + } + } + + /// + /// 生成新变量名 + /// + private string GenerateNewVarName() + { + int index = 1; + string baseName = "新变量".Translated(); + string newName = baseName; + + while (Variables.Any(v => + v.PlcNum == PlcNum && + v.VarName.Equals(newName, StringComparison.OrdinalIgnoreCase))) + { + index++; + newName = $"{baseName}{index}"; + } + + return newName; + } + + /// + /// 获取下一个可用地址 + /// + private string FindNextAvailableAddress() + { + var plcVariables = Variables.Where(v => v.PlcNum == PlcNum).ToList(); + + if (!plcVariables.Any()) + { + return "D0"; + } + + int maxAddress = plcVariables.Max(v => + { + if (v.VarAddress.StartsWith("D") && int.TryParse(v.VarAddress.Substring(1), out int addr)) + { + return addr + v.OffsetOrLength; + } + return 0; + }); + + if (maxAddress >= 32675) + { + throw new Exception("没有可用的地址空间".Translated()); + } + + return $"D{maxAddress}"; + } + + /// + /// 验证单个变量配置 + /// + private bool ValidateConfigAll(VariableConfig config) + { + try + { + if (string.IsNullOrWhiteSpace(config.VarName)) + { + ShowError("变量名不能为空".Translated()); + return false; + } + + if (!ValidateVariableAddress(config.VarAddress)) + { + ShowError("变量地址格式不正确".Translated()); + return false; + } + + if (!ValidateStartAddress(config.Start)) + { + ShowError("起始地址格式不正确".Translated()); + return false; + } + + if (!ValidateDataType(config.DataType)) + { + ShowError("不支持的数据类型".Translated()); + return false; + } + + if (config.OffsetOrLength <= 0) + { + ShowError("长度必须大于0".Translated()); + return false; + } + + // 检查重复 + if (Variables.Any(v => v != config && + v.PlcNum == config.PlcNum && + v.VarName.Equals(config.VarName, StringComparison.OrdinalIgnoreCase))) + { + ShowError($"变量名 {config.VarName} 已存在"); + return false; + } + + if (Variables.Any(v => v != config && + v.PlcNum == config.PlcNum && + v.VarAddress.Equals(config.VarAddress, StringComparison.OrdinalIgnoreCase))) + { + ShowError($"变量地址 {config.VarAddress} 已存在"); + return false; + } + + // 地址范围验证 + if (!int.TryParse(config.Start, out int startAddress)) + { + ShowError("无效的起始地址".Translated()); + return false; + } + + int endAddress = startAddress + config.OffsetOrLength/2 - 1; + if (endAddress > 32767) + { + ShowError($"地址范围超出限制,结束地址不能超过32767".Translated()); + return false; + } + + // 检查地址冲突 + foreach (var other in Variables.Where(v => v != config && v.PlcNum == config.PlcNum)) + { + if (int.TryParse(other.Start, out int otherStart)) + { + int otherEnd = otherStart + other.OffsetOrLength/2 - 1; + if (!(endAddress < otherStart || startAddress > otherEnd)) + { + ShowError($"地址范围与变量 \"{other.VarName}\" 冲突"); + return false; + } + } + } + + return true; + } + catch (Exception ex) + { + LogHelper.Instance?.WriteError($"验证变量配置时发生错误: {ex}"); + ShowError($"验证配置时发生错误: {ex.Message}".Translated()); + return false; + } + } + + /// + /// 批量验证表格中所有变量配置 + /// + private bool ValidateAllVariablesInGrid() + { + try + { + if (variableTable.DataSource is not List gridVariables) + { + ShowError("表格中无数据可保存".Translated()); + return false; + } + + // 逐个验证表格中的变量 + foreach (var config in gridVariables) + { + if (!ValidateConfigAll(config)) + { + return false; + } + } + + return true; + } + catch (Exception ex) + { + ShowError($"批量验证失败: {ex.Message}"); + return false; + } + } + + /// + /// 验证变量地址 + /// + private bool ValidateVariableAddress(string address) + { + if (string.IsNullOrWhiteSpace(address)) return false; + + if (!address.StartsWith("D", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + string numberPart = address.Substring(1); + if (!int.TryParse(numberPart, out int dAddress) || dAddress < 0 || dAddress > 32767) + { + return false; + } + + return true; + } + + /// + /// 验证起始地址 + /// + private bool ValidateStartAddress(string startAddress) + { + if (string.IsNullOrWhiteSpace(startAddress)) return false; + + if (!int.TryParse(startAddress, out int addressNum)) return false; + + return addressNum >= 0 && addressNum <= 32767; + } + + /// + /// 验证数据类型 + /// + private bool ValidateDataType(string dataType) + { + if (string.IsNullOrWhiteSpace(dataType)) return false; + + string[] validTypes = new[] { "Bit", "Byte", "ByteArray", "Short", "Arrshort", "Word", "DWord", "Int", "DInt", "Real", "String" }; + return validTypes.Contains(dataType, StringComparer.OrdinalIgnoreCase); + } + + /// + /// 查找地址间隙 + /// + private string FindAddressGap(int requiredLength = 1) + { + var plcVariables = Variables + .Where(v => v.PlcNum == PlcNum) + .Select(v => new + { + Start = int.Parse(v.VarAddress.Substring(1)), + End = int.Parse(v.VarAddress.Substring(1)) + v.OffsetOrLength - 1 + }) + .OrderBy(v => v.Start) + .ToList(); + + if (!plcVariables.Any()) + { + return "D0"; + } + + if (plcVariables.First().Start >= requiredLength) + { + return "D0"; + } + + for (int i = 0; i < plcVariables.Count - 1; i++) + { + int gapStart = plcVariables[i].End + 1; + int gapEnd = plcVariables[i + 1].Start - 1; + + if (gapEnd - gapStart + 1 >= requiredLength) + { + return $"D{gapStart}"; + } + } + + int lastEnd = plcVariables.Last().End; + if (lastEnd + requiredLength <= 32675) + { + return $"D{lastEnd + 1}"; + } + + throw new Exception("没有找到足够大的地址空间".Translated()); + } + + // 错误提示 + private void ShowError(string message) + { + MessageBox.Show(message, "验证错误".Translated(), MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + // 成功提示 + private void ShowSuccess(string message) + { + MessageBox.Show(message, "成功".Translated(), MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void btn_Close_Click(object sender, EventArgs e) + { + this.Close(); + } + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + #region 无边框拖动 + private Point mPoint; + private void Panel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void Panel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + #endregion + + /// + /// 批量保存所有修改的变量配置 + /// + private void BtnSave_Click(object sender, EventArgs e) + { + try + { + var result = MessageBox.Show("是否保存所有修改的配置?".Translated(), "确认保存".Translated(), + MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result != DialogResult.Yes) return; + + // 验证表格中所有变量 + if (!ValidateAllVariablesInGrid()) + { + return; + } + + // 同步表格数据到Variables列表 + if (variableTable.DataSource is List gridVariables) + { + // 清空原有列表,替换为表格中的最新数据 + Variables.Clear(); + Variables.AddRange(gridVariables); + } + + SaveConfigToExcel(); + LoadVariables(); + ShowSuccess("所有配置保存成功".Translated()); + } + catch (Exception ex) + { + ShowError($"批量保存失败: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/LargeSquareOne/VariableEditForm.resx b/LargeSquareOne/VariableEditForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/VariableEditForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/ViewModel/FrmDataMonitorViewModel.cs b/LargeSquareOne/ViewModel/FrmDataMonitorViewModel.cs new file mode 100644 index 0000000..a2e63eb --- /dev/null +++ b/LargeSquareOne/ViewModel/FrmDataMonitorViewModel.cs @@ -0,0 +1,53 @@ +using LargeSquareOne.ViewModel; +using JinYuan.ControlLib; +using JinYuan.Models; +using JinYuan.Models.HelperAttribute; +using Language; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LargeSquareOne.ViewModel +{ + public static class FrmDataMonitorViewModel + { + public static void InitDiolameFrm(this FrmDataMonitor from) + { + from.dgvFeedingData.InitDgvFeedingData(); + from.dgvBlankingData.InitDgvBlankingData(); + from.dgvPrintContainerData.InitDgvPrintContainerData(); + //from.dgvPrintPalletData.InitDgvPrintPalletData(); + } + + class DMoveInEntity + { + + public string Remark { get; set; } + } + + /// + /// 指定类使用DataGridViewColumn + /// + /// + /// + public static void SetColumns(this DataGridView dataGridView) where T : class, new() + { + T t = new T(); + var columnList = t.GetDataGridViewColumns(); + dataGridView.Columns.Clear(); + + foreach (JinYuan.Models.HelperAttribute.DataGridViewColumn column in columnList) + { + // 构建语言键:窗体名_控件名_Column_列名 + //CommunicationEditForm_groupTable_Column_PlcNum + string resourceKey = $"FrmDataMonitor_{dataGridView.Name}_{column.Name}Header"; + string translatedHeader = LanguageManager.GetString(resourceKey); + // 获取翻译后的列标题 + dataGridView.SetColumnAutoWidth(translatedHeader, column.DataPropertyName, column.Name); + } + } + } +} diff --git a/LargeSquareOne/ViewModel/ViewModelBase.cs b/LargeSquareOne/ViewModel/ViewModelBase.cs new file mode 100644 index 0000000..445d903 --- /dev/null +++ b/LargeSquareOne/ViewModel/ViewModelBase.cs @@ -0,0 +1,365 @@ + +using JinYuan.Models; +using JinYuan.VirtualDataLibrary; +using LargeSquareOne; +using LargeSquareOne.ViewModel; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Net.Mime.MediaTypeNames; + + +#if Model_1 +//TODO 入站数据展示类名引用 +using IMData = JinYuan.Models.Loading.PreweldingEntity; +//TODO 出站数据展示类名引用 +using OUData = JinYuan.Models.Product.ProductionMoveOut; + +#elif Model_2 +//TODO 入站数据展示类名引用 +using IMData = JinYuan.Models.Loading.FMoveInEntity; +//TODO 出站数据展示类名引用 +using OUData = JinYuan.Models.FinalWeldingGearEntity; + +#elif Model_3 +//TODO 入站数据展示类名引用 +using IMData = JinYuan.Models.Loading.DMoveInEntity; +//TODO 出站数据展示类名引用 +using OUData = JinYuan.Models.DiolameGearEntity; + +#elif Model_4 +//TODO 入站数据展示类名引用 +using IMData = JinYuan.Models.Loading.PETLoadingEntity; +//TODO 出站数据展示类名引用 +using OUData = JinYuan.Models.Product.DiolameMoveOut; +#else +//TODO 组盘数据展示类名引用 +using IMData = JinYuan.Models.AGearEntity; +//TODO 叠盘数据展示类名引用 +using OUData = JinYuan.Models.BGearEntity; +//TODO 抽检数据展示类名引用 +using CData = JinYuan.Models.CGearEntity; +//TODO 底托卡板绑定数据展示类名引用 +using DData = JinYuan.Models.DGearEntity; +//TODO 底托卡板打印数据展示类名引用 +using EData = JinYuan.Models.EGearEntity; +#endif + +namespace LargeSquareOne.ViewModel +{ + public static class ViewModelBase + { + + /// + /// 组盘工位电池数据显示 + /// + public static BindingList listTA = new BindingList(); + + /// + /// 抽检工位数据显示 + /// + public static BindingList listTC = new BindingList(); + + /// + /// 叠盘数据绑定委托 + /// + /// + public static BindingList listTB = new BindingList(); + /// + /// 箱唛打印绑定委托 + /// + public static BindingList listD = new BindingList(); + /// + /// 栈板打印绑定委托 + /// + public static BindingList listE = new BindingList(); + + public static void initShowLowDataTable(this FrmMain frmMain) + { + + //M_DBCtrl._MachineInSQLTable = typeof(IMData).Name; + //M_DBCtrl._MachineOutSQLTable = typeof(OUData).Name; + } + + #region 显示上料数据 + public static void ShowFeedingData(this FrmDataMonitor from, List list) + { + try + { + if (from.dgvFeedingData.InvokeRequired) + { + from.dgvFeedingData.Invoke(new Action>(from.ShowFeedingData), list); + } + else + { + if (list != null && list.Count > 0) + { + foreach (object m in list) + { + listTA.Add((IMData)m); + } + if (listTA.Count >= 500) + { + listTA.Clear(); + GC.Collect(); + } + } + // 设置最新行为活动行 (当前行) + from.dgvFeedingData.CurrentCell = from.dgvFeedingData.Rows[from.dgvFeedingData.Rows.Count - 1].Cells[0]; + } + } + catch (Exception ex) + { + //ShowLog("显示上料出现" + ex.Message, 1); + } + } + #endregion + + /// + /// 初始化组盘工位表格 + /// + /// + public static void InitDgvFeedingData(this DataGridView dataGridView) + { + dataGridView.SetColumns(); + } + + /// + /// 初始化包装出站表格 + /// + /// + public static void InitDgvBlankingData(this DataGridView dataGridView) + { + dataGridView.SetColumns(); + } + + /// + /// 初始化栈板打印绑定表格 + /// + /// + //public static void InitDgvPrintPalletData(this DataGridView dataGridView) + //{ + // dataGridView.SetColumns(); + //} + + /// + /// 初始化箱唛打印表格 + /// + /// + public static void InitDgvPrintContainerData(this DataGridView dataGridView) + { + dataGridView.SetColumns(); + } + + //#region 显示打印箱唛 + ///// + ///// 显示打印箱唛 + ///// + ///// + //public static void ShowPrintContainerData(this FrmDataMonitor from, List list) + //{ + // try + // { + // if (from.dgvPrintContainerData.InvokeRequired) + // { + // from.dgvPrintContainerData.Invoke(new Action>(from.ShowPrintContainerData), list); + // } + // else + // { + // //绑定数据到委托数据 + // if (list != null && list.Count > 0) + // { + // foreach (object m in list) + // { + // listD.Add((DData)m); + // } + // if (listD.Count >= 500) + // { + // listD.Clear(); + // GC.Collect(); + // } + // } + // int index = from.dgvPrintContainerData.Rows.Count - 1; + + // // 设置最新行为活动行 (当前行) + // from.dgvPrintContainerData.CurrentCell = from.dgvPrintContainerData.Rows[index].Cells[1]; + // from.dgvPrintContainerData.BeginEdit(true); + + // } + // } + // catch (Exception ex) + // { + // //ShowLog("显示上料出现" + ex.Message, 1); + // } + //} + + //#endregion + + //#region 显示打印栈板 + ///// + ///// 显示打印栈板 + ///// + ///// + //public static void ShowPrintPalletData(this FrmDataMonitor from, List list) + //{ + // try + // { + // if (from.dgvPrintPalletData.InvokeRequired) + // { + // from.dgvPrintPalletData.Invoke(new Action>(from.ShowPrintPalletData), list); + // } + // else + // { + // //绑定数据到委托数据 + // if (list != null && list.Count > 0) + // { + // foreach (object m in list) + // { + // listE.Add((EData)m); + // } + // if (listE.Count >= 500) + // { + // listE.Clear(); + // GC.Collect(); + // } + // } + // int index = from.dgvPrintPalletData.Rows.Count - 1; + // //this.dgvBlankingData.FirstDisplayedScrollingRowIndex = index; + + // // 设置最新行为活动行 (当前行) + // from.dgvPrintPalletData.CurrentCell = from.dgvPrintPalletData.Rows[index].Cells[1]; + // from.dgvPrintPalletData.BeginEdit(true); + + // } + // } + // catch (Exception ex) + // { + // //ShowLog("显示上料出现" + ex.Message, 1); + // } + //} + + //#endregion + + //#region 显示下料数据 + ///// + ///// 显示下料数据 + ///// + ///// + //public static void ShowBlankingData(this FrmDataMonitor from, List list) + //{ + // try + // { + // if (from.dgvBlankingData.InvokeRequired) + // { + // from.dgvBlankingData.Invoke(new Action>(from.ShowBlankingData), list); + // } + // else + // { + // //绑定数据到委托数据 + // if (list != null && list.Count > 0) + // { + // foreach (object m in list) + // { + // listTB.Add((OUData)m); + // } + // if (listTB.Count >= 500) + // { + // listTB.Clear(); + // GC.Collect(); + // } + // } + // int index = from.dgvBlankingData.Rows.Count - 1; + // //this.dgvBlankingData.FirstDisplayedScrollingRowIndex = index; + + // // 设置最新行为活动行 (当前行) + // from.dgvBlankingData.CurrentCell = from.dgvBlankingData.Rows[index].Cells[1]; + // from.dgvBlankingData.BeginEdit(true); + + // } + // } + // catch (Exception ex) + // { + // //ShowLog("显示上料出现" + ex.Message, 1); + // } + //} + + //#endregion + + public static void InitFrmDataMonitor(this FrmDataMonitor from) + { + from.InitDiolameFrm(); + } + + public static void setColumn(this DataGridView dataGridView, string HeaderText, string DataPropertyName, bool isFill = true) + { + dataGridView.Columns.Add(dataGridView.newColumn(HeaderText, DataPropertyName, isFill)); + } + + public static DataGridViewTextBoxColumn newColumn(this DataGridView dataGridView, string HeaderText, string DataPropertyName, bool isFill) + { + DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn(); + column.HeaderText = HeaderText; + column.DataPropertyName = DataPropertyName; + if (isFill) + { + column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; ; + } + else + { + column.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; + } + return column; + } + + /// + /// 获取dgv计算宽度 + /// + /// + /// + /// + private static int GetCalculatedWidth(this DataGridView dataGridView, string text) + { + Font font = dataGridView.DefaultCellStyle.Font; // 获取当前字体 + SizeF textSize = new SizeF(0, 0); + textSize = TextRenderer.MeasureText(text, font); + return (int)Math.Ceiling(textSize.Width) + 10; // 计算宽度并考虑额外的边距(padding) + } + + /// + /// 设置表头单元格宽度 + /// + /// + /// + /// + /// + /// + public static void SetColumnAutoWidth(this DataGridView dataGridView, string HeaderText, string DataPropertyName, string name, int Width = 20) + { + + DataGridViewTextBoxColumn column = dataGridView.newColumn(HeaderText, DataPropertyName, false); + column.Name = name; + + int calculatedWidth = dataGridView.GetCalculatedWidth(HeaderText); + column.Width = Math.Max(calculatedWidth, Width); // 添加一个最小宽度限制 + dataGridView.Columns.Add(column); + } + + + public static void SetColumn(this DataGridView dataGridView, string HeaderText, string DataPropertyName, int Width) + { + + DataGridViewTextBoxColumn column = dataGridView.newColumn(HeaderText, DataPropertyName, false); + column.Width = Width; + dataGridView.Columns.Add(column); + + } + + + } +} diff --git a/LargeSquareOne/packages.config b/LargeSquareOne/packages.config new file mode 100644 index 0000000..bdeae83 --- /dev/null +++ b/LargeSquareOne/packages.config @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LargeSquareOne/trw.Designer.cs b/LargeSquareOne/trw.Designer.cs new file mode 100644 index 0000000..65945c2 --- /dev/null +++ b/LargeSquareOne/trw.Designer.cs @@ -0,0 +1,263 @@ +namespace LargeSquareOne +{ + partial class trw + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.listView1 = new System.Windows.Forms.ListView(); + this.项目1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.数值1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.项目2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.数值2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.项目3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.数值3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.lbl_Ca = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.listView2 = new System.Windows.Forms.ListView(); + this.tableLayoutPanel1.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.SuspendLayout(); + // + // listView1 + // + this.listView1.Activation = System.Windows.Forms.ItemActivation.OneClick; + this.listView1.AutoArrange = false; + this.listView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.项目1, + this.数值1, + this.项目2, + this.数值2, + this.项目3, + this.数值3}); + this.listView1.ForeColor = System.Drawing.Color.White; + this.listView1.GridLines = true; + this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.listView1.HideSelection = false; + this.listView1.LabelWrap = false; + this.listView1.Location = new System.Drawing.Point(4, 5); + this.listView1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.listView1.Name = "listView1"; + this.listView1.ShowItemToolTips = true; + this.listView1.Size = new System.Drawing.Size(518, 99); + this.listView1.TabIndex = 3; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // 项目1 + // + this.项目1.Text = "项目1"; + this.项目1.Width = 90; + // + // 数值1 + // + this.数值1.Text = "数值"; + this.数值1.Width = 80; + // + // 项目2 + // + this.项目2.Text = "项目2"; + this.项目2.Width = 90; + // + // 数值2 + // + this.数值2.Text = "数值"; + this.数值2.Width = 75; + // + // 项目3 + // + this.项目3.Text = "项目3"; + this.项目3.Width = 100; + // + // 数值3 + // + this.数值3.Text = "数值3"; + this.数值3.Width = 80; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.listView1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.listView2, 0, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 109F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 229F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 364F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(526, 415); + this.tableLayoutPanel1.TabIndex = 5; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel2.ColumnCount = 3; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 53.63881F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 46.36119F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 195F)); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel5, 2, 0); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel3, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel4, 1, 0); + this.tableLayoutPanel2.Location = new System.Drawing.Point(4, 343); + this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(518, 67); + this.tableLayoutPanel2.TabIndex = 5; + // + // tableLayoutPanel5 + // + this.tableLayoutPanel5.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel5.ColumnCount = 2; + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel5.Location = new System.Drawing.Point(325, 6); + this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel5.Name = "tableLayoutPanel5"; + this.tableLayoutPanel5.RowCount = 1; + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel5.Size = new System.Drawing.Size(185, 22); + this.tableLayoutPanel5.TabIndex = 2; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Controls.Add(this.lbl_Ca, 1, 0); + this.tableLayoutPanel3.Controls.Add(this.label2, 0, 0); + this.tableLayoutPanel3.Location = new System.Drawing.Point(5, 6); + this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 1; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(163, 22); + this.tableLayoutPanel3.TabIndex = 0; + // + // lbl_Ca + // + this.lbl_Ca.AutoSize = true; + this.lbl_Ca.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbl_Ca.ForeColor = System.Drawing.Color.White; + this.lbl_Ca.Location = new System.Drawing.Point(86, 1); + this.lbl_Ca.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbl_Ca.Name = "lbl_Ca"; + this.lbl_Ca.Size = new System.Drawing.Size(72, 20); + this.lbl_Ca.TabIndex = 0; + this.lbl_Ca.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Dock = System.Windows.Forms.DockStyle.Fill; + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(4, 1); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(74, 20); + this.label2.TabIndex = 1; + this.label2.Text = "CA"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel4.ColumnCount = 2; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.Location = new System.Drawing.Point(177, 6); + this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 1; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel4.Size = new System.Drawing.Size(139, 22); + this.tableLayoutPanel4.TabIndex = 1; + // + // listView2 + // + this.listView2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(6)))), ((int)(((byte)(30)))), ((int)(((byte)(78))))); + this.listView2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.listView2.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView2.ForeColor = System.Drawing.Color.White; + this.listView2.GridLines = true; + this.listView2.HideSelection = false; + this.listView2.Location = new System.Drawing.Point(3, 112); + this.listView2.Name = "listView2"; + this.listView2.Size = new System.Drawing.Size(520, 223); + this.listView2.TabIndex = 6; + this.listView2.UseCompatibleStateImageBehavior = false; + this.listView2.View = System.Windows.Forms.View.Details; + // + // trw + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "trw"; + this.Size = new System.Drawing.Size(526, 415); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.tableLayoutPanel3.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader 项目1; + private System.Windows.Forms.ColumnHeader 数值1; + private System.Windows.Forms.ColumnHeader 项目2; + private System.Windows.Forms.ColumnHeader 数值2; + private System.Windows.Forms.ColumnHeader 项目3; + private System.Windows.Forms.ColumnHeader 数值3; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.Label lbl_Ca; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ListView listView2; + } +} diff --git a/LargeSquareOne/trw.cs b/LargeSquareOne/trw.cs new file mode 100644 index 0000000..da8d180 --- /dev/null +++ b/LargeSquareOne/trw.cs @@ -0,0 +1,285 @@ +using JinYuan.Models; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace LargeSquareOne +{ + public partial class trw : UserControl + { + public trw() + { + InitializeComponent(); + IntValue(); + } + + + #region 减少闪烁 + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; + return cp; + } + } + #endregion + + + private int subgroupSize = 5; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取子组大小值")] + public int SubgroupSize + { + get { return subgroupSize; } + set + { + subgroupSize = value; + listView1.Items[0].SubItems[3].Text = value.ToString(); + this.Invalidate(); + } + } + + private double _uSLs = 0; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取上规格值")] + public double USLs + { + get { return _uSLs; } + set + { + _uSLs = value; + listView1.Items[2].SubItems[1].Text = value.ToString(); + this.Invalidate(); + } + } + + private double _lSLs = 0; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取下规格值")] + public double LSLs + { + get { return _lSLs; } + set + { + _lSLs = value; + listView1.Items[2].SubItems[5].Text = value.ToString(); + this.Invalidate(); + } + } + + private double _cpkPpkAcceptanceValue = 0; + [Browsable(true)] + [Category("自定义属性")] + [Description("设置或获取目标值")] + public double CpkPpkAcceptanceValue + { + get { return _cpkPpkAcceptanceValue; } + set + { + _cpkPpkAcceptanceValue = value; + listView1.Items[2].SubItems[3].Text = value.ToString(); + this.Invalidate(); + } + } + + + private CPKModel _cPKData = new CPKModel(); + [Browsable(true)] + [Category("自定义属性")] + [Description("获取目标值")] + public CPKModel CPKData + { + get { return _cPKData; } + set + { + if (value != null) + { + _cPKData = value; + //总样本数 + listView1.Items[0].SubItems[1].Text = _cPKData.TotalNumber.ToString(); + //平均值 + listView1.Items[1].SubItems[1].Text = _cPKData.MeanVlaue.ToString(); + //最大值 + listView1.Items[1].SubItems[3].Text = _cPKData.MaxValue.ToString(); + //最小值 + listView1.Items[1].SubItems[5].Text = _cPKData.MinValue.ToString(); + // 正的3倍标准差线 + listView1.Items[3].SubItems[1].Text = _cPKData.Pos3Sigma.ToString(); + // 负的3倍标准差线 + listView1.Items[3].SubItems[3].Text = _cPKData.Neg3Sigma.ToString(); + + // 组内标准差值 + listView2.Items[0].SubItems[1].Text = _cPKData.GroupSTDEV.ToString(); + // 整体标准差值 + listView2.Items[0].SubItems[2].Text = _cPKData.WholeSTDEV.ToString(); + + // 组内CPK值 + listView2.Items[1].SubItems[1].Text = _cPKData.GroupCPK.ToString(); + // 整体CPK值 + listView2.Items[1].SubItems[2].Text = _cPKData.WholeCPK.ToString(); + // 组内CP值 + listView2.Items[2].SubItems[1].Text = _cPKData.GroupCP.ToString(); + // 整体CP值 + listView2.Items[2].SubItems[2].Text = _cPKData.WholeCP.ToString(); + + // 组内CPL值 + listView2.Items[3].SubItems[1].Text = _cPKData.GroupCPL.ToString(); + // 整体CPL值 + listView2.Items[3].SubItems[2].Text = _cPKData.WholeCPL.ToString(); + // 组内CPU值 + listView2.Items[4].SubItems[1].Text = _cPKData.GroupCPU.ToString(); + // 整体CPU值 + listView2.Items[4].SubItems[2].Text = _cPKData.WholeCPU.ToString(); + + // 组内PPMUSL值 + listView2.Items[6].SubItems[1].Text = _cPKData.GroupPPM_USL.ToString(); + // 整体PPM>USL值 + listView2.Items[6].SubItems[2].Text = _cPKData.WholePPM_USL.ToString(); + + // 组内PPM Total值 + listView2.Items[7].SubItems[1].Text = _cPKData.GroupPPM_Total.ToString(); + // 整体PPMN Total值 + listView2.Items[7].SubItems[2].Text = _cPKData.WholePPM_Total.ToString(); + + lbl_Ca.Text = _cPKData.CA.ToString(); + this.Invalidate(); + } + + } + } + + + + #region 初始化 + private void IntValue() + { + + //listView2.OwnerDraw = true; + //listView2.DrawColumnHeader += ListView2_DrawColumnHeader; + + listView1.Columns.Clear(); + listView2.Columns.Clear(); + + // 假设ListView控件的名称为listView1 + // 添加列头 + listView1.Columns.Add("项目1", 80); + listView1.Columns.Add("数值1", 90); + listView1.Columns.Add("项目2", 80); + listView1.Columns.Add("数值2", 90); + listView1.Columns.Add("项目3", 80); + listView1.Columns.Add("数值3", 95); + + // 创建一个ListViewItem对象,并将数据添加到指定单元格 0 + ListViewItem item1_1 = new ListViewItem("总样本数"); + item1_1.SubItems.Add("0"); + item1_1.SubItems.Add("子组大小"); + item1_1.SubItems.Add("0"); + item1_1.SubItems.Add("图标类型"); + item1_1.SubItems.Add("XR"); + listView1.Items.Add(item1_1); // 添加完整的ListViewItem对象到ListView控件中的指定行索引 + + + // 如果需要添加多行数据,可以类似地重复上述步骤 + ListViewItem item1_2 = new ListViewItem("平均值"); //1 + item1_2.SubItems.Add("0"); + item1_2.SubItems.Add("最大值"); + item1_2.SubItems.Add("0"); + item1_2.SubItems.Add("最小值"); + item1_2.SubItems.Add("0"); + listView1.Items.Add(item1_2); + + ListViewItem item1_3 = new ListViewItem("上规格"); //2 + item1_3.SubItems.Add("0"); + item1_3.SubItems.Add("目标值"); + item1_3.SubItems.Add("0"); + item1_3.SubItems.Add("下规格"); + item1_3.SubItems.Add("0"); + listView1.Items.Add(item1_3); + + ListViewItem item1_4 = new ListViewItem("+3Sigma"); //3 + item1_4.SubItems.Add("0"); + item1_4.SubItems.Add("-3Sigma"); + item1_4.SubItems.Add("0"); + listView1.Items.Add(item1_4); + + + + + // 假设ListView控件的名称为listView1 + // 添加列头 + listView2.Columns.Add("", 150); + listView2.Columns.Add("组内", 120); + listView2.Columns.Add("整体", 120); + listView2.Columns.Add("实测", 128); + + // 创建一个ListViewItem对象,并将数据添加到指定单元格 + ListViewItem item2_1 = new ListViewItem("STDEV"); //0 + item2_1.SubItems.Add("0"); + item2_1.SubItems.Add("0"); + item2_1.SubItems.Add(""); + listView2.Items.Add(item2_1); // 添加完整的ListViewItem对象到ListView控件中的指定行索引 + + ListViewItem item2_2 = new ListViewItem("CPK"); //1 + item2_2.SubItems.Add("0"); + item2_2.SubItems.Add("0"); + item2_2.SubItems.Add(""); + listView2.Items.Add(item2_2); + ListViewItem item2_3 = new ListViewItem("CP");//2 + item2_3.SubItems.Add("0"); + item2_3.SubItems.Add("0"); + item2_3.SubItems.Add(""); + listView2.Items.Add(item2_3); + ListViewItem item2_4 = new ListViewItem("CPL");//3 + item2_4.SubItems.Add("0"); + item2_4.SubItems.Add("0"); + item2_4.SubItems.Add(""); + listView2.Items.Add(item2_4); + ListViewItem item2_5 = new ListViewItem("CPU");//4 + item2_5.SubItems.Add("0"); + item2_5.SubItems.Add("0"); + item2_5.SubItems.Add(""); + listView2.Items.Add(item2_5); + ListViewItem item2_6 = new ListViewItem("PPMUSL");//6 + item2_7.SubItems.Add("0"); + item2_7.SubItems.Add("0"); + item2_7.SubItems.Add("0"); + listView2.Items.Add(item2_7); + ListViewItem item2_8 = new ListViewItem("PPM Total");//7 + item2_8.SubItems.Add("0"); + item2_8.SubItems.Add("0"); + item2_8.SubItems.Add("0"); + listView2.Items.Add(item2_8); + + lbl_Ca.Text = "0"; + } + + #endregion + + public void ListView2_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + e.DrawBackground(); + + // 设置自定义的列标题栏背景颜色 + e.Graphics.FillRectangle(Brushes.AliceBlue, e.Bounds); + + // 绘制列标题栏的文本 + e.DrawText(); + } + } + +} diff --git a/LargeSquareOne/trw.resx b/LargeSquareOne/trw.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/LargeSquareOne/trw.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LargeSquareOne/欧姆龙报警寄存器对应表.csv b/LargeSquareOne/欧姆龙报警寄存器对应表.csv new file mode 100644 index 0000000..627e572 Binary files /dev/null and b/LargeSquareOne/欧姆龙报警寄存器对应表.csv differ diff --git a/LargeSquareOne/电池.ico b/LargeSquareOne/电池.ico new file mode 100644 index 0000000..2750edc Binary files /dev/null and b/LargeSquareOne/电池.ico differ diff --git a/LargeSquareOne/采集项目表.csv b/LargeSquareOne/采集项目表.csv new file mode 100644 index 0000000..6797e74 --- /dev/null +++ b/LargeSquareOne/采集项目表.csv @@ -0,0 +1,37 @@ +采集项编码,采集项字段,采集项描述 +in_time,CSBYHINSTATIONTIME,进站时间 +in_battery_barcode,BarCode,进站电芯条码 +in_battery_grade,in_battery_grade,进站电芯条码等级 +free_state_thickness_setpoint,Thickness1,自由态厚度(设定值) +free_state_thickness_actual,ThicknessResult1,自由态厚度(实际值) +free_state_thickness_judgment,CCDResult19,自由态厚度(判定结果) +flatness_setpoint,flatness_setpoint,平面度(设定值) +flatness_actual,flatness_actual,平面度(实际值) +flatness_judgment,CCDResult20,平面度(判定结果) +appearance_standard,appearance_standard,外观标准(设定值) +positive_terminal_inspection_result,CCDResult15,正极柱检测结果 +positive_terminal_ng_code,CCD15NgCode,正极柱检测NG代码 +explosion_valve_inspection_result,CCDResult17,防爆阀检测结果 +explosion_valve_ng_code,CCD17NgCode,防爆阀检测NG代码 +qr_code_inspection_result,CCDResult18,二维码检测结果 +qr_code_ng_code,CCD18NgCode,二维码检测NG代码 +negative_terminal_inspection_result,CCDResult16,负极柱检测结果 +negative_terminal_ng_code,CCD16NgCode,负极柱检测NG代码 +top_surface_inspection_result,CCDResult5,顶面检测结果 +top_surface_ng_code,CCD5NgCode,顶面检测NG代码 +positive_side_inspection_result,CCDResult3,正极侧面检测结果 +positive_side_ng_code,CCD3NgCode,正极侧面检测NG代码 +negative_side_inspection_result,CCDResult4,负极侧面检测结果 +negative_side_ng_code,CCD4NgCode,负极侧面检测NG代码 +large_surface_A_inspection_result,CCDResult1,大面A检测结果 +large_surface_A_ng_code,CCD1NgCode,大面A检测NG代码 +large_surface_B_inspection_result,CCDResult2,大面B检测结果 +large_surface_B_ng_code,CCD2NgCode,大面B检测NG代码 +bottom_surface_inspection_result,CCDResult6,底面检测结果 +bottom_surface_ng_code,CCD6NgCode,底面检测NG代码 +out_time,CSBYHOUTSTATIONTIME,出站时间 +out_battery_barcode,BarCode,出站电芯条码 +out_battery_grade,out_battery_grade,出站电芯条码等级 +barcode_match_result,barcode_match_result,进出站条码匹配结果 +overall_judgment,CSBYHOUTSTATIONJUDGMENTRESULT,总判定结果 +ng_code_summary,ng_code_summary,NG代码汇总 diff --git a/Libs/2016/Seagull.BarTender.Print.dll b/Libs/2016/Seagull.BarTender.Print.dll new file mode 100644 index 0000000..98168fe Binary files /dev/null and b/Libs/2016/Seagull.BarTender.Print.dll differ diff --git a/Libs/2019R4BTx32/Seagull.BarTender.Print.dll b/Libs/2019R4BTx32/Seagull.BarTender.Print.dll new file mode 100644 index 0000000..9216a56 Binary files /dev/null and b/Libs/2019R4BTx32/Seagull.BarTender.Print.dll differ diff --git a/Libs/2019R4BTx64/Seagull.BarTender.Print.dll b/Libs/2019R4BTx64/Seagull.BarTender.Print.dll new file mode 100644 index 0000000..d22ea81 Binary files /dev/null and b/Libs/2019R4BTx64/Seagull.BarTender.Print.dll differ diff --git a/Libs/2022R4BT/Seagull.BarTender.Print.dll b/Libs/2022R4BT/Seagull.BarTender.Print.dll new file mode 100644 index 0000000..92677bc Binary files /dev/null and b/Libs/2022R4BT/Seagull.BarTender.Print.dll differ diff --git a/Libs/HML.dll b/Libs/HML.dll new file mode 100644 index 0000000..4e82da3 Binary files /dev/null and b/Libs/HML.dll differ diff --git a/Libs/PLCCommunication.dll b/Libs/PLCCommunication.dll new file mode 100644 index 0000000..65919c9 Binary files /dev/null and b/Libs/PLCCommunication.dll differ diff --git a/Libs/SqlSugar.dll b/Libs/SqlSugar.dll new file mode 100644 index 0000000..1fb6811 Binary files /dev/null and b/Libs/SqlSugar.dll differ diff --git a/PLC/Base/IPLC.cs b/PLC/Base/IPLC.cs new file mode 100644 index 0000000..9a6dff2 --- /dev/null +++ b/PLC/Base/IPLC.cs @@ -0,0 +1,106 @@ +using PLCCommunication; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PLC +{ + /// + /// PLC接口 + /// + public interface IPLC + { + /// + /// 链接 + /// + /// + /// + bool Connect(ref string msg); + /// + /// 断开 + /// + /// + bool Disconnect(); + + #region 读取 + /// + /// 读取单个Bool + /// + /// + /// + bool ReadBool(string address); + /// + /// 读取单个Int16整数 + /// + /// + /// + short ReadInt16(string address); + /// + /// 异步读取单个Int16整数 + /// + /// + /// + Task> ReadInt16Async(string address); + /// + /// 读取Int16数组 + /// + /// + /// + /// + short[] ReadArrInt16(string address, ushort length); + /// + /// 异步读取Int16数组 + /// + /// + /// + /// + Task> ReadArrInt16Async(string address, ushort length); + /// + /// 读取单个32位整数 + /// + /// + /// + int ReadInt32(string address); + /// + /// 异步读取单个32位整数 + /// + /// + /// + Task> ReadInt32Async(string address); + /// + /// 读取浮点型数据 + /// + /// + /// + float ReadFloat(string address); + /// + /// 异步读取float数组 + /// + /// + /// + /// + Task> ReadArrFloatAsync(string address, ushort length); + + /// + /// 泛型读取 + /// + /// + /// + /// + /// + /// + T ReadValue(string address, DataType type, ushort length = 0); + + #endregion + + #region 写入 + bool WriteBool(string address, bool value); + bool WriteInt16(string address, short value); + bool WriteInt32(string address, int value); + bool WriteFloat(string address, float value); + JYResult WriteValue(string address, object value, PLC.DataType type); + #endregion + } +} diff --git a/PLC/Base/PlcReadWriteBase.cs b/PLC/Base/PlcReadWriteBase.cs new file mode 100644 index 0000000..b8db339 --- /dev/null +++ b/PLC/Base/PlcReadWriteBase.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using PLCCommunication; + +namespace PLC +{ + /// + /// PLC基类 + /// + public abstract class PlcReadWriteBase : IPLC + { + /// + /// 构造一个新的PLC对象 + /// + /// + /// plc名 + /// PLC的IP和端口 + /// PLC的通讯超时时间 + public PlcReadWriteBase(int pid, string pname, IPEndPoint iep, int timeout = 10) + { + this.zPlcID = pid; + this.zName = pname; + this.IP = iep.Address.ToString(); + this.Port = iep.Port; + this.Timeout = timeout; + } + /// + /// + /// + protected string zName;// 允许继承类以后可以更改名称 + /// + /// + /// + protected int zPlcID; + /// + /// + /// + public string Name { get { return zName; } } + /// + /// + /// + public int PlcID { get { return zPlcID; } } + /// + /// Ip地址 + /// + public string IP { get; private set; } + /// + /// 端口号 + /// + public int Port { get; private set; } + /// + /// 是否链接成功 + /// + public bool IsConnected { get; set; } + /// + /// PLC 的通讯超时时间 + /// + public int Timeout { get; private set; } + /// + /// 链接PLC + /// + public abstract bool Connect(ref string msg); + /// + /// 断开PLC + /// + public abstract bool Disconnect(); + /// + /// 读取Plc内部boo变量 + /// + /// + /// + public abstract bool ReadBool(string address); + /// + /// 读取单个Int16整数 + /// + /// + /// + public abstract short ReadInt16(string address); + /// + /// 异步读取单个Int16整数 + /// + /// + /// + public abstract Task> ReadInt16Async(string address); + /// + /// 读取Int16数组 + /// + /// + /// + /// + public abstract short[] ReadArrInt16(string address, ushort length); + /// + /// 异步读取Int16数组 + /// + /// + /// + /// + public abstract Task> ReadArrInt16Async(string address, ushort length); + /// + /// + /// + /// + /// + public abstract int ReadInt32(string address); + /// + /// 异步读取整数32位 + /// + /// + /// + public abstract Task> ReadInt32Async(string address); + /// + /// + /// + /// + /// + public abstract float ReadFloat(string address); + /// + /// 读取float数组 + /// + /// + /// + /// + public abstract float[] ReadArrFloat(string address, ushort length); + /// + /// 异步读取float数组 + /// + /// + /// + /// + public abstract Task> ReadArrFloatAsync(string address, ushort length); + + /// + /// + /// + /// + /// + /// + /// + /// + public abstract T ReadValue(string address, DataType type, ushort length = 0); + + /// + /// + /// + /// + /// + public abstract bool WriteBool(string address, bool value); + /// + /// + /// + /// + /// + /// + public abstract bool WriteInt16(string address, short value); + /// + /// + /// + /// + /// + /// + public abstract bool WriteInt32(string address, int value); + + /// + /// + /// + /// + /// + /// + public abstract bool WriteFloat(string address, float value); + /// + /// 泛型写入数据 + /// + /// + /// + /// + /// + public abstract JYResult WriteValue(string address, object value, PLC.DataType type = PLC.DataType.Short); + + + } +} diff --git a/PLC/DataQueue.cs b/PLC/DataQueue.cs new file mode 100644 index 0000000..e34b91b --- /dev/null +++ b/PLC/DataQueue.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PLC +{ + /// + /// 泛型定长数据队列 + /// + /// + public class DataQueue + { + public DataQueue(int length) + { + dataQueue = new Queue(length); + this.length = length; + queueLocker = new object(); + } + + /// + /// 队列长度 + /// + private int length; + /// + /// 泛型队列 + /// + private Queue dataQueue; + private readonly object queueLocker; + + /// + /// 向列尾插入元素 + /// 并移去列首超出数量的元素 + /// + /// + public void Enqueue(T value) + { + lock (queueLocker) + { + dataQueue.Enqueue(value); + if (dataQueue.Count > length) + dataQueue.Dequeue(); + } + } + + /// + /// 是否整个队列的数据都相同、 + /// + public bool IsSame + { + get + { + lock (queueLocker) + { + if (dataQueue.Count < length) + return false; + + return dataQueue.Distinct().Count() == 1; + + } + } + } + } +} diff --git a/PLC/Lib/PLCCommunication.dll b/PLC/Lib/PLCCommunication.dll new file mode 100644 index 0000000..1993b11 Binary files /dev/null and b/PLC/Lib/PLCCommunication.dll differ diff --git a/PLC/PLC.csproj b/PLC/PLC.csproj new file mode 100644 index 0000000..a2eef79 --- /dev/null +++ b/PLC/PLC.csproj @@ -0,0 +1,84 @@ + + + + + Debug + AnyCPU + {486AECD0-C2BF-43C5-B7D7-88E565ADE4B7} + Library + Properties + PLC + PLC + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + bin\Debug\PLC.xml + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\PLC.xml + false + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {258D0AB7-2B4F-4D8F-A3CD-7A8CB4A85360} + JinYuan.Helper + + + + + + + + + + + \ No newline at end of file diff --git a/PLC/PLCAlarm/AlarmFileData.cs b/PLC/PLCAlarm/AlarmFileData.cs new file mode 100644 index 0000000..18873df --- /dev/null +++ b/PLC/PLCAlarm/AlarmFileData.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PLC.PLCAlarm +{ + /// + /// 从文件读取的PLC报警信息 + /// + public class AlarmFileData + { + /// + /// alarmData有5个元素,分别对应字,位,报警触发值,报警代码,报警信息 + /// + /// + public AlarmFileData(string[] alarmData) + { + Word = int.Parse(alarmData[0]); + Bit = int.Parse(alarmData[1]); + AlarmTriger = alarmData[2] == "1"; + AlarmCode = alarmData[3]; + AlarmInfo = alarmData[4]; + } + + /// + /// 报警字地址 + /// + public int Word { get; set; } + /// + /// 报警位地址 + /// + public int Bit { get; set; } + /// + /// 报警触发值 + /// (为true的话就是当读取值是true的时候触发这个报警) + /// + public bool AlarmTriger { get; set; } + /// + /// 要上传到mes的报警代码 + /// + public string AlarmCode { get; set; } + /// + /// 报警说明 + /// + public string AlarmInfo { get; set; } + + } +} diff --git a/PLC/PLCAlarm/AlarmManager.cs b/PLC/PLCAlarm/AlarmManager.cs new file mode 100644 index 0000000..3551507 --- /dev/null +++ b/PLC/PLCAlarm/AlarmManager.cs @@ -0,0 +1,88 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PLC.PLCAlarm +{ + /// + /// 报警信息管理器 + /// + public class AlarmManager + { + private readonly ConcurrentDictionary activeAlarms = new ConcurrentDictionary(); + + /// + /// 添加报警 + /// + /// + public void AddAlarm(RecordAlarmDataArgs e) + { + var alarmInfo = new AlarmEntry + { + AlarmCode = e.AlarmCode, + AlarmInfo = e.AlarmInfo, + AlarmDate = e.AlarmDate, + StartTime = e.StartTime + }; + + activeAlarms.TryAdd(e.AlarmCode, alarmInfo); + } + /// + /// 删除报警 + /// + /// + public void RemoveAlarm(RecordAlarmDataArgs e) + { + activeAlarms.TryRemove(e.AlarmCode, out _); + } + /// + /// 获取报警文本 + /// + /// + public string GetFormattedAlarmText() + { + var sb = new StringBuilder(); + foreach (var alarm in activeAlarms.Values.OrderByDescending(a => a.StartTime)) + { + sb.AppendLine($"报警: 代码 {alarm.AlarmCode}, 内容 {alarm.AlarmInfo}, 日期 {alarm.AlarmDate}, 开始时间 {alarm.StartTime:HH:mm:ss}"); + } + return sb.ToString().TrimEnd(); + } + + /// + /// 获取报警JOSN + /// + /// + public string GetActiveAlarmsJson() + { + return JsonConvert.SerializeObject(activeAlarms.Values); + } + } + + /// + /// 报警类 + /// + public class AlarmEntry + { + /// + /// 报警代码 + /// + public string AlarmCode { get; set; } + /// + /// 报警信息 + /// + public string AlarmInfo { get; set; } + /// + /// 报警时间 + /// + public string AlarmDate { get; set; } + /// + /// 报警开始时间 + /// + public DateTime StartTime { get; set; } + } +} diff --git a/PLC/PLCAlarm/PLCAlarmReader.cs b/PLC/PLCAlarm/PLCAlarmReader.cs new file mode 100644 index 0000000..584f9e2 --- /dev/null +++ b/PLC/PLCAlarm/PLCAlarmReader.cs @@ -0,0 +1,332 @@ +using JinYuan.Helper; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Text; + +namespace PLC.PLCAlarm +{ + /// + /// PLC报警记录模块 + /// + public class PLCAlarmReader + { + /// + /// 报警模板(从触摸屏导出的报警数据) + /// + private readonly List alarmFileDataList; + /// + /// 报警记录路径(实际记录下来的实时报警) + /// + private readonly string alarmRecordPath; + /// + /// 是否忽略报警状态下的新增报警 + /// + private readonly bool ignoreAlarm; + /// + /// 报警记录类型 + /// + private readonly RecordType recordType; + + /// + /// 初始化一个报警读取器 + /// + /// 报警文件路径 + /// + /// 文件格式 .csv + /// 字,位,触发数值,报警代码,报警内容 + /// 40000,0,1,E001,急停报警(IO:A1_I0.05) + /// 40000,1,1,E002,上下料安全门报警(IO:A1_I0.06) + /// + /// + /// 报警记录目录路径 + /// 报警记录类型 + /// 是否忽略报警状态下的新增报警 + public PLCAlarmReader(string AlarmFilePath, string AlarmRecordPath, RecordType recType = RecordType.RecordWhenStart, bool ignore = false) + { + alarmFileDataList = ReadAlarmFile(AlarmFilePath); + alarmRecordPath = AlarmRecordPath; + recordType = recType; + ignoreAlarm = ignore; + RecordAlarms = new List(); + } + + /// + /// 新增报警事件 + /// + public event EventHandler PLCAlarm_New; + /// + /// 报警复位事件 + /// + public event EventHandler PLCAlarm_Remove; + /// + /// 当前记录中的报警 + /// + public List RecordAlarms { get; } + + /// + /// 读取本地报警文件 + /// + /// + private List ReadAlarmFile(string alarmFilePath) + { + List fileAlarmList = new List(); + try + { + if (!File.Exists(alarmFilePath)) + return null; + using (StreamReader sr = new StreamReader(alarmFilePath, Encoding.Default)) + { + if (!sr.EndOfStream) + sr.ReadLine(); // 读掉第一行标题行 + while (!sr.EndOfStream) + { + string[] alarmData = sr.ReadLine().Split('\t'); + fileAlarmList.Add(new AlarmFileData(alarmData)); + } + } + return fileAlarmList; + } + catch (Exception ex) + { + LogHelper.Instance.WriteError("读取本地报警信息配置文件出错:" + ex.Message); + return null; + } + } + + /// + /// 寻找报警代码 + /// + /// 字地址 + /// 位地址 + /// 值 + /// 报警信息 + /// 是否找到 + private bool FindAlarm(int word, int bit, bool value, out AlarmFileData alarmData) + { + if (alarmFileDataList == null) + { + alarmData = null; + return false; + } + foreach (var item in alarmFileDataList) + { + if (item.Word == word && + item.Bit == bit && + item.AlarmTriger == value) + { + alarmData = item; + return true; + } + } + alarmData = null; + return false; + } + + /// + /// 获得当前报警列表 + /// + /// 报警字开始地址 + /// 报警地址递增步进(个别情况用) + /// 比如按字读取基恩士MR地址时,字地址是40000,40100,40200这样增加的,此时就要把addrStep设成100 + /// + /// 报警字长度(有几个字) + /// 读到的数据 + /// 返回的当前报警列表 + /// + private bool GenerateAlarmList(int startAddr, int length, ushort[] readDatas, out List readPLCAlrms, int addrStep = 1) + { + bool isAlarm = false; + readPLCAlrms = new List(); + for (int wi = 0; wi < length; wi++) + { + ushort word = readDatas[wi]; + if (word != 0) + { + isAlarm = true; + bool[] bits = PLCDataTool.WordToBits(word); + for (int bi = 0; bi < 16; bi++) + { + if (FindAlarm(startAddr + wi * addrStep, bi, bits[bi], out AlarmFileData alarmdata)) + { + if (!readPLCAlrms.Exists((p) => p.AlarmCode == alarmdata.AlarmCode)) + readPLCAlrms.Add(alarmdata); + } + } + } + } + return isAlarm; + } + + /// + /// 输入读取的数据,判断当前是否报警,保存报警记录 + /// + /// 报警字开始地址 + /// 报警地址递增步进(个别情况用) + /// 比如按字读取基恩士MR地址时,字地址是40000,40100,40200这样增加的,此时就要把addrStep设成100 + /// + /// 报警字长度(有几个字) + /// 读到的数据 + /// + public bool IsPLCAlarm(int startAddr, int length, ushort[] readDatas, int addrStep = 1) + { + if (GenerateAlarmList(startAddr, length, readDatas, out List readPLCAlrms, addrStep)) + { + // 新增 + if (!ignoreAlarm || RecordAlarms.Count <= 0) //当不忽略报警状态下新增报警,或者当前是无报警状态的话,就记录 + { + foreach (var alrmItem in readPLCAlrms) + { + if (RecordAlarms.Exists(p => p.AlarmCode == alrmItem.AlarmCode)) + continue; + // 记录新增报警 + var recordData = new RecordAlarmDataArgs() + { + AlarmCode = alrmItem.AlarmCode, + AlarmInfo = alrmItem.AlarmInfo, + AlarmDate = DateTime.Now.ToString("yyyy/MM/dd"), + StartTime = DateTime.Now + }; + RecordAlarms.Add(recordData); + SaveAlarmRecordWhenStart(recordData); + OnAlarm_New(recordData); + } + } + // 复位 + for (int i = RecordAlarms.Count - 1; i >= 0; i--) + { + // 遍历记录中的报警,如果有当前报警中不包含的报警项,说明报警已复位 + if (!readPLCAlrms.Exists(p => p.AlarmCode == RecordAlarms[i].AlarmCode)) + { + SaveAlarmRecordWhenFinish(RecordAlarms[i], DateTime.Now); + OnAlarm_Remove(RecordAlarms[i]); + RecordAlarms.RemoveAt(i); + } + } + return true; + } + else + { + // 全都复位 + for (int i = RecordAlarms.Count - 1; i >= 0; i--) + { + SaveAlarmRecordWhenFinish(RecordAlarms[i], DateTime.Now); + OnAlarm_Remove(RecordAlarms[i]); + RecordAlarms.RemoveAt(i); + } + return false; + } + } + + /// + /// 触发新增报警事件 + /// + /// + private void OnAlarm_New(RecordAlarmDataArgs args) + { + // 以线程安全的方式引发事件 + var temp = PLCAlarm_New; + temp?.Invoke(this, args); + } + /// + /// 触发报警复位事件 + /// + /// + private void OnAlarm_Remove(RecordAlarmDataArgs args) + { + // 以线程安全的方式引发事件 + var temp = PLCAlarm_Remove; + temp?.Invoke(this, args); + } + + + #region 保存报警记录 + /// + /// 当报警消除的时候记录已消除的报警 + /// + /// 报警数据 + /// 结束时间 + private void SaveAlarmRecordWhenFinish(RecordAlarmDataArgs alrmData, DateTime endTime) + { + if (recordType != RecordType.RecordWhenFinish) + return; + + string start = alrmData.StartTime.ToString("HH:mm:ss"); + string end = endTime.ToString("HH:mm:ss"); + string totaltime = (endTime - alrmData.StartTime).TotalMinutes.ToString("f2"); + + if (!Directory.Exists(alarmRecordPath)) + { + Directory.CreateDirectory(alarmRecordPath); + } + try + { + string filePath = Path.Combine(alarmRecordPath, DateTime.Now.ToString("yyyy-MM-dd") + ".csv"); + if (!File.Exists(filePath)) + { + using (StreamWriter sw = new StreamWriter(filePath)) + { + sw.WriteLine("报警信息,报警代码,统计日期,开始时间,结束时间,消耗时间(min)"); + sw.WriteLine(alrmData.AlarmInfo + "," + alrmData.AlarmCode + "," + alrmData.AlarmDate + "," + start + "," + end + "," + totaltime); + } + } + else + { + using (StreamWriter sw = new StreamWriter(filePath, true)) + { + sw.WriteLine(alrmData.AlarmInfo + "," + alrmData.AlarmCode + "," + alrmData.AlarmDate + "," + start + "," + end + "," + totaltime); + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex.Message); + } + + } + + /// + /// 当报警触发的时候记录报警 + /// + /// 报警数据 + private void SaveAlarmRecordWhenStart(RecordAlarmDataArgs alrmData) + { + if (recordType != RecordType.RecordWhenStart) + return; + + string start = alrmData.StartTime.ToString("HH:mm:ss"); + + if (!Directory.Exists(alarmRecordPath)) + { + Directory.CreateDirectory(alarmRecordPath); + } + try + { + string filePath = Path.Combine(alarmRecordPath, DateTime.Now.ToString("yyyy-MM-dd") + ".csv"); + if (!File.Exists(filePath)) + { + using (StreamWriter sw = new StreamWriter(filePath)) + { + sw.WriteLine("报警信息,报警代码,统计日期,开始时间"); + sw.WriteLine(alrmData.AlarmInfo + "," + alrmData.AlarmCode + "," + alrmData.AlarmDate + "," + start); + } + } + else + { + using (StreamWriter sw = new StreamWriter(filePath, true)) + { + sw.WriteLine(alrmData.AlarmInfo + "," + alrmData.AlarmCode + "," + alrmData.AlarmDate + "," + start); + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex.Message); + } + + } + + #endregion + } +} diff --git a/PLC/PLCAlarm/RecordAlarmData.cs b/PLC/PLCAlarm/RecordAlarmData.cs new file mode 100644 index 0000000..06ae1ed --- /dev/null +++ b/PLC/PLCAlarm/RecordAlarmData.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PLC.PLCAlarm +{ + /// + /// 报警记录数据(同时作为报警事件的事件参数) + /// + public class RecordAlarmDataArgs : EventArgs + { + /// + /// 报警信息 + /// + public string AlarmInfo { get; set; } + /// + /// 报警代码 + /// + public string AlarmCode { get; set; } + /// + /// 报警日期 + /// + public string AlarmDate { get; set; } + /// + /// 报警开始时间 + /// + public DateTime StartTime { get; set; } + } +} diff --git a/PLC/PLCAlarm/RecordType.cs b/PLC/PLCAlarm/RecordType.cs new file mode 100644 index 0000000..07d53d2 --- /dev/null +++ b/PLC/PLCAlarm/RecordType.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PLC.PLCAlarm +{ + /// + /// 报警文件记录选项 + /// + public enum RecordType + { + /// + /// 不记录 + /// + NoRecord, + /// + /// 报警触发的时候记录 + /// + RecordWhenStart, + /// + /// 报警复位的时候记录 + /// + RecordWhenFinish + } +} diff --git a/PLC/PLCData.cs b/PLC/PLCData.cs new file mode 100644 index 0000000..7a06d54 --- /dev/null +++ b/PLC/PLCData.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace PLC +{ + /// + /// PLC数据 + /// + /// 读取的值类型 + public struct PLCData + { + /// + /// 字地址 + /// + public int WordAddr { get; set; } + /// + /// 位地址 + /// + public int BitAddr { get; set; } + /// + /// 功能 + /// + public string Function { get; set; } + /// + /// 描述 + /// + public string Info { get; set; } + /// + /// 数据类型 + /// + public DataType DataType { get; set; } + /// + /// 高低位类型 + /// + public HightLowType HightLowType { get; set; } + /// + /// 读取的值 + /// + public T Data { get; set; } + } + + /// + /// 读取数据类型 + /// + //public enum DataType + //{ + // /// + // /// 位 + // /// + // Bit = 0, + // /// + // /// 短整型 16位 + // /// + // Short, + // /// + // /// 整型 32位 + // /// + // Int, + // /// + // /// 浮点 32位 + // /// + // Float + //} + + public enum DataType + { + [Description("Bool")] + Bool, + [Description("Short")] + Short, + [Description("Int")] + Int, + [Description("Float")] + Float, + [Description("Double")] + Double, + [Description("String")] + String, + [Description("ArrByte")] + ArrByte, + [Description("ArrFloat")] + ArrFloat, + [Description("ArrShort")] + ArrShort, + [Description("ArrUshort")] + ArrUshort, + [Description("ArrInt")] + ArrInt, + [Description("ArrUint")] + ArrUint, + + + } + + public enum HightLowType + { + _12, + _21, + _4321 + } +} diff --git a/PLC/PLCDataTool.cs b/PLC/PLCDataTool.cs new file mode 100644 index 0000000..e28658d --- /dev/null +++ b/PLC/PLCDataTool.cs @@ -0,0 +1,202 @@ + + +using JinYuan.Helper; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PLC +{ + /// + /// + /// + public class PLCDataTool + { + /// + /// 将字节数组转成16进制字符串 + /// + /// + /// + /// + public static string Byte2HexString(byte[] hex, int len) + { + string returnstr = ""; + for (int i = 0; i < len; i++) + { + returnstr += hex[i].ToString("X2"); + } + return returnstr; + } + + /// + /// 把字符串截取成每个元素2个字符的字符串数组 + /// + /// + /// 前置非数据字节数,omron为30,Mitsubishi为11 + /// + public static string[] Str2StrArray(string src, int notDataCounts) + { + try + { + string[] res; + + src = src.Substring(2 * notDataCounts); + + res = new string[src.Length / 2]; + for (int i = 0; i < src.Length / 2; i++) + { + res[i] = src.Substring(i * 2, 2); + } + + return res; + } + catch (Exception exp) + { + LogHelper.Instance.WriteError(exp.Message); + return null; + } + } + + /// + /// 将条码转换成UInt16数组 + /// 没两个字符对应一个UInt16 + /// + /// + /// + public static int[] BarcodeTransfer(string barcode) + { + + byte[] bt = Encoding.ASCII.GetBytes(barcode); + if (bt.Length % 2 != 0) + { + bt = bt.Concat(new byte[] { 0 }).ToArray(); + } + int[] result = new int[bt.Length / 2]; + for (int i = 0; i < bt.Length / 2; i++) + { + result[i] = Convert.ToUInt16(bt[2 * i].ToString("X2") + bt[2 * i + 1].ToString("X2"), 16); + } + return result; + } + + /// + /// 位转字 + /// 输入一个长度16的bool数组,返回一个Int16形式的字 + /// 高位在左,低位在右 + /// + /// + /// Word + public static ushort BitsToWord(bool[] bits) + { + ushort result = 0; + for (int i = 0; i < 16; i++) + { + if (bits[i]) + result |= (ushort)(1 << i); + } + return result; + } + + /// + /// 字转位 + /// 输入一个Int16形式的字,返回一个长度16的bool数组 + /// + /// + /// Bits + public static bool[] WordToBits(ushort word) + { + bool[] result = new bool[16]; + for (int i = 0; i < 16; i++) + { + result[i] = ((word >> i) & 1) == 1; + } + return result; + } + + /// + /// 位转字节 + /// + /// + /// + public static byte BitsToByte(bool[] bits) + { + byte result = 0; + for (int i = 0; i < 8; i++) + { + if (bits[i]) + result |= (byte)(1 << i); + } + return result; + } + + /// + /// 字节转位 + /// + /// + /// + public static bool[] ByteToBits(byte bt) + { + bool[] result = new bool[8]; + for (int i = 0; i < 8; i++) + { + result[i] = ((bt >> i) & 1) == 1; + } + return result; + } + + /// + /// 把两个uint16的数据合并成一个float + /// + /// + /// + /// + public static double TwoUInt16ToFloat(ushort High, ushort Low) + { + int int_32 = (High << 16) | Low; + + return BitConverter.ToSingle(BitConverter.GetBytes(int_32), 0); + } + + /// + /// 把float分隔成两个int16 + /// + /// + /// 低位在前高位在后 + public static ushort[] FloatToTwoUInt16(float value) + { + byte[] bs = BitConverter.GetBytes(value); + + ushort low = BitConverter.ToUInt16(bs, 0); + ushort high = BitConverter.ToUInt16(bs, 2); + + return new ushort[2] { low, high }; + } + + /// + /// 把int分隔成两个int16 + /// + /// + /// 低位在前高位在后 + public static ushort[] Int32ToTwoUInt16(int value) + { + byte[] bs = BitConverter.GetBytes(value); + + ushort low = BitConverter.ToUInt16(bs, 0); + ushort high = BitConverter.ToUInt16(bs, 2); + + return new ushort[2] { low, high }; + } + + /// + /// 把两个Int16的数据合并成一个Int32 + /// + /// + /// + /// + public static int TwoInt16ToInt32(short High, short Low) + { + return ((ushort)High << 16) | (ushort)Low; + } + } +} diff --git a/PLC/PlcLibrary/OmronCipNet.cs b/PLC/PlcLibrary/OmronCipNet.cs new file mode 100644 index 0000000..61148a8 --- /dev/null +++ b/PLC/PlcLibrary/OmronCipNet.cs @@ -0,0 +1,472 @@ + +using PLCCommunication; +using PLCCommunication.PLCType.Omron; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel.Composition; +using System.Net; +using System.Threading.Tasks; + +namespace PLC +{ + /// + /// + /// + [Export("OmronCipNet", typeof(PlcReadWriteBase))] + public class OmronCipNet : PlcReadWriteBase + { + private PLCCommunication.PLCType.Omron.OmronCipNet omronCipNet = null; + + + /// + /// 初始化 + /// + /// + /// + /// + /// + public OmronCipNet(int pid, string pname, IPEndPoint iep, int timeout = 10) : + base(pid, pname, iep, timeout) + { + omronCipNet = new PLCCommunication.PLCType.Omron.OmronCipNet(); + omronCipNet.IpAddress = iep.Address.ToString(); + omronCipNet.Port = iep.Port; + omronCipNet.Slot = (byte)0; + omronCipNet.SocketKeepAliveTime = 60000; + omronCipNet.ConnectTimeOut = 1000; + omronCipNet.ReceiveTimeOut = 1000; + + IsConnected = false; + } + + /// + /// 启动与PLC链接 + /// + /// + public override bool Connect(ref string msg) + { + bool res = false; + try + { + if (!IsConnected) + { + omronCipNet.ConnectClose(); + JYResult connect = omronCipNet.ConnectServer(); + if (connect.IsSuccess) + { + IsConnected = connect.IsSuccess; + + msg = StringResources.Language.ConnectedSuccess; + return true; + } + } + else + { + return true; + } + } + catch (Exception ex) + { + msg = ex.Message; + } + return res; + } + + /// + /// 断开与PLC链接 + /// + /// + public override bool Disconnect() + { + if (IsConnected) + { + JYResult connect = omronCipNet.ConnectClose(); + IsConnected = false; + return connect.IsSuccess; + } + else + { + return true; + } + } + + + /// + /// 读取BOOl变量 + /// + /// + /// + public override bool ReadBool(string address) + { + JYResult result = omronCipNet.ReadBool(address, 1); + if (result.IsSuccess) + return result.Content[0]; + else + return false; + + } + + /// + /// 读取16位整数 + /// + /// + /// + public override short ReadInt16(string address) + { + + short result = 0; + try + { + if (IsConnected) + { + result = omronCipNet.ReadInt16(address).Content; + + } + } + catch (Exception ex) + { + + } + return result; + } + + /// + /// + /// + /// + /// + public override Task> ReadInt16Async(string address) + { + JYResult result = null; + try + { + if (IsConnected) + { + result = omronCipNet.ReadInt16Async(address).Result; + } + } + catch (Exception ex) + { + + } + return Task.FromResult(result); + } + + /// + /// 读取32位整数 + /// + /// + /// + public override int ReadInt32(string address) + { + int result = 0; + try + { + if (IsConnected) + { + result = omronCipNet.ReadInt32(address).Content; + } + } + catch (Exception ex) + { + + } + return result; + } + + /// + /// 异步读取32位整数 + /// + /// + /// + public override Task> ReadInt32Async(string address) + { + JYResult result = null; + try + { + if (IsConnected) + { + result = omronCipNet.ReadInt32Async(address).Result; + } + } + catch (Exception ex) + { + + } + return Task.FromResult(result); + } + + /// + /// 读取Float单精度小数 + /// + /// + /// + public override float ReadFloat(string address) + { + try + { + JYResult result = omronCipNet.ReadFloat(address); + if (result.IsSuccess) + { + return result.Content; + } + } + catch (Exception) + { + + } + + return 0.0f; + + + } + + /// + /// 读取浮点数组 + /// + /// + /// + /// + public override float[] ReadArrFloat(string address, ushort length) + { + float[] floats = new float[length]; + try + { + JYResult result = omronCipNet.ReadFloat(address, length); + if (result.IsSuccess) + { + floats = result.Content; + } + } + catch (Exception) + { + } + return floats; + } + + /// + /// 读取PLC数据 + /// + /// + /// + /// + /// + /// + public override T ReadValue(string address, DataType type, ushort length = 0) + { + object obj = default(object); + try + { + switch (type) + { + case DataType.Bool: + obj = omronCipNet.ReadBool(address); + break; + case DataType.Short: + obj = omronCipNet.ReadInt16(address); + break; + case DataType.Int: + obj = omronCipNet.ReadInt32(address); + break; + case DataType.Float: + obj = omronCipNet.ReadFloat(address); + break; + case DataType.Double: + obj = omronCipNet.ReadDouble(address); + break; + case DataType.String: + obj = omronCipNet.ReadString(address, length); + break; + case DataType.ArrByte: + obj = omronCipNet.Read(address, length); + break; + case DataType.ArrFloat: + obj = omronCipNet.ReadFloat(address, length); + //obj = ReadArrFloat(address, length); + break; + case DataType.ArrShort: + obj = omronCipNet.ReadInt16(address, length); + break; + case DataType.ArrUshort: + obj = omronCipNet.ReadUInt16(address, length); + break; + case DataType.ArrInt: + obj = omronCipNet.ReadUInt32(address, length); + break; + case DataType.ArrUint: + obj = omronCipNet.ReadUInt32(address, length); + break; + default: + break; + } + return (T)obj; + } + catch (Exception) + { + return default(T); + } + } + + + public override bool WriteBool(string address, bool value) + { + bool[] data = new bool[1] { value }; + JYResult result = omronCipNet.Write(address, value); + return result.IsSuccess; + } + + /// + /// 写入16位整数 + /// + /// + /// + /// + /// + public override bool WriteInt16(string address, short value) + { + JYResult result = omronCipNet.Write(address, value); + return result.IsSuccess; + } + /// + /// 写入32位整数 + /// + /// + /// + /// + public override bool WriteInt32(string address, int value) + { + JYResult result = omronCipNet.Write(address, value); + return result.IsSuccess; + } + + /// + /// 写入浮点数 + /// + /// + /// + /// + public override bool WriteFloat(string address, float value) + { + JYResult result = omronCipNet.Write(address, value); + return result.IsSuccess; + } + + + /// + /// 写入PLC数据 + /// + /// + /// + /// + /// + public override JYResult WriteValue(string address, object value, DataType type = DataType.Short) + { + JYResult result = new JYResult(); + try + { + switch (type) + { + case DataType.Bool: + result = omronCipNet.Write(address, Convert.ToBoolean(value)); + break; + case DataType.Short: + result = omronCipNet.Write(address, Convert.ToInt16(value)); + break; + case DataType.Int: + result = omronCipNet.Write(address, Convert.ToInt32(value)); + break; + case DataType.Float: + result = omronCipNet.Write(address, Convert.ToSingle(value)); + break; + case DataType.Double: + result = omronCipNet.Write(address, Convert.ToDouble(value)); + break; + case DataType.String: + result = omronCipNet.Write(address, value.ToString()); + break; + case DataType.ArrShort: + result = omronCipNet.Write(address, value as short[]); + //result = omronCipNet.Write(address, new short[] { 0, 1, 1,1 }); + break; + case DataType.ArrByte: + result = omronCipNet.Write(address, value as byte[]); + break; + case DataType.ArrFloat: + result = omronCipNet.Write(address, value as float[]); + break; + + default: + break; + } + return result; + } + catch (Exception ex) + { + result.IsSuccess = false; + result.Message = ex.Message; + return result; + } + } + /// + /// 读取16位整数 + /// + /// + /// + /// + public override short[] ReadArrInt16(string address, ushort length) + { + short[] floats = new short[length]; + try + { + JYResult result = omronCipNet.ReadInt16(address, length); + if (result.IsSuccess) + { + floats = result.Content; + } + } + catch (Exception) + { + } + return floats; + } + + public override async Task> ReadArrInt16Async(string address, ushort length) + { + JYResult result = new JYResult(); + try + { + result = await omronCipNet.ReadInt16Async(address, length); + } + catch (Exception ex) + { + result.IsSuccess = false; + result.Message = ex.Message; + } + return result; + } + + /// + /// 异步读取浮点数组 + /// + /// + /// + /// + public override async Task> ReadArrFloatAsync(string address, ushort length) + { + JYResult result = new JYResult(); + try + { + result = await omronCipNet.ReadFloatAsync(address, length); + } + catch (Exception ex) + { + result.IsSuccess = false; + result.Message = ex.Message; + } + return result; + } + } +} diff --git a/PLC/PlcLibrary/OmronFinsTCP.cs b/PLC/PlcLibrary/OmronFinsTCP.cs new file mode 100644 index 0000000..1dde90a --- /dev/null +++ b/PLC/PlcLibrary/OmronFinsTCP.cs @@ -0,0 +1,514 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PLCCommunication; +using PLCCommunication.PLCType.Omron; +using PLCCommunication.Common; +using System.ComponentModel.Composition; +using System.Net; +using PLCCommunication.Common.DataConvert; + +namespace PLC +{ + /// + /// 欧姆龙FinsTCP通讯 + /// + [Export("OmronFinsTCP", typeof(PlcReadWriteBase))] + public class OmronFinsTCP : PlcReadWriteBase + { + private OmronFinsNet omronFinsNet = null; + + + /// + /// 构造函数 + /// + /// + /// + /// + /// + public OmronFinsTCP(int pid, string pname, IPEndPoint iep, int timeout = 10) : + base(pid, pname, iep, timeout) + { + omronFinsNet = new OmronFinsNet(); + omronFinsNet.IpAddress = iep.Address.ToString(); + omronFinsNet.Port = iep.Port; + omronFinsNet.DA2 = 0x00;// PLC单元号,通常为0 + omronFinsNet.ReadSplits = 999; //读取字长度,最长999,不能超过1000 + omronFinsNet.ByteTransform.DataFormat = PLCCommunication.Common.DataFormat.CDAB; + omronFinsNet.ByteTransform.IsStringReverseByteWord = true; + omronFinsNet.ConnectTimeOut = 2000; + omronFinsNet.ReceiveTimeOut = 2000; + IsConnected = false; + } + + /// + /// 启动与PLC链接 + /// + /// + public override bool Connect(ref string msg) + { + bool res = false; + try + { + if (!IsConnected) + { + JYResult connect = omronFinsNet.ConnectServer(); + if (connect.IsSuccess) + { + IsConnected = connect.IsSuccess; + byte num1 = this.omronFinsNet.SA1; + byte num2 = this.omronFinsNet.DA1; + msg = $"{num1},{num2}"; + return true; + } + } + else + { + return true; + } + } + catch (Exception ex) + { + msg = ex.Message; + } + return res; + } + + /// + /// 断开与PLC链接 + /// + /// + public override bool Disconnect() + { + if (IsConnected) + { + JYResult connect = omronFinsNet.ConnectClose(); + IsConnected = false; + return connect.IsSuccess; + } + else + { + return true; + } + } + + + /// + /// 读取BOOl变量 + /// + /// + /// + public override bool ReadBool(string address) + { + JYResult result = omronFinsNet.ReadBool(address, 1); + if (result.IsSuccess) + return result.Content[0]; + else + return false; + + } + + /// + /// 读取16位整数 + /// + /// + /// + public override short ReadInt16(string address) + { + JYResult result = omronFinsNet.ReadInt16(address); + if (result.IsSuccess) + return result.Content; + else + return 0; + } + + /// + /// + /// + /// + /// + public override Task> ReadInt16Async(string address) + { + JYResult result = null; + try + { + if (IsConnected) + { + result = omronFinsNet.ReadInt16Async(address).Result; + } + } + catch (Exception ex) + { + + } + return Task.FromResult(result); + } + + /// + /// 读取16位数组 + /// + /// + /// + /// + public override short[] ReadArrInt16(string address, ushort length) + { + JYResult result = omronFinsNet.Read(address, length); + if (result.IsSuccess) + return ParseShortData(result.Content); + else + return null; + } + + /// + /// + /// + /// + /// + /// + public override async Task> ReadArrInt16Async(string address, ushort length) + { + JYResult result = await omronFinsNet.ReadAsync(address, length); + if (result.IsSuccess) + { + short[] parsedData = ParseShortData(result.Content); + return new JYResult { Content = parsedData, IsSuccess = true }; + } + else + { + return new JYResult { IsSuccess = false, Message = result.Message }; + } + } + + /// + /// 读取32位整数 + /// + /// + /// + public override int ReadInt32(string address) + { + JYResult result = omronFinsNet.ReadInt32(address); + if (result.IsSuccess) + return result.Content; + else + return 0; + } + + /// + /// 读取Float单精度小数 + /// + /// + /// + public override float ReadFloat(string address) + { + JYResult result = omronFinsNet.ReadFloat(address); + if (result.IsSuccess) + return result.Content; + else + return 0.0f; + } + + /// + /// 读取Float数组 + /// + /// + /// + /// + public override float[] ReadArrFloat(string address, ushort length = 0) + { + JYResult result = omronFinsNet.Read(address, length); + if (result.IsSuccess) + return ParseFloatData(result.Content); + else + return null; + } + + + /// + /// 读取有符号16位数组 + /// + /// + /// + /// + private short[] ReadArrShort(string address, ushort length = 0) + { + JYResult result = omronFinsNet.Read(address, length); + if (result.IsSuccess) + return ParseShortData(result.Content); + else + return null; + } + /// + /// 读取无符号16位数组 + /// + /// + /// + /// + private ushort[] ReadArrUshort(string address, ushort length = 0) + { + JYResult result = omronFinsNet.Read(address, length); + if (result.IsSuccess) + return ParseUshortData(result.Content); + else + return null; + } + + + private int[] ReadArrInt32(string address, ushort length = 0) + { + JYResult result = omronFinsNet.Read(address, length); + if (result.IsSuccess) + return ParseInt32Data(result.Content); + else + return null; + } + + /// + /// + /// + /// + /// + public override async Task> ReadInt32Async(string address) + { + + JYResult result = await omronFinsNet.ReadInt32Async(address); + if (result.IsSuccess) + { + + return new JYResult { Content = result.Content, IsSuccess = true }; + } + else + { + return new JYResult { IsSuccess = false, Message = result.Message }; + } + } + + /// + /// 异步读取浮点数组 + /// + /// + /// + /// + public override async Task> ReadArrFloatAsync(string address, ushort length) + { + JYResult result = await omronFinsNet.ReadAsync(address,length); + if (result.IsSuccess) + { + float[] floats = ParseFloatData(result.Content); + return new JYResult { Content = floats, IsSuccess = true }; + } + else + { + return new JYResult { IsSuccess = false, Message = result.Message }; + } + } + + + private short[] ParseShortData(byte[] content) + { + int count = content.Length / 2; + return Enumerable.Range(0, count) + .Select(i => (short)ShortLib.GetShortFromByteArray(content, i * 2)) + .ToArray(); + } + + private ushort[] ParseUshortData(byte[] content) + { + int count = content.Length / 2; + return Enumerable.Range(0, count) + .Select(i => (ushort)UShortLib.GetUShortFromByteArray(content, i * 2)) + .ToArray(); + } + + private int[] ParseInt32Data(byte[] content) + { + int count = content.Length / 2; + return Enumerable.Range(0, count) + .Select(i => (Int32)IntLib.GetIntFromByteArray(content, i * 4)) + .ToArray(); + } + + private float[] ParseFloatData(byte[] content) + { + int count = content.Length / 4; + return Enumerable.Range(0, count) + .Select(i => (float)FloatLib.GetFloatFromByteArray(content, i * 4)) + .ToArray(); + } + + + /// + /// 读取PLC数据 + /// + /// + /// + /// + /// + /// + public override T ReadValue(string address, DataType type, ushort length = 0) + { + object obj = default(object); + try + { + switch (type) + { + case DataType.Bool: + obj = omronFinsNet.ReadBool(address); + break; + case DataType.Short: + obj = omronFinsNet.ReadInt16(address); + break; + case DataType.Int: + obj = omronFinsNet.ReadInt32(address); + break; + case DataType.Float: + obj = omronFinsNet.ReadFloat(address); + break; + case DataType.Double: + obj = omronFinsNet.ReadDouble(address); + break; + case DataType.String: + obj = omronFinsNet.ReadString(address, length); + break; + case DataType.ArrByte: + obj = omronFinsNet.Read(address, length); + break; + case DataType.ArrFloat: + //obj = ReadArrFloat(address, length); + obj = omronFinsNet.ReadFloat(address, length); + break; + case DataType.ArrShort: + obj = omronFinsNet.ReadInt16(address, length); + break; + case DataType.ArrUshort: + obj = omronFinsNet.ReadUInt16(address, length); + break; + case DataType.ArrInt: + obj = omronFinsNet.ReadUInt32(address, length); + break; + case DataType.ArrUint: + obj = omronFinsNet.ReadUInt32(address, length); + break; + default: + break; + } + return (T)obj; + } + catch (Exception) + { + return default(T); + } + } + + /// + /// + /// + /// + /// + /// + public override bool WriteBool(string address, bool value) + { + bool[] data = new bool[1] { value }; + JYResult result = omronFinsNet.Write(address, value); + return result.IsSuccess; + } + + /// + /// 写入16位整数 + /// + /// + /// + /// + /// + public override bool WriteInt16(string address, short value) + { + JYResult result = omronFinsNet.Write(address, value); + return result.IsSuccess; + } + /// + /// 写入32位整数 + /// + /// + /// + /// + public override bool WriteInt32(string address, int value) + { + JYResult result = omronFinsNet.Write(address, value); + return result.IsSuccess; + } + + /// + /// 写入浮点数 + /// + /// + /// + /// + public override bool WriteFloat(string address, float value) + { + JYResult result = omronFinsNet.Write(address, value); + return result.IsSuccess; + } + + + /// + /// 写入PLC数据 + /// + /// + /// + /// + /// + public override JYResult WriteValue(string address, object value, DataType type = DataType.Short) + { + JYResult result = new JYResult(); + try + { + switch (type) + { + case DataType.Bool: + result = omronFinsNet.Write(address, Convert.ToBoolean(value)); + break; + case DataType.Short: + result = omronFinsNet.Write(address, Convert.ToInt16(value)); + break; + case DataType.Int: + result = omronFinsNet.Write(address, Convert.ToInt32(value)); + break; + case DataType.Float: + result = omronFinsNet.Write(address, Convert.ToSingle(value)); + break; + case DataType.Double: + result = omronFinsNet.Write(address, Convert.ToDouble(value)); + break; + case DataType.String: + result = omronFinsNet.Write(address, value.ToString()); + break; + case DataType.ArrShort: + result = omronFinsNet.Write(address, value as short[]); + break; + case DataType.ArrUshort: + result = omronFinsNet.Write(address, value as ushort[]); + break; + case DataType.ArrByte: + result = omronFinsNet.Write(address, value as byte[]); + break; + case DataType.ArrFloat: + result = omronFinsNet.Write(address, value as float[]); + break; + default: + break; + } + return result; + } + catch (Exception ex) + { + result.IsSuccess = false; + result.Message = ex.Message; + return result; + } + } + + + } +} diff --git a/PLC/PlcLibrary/PLCFactory.cs b/PLC/PlcLibrary/PLCFactory.cs new file mode 100644 index 0000000..aeaf4fe --- /dev/null +++ b/PLC/PlcLibrary/PLCFactory.cs @@ -0,0 +1,53 @@ +using PLCCommunication.PLCType.Siemens; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace PLC +{ + /// + /// PLC工厂 + /// + public class PLCFactory + { + private static Dictionary plcTypes = new Dictionary + { + { PLCType.OmronFinsTCP, typeof(OmronFinsTCP) }, + { PLCType.OmronCipNet, typeof(OmronCipNet) }, + { PLCType.Siemens, typeof(SiemensS7) }, + + //{ PLCType.Mitsubishi, typeof(MitsubishiPLC) }, + // 添加其他 PLC 类型和对应的类... + }; + + public static PlcReadWriteBase CreatePLC(PLCType type, int pid, string pname, IPEndPoint iep, int timeout = 10) + { + if (!plcTypes.TryGetValue(type, out Type plcType)) + { + throw new ArgumentException($"不支持的 PLC 类型: {type}"); + } + + try + { + return (PlcReadWriteBase)Activator.CreateInstance(plcType, pid, pname, iep, timeout); + } + catch (Exception ex) + { + throw new Exception($"创建 PLC 类型时出错 {type}", ex); + } + } + + public static PlcReadWriteBase CreatePLC(string typeName, int pid, string pname, IPEndPoint iep, int timeout = 10) + { + if (!Enum.TryParse(typeName, true, out PLCType type)) + { + throw new ArgumentException($"PLC 类型名称无效: {typeName}"); + } + + return CreatePLC(type, pid, pname, iep, timeout); + } + } +} diff --git a/PLC/PlcLibrary/PLCType.cs b/PLC/PlcLibrary/PLCType.cs new file mode 100644 index 0000000..c921af8 --- /dev/null +++ b/PLC/PlcLibrary/PLCType.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace PLC +{ + /// + /// PLC类型 + /// + public enum PLCType + { + /// + /// 欧姆龙 Fins协议 + /// + OmronFinsTCP, + /// + /// 欧姆龙 Fins协议 + /// + OmronCipNet, + /// + /// 三菱 MC协议 + /// + Mitsubishi, + /// + /// 基恩士 上位链路协议 + /// + Keyence, + /// + /// 西门子 S7协议 + /// + Siemens + } +} diff --git a/PLC/PlcLibrary/SiemensS7.cs b/PLC/PlcLibrary/SiemensS7.cs new file mode 100644 index 0000000..82b988d --- /dev/null +++ b/PLC/PlcLibrary/SiemensS7.cs @@ -0,0 +1,265 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using PLCCommunication; +using PLCCommunication.PLCType.Siemens; +using PLCCommunication.Common; +using System.ComponentModel.Composition; +using System.Net; +using PLCCommunication.Common.DataConvert; + +namespace PLC +{ + /// + /// 西门子S7协议通讯(S7-1200/S7-300/S7-400/S7-200SMART) + /// + [Export("SiemensS7", typeof(PlcReadWriteBase))] + public class SiemensS7 : PlcReadWriteBase + { + private SiemensS7Net siemensS7Net = null; + + public SiemensS7(int pid, string pname, IPEndPoint iep, int timeout = 10) + : base(pid, pname, iep, timeout) + { + siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200); + siemensS7Net.IpAddress = iep.Address.ToString(); + siemensS7Net.Port = iep.Port; + siemensS7Net.ByteTransform.DataFormat = DataFormat.CDAB; + siemensS7Net.ConnectTimeOut = 2000; + siemensS7Net.ReceiveTimeOut = 2000; + IsConnected = false; + } + + public override bool Connect(ref string msg) + { + try + { + if (!IsConnected) + { + JYResult connect = siemensS7Net.ConnectServer(); + if (connect.IsSuccess) + { + IsConnected = true; + msg = "连接成功"; + return true; + } + + msg = connect.Message; + + } + } + catch (Exception ex) + { + msg = ex.Message; + } + return false; + } + + public override bool Disconnect() + { + if (IsConnected) + { + siemensS7Net.ConnectClose(); + IsConnected = false; + } + return true; + } + + public override bool ReadBool(string address) + { + JYResult result = siemensS7Net.ReadBool(address); + return result.IsSuccess ? result.Content : false; + } + + public override short ReadInt16(string address) + { + JYResult result = siemensS7Net.ReadInt16(address); + return result.IsSuccess ? result.Content : (short)0; + } + + public override async Task> ReadInt16Async(string address) + { + return await siemensS7Net.ReadInt16Async(address); + } + + public override short[] ReadArrInt16(string address, ushort length) + { + JYResult result = siemensS7Net.ReadInt16(address, length); + return result.IsSuccess ? result.Content : null; + } + + public override async Task> ReadArrInt16Async(string address, ushort length) + { + return await siemensS7Net.ReadInt16Async(address, length); + } + + public override int ReadInt32(string address) + { + JYResult result = siemensS7Net.ReadInt32(address); + return result.IsSuccess ? result.Content : 0; + } + + public override float ReadFloat(string address) + { + JYResult result = siemensS7Net.ReadFloat(address); + return result.IsSuccess ? result.Content : 0.0f; + } + + public override float[] ReadArrFloat(string address, ushort length = 0) + { + JYResult result = siemensS7Net.ReadFloat(address, length); + return result.IsSuccess ? result.Content : null; + } + + public override async Task> ReadInt32Async(string address) + { + return await siemensS7Net.ReadInt32Async(address); + } + + public override async Task> ReadArrFloatAsync(string address, ushort length) + { + return await siemensS7Net.ReadFloatAsync(address, length); + } + + + /// + /// 统一读取 + /// + public override T ReadValue(string address, DataType type, ushort length = 0) + { + object obj = null; + try + { + switch (type) + { + case DataType.Bool: + obj = siemensS7Net.ReadBool(address).Content; + break; + case DataType.Short: + obj = siemensS7Net.ReadInt16(address).Content; + break; + case DataType.Int: + obj = siemensS7Net.ReadInt32(address).Content; + break; + case DataType.Float: + obj = siemensS7Net.ReadFloat(address).Content; + break; + case DataType.Double: + obj = siemensS7Net.ReadDouble(address).Content; + break; + case DataType.String: + obj = siemensS7Net.ReadString(address, length).Content; + break; + + case DataType.ArrByte: + obj = ReadArrByteFromPlc(address, length); + break; + + case DataType.ArrFloat: + obj = siemensS7Net.ReadFloat(address, length).Content; + break; + case DataType.ArrShort: + obj = siemensS7Net.ReadInt16(address, length).Content; + break; + case DataType.ArrUshort: + obj = siemensS7Net.ReadUInt16(address, length).Content; + break; + case DataType.ArrInt: + obj = siemensS7Net.ReadInt32(address, length).Content; + break; + case DataType.ArrUint: + obj = siemensS7Net.ReadUInt32(address, length).Content; + break; + } + return (T)obj; + } + catch + { + return default; + } + } + + + private byte[] ReadArrByteFromPlc(string address, ushort length) + { + short[] shorts = ReadArrInt16(address, length); + if (shorts == null) return null; + + byte[] bytes = new byte[shorts.Length * 2]; + Buffer.BlockCopy(shorts, 0, bytes, 0, bytes.Length); + return bytes; + } + + public override bool WriteBool(string address, bool value) + { + JYResult result = siemensS7Net.Write(address, value); + return result.IsSuccess; + } + + public override bool WriteInt16(string address, short value) + { + JYResult result = siemensS7Net.Write(address, value); + return result.IsSuccess; + } + + public override bool WriteInt32(string address, int value) + { + JYResult result = siemensS7Net.Write(address, value); + return result.IsSuccess; + } + + public override bool WriteFloat(string address, float value) + { + JYResult result = siemensS7Net.Write(address, value); + return result.IsSuccess; + } + + public override JYResult WriteValue(string address, object value, DataType type = DataType.Short) + { + JYResult result = new JYResult(); + try + { + switch (type) + { + case DataType.Bool: + result = siemensS7Net.Write(address, (bool)value); + break; + case DataType.Short: + result = siemensS7Net.Write(address, (short)value); + break; + case DataType.Int: + result = siemensS7Net.Write(address, (int)value); + break; + case DataType.Float: + result = siemensS7Net.Write(address, (float)value); + break; + case DataType.Double: + result = siemensS7Net.Write(address, (double)value); + break; + case DataType.String: + result = siemensS7Net.Write(address, value.ToString()); + break; + case DataType.ArrShort: + result = siemensS7Net.Write(address, (short[])value); + break; + case DataType.ArrUshort: + result = siemensS7Net.Write(address, (ushort[])value); + break; + case DataType.ArrByte: + result = siemensS7Net.Write(address, (byte[])value); + break; + case DataType.ArrFloat: + result = siemensS7Net.Write(address, (float[])value); + break; + } + return result; + } + catch (Exception ex) + { + result.IsSuccess = false; + result.Message = ex.Message; + return result; + } + } + } +} \ No newline at end of file diff --git a/PLC/Properties/AssemblyInfo.cs b/PLC/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..82b624c --- /dev/null +++ b/PLC/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("PLC")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PLC")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("486aecd0-c2bf-43c5-b7d7-88e565ade4b7")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.2")] +[assembly: AssemblyFileVersion("1.0.0.2")] diff --git a/PLC/app.config b/PLC/app.config new file mode 100644 index 0000000..9d317dd --- /dev/null +++ b/PLC/app.config @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PLC/packages.config b/PLC/packages.config new file mode 100644 index 0000000..0b14af3 --- /dev/null +++ b/PLC/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ResXManager.config.xml b/ResXManager.config.xml new file mode 100644 index 0000000..88267ce --- /dev/null +++ b/ResXManager.config.xml @@ -0,0 +1,5 @@ + + + zh-Hans + True + \ No newline at end of file diff --git a/TextFile1.txt b/TextFile1.txt new file mode 100644 index 0000000..81106fd --- /dev/null +++ b/TextFile1.txt @@ -0,0 +1,12 @@ +try + { + // 测试连接 + + MessageBox.Show("✅ 数据库连接成功!"); + } + catch (Exception ex) + { + MessageBox.Show($"❌ 连接失败:{ex.Message}"); + } + + \ No newline at end of file diff --git a/数据库/hbg_cupdataturnover.sql b/数据库/hbg_cupdataturnover.sql new file mode 100644 index 0000000..5fb7b9b --- /dev/null +++ b/数据库/hbg_cupdataturnover.sql @@ -0,0 +1,53 @@ +/* + Navicat Premium Data Transfer + + Source Server : S1270 + Source Server Type : MySQL + Source Server Version : 80042 (8.0.42) + Source Host : localhost:3306 + Source Schema : hbg_cupdataturnover + + Target Server Type : MySQL + Target Server Version : 80042 (8.0.42) + File Encoding : 65001 + + Date: 17/09/2025 16:18:25 +*/ +CREATE DATABASE IF NOT EXISTS `hbg_cupdataturnover` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; +USE `hbg_cupdataturnover`; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for dataturnover +-- ---------------------------- +DROP TABLE IF EXISTS `dataturnover`; +CREATE TABLE `dataturnover` ( + `equipNum` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `containerCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `identification` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `message` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `Time` datetime NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; + + + +-- ---------------------------- +-- Table structure for dataturnoverlog +-- ---------------------------- +DROP TABLE IF EXISTS `dataturnoverlog`; +CREATE TABLE `dataturnoverlog` ( + `LogID` int NOT NULL AUTO_INCREMENT, + `equipNum` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `containerCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `identification` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `message` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `Time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + `Operation` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`LogID`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1131 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; + + + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/数据库/labellingMachine.sql b/数据库/labellingMachine.sql new file mode 100644 index 0000000..6971480 --- /dev/null +++ b/数据库/labellingMachine.sql @@ -0,0 +1,280 @@ + + + +-- 导出 labellingmachine 的数据库结构 +CREATE DATABASE IF NOT EXISTS `labellingmachine`; +USE `labellingmachine`; + +-- 导出 表 labellingmachine.agearentity 结构 +CREATE TABLE IF NOT EXISTS `agearentity` ( + `ID` int NOT NULL AUTO_INCREMENT, + `TestTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ContainerCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '箱唛码', + `PalletCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '栈板码', + `Result` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + PRIMARY KEY (`ID`) USING BTREE, + KEY `ContainerCode` (`ContainerCode`), + KEY `PalletCode` (`PalletCode`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='AGearEntity 表'; + +-- 正在导出表 labellingmachine.agearentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.alarmcountentry 结构 +CREATE TABLE IF NOT EXISTS `alarmcountentry` ( + `ID` int NOT NULL AUTO_INCREMENT, + `PLCAdress` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `AlarmContent` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `AlarmCount` int DEFAULT NULL, + `Class` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `AlarmTime` datetime DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='AlarmCountEntry 表'; + +-- 正在导出表 labellingmachine.alarmcountentry 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.bgearentity 结构 +CREATE TABLE IF NOT EXISTS `bgearentity` ( + `ID` bigint NOT NULL AUTO_INCREMENT, + `TestTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '时间', + `ContainerCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '箱唛码', + `PalletCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '栈板码', + `Weight` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '重量', + `Result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '综合结果', + `Remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '备注', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; + +-- 正在导出表 labellingmachine.bgearentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.container 结构 +CREATE TABLE IF NOT EXISTS `container` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `container_id` varchar(50) DEFAULT NULL, + `create_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `container_id` (`container_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- 正在导出表 labellingmachine.container 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.container_kv_detail 结构 +CREATE TABLE IF NOT EXISTS `containerkvdetail` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `container_id` varchar(50) DEFAULT NULL, + `tag_code` varchar(50) DEFAULT NULL, + `tag_value` varchar(50) DEFAULT NULL, + `create_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `container_id` (`container_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + + +-- 导出 表 labellingmachine.container_kv_detail 结构 +CREATE TABLE IF NOT EXISTS `palletkvdetail` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `pallet_id` varchar(50) DEFAULT NULL, + `tag_code` varchar(50) DEFAULT NULL, + `tag_value` varchar(50) DEFAULT NULL, + `create_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `pallet_id` (`pallet_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- 正在导出表 labellingmachine.container_kv_detail 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.dgearentity 结构 +CREATE TABLE IF NOT EXISTS `dgearentity` ( + `ID` int NOT NULL AUTO_INCREMENT, + `TestTime` datetime DEFAULT NULL, + `ContainerCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '箱唛码', + `Result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '结果', + `Remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '备注', + PRIMARY KEY (`ID`) USING BTREE, + KEY `ContainerCode` (`ContainerCode`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='箱唛标签打印记录'; + +-- 正在导出表 labellingmachine.dgearentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.egearentity 结构 +CREATE TABLE IF NOT EXISTS `egearentity` ( + `ID` bigint NOT NULL AUTO_INCREMENT, + `PalletCode` varchar(50) NOT NULL COMMENT '栈板码', + `TestTime` datetime DEFAULT NULL, + `Result` varchar(50) DEFAULT NULL COMMENT '结果', + `Remark` text COMMENT '备注', + PRIMARY KEY (`ID`), + KEY `PalletCode` (`PalletCode`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='栈板标签打印记录'; + +-- 正在导出表 labellingmachine.egearentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.hourprod 结构 +CREATE TABLE IF NOT EXISTS `hourprod` ( + `FDate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `FHour` int NOT NULL, + `ProdIn` int DEFAULT NULL, + `ProdOut` int DEFAULT NULL, + `TestTime` datetime DEFAULT NULL, + `Ppm` int DEFAULT NULL, + `JiaDL` decimal(20,6) DEFAULT NULL, + PRIMARY KEY (`FDate`,`FHour`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='存储每日产能'; + +-- 正在导出表 labellingmachine.hourprod 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.palletentity 结构 +CREATE TABLE IF NOT EXISTS `palletentity` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `pallet_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `container_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `create_time` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `pallet_id` (`pallet_id`), + KEY `container_id` (`container_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- 正在导出表 labellingmachine.palletentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.parambase 结构 +CREATE TABLE IF NOT EXISTS `parambase` ( + `fNo` int NOT NULL, + `Type` int NOT NULL, + `ParaName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Uint` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + PRIMARY KEY (`ParaName`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; + +-- 正在导出表 labellingmachine.parambase 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.paramlist 结构 +CREATE TABLE IF NOT EXISTS `paramlist` ( + `ModelName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Type` int DEFAULT NULL, + `IsCheck` tinyint(1) DEFAULT NULL, + `ParaName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `ParaValueMin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `ParaValueMax` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Uint` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `UpdateTime` datetime DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; + +-- 正在导出表 labellingmachine.paramlist 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.productmodel 结构 +CREATE TABLE IF NOT EXISTS `productmodel` ( + `ModelName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `MaterialCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + PRIMARY KEY (`ModelName`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; + +-- 正在导出表 labellingmachine.productmodel 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.rfidentity 结构 +CREATE TABLE IF NOT EXISTS `rfidentity` ( + `ID` int NOT NULL AUTO_INCREMENT, + `ChannelNo` int DEFAULT NULL, + `TestTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `RFID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `BarCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Result` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `Flag` int DEFAULT NULL, + `FtCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '复投', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='AGearEntity 表'; + +-- 正在导出表 labellingmachine.rfidentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.rfidoutentity 结构 +CREATE TABLE IF NOT EXISTS `rfidoutentity` ( + `ID` int NOT NULL AUTO_INCREMENT, + `ChannelNo` int DEFAULT NULL, + `TestTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `RFID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `BarCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Result` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `Flag` int DEFAULT NULL, + `FtCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '复投', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='AGearEntity 表'; + +-- 正在导出表 labellingmachine.rfidoutentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.rgearentity 结构 +CREATE TABLE IF NOT EXISTS `rgearentity` ( + `ID` int NOT NULL AUTO_INCREMENT, + `ChannelNo` int DEFAULT NULL, + `TestTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `RFID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `BarCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Result` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `Flag` int DEFAULT NULL, + `FtCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '复投', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=383 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='AGearEntity 表'; + +-- 正在导出表 labellingmachine.rgearentity 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.sysadmin 结构 +CREATE TABLE IF NOT EXISTS `sysadmin` ( + `LoginId` int NOT NULL AUTO_INCREMENT, + `LoginName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `LoginPwd` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `LoginUid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `LoginLevel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `SystemLog` int DEFAULT NULL, + `CPKData` int DEFAULT NULL, + `HistoryData` int DEFAULT NULL, + `ParamSet` int DEFAULT NULL, + `SystemSet` int DEFAULT NULL, + `UserManage` int DEFAULT NULL, + PRIMARY KEY (`LoginId`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; + +INSERT INTO `sysadmin` (`LoginId`, `LoginName`, `LoginPwd`, `LoginUid`, `LoginLevel`, `SystemLog`, `CPKData`, `HistoryData`, `ParamSet`, `SystemSet`, `UserManage`) VALUES + (1, 'Admin', 'OphRG2FDxwk=', '1', '管理员', 1, 1, 1, 1, 1, 1); + +-- 导出 表 labellingmachine.syslog 结构 +CREATE TABLE IF NOT EXISTS `syslog` ( + `Id` int NOT NULL AUTO_INCREMENT, + `InsertTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `LogType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Operater` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `VarName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `AlarmSet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `AlarmValue` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `AlarmType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + PRIMARY KEY (`Id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='存储记录日志'; + + + +-- 导出 表 labellingmachine.tb_3a_3c 结构 +CREATE TABLE IF NOT EXISTS `tb_3a_3c` ( + `equipNum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `containerCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `identification` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `messageCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `message` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `Time` datetime DEFAULT NULL, + PRIMARY KEY (`containerCode`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; + +-- 正在导出表 labellingmachine.tb_3a_3c 的数据:~0 rows (大约) + +-- 导出 表 labellingmachine.tb_3d_3c 结构 +CREATE TABLE IF NOT EXISTS `tb_3d_3c` ( + `RFID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `BarCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `Flag` int DEFAULT '0', + `UpDateTime` datetime DEFAULT NULL, + PRIMARY KEY (`RFID`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; +