183 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Check.Main.Common;
 | ||
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.ComponentModel;
 | ||
| using System.Drawing.Design;
 | ||
| using System.Linq;
 | ||
| using System.Runtime.CompilerServices;
 | ||
| using System.Text;
 | ||
| using System.Threading.Tasks;
 | ||
| using System.Windows.Forms.Design;
 | ||
| 
 | ||
| namespace Check.Main.Camera
 | ||
| {
 | ||
|     // 相机触发方式枚举
 | ||
|     public enum TriggerModeType
 | ||
|     {
 | ||
|         [Description("连续采集")]
 | ||
|         Continuous,
 | ||
|         [Description("软件触发")]
 | ||
|         Software,
 | ||
|         [Description("硬件触发")]
 | ||
|         Hardware
 | ||
|     }
 | ||
|     public enum CheckType
 | ||
|     {
 | ||
|         [Description("传统算法")]
 | ||
|         Traditional,
 | ||
|         [Description("深度学习")]
 | ||
|         DeepLearning
 | ||
|     }
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 相机配置信息类CameraSettings,用于PropertyGrid显示和编辑(****核心!****)
 | ||
|     /// </summary>
 | ||
|     public class CameraSettings : INotifyPropertyChanged, ICloneable
 | ||
|     {
 | ||
|         // 1. 实现 INotifyPropertyChanged 接口所要求的事件
 | ||
|         public event PropertyChangedEventHandler PropertyChanged;
 | ||
| 
 | ||
|         private int _cameraIndex = 0;
 | ||
|         private string _name = "Camera-1";
 | ||
|         private string _ipAddress = "169.254.51.253";
 | ||
|         private string _ipDeviceAddress = "169.254.51.45";
 | ||
|         private TriggerModeType _triggerMode = TriggerModeType.Continuous;
 | ||
|         private bool _isEnabled = true;
 | ||
|         private CheckType _checkType = CheckType.DeepLearning;
 | ||
|         private int _modelID = 0;
 | ||
| 
 | ||
|         [Category("基本信息"), DisplayName("相机编号"), Description("相机的唯一标识符,用于与模型编号对应。")]
 | ||
|         public int CameraIndex
 | ||
|         {
 | ||
|             get => _cameraIndex;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_cameraIndex != value)
 | ||
|                 {
 | ||
|                     _cameraIndex = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         [Category("基本信息"), DisplayName("相机名称"), Description("给相机起一个唯一的别名")]
 | ||
|         public string Name
 | ||
|         {
 | ||
|             get => _name;
 | ||
|             set
 | ||
|             {
 | ||
|                 // 2. 在setter中检查值是否真的改变了
 | ||
|                 if (_name != value)
 | ||
|                 {
 | ||
|                     _name = value;
 | ||
|                     // 3. 如果改变了,就调用通知方法,广播“Name”属性已变更的消息
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Category("网络信息"), DisplayName("相机IP地址"), Description("相机的IP地址(GigE相机需要)")]
 | ||
|         public string IPAddress
 | ||
|         {
 | ||
|             get => _ipAddress;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_ipAddress != value)
 | ||
|                 {
 | ||
|                     _ipAddress = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Category("网络信息"), DisplayName("上位机IP地址"), Description("相机对应的上位机的IP地址(GigE相机需要)")]
 | ||
|         public string IPDeviceAddress
 | ||
|         {
 | ||
|             get => _ipDeviceAddress;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_ipDeviceAddress != value)
 | ||
|                 {
 | ||
|                     _ipDeviceAddress = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Category("采集控制"), DisplayName("触发模式"), Description("设置相机的图像采集触发方式")]
 | ||
|         [TypeConverter(typeof(EnumDescriptionTypeConverter))]
 | ||
|         public TriggerModeType TriggerMode
 | ||
|         {
 | ||
|             get => _triggerMode;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_triggerMode != value)
 | ||
|                 {
 | ||
|                     _triggerMode = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Category("采集控制"), DisplayName("是否启用"), Description("是否在程序启动时初始化并使用此相机")]
 | ||
|         public bool IsEnabled
 | ||
|         {
 | ||
|             get => _isEnabled;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_isEnabled != value)
 | ||
|                 {
 | ||
|                     _isEnabled = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Category("检测配置"), DisplayName("检测类型"), Description("使用传统算法或深度学习")]
 | ||
|         [TypeConverter(typeof(EnumDescriptionTypeConverter))]
 | ||
|         public CheckType CheckType
 | ||
|         {
 | ||
|             get => _checkType;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_checkType != value)
 | ||
|                 {
 | ||
|                     _checkType = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         [Category("基本信息"), DisplayName("模型编号"), Description("相机调用的模型编号")]
 | ||
|         [TypeConverter(typeof(ModelSelectionConverter))]
 | ||
|         public int ModelID
 | ||
|         {
 | ||
|             get => _modelID;
 | ||
|             set
 | ||
|             {
 | ||
|                 if (_modelID != value)
 | ||
|                 {
 | ||
|                     _modelID = value;
 | ||
|                     OnPropertyChanged();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 4. 触发 PropertyChanged 事件的辅助方法
 | ||
|         /// [CallerMemberName] 特性是一个“语法糖”,它会自动获取调用此方法的属性的名称。
 | ||
|         /// 例如,在Name属性的setter中调用OnPropertyChanged(),C#编译器会自动传入"Name"作为参数。
 | ||
|         /// </summary>
 | ||
|         protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
 | ||
|         {
 | ||
|             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 | ||
|         }
 | ||
|         public object Clone()
 | ||
|         {
 | ||
|             // MemberwiseClone() 会创建一个新对象,并将当前对象的所有非静态字段的值
 | ||
|             // 复制到新对象中。对于值类型,这是值的拷贝;对于引用类型,这是引用的拷贝。
 | ||
|             // 在本类中,这已经足够了。
 | ||
|             return this.MemberwiseClone();
 | ||
|         }
 | ||
|     }
 | ||
| }
 |