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<string, List<IShapeElement>> _eleBufferDict = new Dictionary<string, List<IShapeElement>>();
|
private volatile string _setId = "";
|
|
protected virtual void Camera_OnElementsUpdated(CameraBase camera, List<IShapeElement> eleList, string setId)
|
{
|
if (CvImage.IsHandleCreated)
|
{
|
if (_setId == setId)
|
{
|
CvImage.Elements.Clear();
|
eleList.ForEach(e => CvImage.Elements.Add(e));
|
}
|
else
|
{
|
_eleBufferDict[setId] = new List<IShapeElement>(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);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 清理所有正在使用的资源。
|
/// </summary>
|
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
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
|
}
|
}
|