视觉修改

This commit is contained in:
17860779768
2025-08-25 16:33:58 +08:00
commit 2e46747ba9
49 changed files with 11062 additions and 0 deletions

View File

@@ -0,0 +1,264 @@
using Check.Main.Camera;
using Check.Main.Common;
using Check.Main.Infer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace Check.Main.UI
{
public partial class FormControlPanel : DockContent
{
private bool _isDeviceReady = false; // 新的状态:设备是否已准备好
private bool _isDetecting = false; // 新的状态:是否正在检测中
// 用于跟踪设备运行状态的私有标志
private bool _isDeviceRunning = false;
public FormControlPanel()
{
InitializeComponent();
ConfigurationManager.OnConfigurationChanged += HandleConfigurationChanged;
UpdateUI();
}
/// <summary>
/// 处理全局配置在其他地方(如 FrmConfig被更改的事件
/// </summary>
private void HandleConfigurationChanged()
{
// 这是一个安全措施。如果设备正在运行时配置发生了变化,
// 最安全的做法是停止设备,以防止出现不可预知的行为。
if (_isDeviceRunning)
{
// 使用 Invoke 确保UI更新在正确的线程上执行
this.Invoke((Action)(() =>
{
ThreadSafeLogger.Log("相机配置已在运行时发生更改,设备将自动停止。请重新启动设备以应用新配置。");
//MessageBox.Show("相机配置已在运行时发生更改,设备将自动停止。请重新启动设备以应用新配置。",
// "配置变更", MessageBoxButtons.OK, MessageBoxIcon.Information);
// 触发与点击“关闭设备”按钮相同的逻辑
btnStartDevice_Click(this, EventArgs.Empty);
}));
}
}
private void btnStartDevice_Click(object sender, EventArgs e)
{
if (_isDeviceReady)//_isDeviceRunning
{
// --- 关闭流程 ---
ThreadSafeLogger.Log("用户点击“关闭设备”,开始完整关闭流程...");
// 如果正在检测,先停止它
if (_isDetecting)
{
btnStartCheck_Click(this, EventArgs.Empty); // 调用停止检测的逻辑
}
var mainForm = this.DockPanel.FindForm() as FrmMain;
CameraManager.Shutdown();
_isDeviceReady = false;
//// 1. 停止硬触发模拟器
//CameraManager.StopHardwareTriggerSimulator();
//// 2. 如果检测正在运行,则停止
//if (DetectionCoordinator.IsDetectionRunning)
//{
// DetectionCoordinator.StopDetection();
// UpdateDetectionButtonUI();
//}
// 3. 执行完整的系统关闭(包括相机硬件和检测协调器)
//CameraManager.Shutdown();
//YoloModelManager.Shutdown();
//_isDeviceRunning = false;
}
else
{
// --- 启动流程 ---
ThreadSafeLogger.Log("用户点击“启动设备”,开始新的启动流程...");
// 1. 从单一数据源获取完整的配置对象
var config = ConfigurationManager.GetCurrentConfig();
// 2. 验证相机配置的有效性
if (config.CameraSettings == null || !config.CameraSettings.Any(c => c.IsEnabled))
{
ThreadSafeLogger.Log("没有已启用的相机配置,启动中止。");
return;
}
// 3. 获取主窗体引用
var mainForm = this.DockPanel.FindForm() as FrmMain;
if (mainForm == null)
{
ThreadSafeLogger.Log("无法找到主窗体,启动中止。");
return;
}
// 4. 执行新的启动流程:
// 第一步初始化系统。这会准备好相机硬件、UI窗口和所有后台处理线程。
CameraManager.PrepareAll(config, mainForm);
_isDeviceReady = true;
//YoloModelManager.Initialize(config.ModelSettings);
//CameraManager.Initialize(config, mainForm);
//// 第二步:命令所有相机开始采集图像。
//CameraManager.StartAll();
//// 5. 如果有任何相机配置为软触发模式,我们启动模拟器来模拟触发信号
//if (config.CameraSettings.Any(c => c.IsEnabled && c.TriggerMode == TriggerModeType.Software))
//{
// ThreadSafeLogger.Log("检测到软触发相机,启动触发模拟器。");
// CameraManager.TriggerInterval = 100; // 根据需要设置间隔
// CameraManager.StartHardwareTriggerSimulator();
//}
//_isDeviceRunning = true;
}
UpdateUI();//UpdateDeviceButtonUI();
}
private void btnStartCheck_Click(object sender, EventArgs e)
{
if (_isDetecting)
{
// --- 停止检测 ---
ThreadSafeLogger.Log("用户点击“停止检测”,暂停数据流...");
// 停止硬触发模拟器
CameraManager.StopHardwareTriggerSimulator();
// 停止相机采集
CameraManager.StopAll();
// 停止统计
DetectionCoordinator.StopDetection();
_isDetecting = false;
}
else
{
// --- 开始检测 ---
ThreadSafeLogger.Log("用户点击“开始检测”,启动数据流...");
// 命令相机开始采集
CameraManager.StartAll();
// 启动硬触发模拟器(如果需要)
var config = ConfigurationManager.GetCurrentConfig();
if (config.CameraSettings.Any(c => c.IsEnabled && c.TriggerMode == TriggerModeType.Software))
{
CameraManager.TriggerInterval = 100;
CameraManager.StartHardwareTriggerSimulator();
}
// 开始统计
DetectionCoordinator.StartDetection();
_isDetecting = true;
}
UpdateUI();
//if (!_isDeviceRunning && !DetectionCoordinator.IsDetectionRunning)
//{
// ThreadSafeLogger.Log("设备未启动,无法开始检测。");
// return;
//}
//// 现在调用 DetectionCoordinator 中的方法
//if (DetectionCoordinator.IsDetectionRunning)
//{
// DetectionCoordinator.StopDetection();
//}
//else
//{
// DetectionCoordinator.StartDetection();
//}
//UpdateDetectionButtonUI();
}
#region UI
/// <summary>
/// 根据设备运行状态更新“设备”按钮的UI文本和颜色
/// </summary>
private void UpdateDeviceButtonUI()
{
if (_isDeviceRunning)
{
btnStartDevice.Text = "关闭设备";
btnStartDevice.BackColor = Color.Salmon;
}
else
{
btnStartDevice.Text = "启动设备";
btnStartDevice.BackColor = SystemColors.Control;
}
}
// 统一的UI更新方法
private void UpdateUI()
{
// --- 更新“设备”按钮 ---
if (_isDeviceReady)
{
btnStartDevice.Text = "关闭设备";
btnStartDevice.BackColor = Color.Salmon;
btnStartCheck.Enabled = true; // 设备就绪后,检测按钮才可用
}
else
{
btnStartDevice.Text = "启动设备";
btnStartDevice.BackColor = SystemColors.Control;
btnStartCheck.Enabled = false; // 设备未就绪,检测按钮不可用
}
// --- 更新“检测”按钮 ---
if (_isDetecting)
{
btnStartCheck.Text = "停止检测";
btnStartCheck.BackColor = Color.LightGreen;
btnStartDevice.Enabled = false; // 正在检测时,不允许关闭设备
}
else
{
btnStartCheck.Text = "开始检测";
btnStartCheck.BackColor = SystemColors.Control;
if (_isDeviceReady) btnStartDevice.Enabled = true; // 停止检测后,允许关闭设备
}
}
/// <summary>
/// 根据检测运行状态更新“检测”按钮的UI文本和颜色
/// </summary>
private void UpdateDetectionButtonUI()
{
//if (CameraManager.IsDetectionRunning)
//{
// btnStartCheck.Text = "停止检测";
// btnStartCheck.BackColor = Color.LightGreen;
//}
//else
//{
// btnStartCheck.Text = "启动检测";
// btnStartCheck.BackColor = SystemColors.Control;
//}
if (DetectionCoordinator.IsDetectionRunning)
{
btnStartCheck.Text = "停止检测";
btnStartCheck.BackColor = Color.LightGreen;
}
else
{
btnStartCheck.Text = "启动检测";
btnStartCheck.BackColor = SystemColors.Control;
}
}
#endregion
}
}