using LB_VisionProcesses.Communicators; using LB_VisionControls; using LB_VisionProcesses; using OpenCvSharp.Flann; using System; using System.Collections.Concurrent; using System.Windows.Forms; using System.Xml.Linq; using LB_VisionProcesses.Cameras; namespace LB_SmartVision.Forms.Pages.CameraPage { public partial class CamerasEditPage : UserControl { public Action LogInfo; public CamerasEditPage() { InitializeComponent(); Name = "CamerasEditPage"; Text = "相机设置"; } private void CamerasEditPage_Paint(object sender, PaintEventArgs e) { uiFlowLayoutPanel1.Controls.Clear(); if (GlobalVar.dicCameras.Count <= 0) return; foreach (var item in GlobalVar.dicCameras) { string CameraSN = item.Key; string CameraBrand = item.Value.Brand.ToString(); if (string.IsNullOrEmpty(CameraSN) || string.IsNullOrEmpty(CameraBrand)) return; UserItem flow = new UserItem(new string[] { "测试", "重连", "移除", "断连" }); flow.Name = CameraSN; flow.Text = $"[{CameraBrand}]"; if (item.Value.isGrabbing) flow.state = State.Pass; else flow.state |= State.Error; LoadFlowEvent(flow); uiFlowLayoutPanel1.Controls.Add(flow); } } private void uiButton1_Click(object sender, System.EventArgs e) { CreateCameraForm createCameraForm = new CreateCameraForm(); createCameraForm.ShowDialog(); if (createCameraForm.bCreate) { BaseCamera camera = createCameraForm.camera; if (GlobalVar.dicCameras.ContainsKey(camera.SN)) { MessageBox.Show($"相机[{camera.SN}]已存在!", "异常"); return; } string CameraSN = camera.SN;//"127.0.0.1" string CameraBrand = camera.Brand.ToString();//"1111" if (string.IsNullOrEmpty(CameraSN) || string.IsNullOrEmpty(CameraBrand)) return; GlobalVar.dicCameras.TryAdd(CameraSN, camera); LogInfo?.Invoke(string.Format("添加相机[{0}][{1}]成功", CameraBrand, CameraSN), LogInfoType.PASS); } this.Invalidate(); } private void uiButton2_Click(object sender, System.EventArgs e) { //清除用Clear方法 uiFlowLayoutPanel1.Controls.Clear(); foreach (var camera in GlobalVar.dicCameras.Values) { camera.CloseDevice(); } GlobalVar.dicCameras.Clear(); } private void LoadFlowEvent(UserItem flow) { //按键1为测试 flow.MenuItem1ClickedEvent += TestEvent; //按键2为重连 flow.MenuItem2ClickedEvent += ReconnectEvent; //按键3为移除 flow.MenuItem3ClickedEvent += DeleteEvent; //按键4为断连 flow.MenuItem4ClickedEvent += DisconnectEvent; } private void RemoveFlowEvent(UserItem flow) { //按键1为测试 flow.MenuItem1ClickedEvent -= TestEvent; //按键2为重连 flow.MenuItem2ClickedEvent -= ReconnectEvent; //按键3为移除 flow.MenuItem3ClickedEvent -= DeleteEvent; //按键4为断连 flow.MenuItem4ClickedEvent -= DisconnectEvent; } // 测试相机 private void TestEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; if (GlobalVar.dicCameras.ContainsKey(name)) { CameraForm cameraForm = new CameraForm(GlobalVar.dicCameras[name]); cameraForm.Show(); } } } // 移除相机 private void DeleteEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; RemoveFlowEvent(flow); uiFlowLayoutPanel1.Controls.Remove(uiFlowLayoutPanel1.Controls[i]); if (GlobalVar.dicCameras.TryRemove(name, out BaseCamera BaseCamera)) { BaseCamera.Dispose(); LogInfo?.Invoke(string.Format("移除相机[{0}]", name), LogInfoType.INFO); } else LogInfo?.Invoke(string.Format("移除相机[{0}]失败", name), LogInfoType.ERROR); } } // 重连相机 private void ReconnectEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; GlobalVar.dicCameras[name].CloseDevice(); Thread.Sleep(50); GlobalVar.dicCameras[name].InitDevice(name, this.Handle); if (GlobalVar.dicCameras[name].isGrabbing) { flow.state = State.Pass; LogInfo?.Invoke(string.Format("重连相机[{0}]成功", name), LogInfoType.PASS); } else { flow.state = State.Error; LogInfo?.Invoke(string.Format("重连相机[{0}]失败", name), LogInfoType.ERROR); } flow.Refresh(); } } // 断连相机 private void DisconnectEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; GlobalVar.dicCameras[name].CloseDevice(); if (GlobalVar.dicCameras[name].isGrabbing) { flow.state = State.Pass; LogInfo?.Invoke(string.Format("断连相机[{0}]失败", name), LogInfoType.ERROR); } else { flow.state = State.Error; LogInfo?.Invoke(string.Format("断连相机[{0}]成功", name), LogInfoType.PASS); } flow.Refresh(); } } } }