using Bro.Common.Interface; using Bro.UI.Model.Winform; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace Bro.Common.Base.UI { public partial class CtrlCameraRunBase : UserControl, IRunCtrl { public Canvas CvImage { get; set; } public CtrlCameraRunBase() { InitializeComponent(); CvImage = new Canvas(); CvImage.IsShowElementList = false; CvImage.IsShowROITool = false; CvImage.Dock = DockStyle.Fill; Controls.Add(CvImage); } public IDevice Device { get; set; } protected CameraBase Camera { get => Device as CameraBase; } public CtrlCameraRunBase(IDevice device) { InitializeComponent(); CvImage = new Canvas(); CvImage.IsShowElementList = false; CvImage.IsShowROITool = false; CvImage.Dock = DockStyle.Fill; Controls.Add(CvImage); Device = device; Camera.OnImageUpdated += Camera_UpdateShowImage; Camera.OnElementsUpdated += Camera_OnElementsUpdated; Camera.OnCameraOpModeChanged += Camera_OnCameraOpModeChanged; InitialToolBarVisible(); } private readonly Dictionary> _eleBufferDict = new Dictionary>(); private volatile string _setId = ""; protected virtual void Camera_OnElementsUpdated(CameraBase camera, List eleList, string setId) { if (CvImage.IsHandleCreated) { if (_setId == setId) { CvImage.Elements.Clear(); eleList.ForEach(e => CvImage.Elements.Add(e)); } else { _eleBufferDict[setId] = new List(eleList); } } } DateTime _showTime = DateTime.Now; protected virtual void Camera_UpdateShowImage(CameraBase camera, Bitmap image, string setId) { if (!string.IsNullOrWhiteSpace(setId)) _setId = setId; if (CvImage.IsHandleCreated) { CvImage.LoadImage(image); if (camera.OpMode == Helper.EnumHelper.CameraOpMode.ContinuousMode) { camera.ImageShowedHandle.Set(); DateTime dt = DateTime.Now; //lblDisplayFrequency.Invoke(new Action(() => lblDisplayFrequency.Text = ((int)(dt - _showTime).TotalMilliseconds).ToString())); this.Invoke(new Action(() => { var temp = tssBtnCameraOp.Text.Split('|'); tssBtnCameraOp.Text = $"{temp[0].Trim()} | {((int)(dt - _showTime).TotalMilliseconds).ToString()}"; })); _showTime = dt; } //else //{ // lblDisplayFrequency.Invoke(new Action(() => lblDisplayFrequency.Text = "")); //} if (_eleBufferDict.ContainsKey(setId)) { CvImage.Elements.Clear(); _eleBufferDict[setId].ForEach(e => CvImage.Elements.Add(e)); _eleBufferDict.Remove(setId); } } } /// /// 清理所有正在使用的资源。 /// /// 如果应释放托管资源,为 true;否则为 false。 protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void CtrlCameraRunBase_Leave(object sender, System.EventArgs e) { Camera.OpMode = Helper.EnumHelper.CameraOpMode.SingleSnapShot; } #region 操作栏 private void tssBtnCameraOp_Click(object sender, EventArgs e) { if (Camera.CurrentState == Helper.EnumHelper.DeviceState.DSOpen && Camera.OpMode == Helper.EnumHelper.CameraOpMode.SingleSnapShot) { //Camera.OpMode = Helper.EnumHelper.CameraOpMode.SingleSnapShot; Camera.Snapshot(); } else { MessageBox.Show($"{Camera.Name}不在开启状态"); } } private void Camera_OnCameraOpModeChanged() { //chkVideoMode.Invoke(new Action(() => chkVideoMode.Checked = Camera.OpMode == Helper.EnumHelper.CameraOpMode.ContinuousMode)); this.Invoke(new Action(() => { if (Camera.OpMode == Helper.EnumHelper.CameraOpMode.SingleSnapShot) { tssBtnCameraOp.Text = "拍 照"; tsmiVideoMode.Checked = false; } else { tssBtnCameraOp.Text = "视频模式"; tsmiVideoMode.Checked = true; } })); } private void tsmiVideoMode_CheckedChanged(object sender, EventArgs e) { if (Camera.CurrentState != Helper.EnumHelper.DeviceState.DSOpen && tsmiVideoMode.Checked) { MessageBox.Show($"{Camera.Name}不在开启状态"); tsmiVideoMode.Checked = false; } if (tsmiVideoMode.Checked) { Camera.OpMode = Helper.EnumHelper.CameraOpMode.ContinuousMode; } else { Camera.OpMode = Helper.EnumHelper.CameraOpMode.SingleSnapShot; } } private void tsBtnModifyExposure_Click(object sender, EventArgs e) { string exposureStr = tsTxtExposure.Text.Trim(); if (float.TryParse(exposureStr, out float exposure)) { if (Camera.CurrentState == Helper.EnumHelper.DeviceState.DSOpen) { Camera.UploadOperationConfig(new CameraOprerationConfigBase() { Exposure = exposure }); } } } private void tssBtnCameraOp_DropDownOpening(object sender, EventArgs e) { tssBtnCameraOp.Click -= tssBtnCameraOp_Click; } private void tssBtnCameraOp_DropDownClosed(object sender, EventArgs e) { tssBtnCameraOp.Click -= tssBtnCameraOp_Click; tssBtnCameraOp.Click += tssBtnCameraOp_Click; } #endregion #region 显示控制 public bool IsShowOperationBar { get => toolStripOperation.Visible; set => tsmiShowOpBar.Checked = toolStripOperation.Visible = value; } public bool IsShowToolBar { get => CvImage.IsShowToolBar; set => tsmiShowToolBar.Checked = CvImage.IsShowToolBar = value; } public bool IsShowElements { get => CvImage.IsShowElementList; set => tsmiShowElements.Checked = CvImage.IsShowElementList = value; } public bool IsShowStatusBar { get => CvImage.IsShowStatusBar; set => tsmiShowStatusBar.Checked = CvImage.IsShowStatusBar = value; } private void InitialToolBarVisible() { IsShowOperationBar = IsShowToolBar = IsShowElements = IsShowStatusBar = false; } private void tsmiShowToolBar_CheckedChanged(object sender, EventArgs e) { IsShowToolBar = tsmiShowToolBar.Checked; } private void tsmiShowOpBar_CheckedChanged(object sender, EventArgs e) { IsShowOperationBar = tsmiShowOpBar.Checked; } private void tsmiShowElements_CheckedChanged(object sender, EventArgs e) { IsShowElements = tsmiShowElements.Checked; } private void tsmiShowStatusBar_CheckedChanged(object sender, EventArgs e) { IsShowStatusBar = tsmiShowStatusBar.Checked; } #endregion public IOperationConfig OpConfig { get; set; } public void UploadOperationConfig(IOperationConfig opConfig) { throw new NotImplementedException(); } public IOperationConfig GetOperationConfig() { throw new NotImplementedException(); } } }