19 Commits

Author SHA1 Message Date
efcf79ea0d 合并修改 2025-04-30 16:13:13 +08:00
bb943740da 数据统计线程保护
设置删除工位失效bug
2025-04-30 09:21:06 +08:00
71bbea56a7 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-29 15:23:37 +08:00
6c1d86619e har error 和日志更新 2025-04-29 15:22:54 +08:00
1a84519874 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-28 15:38:34 +08:00
4e75b0d4da 将相机设置页面的数字框改为文本框,防止出现滚动中键数值变动的情况 2025-04-28 15:38:27 +08:00
95bc9ce3b3 提交 2025-04-28 11:30:29 +08:00
bc0ed5d574 相机格式更改 2025-04-28 09:44:35 +08:00
6a9e7e4343 更新GPU 2025-04-27 10:40:12 +08:00
f12c2f0cd9 软件ico提交 2025-04-27 10:21:45 +08:00
8e2197f46e 提交图片保存路径 2025-04-27 09:48:48 +08:00
ed53c8e5db 1.三色灯提交
2.设置重命名时带出之前名称
2025-04-27 09:26:18 +08:00
b749eb4266 提交设备状态 2025-04-25 09:03:47 +08:00
ae5c1122ed 提交 2025-04-24 16:21:10 +08:00
6973d39cad 提交bug 2025-04-24 15:45:01 +08:00
77b75050b2 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-24 09:00:57 +08:00
99226f4cb0 提交 2025-04-24 09:00:44 +08:00
7011e4f353 1 2025-03-18 14:25:41 +08:00
6696c4e106 修改config 2025-03-18 14:20:11 +08:00
74 changed files with 2492 additions and 1614 deletions

View File

@ -110,7 +110,7 @@ namespace CanFly.Canvas.Shape
/// <summary>
/// 是否填充多边形使用select_fill_color 或 fill_color 填充
/// 是否填充多边形 使用select_fill_color 或 fill_color 填充
/// </summary>
public bool fill = false;

View File

@ -3,14 +3,14 @@
partial class FlyCanvas
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
///// <summary>
///// 清理所有正在使用的资源
///// 清理所有正在使用的资源
///// </summary>
///// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
///// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
//protected override void Dispose(bool disposing)
//{
// if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -1704,9 +1704,9 @@ namespace CanFly.Canvas.UI
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))

View File

@ -1,10 +1,10 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成
// 此代码由工具生成
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失
// 重新生成代码,这些更改将会丢失
// </auto-generated>
//------------------------------------------------------------------------------
@ -13,12 +13,12 @@ namespace XKRS.CanFly.Properties {
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等
/// 一个强类型的资源类,用于查找本地化的字符串等
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目
// (以 /str 作为命令选项),或重新生成 VS 项目
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@ -33,7 +33,7 @@ namespace XKRS.CanFly.Properties {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例
/// 返回此类使用的缓存的 ResourceManager 实例
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
@ -48,7 +48,7 @@ namespace XKRS.CanFly.Properties {
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写
/// 使用此强类型资源类的所有资源查找执行重写
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
@ -61,7 +61,7 @@ namespace XKRS.CanFly.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap Close {
get {

View File

@ -3,14 +3,14 @@
partial class CtrlTitleBar
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class GuideCircleCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class GuideHeightCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class GuideLineCircleCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class GuideLineCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,6 +3,7 @@ using System.ComponentModel;
using System.Drawing.Imaging;
using AntdUI;
using DH.Commons.Enums;
using DVPCameraType;
using HalconDotNet;
using OpenCvSharp;
@ -47,11 +48,13 @@ namespace DH.Commons.Base
// 私有字段 + 带通知的属性与DetectionLabel风格一致
private bool _isEnabled = false;
private bool _isallPicEnabled = true;//默认全画幅
private bool _isRGBEnabled = true;//默认彩色
private bool _isContinueMode = false;
private bool _isSavePicEnabled = false;
private bool _isZoomCamera = false;
private string _imageSaveDirectory;
private EnumCamType _CamType;
private dvpStreamFormat _dvpstreamFormat = dvpStreamFormat.S_RGB24;
private ImageFormat _imageFormat = ImageFormat.Jpeg;
private bool _isHardwareTrigger = true;
private string _serialNumber = string.Empty;
@ -71,6 +74,20 @@ namespace DH.Commons.Base
public volatile int SnapshotCount = 0;
[Category("相机设置")]
[DisplayName("图像格式")]
[Description("相机采集图像格式")]
public dvpStreamFormat DvpImageFormat
{
get => _dvpstreamFormat;
set
{
if (_dvpstreamFormat == value) return;
_dvpstreamFormat = value;
OnPropertyChanged(nameof(DvpImageFormat));
}
}
[Category("采图模式")]
[DisplayName("连续模式")]
[Description("是否连续模式。true连续模式采图false触发模式采图")]

View File

@ -6,6 +6,8 @@ using System.Text.RegularExpressions;
using System.Text;
using System.Drawing.Design;
using AntdUI;
using System.Text.Json.Serialization;
using static DH.Commons.Enums.EnumHelper;
using System.Text.Json.Serialization;
using DH.Commons.Enums;
@ -282,6 +284,7 @@ namespace DH.Commons.Base
[Category("关联相机")]
[DisplayName("相机源ID")]
[Description("关联相机的唯一标识符")]
[JsonPropertyName("camera_sourceId")]
//[TypeConverter(typeof(CollectionCountConvert))]
public string CameraSourceId
{
@ -616,6 +619,13 @@ namespace DH.Commons.Base
}
[Category("启用配置")]
[DisplayName("是否启用预处理")]
[JsonPropertyName("is_PreEnabled")]
public bool IsPreEnabled { get; set; }
// public bool IsAddStation { get; set; } = true;
private bool _isAddStation;
[Category("启用配置")]
[DisplayName("是否加入检测工位")]
[Description("是否加入检测工位")]
public bool IsAddStation
@ -901,6 +911,7 @@ namespace DH.Commons.Base
ModelPath = modelPath ?? string.Empty;
Name = name;
ModelType = modelType;
ModelPath = modelPath ?? string.Empty;
IsEnableGPU = isEnableGPU;
}
@ -916,6 +927,7 @@ namespace DH.Commons.Base
private bool _selected = false;
public bool Selected
{
get { return _selected; }
@ -926,6 +938,7 @@ namespace DH.Commons.Base
OnPropertyChanged(nameof(Selected));
}
}
[JsonPropertyName("name")]
private string _name;
public string Name
{
@ -940,6 +953,7 @@ namespace DH.Commons.Base
private string _value;
[JsonPropertyName("value")]
public string Value
{
get { return _value; }
@ -955,7 +969,9 @@ namespace DH.Commons.Base
[JsonIgnore]
public CellLink[] CellLinks
{
get { return cellLinks; }
get {
return cellLinks; }
set
{
if (cellLinks == value) return;
@ -995,7 +1011,7 @@ namespace DH.Commons.Base
}
[JsonPropertyName("labelId")]
public string LabelId
{
get { return _labelId; }
@ -1006,7 +1022,7 @@ namespace DH.Commons.Base
OnPropertyChanged(nameof(LabelId));
}
}
[JsonPropertyName("labelName")]
public string LabelName
{
get { return _labelName; }
@ -1039,7 +1055,7 @@ namespace DH.Commons.Base
OnPropertyChanged(nameof(MinScore));
}
}
[JsonPropertyName("maxArea")]
public double MaxArea
{
get { return _maxArea; }
@ -1050,7 +1066,7 @@ namespace DH.Commons.Base
OnPropertyChanged(nameof(MaxArea));
}
}
[JsonPropertyName("minArea")]
public double MinArea
{
get { return _minArea; }
@ -1061,7 +1077,7 @@ namespace DH.Commons.Base
OnPropertyChanged(nameof(MinArea));
}
}
[JsonPropertyName("_resultState")]
public ResultState ResultState
{
get { return _resultState; }
@ -1072,12 +1088,14 @@ namespace DH.Commons.Base
OnPropertyChanged(nameof(ResultState));
}
}
private CellLink[] cellLinks;
[JsonIgnore]
public CellLink[] CellLinks
{
get { return cellLinks; }
get {
return cellLinks; }
set
{
if (cellLinks == value) return;
@ -1095,6 +1113,60 @@ namespace DH.Commons.Base
}
}
public class PreTreatCollect
{
[Category("尺寸测量集合")]
[DisplayName("预处理-算法文件路径")]
[Description("预处理算法文件路径配置")]
[JsonPropertyName("halconPath_Pre")]
// [Editor(typeof(FileDialogEditor), typeof(UITypeEditor))]
public string HalconPath_Pre { get; set; }
[Category("尺寸测量集合")]
[DisplayName("输入参数列表")]
[Description("输入参数列表")]
[JsonPropertyName("preParams")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<PreTreatParam>), typeof(UITypeEditor))]
public List<PreTreatParam> PreParams { get; set; } = new List<PreTreatParam>();
[Category("尺寸测量集合")]
[DisplayName("输出参数列表")]
[Description("输出参数列表")]
[JsonPropertyName("outPreParams")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<PreTreatParam>), typeof(UITypeEditor))]
public List<PreTreatParam> outPreParams { get; set; } = new List<PreTreatParam>();
[Category("尺寸测量集合")]
[DisplayName("预处理-名称")]
[Description("预处理名称")]
[JsonPropertyName("preName")]
public string PreName { get; set; }
[Category("尺寸测量集合")]
[DisplayName("预处理-启用")]
[Description("预处理启用")]
[JsonPropertyName("preIsEnable")]
public bool PreIsEnable { get; set; } = false;
[Category("尺寸测量集合")]
[DisplayName("类型")]
[Description("类型")]
[JsonPropertyName("preType")]
// [TypeConverter(typeof(EnumDescriptionConverter<SizeEnum>))]
public SizeEnum PreType { get; set; }
[Category("尺寸测量集合")]
[DisplayName("阈值")]
[Description("阈值")]
[JsonPropertyName("prePix")]
public int PrePix { get; set; }
}
public class SizeTreatParam : NotifyProperty
{
@ -1256,7 +1328,7 @@ namespace DH.Commons.Base
[DisplayName("检测项标签")]
[Description("检测标签Id")]
//[TypeConverter(typeof(DetectionLabelConverter))]
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string LabelId { get; set; }

View File

@ -11,6 +11,9 @@ namespace DH.Commons.Base
{
public class GlobalConfig : NotifyProperty
{
bool _EnableVibrator=false;
bool _EnableBelt = false;
int _ClearTime=0;
string _name;
private BindingList<PLCItem> _InitProcessList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StartProcessList = new BindingList<PLCItem>();
@ -29,7 +32,42 @@ namespace DH.Commons.Base
}
}
}
public bool EnableBelt
{
get => _EnableBelt;
set
{
if (_EnableBelt != value)
{
_EnableBelt = value;
OnPropertyChanged(nameof(EnableBelt));
}
}
}
public bool EnableVibrator
{
get => _EnableVibrator;
set
{
if (_EnableVibrator != value)
{
_EnableVibrator = value;
OnPropertyChanged(nameof(EnableVibrator));
}
}
}
public int ClearTime
{
get => _ClearTime;
set
{
if (_ClearTime != value)
{
_ClearTime = value;
OnPropertyChanged(nameof(ClearTime));
}
}
}
public BindingList<PLCItem> InitProcessList
{
get => _InitProcessList;

View File

@ -27,6 +27,9 @@
</ItemGroup>
<ItemGroup>
<Reference Include="DVPCameraCS64">
<HintPath>..\X64\Debug\DVPCameraCS64.dll</HintPath>
</Reference>
<Reference Include="halcondotnet">
<HintPath>..\x64\Debug\halcondotnet.dll</HintPath>
</Reference>

View File

@ -9,8 +9,9 @@ namespace DH.Commons.Enums
{
public enum EnumStatus
{
,
,
,
,
,
}

View File

@ -682,31 +682,31 @@ namespace DH.Commons.Enums
Warning = 8,
}
public enum ResultState
{
[Description("NA")]
NA = -5,
[Description("尺寸NG")]
SizeNG = -4,
[Description("检测NG")]
DetectNG = -3,
//public enum ResultState
//{
// [Description("NA")]
// NA = -5,
// [Description("尺寸NG")]
// SizeNG = -4,
// [Description("检测NG")]
// DetectNG = -3,
//[Description("检测不足TBD")]
// ShortageTBD = -2,
[Description("检测结果TBD")]
ResultTBD = -1,
[Description("OK")]
OK = 1,
// [Description("NG")]
// NG = 2,
//统计结果
[Description("A类NG")]
A_NG = 25,
[Description("B类NG")]
B_NG = 26,
[Description("C类NG")]
C_NG = 27,
}
// //[Description("检测不足TBD")]
// // ShortageTBD = -2,
// [Description("检测结果TBD")]
// ResultTBD = -1,
// [Description("OK")]
// OK = 1,
// // [Description("NG")]
// // NG = 2,
// //统计结果
// [Description("A类NG")]
// A_NG = 25,
// [Description("B类NG")]
// B_NG = 26,
// [Description("C类NG")]
// C_NG = 27,
//}
public enum HikCameraType
{
[Description("HikCamera-Gige")]

View File

@ -571,8 +571,8 @@ namespace DH.Commons.Enums
}
//分别基于像素GetPixel和SetPixel、基于内存、基于指针这三种方法增强图片对比度
// 第一种方法:像素提取法速度慢 基于像素400-600ms
//分别基于像素GetPixel和SetPixel、基于内存、基于指针这三种方法增强图片对比度
// 第一种方法:像素提取法 速度慢 基于像素400-600ms
public static Bitmap MethodBaseOnPixel(Bitmap bitmap, int degree)
{
Color curColor;

View File

@ -108,7 +108,7 @@ namespace DH.Commons.Enums
                DataGridViewCheckboxHeaderEventArgs ex = new DataGridViewCheckboxHeaderEventArgs();
ex.CheckedState = _checked;
object sender = new object();//此处不代表选择的列头checkbox只是作为参数传递因为列头checkbox是绘制出来的无法获得它的实例
object sender = new object();//此处不代表选择的列头checkbox只是作为参数传递 因为列头checkbox是绘制出来的无法获得它的实例
                if (OnCheckBoxClicked != null)
{

View File

@ -18,7 +18,7 @@ namespace DH.Commons.Models
/// <summary>
/// 当前状态
/// </summary>
public static EnumStatus CurrentStatus =EnumStatus.;
public static EnumStatus CurrentStatus =EnumStatus.;
}
/// <summary>

View File

@ -27,7 +27,7 @@ namespace DH.Devices.Camera
public bool Connected=false;
public int m_n_dev_count = 0;
private DVPCamera.dvpStreamCallback ImageCallback;
public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24;
// public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24;
public int m_CamCount = 0;
public Double m_dfDisplayCount = 0;
@ -63,6 +63,8 @@ namespace DH.Devices.Camera
{
try
{
if (CameraName == "Cam1")
Console.WriteLine("");
pCallBackFunc = new DVPCamera.dvpEventCallback(cbExceptiondelegate);
nRet = DVPCamera.dvpOpenByUserId(CameraName,
dvpOpenMode.OPEN_NORMAL,
@ -74,7 +76,7 @@ namespace DH.Devices.Camera
throw new Exception($"Create device failed:{nRet:x8}");
}
nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)dvpStreamFormat);
nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)DvpImageFormat);
if (dvpStatus.DVP_STATUS_OK != nRet)
{
throw new Exception($"Set image format failed:{nRet:x8}");
@ -156,7 +158,10 @@ namespace DH.Devices.Camera
}
//全画幅
if (!IsAllPicEnabled)
{
SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH);
}
//// 设置 触发延迟
if (TriggerDelay > 0)

View File

@ -409,7 +409,7 @@ namespace MCDLL_NET
/********************************************************************************************************************************************************************
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ݡ<EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
********************************************************************************************************************************************************************/
@ -1005,8 +1005,8 @@ namespace MCDLL_NET
/// </summary>
/// <param name="Axis"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="Stop_Time"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣʱ<CDA3><20><>Χ 0 -1000ms<6D><73><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ͣ<EFBFBD><CDA3>
/// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײԭ<D7B2>㻺ͣʱ<CDA3><EFBFBD><E4A3AC>Ҫ<EFBFBD><D2AA><EFBFBD>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĸ<C3B5><C4B8>ٶ<EFBFBD><D9B6>ٶȣ<D9B6><C8A3>͵<EFBFBD><CDB5>ٶ<EFBFBD><D9B6>ٶȵĴ<C8B5><C4B4>
/// <20><><EFBFBD>ô<EFBFBD><C3B4>˻<EFBFBD><CBBB><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ԭ<EFBFBD><D4AD>ʱ<EFBFBD><CAB1><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>м</param>
/// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײԭ<D7B2>㻺ͣʱ<CDA3><EFBFBD><E4A3AC>Ҫ<EFBFBD><D2AA><EFBFBD>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĸ<C3B5><C4B8>ٶ<EFBFBD><D9B6>ٶȣ<D9B6><C8A3>͵<EFBFBD><CDB5>ٶ<EFBFBD><D9B6>ٶȵĴ<C8B5><C4B4><EFBFBD>
/// <20><><EFBFBD>ô<EFBFBD><C3B4>˻<EFBFBD><CBBB><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ԭ<EFBFBD><D4AD>ʱ<EFBFBD><CAB1><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>м<EFBFBD> </param>
/// <param name="StationNumber">վ<><D5BE><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>Ϊ 0</param>
/// <returns></returns>
[DllImport("MCDLL_NET.DLL", EntryPoint = "MCF_Search_Home_Stop_Time_Net")]

View File

@ -444,17 +444,17 @@ namespace DH.Devices.Motion
//[Category("回原点设置")]
//[DisplayName("回原点模式")]
//[Description("HomeMode回原点模式0一般模式 1极限限位模式 2外部触发模式")]
//[Description("HomeMode回原点模式 0一般模式 1极限限位模式 2外部触发模式")]
//public int HomeMode { get; set; } = 0;
//[Category("回原点设置")]
//[DisplayName("回原点方向")]
//[Description("IsHomePositive回原点方向 true正方向开始 false负方向开始")]
//[Description("IsHomePositive回原点方向 true正方向开始 false负方向开始")]
//public bool IsHomePositive { get; set; } = true;
//[Category("回原点设置")]
//[DisplayName("是否自动回原点")]
//[Description("IsAutoGoHome是否自动回原点 true是 false否")]
//[Description("IsAutoGoHome是否自动回原点 true是 false否")]
//public bool IsAutoGoHome { get; set; } = false;
//[Category("超时设置")]
@ -601,7 +601,7 @@ namespace DH.Devices.Motion
[Category("回原点参数")]
[DisplayName("碰撞原点缓停时间")]
[Description("SearchHomeStopTime触发缓停时间范围 0-1000ms默认急停注意:设置碰撞原点缓停时间,需要配合回零设置的高速段速度,和低速度速度的搭配设置大了会出现过冲的现象,设置小了停止的时候会有抖动,需要调节时间,尽量设置找到原点时候在开关中间")]
[Description("SearchHomeStopTime触发缓停时间范围 0-1000ms默认急停 注意:设置碰撞原点缓停时间,需要配合回零设置的高速段速度,和低速度速度的搭配 设置大了会出现过冲的现象,设置小了停止的时候会有抖动,需要调节时间,尽量设置找到原点时候在开关中间 ")]
public ushort SearchHomeStopTime { get; set; } = 0;

View File

@ -85,11 +85,15 @@ namespace DH.Devices.Motion
public void NewPieces(int diskIndex, uint pieceNumber)
{
_taskFactory.StartNew(() =>
Task.Run(() =>
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
try {
Thread.CurrentThread.Priority = ThreadPriority.Highest;
OnNewPieces?.Invoke(diskIndex, pieceNumber);
OnNewPieces?.Invoke(diskIndex, pieceNumber);
}
catch (Exception ex) { /* 记录异常 */ }
});
}
public void SetResetFlag(bool isReset)
@ -314,9 +318,9 @@ namespace DH.Devices.Motion
// //设置物件检测有效电平 0是低电平 1是高电平
// rtn = CMCDLL_NET_Sorting.MCF_Sorting_Set_Input_Logic_Net((ushort)SortingInputSetting.BitInputNumber, 0);
// //设置来料检测编码器 双转盘要设置两个轴
// /*Bit_Input_Number设置位号
// 取值: Bit_Input_0, Bit_Input_1
// Axis: 轴号
// /*Bit_Input_Number设置位号
// 取值: Bit_Input_0, Bit_Input_1
// Axis: 轴号
// Source跟随方式
// 取值0命令
// 1编码器(默认)
@ -1655,7 +1659,7 @@ namespace DH.Devices.Motion
#region IMonitor
/// <summary>
/// 位置捕获监听,入料检测
/// 位置捕获监听,入料检测
/// 入料检测对射开关接到了HOME口每当有新料到达入料检测传感器时程序把当前位置当作原点并调用<see cref="SolidMotionCardBase.CapturePositionChanged(int, int)"/>函数
/// </summary>
private void MonitorPieces()
@ -1796,7 +1800,7 @@ namespace DH.Devices.Motion
// Picese_sizeStr += i.ToString()+":"+Piece_Size[i]+"\t";
// Picese_DistanceizeStr += i.ToString()+":"+ Piece_Distance_To_next[i]+"\t";
//}
// LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 , {piecesCountDic[station]} size:{Piece_Size[Piece_Size.Length - 1]}");
// LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 , {piecesCountDic[station]} size:{Piece_Size[Piece_Size.Length - 1]} ");
// LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 ,监听piece_find{tmpPieceNumber} 监听物件大小" + Picese_sizeStr+",物件间距"+ Picese_DistanceizeStr+"相机经过个数"+Piece_Cross_Camera);
if (tmpPieceNumber != piecesCountDic[station] + 1)
{

View File

@ -627,11 +627,22 @@ namespace DH.Devices.PLC
public void NewPieces(int axisIndex, uint pieceNumber)
{
_taskFactory.StartNew(() =>
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
//_taskFactory.StartNew(() =>
//{
// Thread.CurrentThread.Priority = ThreadPriority.Highest;
// OnNewPieces?.Invoke(axisIndex, pieceNumber);
//});
Task.Run(() =>
{
try
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
OnNewPieces?.Invoke(axisIndex, pieceNumber);
}
catch (Exception ex) { /* 记录异常 */ }
OnNewPieces?.Invoke(axisIndex, pieceNumber);
});
}
public async Task HeartbeatAsync1()
@ -697,14 +708,14 @@ namespace DH.Devices.PLC
//while (CurrentState != DeviceState.DSClose && CurrentState != DeviceState.DSExcept && CurrentState != DeviceState.DSUninit)
while (Connected)
{
Stopwatch sw = new Stopwatch();
// Stopwatch sw = new Stopwatch();
uint tmpPieceNumber = 0;
sw.Start();
// sw.Start();
// var ret = TcpNet.ReadUInt16("D1016");
var ret = TcpNet.ReadUInt32(Count);
sw.Stop();
//sw.Stop();
if (ret.IsSuccess)
{
tmpPieceNumber = ret.Content;
@ -712,7 +723,7 @@ namespace DH.Devices.PLC
if (ret.IsSuccess && ret.Content > piecesCount)
{
sw.Start();
// sw.Start();
// Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 板卡{station}产品入列触发{tmpPieceNumber}");
//LogAsync(DateTime.Now, LogLevel.Information, $"转盘{0}产品入列 {piecesCountDic[0]} size:{sum}");
if (tmpPieceNumber != piecesCount + 1)
@ -724,8 +735,8 @@ namespace DH.Devices.PLC
piecesCount = tmpPieceNumber;
//NewPieces(ai, piecesCountDic[station]);
NewPieces(1, piecesCount);
sw.Stop();
startTime = DateTime.Now;
// sw.Stop();
// startTime = DateTime.Now;
//if (idalarm)
//{
// idalarm = false;
@ -760,6 +771,12 @@ namespace DH.Devices.PLC
//LogAsync(DateTime.Now, LogLevel.Information, $"停止转盘");
//转盘使能
TurnEnable(true);
RedLight(false);
YellowLight(false);
//绿灯
GreenLight(true);
LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳-状态复位-关闭定位-写入流程加载点位配置-计数清零-停止转盘-转盘使能");
//开启入料监听
MonitorPieces();
@ -822,25 +839,70 @@ namespace DH.Devices.PLC
//流程开启操作配置
// ProcessInitialAction();
// if (_PLC?Enabled == true)
//皮带
// _PLC.Belt(true);
// LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置");
//计数清零
CountToZero();
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
if (enableBelt == true)
{
Belt(true);
}
Thread.Sleep(1000);
bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator;
if (enableVibrator == true)
{
Vibrator(true);
}
Thread.Sleep(1000);
//转盘使能
TurnEnable(true);
//转盘启动
TurnStart(true);
Thread.Sleep(1000);
//计数清零
CountToZero();
Thread.Sleep(1000);
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
Thread.Sleep(200);
}
public void StopProcess()
{
StatusReset();
VisionPos(false);
CountToZero();
bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator;
if (enableVibrator == true)
{
Vibrator(true);
}
Thread.Sleep(1000);
bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
if (enableBelt == true)
{
Belt(false);
}
Thread.Sleep(1000);
StopProcessAction();
TurnStart(false);
// LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接");
}
public async Task ExecuteClearDelayAsync()
{
int? clearTime = ConfigModel.GlobalList?.FirstOrDefault()?.ClearTime;
if (clearTime != null)
{
TurnClear(true);
await Task.Delay(clearTime.Value * 1000);
TurnClear(false);
}
}
public void CloseProcess()
{
@ -850,7 +912,11 @@ namespace DH.Devices.PLC
TurnStart(false);
TurnEnable(false);
StopProcessAction();
TurnClear(false);
OpenHeartbeat(false);
GreenLight(false);
YellowLight(false);
RedLight(true);
PLCDisConnect();
// LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接");
}
@ -1014,6 +1080,25 @@ namespace DH.Devices.PLC
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Belt(bool b)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "皮带");
if (pLCItem == null)
return;
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Vibrator(bool b)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "振动盘");
if (pLCItem == null)
return;
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Motor(bool direction, int speed, int pos)
{
@ -1143,7 +1228,13 @@ namespace DH.Devices.PLC
elapsedTime += checkInterval;
}
BarrierToZero(false);
Thread.Sleep(300);
// 检查是否不在原点,如果不在,则回原点
BarrierClockwise(false);
Thread.Sleep(300);
BarrierCounterclockwise(false);
Thread.Sleep(300);
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
BarrierSpeed(speed);
Thread.Sleep(300);

View File

@ -32,6 +32,10 @@ namespace DH.Devices.Vision
bool res = false;
try
{
if (!Path.GetExtension(mLInit.ModelFile).Equals(".trt", StringComparison.OrdinalIgnoreCase))
{
throw new Exception("选择的模型不是trt格式");
}
Model = MLGPUEngine.InitModel(mLInit.ModelFile, 1, mLInit.Score_thre, mLInit.GPUId, 3, 8);
//Model = MLEngine.InitModel(mLInit.ModelFile, 1, 0.45f, 0, 3);
@ -233,15 +237,15 @@ namespace DH.Devices.Vision
{
originMat?.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
originMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
//maskMat?.Dispose();
// maskMat = null;
detectMat?.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
detectMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
// maskWeighted?.Dispose();
// maskWeighted = null;
// GC.Collect();

View File

@ -127,9 +127,9 @@ namespace DH.Devices.Vision
// json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}";
//
Console.WriteLine("检测结果JSON" + json);
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
SegResult detResult = JsonConvert.DeserializeObject<SegResult>(json);
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
if (detResult == null)
{
return;
@ -259,9 +259,9 @@ namespace DH.Devices.Vision
{
originMat?.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
originMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
// GC.Collect();

View File

@ -32,13 +32,21 @@ namespace DH.Devices.Vision
public void Init()
{
//InitialQueue();
InitialHalconTools();
InitialSimboMLEnginesAsync();
try
{
//InitialQueue();
InitialHalconTools();
InitialSimboMLEnginesAsync();
// ImageSaveHelper.OnImageSaveExceptionRaised -= ImageSaveHelper_OnImageSaveExceptionRaised;
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
// base.Init();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
// ImageSaveHelper.OnImageSaveExceptionRaised -= ImageSaveHelper_OnImageSaveExceptionRaised;
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
// base.Init();
}
public void Stop()
{
@ -292,9 +300,16 @@ namespace DH.Devices.Vision
/// </summary>
private bool InitialSimboMLEnginesAsync()
{
//深度学习 模型加载
var resultOK = MLLoadModel();
return resultOK;
try
{
//深度学习 模型加载
var resultOK = MLLoadModel();
return resultOK;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 深度学习 模型加载
@ -358,6 +373,7 @@ namespace DH.Devices.Vision
{
// LogAsync(DateTime.Now, LogLevel.Exception, $"异常:模型并发加载异常:{ex.GetExceptionMessage()}");
resultOK = false;
throw new Exception(ex.Message);
}
return resultOK;
@ -409,7 +425,7 @@ namespace DH.Devices.Vision
}
MLInit mLInit;
string inferenceDevice = "CPU";
if (dc.IsEnableGPU)
if (dc.ModelType== ModelType.GPU)
{
inferenceDevice = "GPU";
mLInit = new MLInit(dc.ModelPath, isGPU, coreInx, dc.ModelconfThreshold);
@ -432,7 +448,7 @@ namespace DH.Devices.Vision
{
// LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}");
throw new ProcessException($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}");
throw new Exception($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.Message}");
}
return mLEngineSet;
}

View File

@ -59,7 +59,7 @@ namespace DH.Devices.Vision
// "rect": [421, 823, 6, 8]
// }]
//}
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<Result> HYolo;
public class Result
@ -67,12 +67,12 @@ namespace DH.Devices.Vision
public double fScore;
public int classId;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string classname;
//public double area;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<int> rect;
@ -82,7 +82,7 @@ namespace DH.Devices.Vision
}
public class SegResult
{
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<Result> SegmentResult;
public class Result
@ -90,12 +90,12 @@ namespace DH.Devices.Vision
public double fScore;
public int classId;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string classname;
public double area;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<int> rect;

View File

@ -22,18 +22,18 @@ namespace DH.Devices.Vision
/// <summary>
/// 检测配置ID
/// </summary>
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string DetectionId { get; set; }
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string DetectionName { get; set; }
/// <summary>
/// 深度学习模型
/// </summary>
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public SimboVisionMLBase StationMLEngine { get; set; }

View File

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<BaseOutputPath>..\</BaseOutputPath>
<AppendTargetFrameworkToOutputPath>output</AppendTargetFrameworkToOutputPath>
<UseWindowsForms>true</UseWindowsForms>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\DH.Commons.Devies\DH.Commons.Devies.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,49 @@
using DH.Commons.Enums;
using DH.Devices.Devices;
using System.ComponentModel;
using System.Drawing.Design;
using System.Text.Json.Serialization;
namespace DH.Process
{
public class ProcessConfigBase
{
[JsonPropertyName("station_code")]
public string StationCode { get; set; }
#region
[Category("设备配置")]
[Description("相机配置")]
[DisplayName("相机配置")]
[JsonPropertyName("camera_config_collection")]
//[TypeConverter(typeof(CollectionCountConvert))]
//[Editor(typeof(InitialConfigCollectionEditor<CameraInitialConfigBase>), typeof(UITypeEditor))]
public List<CameraBase> CameraConfigCollection { get; set; } = new List<CameraBase>();
[Category("设备配置")]
[Description("模型配置")]
[DisplayName("模型配置")]
[JsonPropertyName("detection_config_collection")]
//[TypeConverter(typeof(CollectionCountConvert))]
//[Editor(typeof(InitialConfigCollectionEditor<CameraInitialConfigBase>), typeof(UITypeEditor))]
public List<DetectionConfig> DetectionConfigCollection { get; set; } = new List<DetectionConfig>();
// [Category("设备配置")]
// [Description("PLC配置")]
// [DisplayName("PLC配置")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(InitialConfigCollectionEditor<PLCInitialConfigBase>), typeof(UITypeEditor))]
// public List<IInitialConfig> PLCConfigCollection { get; set; } = new List<IInitialConfig>();
// [Category("设备配置")]
// [Description("其他设备配置")]
// [DisplayName("其他设备配置")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(InitialConfigCollectionEditor<InitialConfigBase>), typeof(UITypeEditor))]
// public List<IInitialConfig> DeviceConfigs { get; set; } = new List<IInitialConfig>();
#endregion
}
}

View File

@ -109,9 +109,6 @@
<Compile Include="Views\Sys\User\UserPage.cs" />
<Compile Include="Views\Sys\User\UserPage.Designer.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="favicon.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AntdUI" Version="1.8.9" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -3,14 +3,14 @@
partial class Canvas
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,7 +3,7 @@
partial class CanvasImage
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
@ -11,7 +11,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -923,9 +923,9 @@ namespace DH.UI.Model.Winform
#region Dispose
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
MAP?.Dispose();

View File

@ -3,14 +3,14 @@
partial class GridCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class IOIndicatorCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -864,30 +864,30 @@ namespace DH.UI.Model.Winform
{
if (disposing)
{
// 释放托管状态(托管对象)
// 释放托管状态(托管对象)
Pen?.Dispose();
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器
// TODO: 将大型字段设置为 null
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器
// TODO: 将大型字段设置为 null
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器
// ~ElementBase()
// {
// // 请勿更改此代码将清理代码放入以上 Dispose(bool disposing) 中
// // 请勿更改此代码 将清理代码放入以上 Dispose(bool disposing) 中
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式
// 添加此代码以正确实现可处置模式
public void Dispose()
{
// 请勿更改此代码将清理代码放入以上 Dispose(bool disposing) 中
// 请勿更改此代码 将清理代码放入以上 Dispose(bool disposing) 中
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行
// GC.SuppressFinalize(this);
}
#endregion

View File

@ -3,14 +3,14 @@
partial class GridCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class IOIndicatorCtrl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -10,7 +10,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Platforms>AnyCPU;x64</Platforms>
<OutputType>WinExe</OutputType>
<ApplicationIcon>assets\favicon.ico</ApplicationIcon>
<ApplicationIcon>assets\logo.ico</ApplicationIcon>
</PropertyGroup>
@ -23,7 +23,8 @@
<ItemGroup>
<Content Include="assets\favicon.ico" />
<Content Include="assets\logo.ico" />
<Content Include="assets\screenshots\favicon.ico" />
<Content Include="db\config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@ -93,10 +94,13 @@
<ItemGroup>
<None Include="db\db.sqlite">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<None Include="assets\favicon.ico" />
<None Include="db\db.sqlite">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<!-- 仅在首次生成时复制 -->
<Condition>!Exists('$(OutputPath)\db\db.sqlite')</Condition>
</None>
</ItemGroup>
</Project>

View File

@ -53,7 +53,6 @@
dgvCamreaNums = new DataGridView();
panelNums = new AntdUI.Panel();
tableLayoutNums = new TableLayoutPanel();
dgvProductNums = new DataGridView();
tableLayoutPanel3 = new TableLayoutPanel();
lblTotalTime = new Label();
label1 = new Label();
@ -63,6 +62,7 @@
lblOEE_Total = new Label();
label10 = new Label();
label7 = new Label();
tagMachineStatus = new AntdUI.Tag();
panel2 = new AntdUI.Panel();
panel1 = new AntdUI.Panel();
segmented2 = new AntdUI.Segmented();
@ -94,7 +94,6 @@
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit();
panelNums.SuspendLayout();
tableLayoutNums.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dgvProductNums).BeginInit();
tableLayoutPanel3.SuspendLayout();
panel1.SuspendLayout();
panel3.SuspendLayout();
@ -145,9 +144,9 @@
// tabPage3
//
tabPage3.Controls.Add(panel7);
tabPage3.Location = new Point(3, 28);
tabPage3.Location = new Point(3, 3);
tabPage3.Name = "tabPage3";
tabPage3.Size = new Size(574, 145);
tabPage3.Size = new Size(574, 170);
tabPage3.TabIndex = 0;
tabPage3.Text = "日志";
//
@ -156,7 +155,7 @@
panel7.Dock = DockStyle.Fill;
panel7.Location = new Point(0, 0);
panel7.Name = "panel7";
panel7.Size = new Size(574, 145);
panel7.Size = new Size(574, 170);
panel7.TabIndex = 2;
//
// tabMain
@ -296,8 +295,8 @@
//
tableLayoutNums.ColumnCount = 1;
tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableLayoutNums.Controls.Add(dgvProductNums, 0, 0);
tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1);
tableLayoutNums.Controls.Add(tagMachineStatus, 0, 0);
tableLayoutNums.Dock = DockStyle.Fill;
tableLayoutNums.Location = new Point(0, 0);
tableLayoutNums.Name = "tableLayoutNums";
@ -308,31 +307,6 @@
tableLayoutNums.Size = new Size(338, 101);
tableLayoutNums.TabIndex = 8;
//
// dgvProductNums
//
dgvProductNums.AllowUserToAddRows = false;
dgvProductNums.AllowUserToDeleteRows = false;
dgvProductNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvProductNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgvProductNums.BackgroundColor = SystemColors.Control;
dgvProductNums.BorderStyle = BorderStyle.None;
dgvProductNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
dgvProductNums.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
dgvProductNums.ColumnHeadersHeight = 4;
dgvProductNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dgvProductNums.ColumnHeadersVisible = false;
dgvProductNums.Dock = DockStyle.Fill;
dgvProductNums.Location = new Point(3, 10);
dgvProductNums.Margin = new Padding(3, 10, 3, 0);
dgvProductNums.MultiSelect = false;
dgvProductNums.Name = "dgvProductNums";
dgvProductNums.ReadOnly = true;
dgvProductNums.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
dgvProductNums.RowHeadersVisible = false;
dgvProductNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvProductNums.Size = new Size(332, 40);
dgvProductNums.TabIndex = 10;
//
// tableLayoutPanel3
//
tableLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink;
@ -447,6 +421,16 @@
label7.Text = "总计数";
label7.TextAlign = ContentAlignment.MiddleCenter;
//
// tagMachineStatus
//
tagMachineStatus.Font = new Font("Microsoft YaHei UI", 14.25F, FontStyle.Regular, GraphicsUnit.Point, 134);
tagMachineStatus.Location = new Point(3, 3);
tagMachineStatus.Name = "tagMachineStatus";
tagMachineStatus.Size = new Size(141, 44);
tagMachineStatus.TabIndex = 12;
tagMachineStatus.Text = "待机中";
tagMachineStatus.Type = AntdUI.TTypeMini.Primary;
//
// panel2
//
panel2.Location = new Point(511, 86);
@ -530,7 +514,7 @@
btnCreateBatchNO.Name = "btnCreateBatchNO";
btnCreateBatchNO.Size = new Size(72, 35);
btnCreateBatchNO.TabIndex = 21;
btnCreateBatchNO.Tag = "sys-load";
btnCreateBatchNO.Tag = "";
btnCreateBatchNO.Text = "生成批次";
btnCreateBatchNO.Click += btnCreateBatchNO_Click;
//
@ -719,7 +703,6 @@
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit();
panelNums.ResumeLayout(false);
tableLayoutNums.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dgvProductNums).EndInit();
tableLayoutPanel3.ResumeLayout(false);
tableLayoutPanel3.PerformLayout();
panel1.ResumeLayout(false);
@ -778,10 +761,10 @@
// private Label label7;
// private AntdUI.Panel pnlLog;
private AntdUI.Label lbInBackend;
private DataGridView dgvProductNums;
private TableLayoutPanel tableLayoutPanel3;
private AntdUI.Button btnCreateBatchNO;
private AntdUI.Input textBoxBatchNO;
private AntdUI.Segmented segmented2;
public AntdUI.Tag tagMachineStatus;
}
}

View File

@ -30,6 +30,7 @@ using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
@ -44,6 +45,7 @@ using Point = System.Drawing.Point;
using ResultState = DH.Commons.Base.ResultState;
using Timer = System.Threading.Timer;
namespace DHSoftware
{
public partial class MainWindow : AntdUI.Window
@ -57,132 +59,9 @@ namespace DHSoftware
public event Action<DateTime, object, string> OnUpdateResult;
public event Action<DateTime, object, string> OnUpdateCamResult;
private string _loginName;
public string LoginName
{
get { return _loginName; }
set
{
_loginName = value;
UpdateLabel();
}
}
private bool _ShowConfig;
public bool ShowConfig
{
get { return _ShowConfig; }
set
{
_ShowConfig = value;
UpdateConfig();
}
}
private bool _addscheme;
public bool Addscheme
{
get { return _addscheme; }
set
{
_addscheme = value;
UpdateScheme();
}
}
private bool _deletescheme;
public bool Deleteschememe
{
get { return _deletescheme; }
set
{
_deletescheme = value;
UpdateScheme();
}
}
private bool _loadscheme;
public bool Loadscheme
{
get { return _loadscheme; }
set
{
_loadscheme = value;
UpdateScheme();
}
}
private void UpdateScheme()
{
if (this.InvokeRequired)
{
this.Invoke(new Action(UpdateScheme));
return;
}
if (Loadscheme)
{
btnDeleteProject.Visible = true;
}
else
{
btnDeleteProject.Visible = false;
}
if (Addscheme)
{
btnAddProject.Visible = true;
}
else
{
btnAddProject.Visible = false;
}
if (Deleteschememe)
{
btnLoadProject.Visible = true;
}
else
{
btnLoadProject.Visible = false;
}
}
private void UpdateLabel()
{
if (lbName.InvokeRequired)
{
lbName.Invoke(new Action(UpdateLabel));
return;
}
lbName.Text = _loginName;
}
private void UpdateConfig()
{
if (ShowConfig)
{
if (segmented1.InvokeRequired)
{
segmented1.Invoke(new Action(UpdateConfig));
return;
}
// 恢复显示时
segmented1.Items.Insert(4, itemToHide);
}
else
{
if (segmented1.InvokeRequired)
{
segmented1.Invoke(new Action(UpdateConfig));
return;
}
segmented1.Items.Remove(itemToHide);
}
}
public List<SysPermission> ButtonPermissionList
{
set
@ -546,67 +425,62 @@ namespace DHSoftware
#region CameraSum
private void InitialCameraSumsView()
{
dgvProductNums.AutoGenerateColumns = false;
dgvProductNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World);
dgvProductNums.DataSource = null;
dgvProductNums.DataSource = ProductSummaries;
dgvCamreaNums.Columns.Clear();
// 添加 CCD 列
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
this.BeginInvoke(new MethodInvoker(delegate ()
{
HeaderText = "CCD",
DataPropertyName = "CameraName"
});
// 添加 触发数 列
var TiggerCountColumn = new DataGridViewTextBoxColumn
{
HeaderText = "触发数",
DataPropertyName = "TiggerCount"
};
dgvCamreaNums.Columns.Add(TiggerCountColumn);
dgvCamreaNums.Columns.Clear();
// 添加 合格
var okColumn = new DataGridViewTextBoxColumn
{
HeaderText = "合格",
DataPropertyName = "OKCount"
};
okColumn.DefaultCellStyle.ForeColor = Color.Green; // 设置背景为绿色
dgvCamreaNums.Columns.Add(okColumn);
// 添加 CCD
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{
HeaderText = "CCD",
DataPropertyName = "CameraName"
});
// 添加 触发数 列
var TiggerCountColumn = new DataGridViewTextBoxColumn
{
HeaderText = "触发数",
DataPropertyName = "TiggerCount"
};
// 添加 不合格 列
var ngColumn = new DataGridViewTextBoxColumn
{
HeaderText = "不合格",
DataPropertyName = "NGCount"
};
ngColumn.DefaultCellStyle.ForeColor = Color.LightCoral; // 设置背景为红色
dgvCamreaNums.Columns.Add(ngColumn);
dgvCamreaNums.Columns.Add(TiggerCountColumn);
// 添加 总数
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{
HeaderText = "总数",
DataPropertyName = "TotalCount"
// 添加 合格
var okColumn = new DataGridViewTextBoxColumn
{
HeaderText = "合格",
DataPropertyName = "OKCount"
};
okColumn.DefaultCellStyle.ForeColor = Color.Green; // 设置背景为绿色
dgvCamreaNums.Columns.Add(okColumn);
});
// 添加 不合格 列
var ngColumn = new DataGridViewTextBoxColumn
{
HeaderText = "不合格",
DataPropertyName = "NGCount"
};
ngColumn.DefaultCellStyle.ForeColor = Color.LightCoral; // 设置背景为红色
dgvCamreaNums.Columns.Add(ngColumn);
// 添加 良率
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{
HeaderText = "良率",
DataPropertyName = "YieldStr"
});
dgvCamreaNums.AutoGenerateColumns = false;
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
}
// 添加 总数
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{
HeaderText = "总数",
DataPropertyName = "TotalCount"
});
// 添加 良率 列
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{
HeaderText = "良率",
DataPropertyName = "YieldStr"
});
dgvCamreaNums.AutoGenerateColumns = false;
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
})); }
#endregion
/// <summary>
@ -653,14 +527,16 @@ namespace DHSoftware
cam.CameraIP = cameraBase.CameraIP;
cam.IsEnabled = cameraBase.IsEnabled;
cam.IsZoomCamera = cameraBase.IsZoomCamera;
cam.DvpImageFormat = cameraBase.DvpImageFormat;
cam.Exposure = cameraBase.Exposure;
cam.Gain = cameraBase.Gain;
cam.RotateImage = cameraBase.RotateImage;
cam.IsAllPicEnabled=cameraBase.IsAllPicEnabled;
cam.ROIX= cameraBase.ROIX;
cam.ROIH= cameraBase.ROIH;
cam.ROIW= cameraBase.ROIW;
cam.ROIY=cameraBase.ROIY;
cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName);
cam.ImageSaveDirectory = Path.Combine("D://Projects//Images", cameraBase.CameraName);
Cameras.Add(cam);
if (cameraBase.IsEnabled)
{
@ -706,113 +582,128 @@ namespace DHSoftware
public void ConnectPLC()
{
if (ConfigModel.PLCBaseList.Count > 0)
try
{
for (int i = 0; i < ConfigModel.PLCBaseList.Count; i++)
if (ConfigModel.PLCBaseList.Count > 0)
{
var plcBase = ConfigModel.PLCBaseList[i];
if (plcBase.PLCType == EnumPLCType.XC网口 || plcBase.PLCType == EnumPLCType.XD网口)
for (int i = 0; i < ConfigModel.PLCBaseList.Count; i++)
{
PLC.IP = plcBase.IP;
PLC.PLCType = plcBase.PLCType;
PLC.Enable = plcBase.Enable;
PLC.PLCName = plcBase.PLCName;
PLC.PLCItemList = plcBase.PLCItemList;
PLC.Port = plcBase.Port;
PLC.OnLog -= _visionEngine_OnLog;
PLC.OnLog += _visionEngine_OnLog;
if(PLC.Enable)
var plcBase = ConfigModel.PLCBaseList[i];
if (plcBase.PLCType == EnumPLCType.XC网口 || plcBase.PLCType == EnumPLCType.XD网口)
{
PLC.PLCConnect();
Button CamLabel = new Button();
CamLabel.Name = PLC.PLCName;
CamLabel.Text = PLC.PLCName; // 关键1必须有文本
CamLabel.AutoSize = true;
CamLabel.Size = new System.Drawing.Size(20, 20); // 关键2自动调整大小
CamLabel.Location = new Point(20 + 50 * (i + ConfigModel.CameraBaseList.Count), 12); // 关键3明确位置
if (PLC.Connected)
CamLabel.BackColor = Color.Green; // 关键4避免透明
else
CamLabel.BackColor = Color.Yellow; // 关键4避免透明
CamLabel.ForeColor = Color.Black; // 关键4避免透明
//CamLabel.ForeColor = Color.Green; // 关键4避免透明
CamLabel.Font = new Font("Microsoft YaHei", 9); // 可选:字体
// 关键5确保添加到父控件
if (pageHeader1 != null && !pageHeader1.Controls.Contains(CamLabel))
PLC.IP = plcBase.IP;
PLC.PLCType = plcBase.PLCType;
PLC.Enable = plcBase.Enable;
PLC.PLCName = plcBase.PLCName;
PLC.PLCItemList = plcBase.PLCItemList;
PLC.Port = plcBase.Port;
PLC.OnLog -= _visionEngine_OnLog;
PLC.OnLog += _visionEngine_OnLog;
if (PLC.Enable)
{
pageHeader1.Controls.Add(CamLabel);
PLC.PLCConnect();
Button CamLabel = new Button();
CamLabel.Name = PLC.PLCName;
CamLabel.Text = PLC.PLCName; // 关键1必须有文本
CamLabel.AutoSize = true;
CamLabel.Size = new System.Drawing.Size(20, 20); // 关键2自动调整大小
CamLabel.Location = new Point(20 + 50 * (i + ConfigModel.CameraBaseList.Count), 12); // 关键3明确位置
if (PLC.Connected)
CamLabel.BackColor = Color.Green; // 关键4避免透明
else
CamLabel.BackColor = Color.Yellow; // 关键4避免透明
CamLabel.ForeColor = Color.Black; // 关键4避免透明
//CamLabel.ForeColor = Color.Green; // 关键4避免透明
CamLabel.Font = new Font("Microsoft YaHei", 9); // 可选:字体
// 关键5确保添加到父控件
if (pageHeader1 != null && !pageHeader1.Controls.Contains(CamLabel))
{
pageHeader1.Controls.Add(CamLabel);
}
}
}
}
}
}
catch (Exception ex)
{
}
}
FrmLog frmLog;
public void InitModel()
{
Dectection.Clear();
_cameraRelatedDetectionDict = new();
if (ConfigModel.DetectionList.Count > 0)
try
{
for (int i = 0; i < ConfigModel.DetectionList.Count; i++)
{
DetectionConfig detectionConfig = ConfigModel.DetectionList[i];
var detection = ConfigModel.DetectionList[i];
detectionConfig.CameraCollects = detection.CameraCollects;
detectionConfig.ModelconfThreshold = detection.ModelconfThreshold;
detectionConfig.ModelWidth = detection.ModelWidth;
detectionConfig.ModelHeight = detection.ModelHeight;
detectionConfig.In_lable_path = detection.In_lable_path;
detectionConfig.IsEnabled = detection.IsEnabled;
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
Dectection.Clear();
_cameraRelatedDetectionDict = new();
detectionConfig.ShowLocation.X = (i + 1) % 5 + (i + 1) / 5;
// detectionConfig.ShowLocation.X = detection.ShowLocation.X;
detectionConfig.ShowLocation.Y = (i + 1) / 5 + 1;
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y;
DetectionConfigs.Add(detectionConfig);
if (ConfigModel.DetectionList.Count > 0)
{
for (int i = 0; i < ConfigModel.DetectionList.Count; i++)
{
DetectionConfig detectionConfig = ConfigModel.DetectionList[i];
var detection = ConfigModel.DetectionList[i];
detectionConfig.CameraCollects = detection.CameraCollects;
detectionConfig.ModelconfThreshold = detection.ModelconfThreshold;
detectionConfig.ModelWidth = detection.ModelWidth;
detectionConfig.ModelHeight = detection.ModelHeight;
detectionConfig.In_lable_path = detection.In_lable_path;
detectionConfig.IsEnabled = detection.IsEnabled;
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
// 优化后代码
detectionConfig.ShowLocation.X = (i % 5) + 1; // X坐标从1开始每行1-5
detectionConfig.ShowLocation.Y = (i / 5) + 1; // Y坐标从1开始每5个换行
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y;
DetectionConfigs.Add(detectionConfig);
}
}
}
DetectionConfigs.ForEach(detection =>
{
detection.CameraCollects.ForEach(cam =>
DetectionConfigs.ForEach(detection =>
{
List<string> Dets = new List<string>
detection.CameraCollects.ForEach(cam =>
{
List<string> Dets = new List<string>
{
detection.Id
};
if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId))
{
_cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets);
if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId))
{
_cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets);
}
else
{
_cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id);
}
}
else
{
_cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id);
}
}
);
});
string inferenceDevice = "CPU";
);
});
string inferenceDevice = "CPU";
frmLog = new FrmLog();
frmLog.Dock = DockStyle.Fill;
pnlLog.Controls.Add(frmLog);
//
_visionEngine = new SimboVisionDriver();
_visionEngine.DetectionConfigs = DetectionConfigs;
_visionEngine.LoggerHelper.LogPath = "D://PROJECTS//Logs//";
_visionEngine.LoggerHelper.LogPrefix = "Vision";
_visionEngine.OnLog += _visionEngine_OnLog;
//初始化模型 加载模型
_visionEngine.Init();
frmLog = new FrmLog();
frmLog.Dock = DockStyle.Fill;
pnlLog.Controls.Add(frmLog);
//
_visionEngine = new SimboVisionDriver();
_visionEngine.DetectionConfigs = DetectionConfigs;
_visionEngine.LoggerHelper.LogPath = "D://PROJECTS//Logs//";
_visionEngine.LoggerHelper.LogPrefix = "Vision";
_visionEngine.OnLog += _visionEngine_OnLog;
//初始化模型 加载模型
_visionEngine.Init();
CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine);
ctrlVisionRun.Dock = DockStyle.Fill;
tabImgDisplay.Controls.Add(ctrlVisionRun);
CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine);
ctrlVisionRun.Dock = DockStyle.Fill;
tabImgDisplay.Controls.Add(ctrlVisionRun);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
@ -916,7 +807,7 @@ namespace DHSoftware
this.Invoke(new Action(() =>
{
dgvProductNums.DataSource = new BindingList<ProductSummary>(ProductSummaries);
//if (dgvProductNums.Rows.Count > 0)
//{
@ -1072,6 +963,7 @@ namespace DHSoftware
private Thread _monitorThread;
private void MainWindow_Load(object sender, EventArgs e)
{
//开启按钮监听
// 启动所有监控线程
StartAllMonitors();
@ -1083,6 +975,8 @@ namespace DHSoftware
{
if (_monitorThread == null || !_monitorThread.IsAlive)
{
//关闭按钮自身功能(比如按按钮转盘自己启动等)
PLC.WriteBool("M40", true);
_isRunning = true;
_monitorThread = new Thread(MonitorPlcButtons);
_monitorThread.IsBackground = true; // 后台线程
@ -1107,8 +1001,7 @@ namespace DHSoftware
// 处理按钮状态变化
if (startPressed)
{
PLC.TurnSpeed(0);
PLC.TurnStart(false);
HandleStartButton();
}
if (resetPressed)
@ -1124,7 +1017,7 @@ namespace DHSoftware
//EmergencyStop(null, null, null);
}
Thread.Sleep(50); // 降低 CPU 占用,根据实际调整轮询间隔
Thread.Sleep(150);
}
catch (Exception ex)
{
@ -1144,6 +1037,7 @@ namespace DHSoftware
{
_monitorThread.Join(1000); // 等待线程退出
}
PLC.WriteBool("M40", false);
}
private bool _isClosing = false; // 状态标志
@ -1171,11 +1065,13 @@ namespace DHSoftware
{
camera.CameraDisConnect();
}
StopMonitoring();
if (PLC != null)
{
PLC.CloseProcess();
}
StopMonitoring();
_visionEngine.Stop();//释放模型
CloseWindow.Instance.Close();// 关闭提示窗口
//Application.Exit();
@ -1265,12 +1161,58 @@ namespace DHSoftware
private void HandleStartButton()
{
InitialCameraSumsView();
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
ResetAllCameraCounts();
//开始流程
StartProcess();
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
lock (_stopLock)
{
if (_isStopProcessing) return;
_isStopProcessing = true;
}
try
{
if (SystemModel.CurrentStatus == EnumStatus.)
{
InitialCameraSumsView();
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
ResetAllCameraCounts();
//开始流程
StartProcess();
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Success;
tagMachineStatus.Text = "运行中";
}));
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在运行,无需启动!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!");
}
}
finally
{
lock (_stopLock)
{
_isStopProcessing = false;
}
}
}
@ -1279,10 +1221,7 @@ namespace DHSoftware
{
try
{
if (CurrentMachine)
{
return;
}
BatchNO = textBoxBatchNO.Text;
textBoxBatchNO.ReadOnly = true;
@ -1371,9 +1310,8 @@ namespace DHSoftware
//mOfflineImageTimer.Start();
#endregion
//流程执行时PLC
PLC.StartProcess();
LogAsync(DateTime.Now, LogLevel.Action, "流程启动11111111111完成");
///这里会执行完成后会造成后台线程断断续续会造成界面UI卡顿
//var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList();
//if (settings != null)
@ -1417,7 +1355,8 @@ namespace DHSoftware
InitialOEEStatistic();
//流程执行时PLC
PLC.StartProcess();
CurrentMachine = true;
}
catch (Exception ex)
@ -1457,15 +1396,15 @@ namespace DHSoftware
//转盘2 的物料是不是重新覆盖之前的pDta
if (axisIndex == 1)
{
ProductData pData = new ProductData("", pieceNumber, ProductBaseCount);
ProductData pData = new ProductData(BatchNO, pieceNumber, ProductBaseCount);
_productLists[index][pieceNumber] = pData;
LogAsync(DateTime.Now, LogLevel.Action, $">> {axisIndex}新产品{pieceNumber}加入队列{index}----板卡计数{PieceCount}");
LogAsync(DateTime.Now, LogLevel.Action, $">> 转盘{axisIndex}新产品{pieceNumber}加入队列{index}----计数{PieceCount}");
}
DateTime dtNow = DateTime.Now;
UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds);
_ctTime = dtNow;
//DateTime dtNow = DateTime.Now;
//UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds);
// _ctTime = dtNow;
}
public async Task UpdateCT(object objData, float ctTime)
@ -1848,25 +1787,89 @@ namespace DHSoftware
}
private void HandleStopButton()
{
if (!CurrentMachine)
private readonly object _stopLock = new object(); // 锁对象
private bool _isStopProcessing = false; // 状态标志
private async void HandleStopButton()
{
// 通过锁和状态标志实现双重检查
lock (_stopLock)
{
return;
if (_isStopProcessing) return;
_isStopProcessing = true;
}
try
{
if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备待机中,无需停止!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
textBoxBatchNO.ReadOnly = false;
btnCreateBatchNO.Enabled = true;
// Cameras.Clear();
// Dectection.Clear();
// Add the code for the "停止" button click here
PLC.StopProcess();
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Primary;
tagMachineStatus.Text = "待机中";
}));
LogAsync(DateTime.Now, LogLevel.Action, $"流程停止!");
await Task.Run(async () =>
{
await ExecuteClearDelayAsync();
});
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!");
}
}
finally
{
lock (_stopLock)
{
_isStopProcessing = false;
}
}
textBoxBatchNO.ReadOnly = false;
btnCreateBatchNO.Enabled = true;
// Cameras.Clear();
// Dectection.Clear();
// Add the code for the "停止" button click here
PLC.StopProcess();
CurrentMachine = false;
//sLDMotion.Stop();
}
private async Task ExecuteClearDelayAsync()
{
LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料开始");
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Warn;
tagMachineStatus.Text = "清料中";
}));
await PLC.ExecuteClearDelayAsync();
LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料完成");
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Primary;
tagMachineStatus.Text = "待机中";
}));
}
public void CalculateOEE()
{

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Microsoft ResX Schema
Version 2.0
@ -48,7 +48,7 @@
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
@ -156,254 +156,7 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn
H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E
u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D
uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn
H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAL+/AAS7ph6HvKcf/ryn
H/+8px//vKcf/7ynH/+9px+tu6oiDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAMKq
JBW8px+/vKcf/7ynH/+8px//vKcf/7umH/28px+Fv78ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAA
AAAAAAAAAAAAALqmID+8px/2vKcf/7ynH/+8px//vKcf/7ynH/C8px5UAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF
u08AAAAAAAAAAAAAAAAAAAAAtpIkB7unHrm8px//vKcf/7ynH/+8px//vKcf/7yoH9i/pBscAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAACAgAACu6ggabynH/28px//vKcf/7ynH/+8px//vKcf/7yn
H4UAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAC9px86vKcf4LynH/+8px//vKcf/7yn
H/+8px//vKcf6LyuGxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAL2lIR+9pyC6vKcf/7yn
H/+8px//vKcf/7ynH/+8px/5vKgeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAv6cgILyn
HrC7px/9vKcf/7ynH/+8px//vKcf/7ynH/68ph6yvKEbEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF
u0+5qB0su6cfx7ynH/68px//vKcf/7ynH/+8px//vKcf/7ynH+a6qR47//8AAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/RMO2/3y0cIi8ph/VvKcf/7ynH/+8px//vKcf/7ynH/+8px//vKce87ymHl8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EHEuv9Tv6P/g7Rm/7apKPq8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/svagebf//
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4Q8O3/HW3eP+pqzf/uqch/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7um
H/S7piBwtrYkBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAv58gCL2lIR+PsViWqas3/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+9qB/+vagf6rymHWqAgAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAqqoAA76qISe7px9avKcflLynHtS8px77vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/y9px/EvKYgSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -412,7 +165,159 @@
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
AAAAAAAAAAAAAAAAAAAAAAAAgGwHAH9vBwD///8Au6gRM9a/D5DiyA3B4csLxdnHEaTOuSFOmYctBr2x
MwDAuz0AUygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABfTgAANCQAAAAAAABNPw4AYlMmAFA/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCACABvYgUAzbgSAAAANQGbiRgNnZAYD1ZP
GwTs2SQArZwpALyqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLAAA8KwAAuqYXAIx5
DAClkRAApZUSAJKFDQAAAAAAbVgHAEw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/
AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA
D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/
AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A
H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAA=
</value>
</data>
</root>

View File

@ -67,6 +67,8 @@ namespace DHSoftware
catch (Exception ex)
{
SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
}
@ -99,6 +101,8 @@ namespace DHSoftware
catch (Exception ex)
{
SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
}
UpdateStep(80, "正在加载算法模型", true);
@ -109,6 +113,8 @@ namespace DHSoftware
catch (Exception ex)
{
SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
}
UpdateStep(100, "程序初始化完成", true);

View File

@ -1,10 +1,10 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成
// 此代码由工具生成
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失
// 重新生成代码,这些更改将会丢失
// </auto-generated>
//------------------------------------------------------------------------------
@ -13,12 +13,12 @@ namespace DHSoftware.Properties {
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等
/// 一个强类型的资源类,用于查找本地化的字符串等
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目
// (以 /str 作为命令选项),或重新生成 VS 项目
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@ -33,7 +33,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例
/// 返回此类使用的缓存的 ResourceManager 实例
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
@ -48,7 +48,7 @@ namespace DHSoftware.Properties {
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写
/// 使用此强类型资源类的所有资源查找执行重写
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
@ -61,7 +61,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap bg1 {
get {
@ -71,7 +71,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap bg2 {
get {
@ -81,7 +81,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap bg3 {
get {
@ -91,7 +91,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap head {
get {
@ -101,7 +101,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap head2 {
get {
@ -111,7 +111,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap logo {
get {
@ -121,7 +121,7 @@ namespace DHSoftware.Properties {
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary>
internal static System.Drawing.Bitmap {
get {

View File

@ -13,6 +13,7 @@ namespace DHSoftware.Views
InitializeComponent();
lbTitleName.Text = TitleName;
// 绑定事件
BindEventHandler();
}
@ -21,6 +22,12 @@ namespace DHSoftware.Views
{
button_ok.Click += Button_ok_Click;
button_cancel.Click += Button_cancel_Click;
Load += AddCameraControl_Load;
}
private void AddCameraControl_Load(object? sender, EventArgs e)
{
input_name.Text = CubicleName;
}
private void Button_cancel_Click(object sender, EventArgs e)

View File

@ -28,6 +28,13 @@ namespace DHSoftware.Views
{
button_ok.Click += Button_ok_Click;
button_cancel.Click += Button_cancel_Click;
Load += AddCubicleControl_Load;
}
private void AddCubicleControl_Load(object? sender, EventArgs e)
{
input_name.Text = CubicleName;
sltdetectionType.SelectedIndex =(int)DetectionType;
}
private void Button_cancel_Click(object sender, EventArgs e)

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Microsoft ResX Schema
Version 2.0
@ -48,7 +48,7 @@
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter

View File

@ -4,14 +4,14 @@
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -25,7 +25,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class CameraConfigControl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -29,29 +29,30 @@
private void InitializeComponent()
{
panel3 = new AntdUI.Panel();
btnSizeAdd = new AntdUI.Button();
button1 = new AntdUI.Button();
button2 = new AntdUI.Button();
button3 = new AntdUI.Button();
button2 = new AntdUI.Button();
button1 = new AntdUI.Button();
btnSizeAdd = new AntdUI.Button();
panel4 = new AntdUI.Panel();
pictureBox1 = new PictureBox();
panel2 = new AntdUI.Panel();
label18 = new AntdUI.Label();
swhEnable = new AntdUI.Switch();
label1 = new AntdUI.Label();
label2 = new AntdUI.Label();
label3 = new AntdUI.Label();
iptExposure = new AntdUI.InputNumber();
iptGain = new AntdUI.InputNumber();
iptExposure = new AntdUI.Input();
iptGain = new AntdUI.Input();
iptRevolve = new AntdUI.Select();
label4 = new AntdUI.Label();
sltAcquisitionMode = new AntdUI.Select();
label5 = new AntdUI.Label();
sltTriggerMode = new AntdUI.Select();
label7 = new AntdUI.Label();
iptROIX = new AntdUI.InputNumber();
iptROIY = new AntdUI.InputNumber();
iptROIW = new AntdUI.InputNumber();
iptROIH = new AntdUI.InputNumber();
iptROIX = new AntdUI.Input();
iptROIY = new AntdUI.Input();
iptROIW = new AntdUI.Input();
iptROIH = new AntdUI.Input();
label6 = new AntdUI.Label();
sthPic = new AntdUI.Switch();
label8 = new AntdUI.Label();
@ -65,12 +66,13 @@
label14 = new AntdUI.Label();
switch1 = new AntdUI.Switch();
panel1 = new AntdUI.Panel();
pictureBox1 = new PictureBox();
sltPicType = new AntdUI.Select();
label15 = new AntdUI.Label();
panel3.SuspendLayout();
panel4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
panel2.SuspendLayout();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
SuspendLayout();
//
// panel3
@ -80,51 +82,12 @@
panel3.Controls.Add(button1);
panel3.Controls.Add(btnSizeAdd);
panel3.Dock = DockStyle.Bottom;
panel3.Location = new Point(0, 552);
panel3.Location = new Point(0, 585);
panel3.Name = "panel3";
panel3.Size = new Size(691, 59);
panel3.TabIndex = 39;
panel3.Text = "panel3";
//
// btnSizeAdd
//
btnSizeAdd.BorderWidth = 2F;
btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机";
//
// button1
//
button1.BorderWidth = 2F;
button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button1.Ghost = true;
button1.IconRatio = 0F;
button1.IconSvg = "";
button1.Location = new Point(233, 13);
button1.Name = "button1";
button1.Size = new Size(80, 38);
button1.TabIndex = 44;
button1.Text = "断开相机";
//
// button2
//
button2.BorderWidth = 2F;
button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button2.Ghost = true;
button2.IconRatio = 0F;
button2.IconSvg = "";
button2.Location = new Point(388, 13);
button2.Name = "button2";
button2.Size = new Size(80, 38);
button2.TabIndex = 45;
button2.Text = "单次触发";
//
// button3
//
button3.BorderWidth = 2F;
@ -138,16 +101,65 @@
button3.TabIndex = 46;
button3.Text = "连续触发";
//
// button2
//
button2.BorderWidth = 2F;
button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button2.Ghost = true;
button2.IconRatio = 0F;
button2.IconSvg = "";
button2.Location = new Point(388, 13);
button2.Name = "button2";
button2.Size = new Size(80, 38);
button2.TabIndex = 45;
button2.Text = "单次触发";
//
// button1
//
button1.BorderWidth = 2F;
button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button1.Ghost = true;
button1.IconRatio = 0F;
button1.IconSvg = "";
button1.Location = new Point(233, 13);
button1.Name = "button1";
button1.Size = new Size(80, 38);
button1.TabIndex = 44;
button1.Text = "断开相机";
//
// btnSizeAdd
//
btnSizeAdd.BorderWidth = 2F;
btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机";
//
// panel4
//
panel4.Controls.Add(pictureBox1);
panel4.Dock = DockStyle.Fill;
panel4.Location = new Point(0, 0);
panel4.Name = "panel4";
panel4.Size = new Size(691, 552);
panel4.Size = new Size(691, 585);
panel4.TabIndex = 40;
panel4.Text = "panel4";
//
// pictureBox1
//
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Dock = DockStyle.Fill;
pictureBox1.Location = new Point(0, 0);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(691, 585);
pictureBox1.TabIndex = 39;
pictureBox1.TabStop = false;
//
// panel2
//
panel2.Controls.Add(panel4);
@ -155,7 +167,7 @@
panel2.Dock = DockStyle.Fill;
panel2.Location = new Point(218, 0);
panel2.Name = "panel2";
panel2.Size = new Size(691, 611);
panel2.Size = new Size(691, 644);
panel2.TabIndex = 49;
panel2.Text = "panel2";
//
@ -172,7 +184,7 @@
swhEnable.CheckedText = "启用";
swhEnable.Location = new Point(86, 9);
swhEnable.Name = "swhEnable";
swhEnable.Size = new Size(94, 33);
swhEnable.Size = new Size(111, 33);
swhEnable.TabIndex = 49;
swhEnable.UnCheckedText = "关闭";
//
@ -204,7 +216,7 @@
//
iptExposure.Location = new Point(86, 136);
iptExposure.Name = "iptExposure";
iptExposure.Size = new Size(94, 36);
iptExposure.Size = new Size(111, 36);
iptExposure.TabIndex = 53;
iptExposure.Tag = "";
iptExposure.Text = "0";
@ -213,7 +225,7 @@
//
iptGain.Location = new Point(86, 179);
iptGain.Name = "iptGain";
iptGain.Size = new Size(94, 36);
iptGain.Size = new Size(111, 36);
iptGain.TabIndex = 54;
iptGain.Text = "0";
//
@ -223,7 +235,7 @@
iptRevolve.List = true;
iptRevolve.Location = new Point(86, 222);
iptRevolve.Name = "iptRevolve";
iptRevolve.Size = new Size(94, 36);
iptRevolve.Size = new Size(111, 36);
iptRevolve.TabIndex = 55;
//
// label4
@ -239,7 +251,7 @@
sltAcquisitionMode.List = true;
sltAcquisitionMode.Location = new Point(86, 265);
sltAcquisitionMode.Name = "sltAcquisitionMode";
sltAcquisitionMode.Size = new Size(94, 36);
sltAcquisitionMode.Size = new Size(111, 36);
sltAcquisitionMode.TabIndex = 57;
//
// label5
@ -255,12 +267,12 @@
sltTriggerMode.List = true;
sltTriggerMode.Location = new Point(86, 310);
sltTriggerMode.Name = "sltTriggerMode";
sltTriggerMode.Size = new Size(94, 36);
sltTriggerMode.Size = new Size(111, 36);
sltTriggerMode.TabIndex = 59;
//
// label7
//
label7.Location = new Point(3, 498);
label7.Location = new Point(3, 538);
label7.Name = "label7";
label7.Size = new Size(29, 23);
label7.TabIndex = 60;
@ -268,34 +280,34 @@
//
// iptROIX
//
iptROIX.Location = new Point(86, 430);
iptROIX.Location = new Point(86, 470);
iptROIX.Name = "iptROIX";
iptROIX.Size = new Size(94, 37);
iptROIX.Size = new Size(111, 37);
iptROIX.TabIndex = 61;
iptROIX.Tag = "";
iptROIX.Text = "0";
//
// iptROIY
//
iptROIY.Location = new Point(86, 473);
iptROIY.Location = new Point(86, 513);
iptROIY.Name = "iptROIY";
iptROIY.Size = new Size(94, 37);
iptROIY.Size = new Size(111, 37);
iptROIY.TabIndex = 62;
iptROIY.Text = "0";
//
// iptROIW
//
iptROIW.Location = new Point(86, 516);
iptROIW.Location = new Point(86, 556);
iptROIW.Name = "iptROIW";
iptROIW.Size = new Size(94, 37);
iptROIW.Size = new Size(111, 37);
iptROIW.TabIndex = 63;
iptROIW.Text = "0";
//
// iptROIH
//
iptROIH.Location = new Point(86, 559);
iptROIH.Location = new Point(86, 599);
iptROIH.Name = "iptROIH";
iptROIH.Size = new Size(94, 37);
iptROIH.Size = new Size(111, 37);
iptROIH.TabIndex = 64;
iptROIH.Text = "0";
//
@ -312,13 +324,13 @@
sthPic.CheckedText = "启用";
sthPic.Location = new Point(86, 56);
sthPic.Name = "sthPic";
sthPic.Size = new Size(94, 33);
sthPic.Size = new Size(111, 33);
sthPic.TabIndex = 66;
sthPic.UnCheckedText = "关闭";
//
// label8
//
label8.Location = new Point(36, 430);
label8.Location = new Point(36, 470);
label8.Name = "label8";
label8.Size = new Size(29, 37);
label8.TabIndex = 67;
@ -326,7 +338,7 @@
//
// label9
//
label9.Location = new Point(36, 473);
label9.Location = new Point(36, 513);
label9.Name = "label9";
label9.Size = new Size(29, 37);
label9.TabIndex = 68;
@ -334,7 +346,7 @@
//
// label10
//
label10.Location = new Point(28, 516);
label10.Location = new Point(28, 556);
label10.Name = "label10";
label10.Size = new Size(44, 37);
label10.TabIndex = 69;
@ -342,7 +354,7 @@
//
// label11
//
label11.Location = new Point(28, 560);
label11.Location = new Point(28, 600);
label11.Name = "label11";
label11.Size = new Size(44, 36);
label11.TabIndex = 70;
@ -350,7 +362,7 @@
//
// label12
//
label12.Location = new Point(21, 362);
label12.Location = new Point(21, 402);
label12.Name = "label12";
label12.Size = new Size(59, 23);
label12.TabIndex = 71;
@ -359,9 +371,9 @@
// sthAllPic
//
sthAllPic.CheckedText = "启用";
sthAllPic.Location = new Point(86, 352);
sthAllPic.Location = new Point(86, 392);
sthAllPic.Name = "sthAllPic";
sthAllPic.Size = new Size(94, 33);
sthAllPic.Size = new Size(111, 33);
sthAllPic.TabIndex = 72;
sthAllPic.UnCheckedText = "关闭";
//
@ -378,12 +390,12 @@
sltCamType.List = true;
sltCamType.Location = new Point(86, 93);
sltCamType.Name = "sltCamType";
sltCamType.Size = new Size(94, 36);
sltCamType.Size = new Size(111, 36);
sltCamType.TabIndex = 74;
//
// label14
//
label14.Location = new Point(21, 401);
label14.Location = new Point(21, 441);
label14.Name = "label14";
label14.Size = new Size(59, 23);
label14.TabIndex = 75;
@ -392,14 +404,16 @@
// switch1
//
switch1.CheckedText = "启用";
switch1.Location = new Point(86, 391);
switch1.Location = new Point(86, 431);
switch1.Name = "switch1";
switch1.Size = new Size(94, 33);
switch1.Size = new Size(111, 33);
switch1.TabIndex = 76;
switch1.UnCheckedText = "关闭";
//
// panel1
//
panel1.Controls.Add(sltPicType);
panel1.Controls.Add(label15);
panel1.Controls.Add(switch1);
panel1.Controls.Add(label14);
panel1.Controls.Add(sltCamType);
@ -432,19 +446,25 @@
panel1.Dock = DockStyle.Left;
panel1.Location = new Point(0, 0);
panel1.Name = "panel1";
panel1.Size = new Size(218, 611);
panel1.Size = new Size(218, 644);
panel1.TabIndex = 48;
panel1.Text = "panel1";
//
// pictureBox1
// sltPicType
//
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Dock = DockStyle.Fill;
pictureBox1.Location = new Point(0, 0);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(691, 552);
pictureBox1.TabIndex = 39;
pictureBox1.TabStop = false;
sltPicType.List = true;
sltPicType.Location = new Point(86, 352);
sltPicType.Name = "sltPicType";
sltPicType.Size = new Size(111, 36);
sltPicType.TabIndex = 78;
//
// label15
//
label15.Location = new Point(21, 352);
label15.Name = "label15";
label15.Size = new Size(59, 36);
label15.TabIndex = 77;
label15.Text = "图片格式";
//
// CameraControl
//
@ -453,12 +473,12 @@
Controls.Add(panel2);
Controls.Add(panel1);
Name = "CameraControl";
Size = new Size(909, 611);
Size = new Size(909, 644);
panel3.ResumeLayout(false);
panel4.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
panel2.ResumeLayout(false);
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
ResumeLayout(false);
}
@ -477,18 +497,18 @@
private AntdUI.Label label1;
private AntdUI.Label label2;
private AntdUI.Label label3;
private AntdUI.InputNumber iptExposure;
private AntdUI.InputNumber iptGain;
private AntdUI.Input iptExposure;
private AntdUI.Input iptGain;
private AntdUI.Select iptRevolve;
private AntdUI.Label label4;
private AntdUI.Select sltAcquisitionMode;
private AntdUI.Label label5;
private AntdUI.Select sltTriggerMode;
private AntdUI.Label label7;
private AntdUI.InputNumber iptROIX;
private AntdUI.InputNumber iptROIY;
private AntdUI.InputNumber iptROIW;
private AntdUI.InputNumber iptROIH;
private AntdUI.Input iptROIX;
private AntdUI.Input iptROIY;
private AntdUI.Input iptROIW;
private AntdUI.Input iptROIH;
private AntdUI.Label label6;
private AntdUI.Switch sthPic;
private AntdUI.Label label8;
@ -502,5 +522,7 @@
private AntdUI.Label label14;
private AntdUI.Switch switch1;
private AntdUI.Panel panel1;
private AntdUI.Select sltPicType;
private AntdUI.Label label15;
}
}

View File

@ -10,6 +10,7 @@ using System.Windows.Forms;
using AntdUI;
using DH.Commons.Base;
using DH.Commons.Enums;
using DVPCameraType;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using Window = AntdUI.Window;
@ -26,9 +27,36 @@ namespace DHSoftware.Views
InitializeComponent();
sltCamType.TextChanged += SltCamTpye_TextChanged;
sltPicType.TextChanged += SltPicTpye_TextChanged;
InitData();
BindData();
}
private void SltPicTpye_TextChanged(object? sender, EventArgs e)
{
if (sender is Select slt && !string.IsNullOrEmpty(slt.Text))
{
// 将文本转换为枚举值
if (Enum.TryParse<dvpStreamFormat>(slt.Text, out var plcType))
{
switch (plcType)
{
case dvpStreamFormat.S_RGB24:
case dvpStreamFormat.S_MONO8:
break;
default:
break;
}
}
else
{
}
}
}
private void SltCamTpye_TextChanged(object? sender, EventArgs e)
{
if (sender is Select slt && !string.IsNullOrEmpty(slt.Text))
@ -77,6 +105,7 @@ namespace DHSoftware.Views
{
sltCamType.DataBindings.Add("Text", CameraBase, "CamType", true, DataSourceUpdateMode.OnPropertyChanged, "");
sltPicType.DataBindings.Add("Text", CameraBase, "DvpImageFormat", true, DataSourceUpdateMode.OnPropertyChanged, "");
sthPic.DataBindings.Add(nameof(sthPic.Checked), CameraBase, nameof(CameraBase.IsSavePicEnabled),
true, DataSourceUpdateMode.OnPropertyChanged);
sthAllPic.DataBindings.Add(nameof(sthAllPic.Checked), CameraBase, nameof(CameraBase.IsAllPicEnabled),
@ -87,22 +116,20 @@ namespace DHSoftware.Views
switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera),
true, DataSourceUpdateMode.OnPropertyChanged);
// 曝光时间绑定假设iptExposure是NumericUpDown
iptExposure.DataBindings.Add(nameof(iptExposure.Value), CameraBase, nameof(CameraBase.Exposure),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptExposure.DataBindings.Add(nameof(iptExposure.Text), CameraBase, nameof(CameraBase.Exposure));
// 增益绑定
iptGain.DataBindings.Add(nameof(iptGain.Value), CameraBase, nameof(CameraBase.Gain),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptGain.DataBindings.Add(nameof(iptGain.Text), CameraBase, nameof(CameraBase.Gain));
// 旋转角度绑定
iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage));
// ROI坐标绑定
iptROIX.DataBindings.Add(nameof(iptROIX.Value), CameraBase, nameof(CameraBase.ROIX));
iptROIY.DataBindings.Add(nameof(iptROIY.Value), CameraBase, nameof(CameraBase.ROIY));
iptROIW.DataBindings.Add(nameof(iptROIW.Value), CameraBase, nameof(CameraBase.ROIW));
iptROIH.DataBindings.Add(nameof(iptROIH.Value), CameraBase, nameof(CameraBase.ROIH));
iptROIX.DataBindings.Add(nameof(iptROIX.Text), CameraBase, nameof(CameraBase.ROIX));
iptROIY.DataBindings.Add(nameof(iptROIY.Text), CameraBase, nameof(CameraBase.ROIY));
iptROIW.DataBindings.Add(nameof(iptROIW.Text), CameraBase, nameof(CameraBase.ROIW));
iptROIH.DataBindings.Add(nameof(iptROIH.Text), CameraBase, nameof(CameraBase.ROIH));
// 采集模式下拉框处理
sltAcquisitionMode.SelectedIndexChanged += (s, e) =>
@ -126,9 +153,15 @@ namespace DHSoftware.Views
{
sltCamType.Items.Add(value.ToString());
}
sltPicType.Items.Clear();
foreach (dvpStreamFormat value in Enum.GetValues(typeof(dvpStreamFormat)))
{
sltPicType.Items.Add(value.ToString());
}
// 初始化下拉框选项
sltAcquisitionMode.Items.AddRange(new[] { "连续模式", "触发模式" });
sltTriggerMode.Items.AddRange(new[] { "软触发", "硬触发" });
// 设置初始选择
sltAcquisitionMode.SelectedIndex = CameraBase.IsContinueMode ? 0 : 1;

View File

@ -3,14 +3,14 @@
partial class CorrelatedCameraEdit
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class CtrlVisionDisplay
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -4,14 +4,14 @@ namespace XKRS.UI.Device.Winform
partial class CtrlVisionRunBase
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -25,7 +25,7 @@ namespace XKRS.UI.Device.Winform
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class DefectRowEdit
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -3,14 +3,14 @@
partial class DetectControl
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{
@ -116,7 +116,7 @@
tabPage1.Controls.Add(label2);
tabPage1.Controls.Add(iptPrePath);
tabPage1.Controls.Add(label1);
tabPage1.Location = new Point(-909, -575);
tabPage1.Location = new Point(3, 31);
tabPage1.Name = "tabPage1";
tabPage1.Size = new Size(909, 575);
tabPage1.TabIndex = 0;
@ -253,9 +253,9 @@
//
label1.Location = new Point(110, 89);
label1.Name = "label1";
label1.Size = new Size(75, 23);
label1.Size = new Size(86, 23);
label1.TabIndex = 0;
label1.Text = "模型路径";
label1.Text = "预处理路径";
//
// tabPage2
//
@ -609,6 +609,7 @@
Controls.Add(tabs1);
Name = "DetectControl";
Size = new Size(915, 609);
Load += DetectControl_Load;
tabs1.ResumeLayout(false);
tabPage1.ResumeLayout(false);
tabPage2.ResumeLayout(false);

View File

@ -20,12 +20,115 @@ namespace DHSoftware.Views
window = _window;
detectionConfig = _detection;
InitializeComponent();
//this.detectionConfig = detectionConfig;
//初始化表格列头
InitTableColumns();
InitData();
BindEventHandler();
}
foreach (var item in MLModelTypes)
{
stDetectType.Items.Add(item.Key);
}
BindEventHandler();
// 如果你的控件是通过设计器生成的,确保事件已经在设计器文件中绑定。
swtPre.CheckedChanged += swtPre_CheckedChanged; // 确保控件的事件处理器被注册
swIsAddStation.CheckedChanged += swIsAddStation_CheckedChanged; // 确保控件的事件处理器被注册
swIsEnabled.CheckedChanged += swIsEnabled_CheckedChanged; // 确保控件的事件处理器被注册
stDetectType.SelectedIndexChanged += stDetectType_SelectedIndexChanged; // 确保控件的事件处理器被注册
iptScore.TextChanged += IptScore_TextChanged;
iptModelPath.TextChanged += IptModelPath_TextChanged;
}
private void IptScore_TextChanged(object sender, EventArgs e)
{
if (_config != null && !string.IsNullOrEmpty(iptScore.Text))
{
if (float.TryParse(iptScore.Text, out float score) && _config.ModelconfThreshold != score)
{
_config.ModelconfThreshold = score;
}
else
{
iptScore.Text = _config.ModelconfThreshold.ToString();
}
}
}
private void IptModelPath_TextChanged(object sender, EventArgs e)
{
if (_config != null && !string.IsNullOrEmpty(iptModelPath.Text))
{
if ( _config.ModelPath != iptModelPath.Text)
{
_config.ModelPath = iptModelPath.Text;
}
else
{
iptModelPath.Text = _config.ModelPath;
}
}
}
private void stDetectType_SelectedIndexChanged(object sender, EventArgs e)
{
// 下拉选项变更事件处理
if (_config != null && stDetectType.SelectedIndex != -1)
{
// 防止循环更新
if ((int)_config.ModelType != stDetectType.SelectedIndex + 1)
{
_config.ModelType = (MLModelType)(stDetectType.SelectedIndex + 1);
}
}
}
private void swtPre_CheckedChanged(object sender, EventArgs e)
{
// 当用户改变控件的值时,更新数据模型的属性
if (_config != null)
{
_config.IsPreEnabled = swtPre.Checked;
}
}
private void swIsAddStation_CheckedChanged(object sender, EventArgs e)
{
// 当用户改变控件的值时,更新数据模型的属性
if (_config != null)
{
_config.IsAddStation = swIsAddStation.Checked;
}
}
private void swIsEnabled_CheckedChanged(object sender, EventArgs e)
{
// 当用户改变控件的值时,更新数据模型的属性
if (_config != null)
{
_config.IsEnabled = swIsEnabled.Checked;
}
}
/// <summary>
/// 更新尺寸测量表格
/// </summary>
private void UpdatePreTreatCollectsFromSizeTable()
{
// 假设 SizeLableList 是 SizeTable 的数据源
List<SizeTreatParam> updatedPreTreatCollects = new List<SizeTreatParam>();
foreach (var sizeTreat in SizeLableList)
{
var preTreatCollect = new SizeTreatParam
{
IsEnable = sizeTreat.IsEnable,
PreName = sizeTreat.PreName,
PrePix = sizeTreat.PrePix,
PreType = sizeTreat.PreType,
ResultShow = sizeTreat.ResultShow,
OutResultShow = sizeTreat.OutResultShow
};
updatedPreTreatCollects.Add(preTreatCollect);
}
// 将更新后的数据设置到 PreTreatCollects
detectionConfig.PreTreatCollects = updatedPreTreatCollects;
}
private void BindEventHandler()
{
//预处理
@ -41,6 +144,9 @@ namespace DHSoftware.Views
//中处理
btnPath2.Click += BtnPath2_Click;
btnCorrelatedCamera.Click += BtnCorrelatedCamera_Click;
btnPic.Click += BtnPic_Click;
btnLableAdd.Click += BtnLableAdd_Click;
btnLableDelete.Click += BtnLableDelete_Click;
@ -106,6 +212,8 @@ namespace DHSoftware.Views
OnClose = () =>
{
AntdUI.Message.info(window, "结束编辑", autoClose: 1);
UpdatePreTreatCollectsFromSizeTable();
}
});
break;
@ -143,7 +251,7 @@ namespace DHSoftware.Views
MessageBox.Show("未定义的测量类型!");
break;
}
UpdatePreTreatCollectsFromSizeTable();
//使用clone可以防止table中的image被修改
//Preview.open(new Preview.Config(window, (Image)SizeParamLable.CellImages[0].Image.Clone()));
break;
@ -488,6 +596,44 @@ namespace DHSoftware.Views
}
}
//加载相机
private void InitRelatedCamera()
{
if (relatedCameras.Count > 0)
{
foreach (var item in relatedCameras)
{
var control = new AntdUI.Tag()
{
Font = new System.Drawing.Font("Microsoft YaHei UI", 9F),
Size = new Size(90, 42),
Text = item.CameraSourceId,
CloseIcon = true
};
control.CloseChanged += (sender, e) =>
{
var tag = sender as Tag;
foreach (var item in relatedCameras)
{
if (item.CameraSourceId.Equals(tag.Text))
{
relatedCameras.Remove(item);
break;
}
}
detectionConfig.CameraCollects = relatedCameras;
return true;
};
// 通过主窗口设置DPI控制添加控件保持缩放比例
window.AutoDpi(control);
flowPanel1.Controls.Add(control);
control.BringToFront();
}
}
}
private void InitData()
@ -613,14 +759,16 @@ namespace DHSoftware.Views
SizeTable.Columns = new ColumnCollection() {
new ColumnCheck("Selected"){Fixed = true},
new ColumnSwitch("IsEnable", "是否启用", ColumnAlign.Center),
new Column("PreName", "测量名称",ColumnAlign.Center),
new Column("PreType", "测量类型", ColumnAlign.Center),
new Column("PrePix", "阈值", ColumnAlign.Center),
new Column("ResultShow", "输入参数", ColumnAlign.Center),
new Column("OutResultShow", "输出参数", ColumnAlign.Center),
new Column("CellLinks", "操作", ColumnAlign.Center)
new ColumnSwitch("IsEnable", "是否启用") {Width = "10%" },
new Column("PreName", "测量名称") { Width = "15%" },
new Column("PreType", "测量类型") { Width = "10%" },
new Column("PrePix", "阈值") { Width = "5%" },
new Column("ResultShow", "输入参数") { Width = "15%" },
new Column("OutResultShow", "输出参数") { Width = "15%" },
new Column("CellLinks", "操作") { Width = "30%" }
};
}
private void btnPath_Click(object? sender, EventArgs e)

View File

@ -3,14 +3,14 @@
partial class DetectionLableEdit
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -55,7 +55,7 @@
this.tsmiClearLog.Name = "tsmiClearLog";
this.tsmiClearLog.Size = new System.Drawing.Size(124, 22);
this.tsmiClearLog.Text = "清空日志";
this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click);
// this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click);
//
// menuStrip1
//

View File

@ -30,8 +30,11 @@ namespace DHSoftware.Views
#region
private const string SOURCE_PROCESS = "流程";
private const int LOG_NUM_LIMIT = 2000;
private const int BATCH_SIZE = 50;
private const int PROCESS_INTERVAL = 100;
// private const int BATCH_SIZE = 50;
// 调整常量配置
private const int BATCH_SIZE = 100; // 从50提升到100
private const int PROCESS_INTERVAL = 200; // 从100ms调整到200ms
// private const int PROCESS_INTERVAL = 100;
private const int FIRST_COL_WIDTH = 120;
#endregion

View File

@ -28,7 +28,7 @@
/// </summary>
private void InitializeComponent()
{
AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine();
AntdUI.Tabs.StyleLine styleLine2 = new AntdUI.Tabs.StyleLine();
tabs1 = new AntdUI.Tabs();
tabPage6 = new AntdUI.TabPage();
tabPage1 = new AntdUI.TabPage();
@ -56,7 +56,16 @@
panel5 = new AntdUI.Panel();
btnStopResetDelete = new AntdUI.Button();
btnStopResetAdd = new AntdUI.Button();
panel6 = new AntdUI.Panel();
panel7 = new AntdUI.Panel();
uiLabel1 = new Sunny.UI.UILabel();
swhEnableVibrator = new AntdUI.Switch();
swhEnableBelt = new AntdUI.Switch();
uiLabel2 = new Sunny.UI.UILabel();
uiLabel3 = new Sunny.UI.UILabel();
iptClearTime = new AntdUI.Input();
tabs1.SuspendLayout();
tabPage6.SuspendLayout();
tabPage1.SuspendLayout();
panel1.SuspendLayout();
tabPage2.SuspendLayout();
@ -67,6 +76,7 @@
panel4.SuspendLayout();
tabPage5.SuspendLayout();
panel5.SuspendLayout();
panel6.SuspendLayout();
SuspendLayout();
//
// tabs1
@ -81,13 +91,14 @@
tabs1.Pages.Add(tabPage4);
tabs1.Pages.Add(tabPage5);
tabs1.Size = new Size(898, 530);
tabs1.Style = styleLine1;
tabs1.Style = styleLine2;
tabs1.TabIndex = 26;
tabs1.Text = "tabs1";
tabs1.SelectedIndex = 1;
//
// tabPage6
//
tabPage6.Controls.Add(panel7);
tabPage6.Controls.Add(panel6);
tabPage6.Location = new Point(3, 28);
tabPage6.Name = "tabPage6";
tabPage6.Size = new Size(892, 499);
@ -372,6 +383,86 @@
btnStopResetAdd.Type = AntdUI.TTypeMini.Primary;
btnStopResetAdd.WaveSize = 0;
//
// panel6
//
panel6.Controls.Add(iptClearTime);
panel6.Controls.Add(uiLabel3);
panel6.Controls.Add(swhEnableBelt);
panel6.Controls.Add(uiLabel2);
panel6.Controls.Add(swhEnableVibrator);
panel6.Controls.Add(uiLabel1);
panel6.Dock = DockStyle.Left;
panel6.Location = new Point(0, 0);
panel6.Name = "panel6";
panel6.Size = new Size(427, 499);
panel6.TabIndex = 0;
panel6.Text = "panel6";
//
// panel7
//
panel7.Dock = DockStyle.Fill;
panel7.Location = new Point(427, 0);
panel7.Name = "panel7";
panel7.Size = new Size(465, 499);
panel7.TabIndex = 1;
panel7.Text = "panel7";
//
// uiLabel1
//
uiLabel1.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel1.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel1.Location = new Point(28, 36);
uiLabel1.Name = "uiLabel1";
uiLabel1.Size = new Size(63, 23);
uiLabel1.TabIndex = 0;
uiLabel1.Text = "振动盘";
//
// swhEnableVibrator
//
swhEnableVibrator.CheckedText = "启用";
swhEnableVibrator.Location = new Point(97, 26);
swhEnableVibrator.Name = "swhEnableVibrator";
swhEnableVibrator.Size = new Size(94, 33);
swhEnableVibrator.TabIndex = 50;
swhEnableVibrator.UnCheckedText = "关闭";
//
// swhEnableBelt
//
swhEnableBelt.CheckedText = "启用";
swhEnableBelt.Location = new Point(97, 82);
swhEnableBelt.Name = "swhEnableBelt";
swhEnableBelt.Size = new Size(94, 33);
swhEnableBelt.TabIndex = 52;
swhEnableBelt.UnCheckedText = "关闭";
//
// uiLabel2
//
uiLabel2.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel2.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel2.Location = new Point(28, 92);
uiLabel2.Name = "uiLabel2";
uiLabel2.Size = new Size(63, 23);
uiLabel2.TabIndex = 51;
uiLabel2.Text = "皮带";
//
// uiLabel3
//
uiLabel3.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel3.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel3.Location = new Point(17, 142);
uiLabel3.Name = "uiLabel3";
uiLabel3.Size = new Size(74, 23);
uiLabel3.TabIndex = 53;
uiLabel3.Text = "清料时间";
//
// iptClearTime
//
iptClearTime.Location = new Point(97, 131);
iptClearTime.Name = "iptClearTime";
iptClearTime.Size = new Size(94, 43);
iptClearTime.TabIndex = 54;
iptClearTime.Text = "0";
//
// GlobalControl
//
AutoScaleDimensions = new SizeF(7F, 17F);
@ -380,6 +471,7 @@
Name = "GlobalControl";
Size = new Size(898, 530);
tabs1.ResumeLayout(false);
tabPage6.ResumeLayout(false);
tabPage1.ResumeLayout(false);
panel1.ResumeLayout(false);
tabPage2.ResumeLayout(false);
@ -390,6 +482,7 @@
panel4.ResumeLayout(false);
tabPage5.ResumeLayout(false);
panel5.ResumeLayout(false);
panel6.ResumeLayout(false);
ResumeLayout(false);
}
@ -421,5 +514,13 @@
private AntdUI.Button btnAdd;
private AntdUI.Button btnDelete;
private AntdUI.TabPage tabPage6;
private AntdUI.Panel panel7;
private AntdUI.Panel panel6;
private Sunny.UI.UILabel uiLabel1;
private AntdUI.Switch swhEnableBelt;
private Sunny.UI.UILabel uiLabel2;
private AntdUI.Switch swhEnableVibrator;
private Sunny.UI.UILabel uiLabel3;
private AntdUI.Input iptClearTime;
}
}

View File

@ -690,8 +690,11 @@ namespace DHSoftware.Views
private void InitData()
{
// 启用状态绑定
swhEnableVibrator.DataBindings.Add("Checked", global, "EnableVibrator", true, DataSourceUpdateMode.OnPropertyChanged);
swhEnableBelt.DataBindings.Add("Checked", global, "EnableBelt", true, DataSourceUpdateMode.OnPropertyChanged);
iptClearTime.DataBindings.Add("Text", global, "ClearTime", true, DataSourceUpdateMode.OnPropertyChanged);
TableInitProcess.Columns = new ColumnCollection() {
new ColumnCheck("Selected"){Fixed = true},

View File

@ -3,14 +3,14 @@
partial class PreTreatEdit
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -7,6 +7,7 @@ using DH.Commons.Base;
using DH.RBAC.Model.Sys;
using System.Reflection;
using ScrollBar = AntdUI.ScrollBar;
using DH.Commons.Enums;
namespace DHSoftware.Views
{
@ -59,6 +60,19 @@ namespace DHSoftware.Views
switch (clickedItem.PARENTITEM.Text)
{
case "相机设置":
bool b = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-cameraset")
{
b = true;
break;
}
}
}
if (!b) { AntdUI.Message.warn(this, $"对不起,无权限访问相机设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -99,6 +113,19 @@ namespace DHSoftware.Views
break;
case "工位设置":
bool b1 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-stationset")
{
b1 = true;
break;
}
}
}
if (!b1) { AntdUI.Message.warn(this, $"对不起,无权限访问工位设置!", autoClose: 3); return; }
// 检查是否已存在同名 TabPage
foreach (var tab in tabs1.Pages)
{
@ -146,6 +173,19 @@ namespace DHSoftware.Views
break;
case "运控设置":
bool b2 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-motionset")
{
b2 = true;
break;
}
}
}
if (!b2) { AntdUI.Message.warn(this, $"对不起,无权限访问运控设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -185,6 +225,19 @@ namespace DHSoftware.Views
}
break;
case "其他设置":
bool b3 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-globalset")
{
b3 = true;
break;
}
}
}
if (!b3) { AntdUI.Message.warn(this, $"对不起,无权限访问其他设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -329,15 +382,30 @@ namespace DHSoftware.Views
}
return null;
}
private List<SysPermission> _buttonPermissionList = new List<SysPermission>();
private readonly object _permissionLock = new object();
/// <summary>
/// 按钮权限列表(线程安全)
/// </summary>
public List<SysPermission> ButtonPermissionList
{
get
{
lock (_permissionLock)
{
return new List<SysPermission>(_buttonPermissionList); // 返回副本避免外部修改
}
}
set
{
List<SysPermission> list = value;
SetPermission(list, this.Controls);
lock (_permissionLock)
{
_buttonPermissionList = value ?? new List<SysPermission>();
SetPermission(_buttonPermissionList, this.Controls); // 应用权限到控件
}
}
}
private void SetPermission(List<SysPermission> list, Control.ControlCollection controls)
{
foreach (Control control in controls)
@ -453,7 +521,19 @@ namespace DHSoftware.Views
{
if (e.Button == MouseButtons.Right)
{
bool b = false;
if (ButtonPermissionList.Count > 0)
{
foreach(var item in ButtonPermissionList)
{
if (item.EnCode == "sys-setright")
{
b= true;
break;
}
}
}
if (!b) { return; }
var menu = sender as Menu;
if (menu == null) return;
@ -491,6 +571,7 @@ namespace DHSoftware.Views
if (result == DialogResult.OK)
{
menu1.Remove(clickedItem);
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
foreach (var tab in tabs1.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -503,7 +584,7 @@ namespace DHSoftware.Views
return;
}
}
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
}
break;
@ -515,7 +596,8 @@ namespace DHSoftware.Views
{
Size = new Size(300, 200),
// 传递当前名称到表单
CubicleName = originalName
CubicleName = originalName,
};
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
@ -577,6 +659,7 @@ namespace DHSoftware.Views
if (result == DialogResult.OK)
{
menu1.Remove(clickedItem);
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
foreach (var tab in tabs1.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -595,12 +678,14 @@ namespace DHSoftware.Views
case "重命名":
// 保存原始名称用于查找
string originalName = clickedItem.Text;
EnumDetectionType enumDetectionType= ConfigModel.DetectionList.FirstOrDefault(c =>
c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)).DetectionType;
var form = new AddCubicleControl(this, "重命名工位操作")
{
Size = new Size(300, 500),
// 传递当前名称到表单
CubicleName = originalName
CubicleName = originalName,
DetectionType = enumDetectionType
};
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
@ -624,6 +709,7 @@ namespace DHSoftware.Views
var detection = ConfigModel.DetectionList.FirstOrDefault(c =>
c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase));
detection.Name = newName;
detection.DetectionType = form.DetectionType;
foreach (var tab in tabs1.Pages)
{
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}")

View File

@ -3,14 +3,14 @@
partial class SizeLabelEdit
{
/// <summary>
/// 必需的设计器变量
/// 必需的设计器变量
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源
/// 清理所有正在使用的资源
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容
/// 使用代码编辑器修改此方法的内容
/// </summary>
private void InitializeComponent()
{

View File

@ -62,10 +62,19 @@
btnMotorForward = new AntdUI.Button();
iptMotorSpeed = new AntdUI.InputNumber();
label8 = new AntdUI.Label();
panel3 = new AntdUI.Panel();
btnSaveBarrierPos = new AntdUI.Button();
iptBarrierPos = new AntdUI.InputNumber();
label10 = new AntdUI.Label();
btnBarrierZero = new AntdUI.Button();
btnBarrier = new AntdUI.Button();
iptBarrierSpeed = new AntdUI.InputNumber();
label11 = new AntdUI.Label();
imageViewerControl1 = new ImageViewerControl();
panel1.SuspendLayout();
panel2.SuspendLayout();
panelMotor.SuspendLayout();
panel3.SuspendLayout();
SuspendLayout();
//
// titlebar
@ -77,12 +86,11 @@
titlebar.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
titlebar.ForeColor = Color.White;
titlebar.Location = new Point(0, 0);
titlebar.Margin = new Padding(4, 4, 4, 4);
titlebar.Mode = AntdUI.TAMode.Dark;
titlebar.Name = "titlebar";
titlebar.ShowButton = true;
titlebar.ShowIcon = true;
titlebar.Size = new Size(1551, 44);
titlebar.Size = new Size(1210, 37);
titlebar.SubText = "视觉定位系统";
titlebar.TabIndex = 1;
titlebar.Text = "山东迭慧智能科技有限公司";
@ -100,39 +108,35 @@
panel1.Controls.Add(sltCameraName);
panel1.Controls.Add(label1);
panel1.Dock = DockStyle.Top;
panel1.Location = new Point(0, 44);
panel1.Margin = new Padding(4, 4, 4, 4);
panel1.Location = new Point(0, 37);
panel1.Name = "panel1";
panel1.Size = new Size(1551, 66);
panel1.Size = new Size(1210, 56);
panel1.TabIndex = 2;
panel1.Text = "panel1";
//
// iptThreshold
//
iptThreshold.Location = new Point(1407, 7);
iptThreshold.Margin = new Padding(4, 4, 4, 4);
iptThreshold.Location = new Point(1094, 6);
iptThreshold.Name = "iptThreshold";
iptThreshold.Size = new Size(138, 51);
iptThreshold.Size = new Size(107, 43);
iptThreshold.TabIndex = 15;
iptThreshold.Text = "0";
//
// label6
//
label6.BackColor = SystemColors.Window;
label6.Location = new Point(1342, 21);
label6.Margin = new Padding(4, 4, 4, 4);
label6.Location = new Point(1044, 18);
label6.Name = "label6";
label6.Size = new Size(73, 27);
label6.Size = new Size(57, 23);
label6.TabIndex = 14;
label6.Text = "定位阈值";
//
// btnSelectBackImg
//
btnSelectBackImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSelectBackImg.Location = new Point(1238, 13);
btnSelectBackImg.Margin = new Padding(4, 4, 4, 4);
btnSelectBackImg.Location = new Point(963, 11);
btnSelectBackImg.Name = "btnSelectBackImg";
btnSelectBackImg.Size = new Size(96, 45);
btnSelectBackImg.Size = new Size(75, 38);
btnSelectBackImg.TabIndex = 13;
btnSelectBackImg.Text = "打开";
btnSelectBackImg.Type = AntdUI.TTypeMini.Primary;
@ -140,70 +144,63 @@
// btnSelectModel
//
btnSelectModel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSelectModel.Location = new Point(675, 11);
btnSelectModel.Margin = new Padding(4, 4, 4, 4);
btnSelectModel.Location = new Point(525, 9);
btnSelectModel.Name = "btnSelectModel";
btnSelectModel.Size = new Size(96, 45);
btnSelectModel.Size = new Size(75, 38);
btnSelectModel.TabIndex = 12;
btnSelectModel.Text = "打开";
btnSelectModel.Type = AntdUI.TTypeMini.Primary;
//
// iptBackImg
//
iptBackImg.Location = new Point(892, 7);
iptBackImg.Margin = new Padding(4, 4, 4, 4);
iptBackImg.Location = new Point(694, 6);
iptBackImg.Name = "iptBackImg";
iptBackImg.PlaceholderText = "请选择背景图片";
iptBackImg.Size = new Size(338, 51);
iptBackImg.Size = new Size(263, 43);
iptBackImg.TabIndex = 10;
//
// label3
//
label3.BackColor = SystemColors.Window;
label3.Location = new Point(779, 21);
label3.Margin = new Padding(4, 4, 4, 4);
label3.Location = new Point(606, 18);
label3.Name = "label3";
label3.Size = new Size(105, 27);
label3.Size = new Size(82, 23);
label3.TabIndex = 9;
label3.Text = "背景图片路径";
//
// iptModel
//
iptModel.Location = new Point(329, 7);
iptModel.Margin = new Padding(4, 4, 4, 4);
iptModel.Location = new Point(256, 6);
iptModel.Name = "iptModel";
iptModel.PlaceholderText = "请选择算法";
iptModel.Size = new Size(338, 51);
iptModel.Size = new Size(263, 43);
iptModel.TabIndex = 3;
//
// label2
//
label2.BackColor = SystemColors.Window;
label2.Location = new Point(248, 21);
label2.Margin = new Padding(4, 4, 4, 4);
label2.Location = new Point(193, 18);
label2.Name = "label2";
label2.Size = new Size(73, 27);
label2.Size = new Size(57, 23);
label2.TabIndex = 2;
label2.Text = "算法路径";
//
// sltCameraName
//
sltCameraName.List = true;
sltCameraName.Location = new Point(93, 8);
sltCameraName.Margin = new Padding(4, 4, 4, 4);
sltCameraName.Location = new Point(72, 7);
sltCameraName.MaxCount = 10;
sltCameraName.Name = "sltCameraName";
sltCameraName.PlaceholderText = "请选择相机";
sltCameraName.Size = new Size(148, 51);
sltCameraName.Size = new Size(115, 43);
sltCameraName.TabIndex = 1;
//
// label1
//
label1.BackColor = SystemColors.Window;
label1.Location = new Point(12, 21);
label1.Margin = new Padding(4, 4, 4, 4);
label1.Location = new Point(9, 18);
label1.Name = "label1";
label1.Size = new Size(73, 27);
label1.Size = new Size(57, 23);
label1.TabIndex = 0;
label1.Text = "相机名称";
//
@ -222,39 +219,35 @@
panel2.Controls.Add(sltDirection);
panel2.Controls.Add(label4);
panel2.Dock = DockStyle.Top;
panel2.Location = new Point(0, 110);
panel2.Margin = new Padding(4, 4, 4, 4);
panel2.Location = new Point(0, 93);
panel2.Name = "panel2";
panel2.Size = new Size(1551, 66);
panel2.Size = new Size(1210, 56);
panel2.TabIndex = 3;
panel2.Text = "panel2";
//
// iptSpeed
//
iptSpeed.Location = new Point(329, 7);
iptSpeed.Margin = new Padding(4, 4, 4, 4);
iptSpeed.Location = new Point(256, 6);
iptSpeed.Name = "iptSpeed";
iptSpeed.Size = new Size(138, 51);
iptSpeed.Size = new Size(107, 43);
iptSpeed.TabIndex = 20;
iptSpeed.Text = "0";
//
// label7
//
label7.BackColor = SystemColors.Window;
label7.Location = new Point(248, 21);
label7.Margin = new Padding(4, 4, 4, 4);
label7.Location = new Point(193, 18);
label7.Name = "label7";
label7.Size = new Size(73, 27);
label7.Size = new Size(57, 23);
label7.TabIndex = 19;
label7.Text = "转盘速度";
//
// btnSaveImg
//
btnSaveImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveImg.Location = new Point(1448, 13);
btnSaveImg.Margin = new Padding(4, 4, 4, 4);
btnSaveImg.Location = new Point(1126, 11);
btnSaveImg.Name = "btnSaveImg";
btnSaveImg.Size = new Size(96, 45);
btnSaveImg.Size = new Size(75, 38);
btnSaveImg.TabIndex = 18;
btnSaveImg.Text = "保存图像";
btnSaveImg.Type = AntdUI.TTypeMini.Primary;
@ -262,10 +255,9 @@
// btnSavePos
//
btnSavePos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSavePos.Location = new Point(1302, 13);
btnSavePos.Margin = new Padding(4, 4, 4, 4);
btnSavePos.Location = new Point(1013, 11);
btnSavePos.Name = "btnSavePos";
btnSavePos.Size = new Size(96, 45);
btnSavePos.Size = new Size(75, 38);
btnSavePos.TabIndex = 17;
btnSavePos.Text = "保存定位";
btnSavePos.Type = AntdUI.TTypeMini.Primary;
@ -273,10 +265,9 @@
// btnReverse
//
btnReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnReverse.Location = new Point(1162, 13);
btnReverse.Margin = new Padding(4, 4, 4, 4);
btnReverse.Location = new Point(904, 11);
btnReverse.Name = "btnReverse";
btnReverse.Size = new Size(96, 45);
btnReverse.Size = new Size(75, 38);
btnReverse.TabIndex = 16;
btnReverse.Text = "转盘反转";
btnReverse.Type = AntdUI.TTypeMini.Primary;
@ -284,10 +275,9 @@
// btnForward
//
btnForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnForward.Location = new Point(1034, 13);
btnForward.Margin = new Padding(4, 4, 4, 4);
btnForward.Location = new Point(804, 11);
btnForward.Name = "btnForward";
btnForward.Size = new Size(96, 45);
btnForward.Size = new Size(75, 38);
btnForward.TabIndex = 15;
btnForward.Text = "转盘正转";
btnForward.Type = AntdUI.TTypeMini.Primary;
@ -295,10 +285,9 @@
// btnLocalization
//
btnLocalization.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnLocalization.Location = new Point(905, 13);
btnLocalization.Margin = new Padding(4, 4, 4, 4);
btnLocalization.Location = new Point(704, 11);
btnLocalization.Name = "btnLocalization";
btnLocalization.Size = new Size(96, 45);
btnLocalization.Size = new Size(75, 38);
btnLocalization.TabIndex = 14;
btnLocalization.Text = "开始定位";
btnLocalization.Type = AntdUI.TTypeMini.Primary;
@ -306,31 +295,28 @@
// btnAcquisition
//
btnAcquisition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnAcquisition.Location = new Point(779, 13);
btnAcquisition.Margin = new Padding(4, 4, 4, 4);
btnAcquisition.Location = new Point(606, 11);
btnAcquisition.Name = "btnAcquisition";
btnAcquisition.Size = new Size(96, 45);
btnAcquisition.Size = new Size(75, 38);
btnAcquisition.TabIndex = 13;
btnAcquisition.Text = "开始采集";
btnAcquisition.Type = AntdUI.TTypeMini.Primary;
//
// iptPosition
//
iptPosition.Location = new Point(546, 7);
iptPosition.Margin = new Padding(4, 4, 4, 4);
iptPosition.Location = new Point(425, 6);
iptPosition.Name = "iptPosition";
iptPosition.ReadOnly = true;
iptPosition.Size = new Size(225, 51);
iptPosition.Size = new Size(175, 43);
iptPosition.TabIndex = 7;
iptPosition.Text = "0";
//
// label5
//
label5.BackColor = SystemColors.Window;
label5.Location = new Point(474, 21);
label5.Margin = new Padding(4, 4, 4, 4);
label5.Location = new Point(369, 18);
label5.Name = "label5";
label5.Size = new Size(76, 27);
label5.Size = new Size(59, 23);
label5.TabIndex = 6;
label5.Text = "当前位置";
//
@ -338,21 +324,19 @@
//
sltDirection.Items.AddRange(new object[] { "正方向", "反方向" });
sltDirection.List = true;
sltDirection.Location = new Point(93, 7);
sltDirection.Margin = new Padding(4, 4, 4, 4);
sltDirection.Location = new Point(72, 6);
sltDirection.MaxCount = 10;
sltDirection.Name = "sltDirection";
sltDirection.PlaceholderText = "请选择方向";
sltDirection.Size = new Size(148, 51);
sltDirection.Size = new Size(115, 43);
sltDirection.TabIndex = 5;
//
// label4
//
label4.BackColor = SystemColors.Window;
label4.Location = new Point(12, 21);
label4.Margin = new Padding(4, 4, 4, 4);
label4.Location = new Point(9, 18);
label4.Name = "label4";
label4.Size = new Size(73, 27);
label4.Size = new Size(57, 23);
label4.TabIndex = 4;
label4.Text = "转盘方向";
//
@ -367,51 +351,46 @@
panelMotor.Controls.Add(iptMotorSpeed);
panelMotor.Controls.Add(label8);
panelMotor.Dock = DockStyle.Top;
panelMotor.Location = new Point(0, 176);
panelMotor.Margin = new Padding(4, 4, 4, 4);
panelMotor.Location = new Point(0, 149);
panelMotor.Name = "panelMotor";
panelMotor.Size = new Size(1551, 54);
panelMotor.Size = new Size(1210, 46);
panelMotor.TabIndex = 4;
panelMotor.Text = "panel3";
//
// btnSaveMotorPos
//
btnSaveMotorPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveMotorPos.Location = new Point(966, 6);
btnSaveMotorPos.Margin = new Padding(4, 4, 4, 4);
btnSaveMotorPos.Location = new Point(751, 5);
btnSaveMotorPos.Name = "btnSaveMotorPos";
btnSaveMotorPos.Size = new Size(111, 45);
btnSaveMotorPos.Size = new Size(109, 38);
btnSaveMotorPos.TabIndex = 21;
btnSaveMotorPos.Text = "保存电机位置";
btnSaveMotorPos.Text = "保存相机电机位置";
btnSaveMotorPos.Type = AntdUI.TTypeMini.Primary;
//
// iptMotorPos
//
iptMotorPos.Location = new Point(365, 0);
iptMotorPos.Margin = new Padding(4, 4, 4, 4);
iptMotorPos.Location = new Point(284, 0);
iptMotorPos.Name = "iptMotorPos";
iptMotorPos.ReadOnly = true;
iptMotorPos.Size = new Size(225, 51);
iptMotorPos.Size = new Size(175, 43);
iptMotorPos.TabIndex = 20;
iptMotorPos.Text = "0";
//
// label9
//
label9.BackColor = SystemColors.Window;
label9.Location = new Point(261, 12);
label9.Margin = new Padding(4, 4, 4, 4);
label9.Location = new Point(203, 10);
label9.Name = "label9";
label9.Size = new Size(104, 27);
label9.Size = new Size(81, 23);
label9.TabIndex = 19;
label9.Text = "变焦电机位置";
//
// btnMotorZero
//
btnMotorZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorZero.Location = new Point(598, 6);
btnMotorZero.Margin = new Padding(4, 4, 4, 4);
btnMotorZero.Location = new Point(465, 5);
btnMotorZero.Name = "btnMotorZero";
btnMotorZero.Size = new Size(96, 45);
btnMotorZero.Size = new Size(75, 38);
btnMotorZero.TabIndex = 18;
btnMotorZero.Text = "电机回原点";
btnMotorZero.Type = AntdUI.TTypeMini.Primary;
@ -419,10 +398,9 @@
// btnMotorReverse
//
btnMotorReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorReverse.Location = new Point(847, 6);
btnMotorReverse.Margin = new Padding(4, 4, 4, 4);
btnMotorReverse.Location = new Point(659, 5);
btnMotorReverse.Name = "btnMotorReverse";
btnMotorReverse.Size = new Size(96, 45);
btnMotorReverse.Size = new Size(75, 38);
btnMotorReverse.TabIndex = 17;
btnMotorReverse.Text = "电机反转";
btnMotorReverse.Type = AntdUI.TTypeMini.Primary;
@ -430,60 +408,137 @@
// btnMotorForward
//
btnMotorForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorForward.Location = new Point(724, 6);
btnMotorForward.Margin = new Padding(4, 4, 4, 4);
btnMotorForward.Location = new Point(563, 5);
btnMotorForward.Name = "btnMotorForward";
btnMotorForward.Size = new Size(96, 45);
btnMotorForward.Size = new Size(75, 38);
btnMotorForward.TabIndex = 16;
btnMotorForward.Text = "电机正转";
btnMotorForward.Type = AntdUI.TTypeMini.Primary;
//
// iptMotorSpeed
//
iptMotorSpeed.Location = new Point(116, 0);
iptMotorSpeed.Margin = new Padding(4, 4, 4, 4);
iptMotorSpeed.Location = new Point(90, 0);
iptMotorSpeed.Name = "iptMotorSpeed";
iptMotorSpeed.Size = new Size(138, 51);
iptMotorSpeed.Size = new Size(107, 43);
iptMotorSpeed.TabIndex = 8;
iptMotorSpeed.Text = "0";
//
// label8
//
label8.BackColor = SystemColors.Window;
label8.Location = new Point(12, 12);
label8.Margin = new Padding(4, 4, 4, 4);
label8.Location = new Point(9, 10);
label8.Name = "label8";
label8.Size = new Size(104, 27);
label8.Size = new Size(81, 23);
label8.TabIndex = 1;
label8.Text = "变焦电机速度";
//
// panel3
//
panel3.Controls.Add(btnSaveBarrierPos);
panel3.Controls.Add(iptBarrierPos);
panel3.Controls.Add(label10);
panel3.Controls.Add(btnBarrierZero);
panel3.Controls.Add(btnBarrier);
panel3.Controls.Add(iptBarrierSpeed);
panel3.Controls.Add(label11);
panel3.Dock = DockStyle.Top;
panel3.Location = new Point(0, 195);
panel3.Name = "panel3";
panel3.Size = new Size(1210, 46);
panel3.TabIndex = 6;
panel3.Text = "panel3";
//
// btnSaveBarrierPos
//
btnSaveBarrierPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveBarrierPos.Location = new Point(681, 5);
btnSaveBarrierPos.Name = "btnSaveBarrierPos";
btnSaveBarrierPos.Size = new Size(109, 38);
btnSaveBarrierPos.TabIndex = 21;
btnSaveBarrierPos.Text = "保存挡料电机位置";
btnSaveBarrierPos.Type = AntdUI.TTypeMini.Primary;
//
// iptBarrierPos
//
iptBarrierPos.Location = new Point(284, 0);
iptBarrierPos.Name = "iptBarrierPos";
iptBarrierPos.Size = new Size(175, 43);
iptBarrierPos.TabIndex = 20;
iptBarrierPos.Text = "0";
//
// label10
//
label10.BackColor = SystemColors.Window;
label10.Location = new Point(203, 10);
label10.Name = "label10";
label10.Size = new Size(81, 23);
label10.TabIndex = 19;
label10.Text = "挡料电机位置";
//
// btnBarrierZero
//
btnBarrierZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnBarrierZero.Location = new Point(465, 5);
btnBarrierZero.Name = "btnBarrierZero";
btnBarrierZero.Size = new Size(75, 38);
btnBarrierZero.TabIndex = 18;
btnBarrierZero.Text = "电机回原点";
btnBarrierZero.Type = AntdUI.TTypeMini.Primary;
//
// btnBarrier
//
btnBarrier.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnBarrier.Location = new Point(563, 5);
btnBarrier.Name = "btnBarrier";
btnBarrier.Size = new Size(101, 38);
btnBarrier.TabIndex = 16;
btnBarrier.Text = "挡料电机转动";
btnBarrier.Type = AntdUI.TTypeMini.Primary;
//
// iptBarrierSpeed
//
iptBarrierSpeed.Location = new Point(90, 0);
iptBarrierSpeed.Name = "iptBarrierSpeed";
iptBarrierSpeed.Size = new Size(107, 43);
iptBarrierSpeed.TabIndex = 8;
iptBarrierSpeed.Text = "0";
//
// label11
//
label11.BackColor = SystemColors.Window;
label11.Location = new Point(9, 10);
label11.Name = "label11";
label11.Size = new Size(81, 23);
label11.TabIndex = 1;
label11.Text = "挡料电机速度";
//
// imageViewerControl1
//
imageViewerControl1.Dock = DockStyle.Fill;
imageViewerControl1.Image = null;
imageViewerControl1.Location = new Point(0, 230);
imageViewerControl1.Margin = new Padding(4, 4, 4, 4);
imageViewerControl1.Location = new Point(0, 241);
imageViewerControl1.Name = "imageViewerControl1";
imageViewerControl1.Size = new Size(1551, 593);
imageViewerControl1.TabIndex = 5;
imageViewerControl1.Size = new Size(1210, 464);
imageViewerControl1.TabIndex = 7;
//
// VisualLocalizationWindow
//
AutoScaleDimensions = new SizeF(9F, 20F);
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1551, 823);
ClientSize = new Size(1210, 705);
Controls.Add(imageViewerControl1);
Controls.Add(panel3);
Controls.Add(panelMotor);
Controls.Add(panel2);
Controls.Add(panel1);
Controls.Add(titlebar);
Margin = new Padding(4, 4, 4, 4);
Name = "VisualLocalizationWindow";
Text = "CCD光学筛选定位系统";
WindowState = FormWindowState.Maximized;
panel1.ResumeLayout(false);
panel2.ResumeLayout(false);
panelMotor.ResumeLayout(false);
panel3.ResumeLayout(false);
ResumeLayout(false);
}
@ -517,12 +572,20 @@
private AntdUI.Panel panelMotor;
private AntdUI.InputNumber iptMotorSpeed;
private AntdUI.Label label8;
private ImageViewerControl imageViewerControl1;
private AntdUI.Button btnMotorReverse;
private AntdUI.Button btnMotorForward;
private AntdUI.InputNumber iptMotorPos;
private AntdUI.Label label9;
private AntdUI.Button btnMotorZero;
private AntdUI.Button btnSaveMotorPos;
private AntdUI.Panel panel3;
private AntdUI.Button btnSaveBarrierPos;
private AntdUI.InputNumber iptBarrierPos;
private AntdUI.Label label10;
private AntdUI.Button btnBarrierZero;
private AntdUI.Button btnBarrier;
private AntdUI.InputNumber iptBarrierSpeed;
private AntdUI.Label label11;
private ImageViewerControl imageViewerControl1;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -120,254 +120,7 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn
H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E
u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D
uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn
H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn
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
H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -376,7 +129,159 @@
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
AAAAAAAAAAAAAAAAAAAAAAAAgGwHAH9vBwD///8Au6gRM9a/D5DiyA3B4csLxdnHEaTOuSFOmYctBr2x
MwDAuz0AUygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABfTgAANCQAAAAAAABNPw4AYlMmAFA/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCACABvYgUAzbgSAAAANQGbiRgNnZAYD1ZP
GwTs2SQArZwpALyqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLAAA8KwAAuqYXAIx5
DAClkRAApZUSAJKFDQAAAAAAbVgHAEw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/
AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA
D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/
AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A
H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAA=
</value>
</data>
</root>

View File

@ -6,15 +6,15 @@
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果想要更改 Windows 用户帐户控制级别,请使用
以下节点之一替换 requestedExecutionLevel 节点
以下节点之一替换 requestedExecutionLevel 节点
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化
如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此
元素
元素
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
@ -24,8 +24,8 @@
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
Windows 版本的列表取消评论适当的元素,
Windows 将自动选择最兼容的环境 -->
Windows 版本的列表 取消评论适当的元素,
Windows 将自动选择最兼容的环境 -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
@ -46,11 +46,11 @@
</compatibility>
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
自动缩放Windows Presentation Foundation (WPF)应用程序自动感知 DPI无需
选择加入选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"
自动缩放 Windows Presentation Foundation (WPF)应用程序自动感知 DPI无需
选择加入 选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"
将应用程序设为感知长路径请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
将应用程序设为感知长路径 请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>

BIN
DHSoftware/assets/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.