10.20PLC+相机2.3视觉修改

This commit is contained in:
17860779768
2025-08-25 16:33:58 +08:00
committed by Maikouce China
commit dca4b2afac
52 changed files with 11698 additions and 0 deletions

View File

@@ -0,0 +1,193 @@
using Check.Main.Camera;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
using WeifenLuo.WinFormsUI.Docking;
namespace Check.Main.UI
{
public partial class FrmCamConfig : DockContent
{
// public List<CameraSettings> _settingsList = new List<CameraSettings>();
public List<CameraSettings> _settingsList { get; private set; }
private readonly string _configFilePath = Path.Combine(Application.StartupPath, "cameras.xml");
public FrmCamConfig()
{
InitializeComponent();
_settingsList = new List<CameraSettings>();
LoadSettings();
RefreshListBox();
AdaptForDialogMode(); // 调整UI为对话框模式
}
/// <summary>
/// 用于从外部接收一个设置列表进行编辑。
/// </summary>
/// <param name="settingsToEdit">要编辑的相机设置列表</param>
public FrmCamConfig(List<CameraSettings> settingsToEdit)
{
InitializeComponent();
// 创建一个现有列表的副本进行编辑,这样如果用户点“取消”,原始列表不会被影响
_settingsList = settingsToEdit != null
? settingsToEdit.Select(s => s.Clone() as CameraSettings).ToList() // 深度克隆更好,这里为简化用浅克隆
: new List<CameraSettings>();
// 别忘了为列表中的每个对象重新订阅事件
foreach (var setting in _settingsList)
{
setting.PropertyChanged += Setting_PropertyChanged;
}
RefreshListBox();
AdaptForDialogMode(); // 调整UI为对话框模式
}
/// <summary>
/// 【新增的方法】
/// 调整UI使其更像一个对话框。
/// </summary>
private void AdaptForDialogMode()
{
// 将“应用配置”按钮改为“确定”
toolBtnSet.Text = "确定";
toolBtnSet.ToolTipText = "保存更改并关闭窗口";
// 新增一个“取消”按钮
var toolBtnCancel = new ToolStripButton("取消")
{
DisplayStyle = ToolStripItemDisplayStyle.Text,
Alignment = ToolStripItemAlignment.Right // 靠右对齐
};
toolBtnCancel.Click += (sender, e) => {
this.DialogResult = DialogResult.Cancel;
this.Close();
};
toolStrip1.Items.Add(toolBtnCancel);
}
/// <summary>
/// 【新增的事件处理方法】
/// 当PropertyGrid中的属性值被用户修改后触发此事件。
/// </summary>
// 刷新左侧的相机列表
private void RefreshListBox()
{
listBoxCameras.Items.Clear();
foreach (var setting in _settingsList)
{
listBoxCameras.Items.Add(setting.Name);
}
}
/// <summary>
/// 【全新的事件处理方法】
/// 监听单个CameraSettings对象的属性变更通知。
/// </summary>
private void Setting_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// 检查是不是“Name”属性发生了变化
if (e.PropertyName == nameof(CameraSettings.Name))
{
// 'sender' 就是那个属性发生了变化的 CameraSettings 对象
var changedSetting = sender as CameraSettings;
if (changedSetting == null) return;
// 在 _settingsList 中找到这个对象的索引
int index = _settingsList.IndexOf(changedSetting);
// 如果找到了就更新ListBox中对应项的显示文本
if (index >= 0)
{
// 使用Invoke确保线程安全虽然在此场景下通常不是问题但这是个好习惯
this.Invoke(new Action(() => {
listBoxCameras.Items[index] = changedSetting.Name;
}));
}
}
}
private void listBoxCameras_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBoxCameras.SelectedIndex >= 0)
{
propertyGrid1.SelectedObject = _settingsList[listBoxCameras.SelectedIndex];
}
else
{
propertyGrid1.SelectedObject = null;
}
}
private void toolBtnAdd_Click(object sender, EventArgs e)
{
var newSetting = new CameraSettings { Name = $"Camera-{_settingsList.Count + 1}" };
_settingsList.Add(newSetting);
newSetting.PropertyChanged += Setting_PropertyChanged;
RefreshListBox();
listBoxCameras.SelectedIndex = listBoxCameras.Items.Count - 1;
}
private void toolBtnRemove_Click(object sender, EventArgs e)
{
if (listBoxCameras.SelectedIndex >= 0)
{
_settingsList.RemoveAt(listBoxCameras.SelectedIndex);
propertyGrid1.SelectedObject = null;
RefreshListBox();
}
}
private void toolBtnSet_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
// 加载XML配置文件
private void LoadSettings()
{
if (!File.Exists(_configFilePath)) return;
try
{
XmlSerializer serializer = new XmlSerializer(typeof(List<CameraSettings>));
using (FileStream fs = new FileStream(_configFilePath, FileMode.Open))
{
_settingsList = (List<CameraSettings>)serializer.Deserialize(fs);
}
}
catch (Exception ex)
{
MessageBox.Show("加载相机配置失败: " + ex.Message);
}
foreach (var setting in _settingsList)
{
setting.PropertyChanged += Setting_PropertyChanged;
}
}
// 保存配置到XML文件
private void SaveSettings()
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(List<CameraSettings>));
using (FileStream fs = new FileStream(_configFilePath, FileMode.Create))
{
serializer.Serialize(fs, _settingsList);
}
}
catch (Exception ex)
{
MessageBox.Show("保存相机配置失败: " + ex.Message);
}
}
}
}