DHDHSoftware/DHSoftware/Views/CtrlVisionRunBase.cs
2025-03-21 08:51:20 +08:00

249 lines
7.1 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using DH.Commons.Enums;
using DH.Commons.Base;
namespace XKRS.UI.Device.Winform
{
public partial class CtrlVisionRunBase : UserControl
{
private DateTime LastDisplayTime = DateTime.MinValue;
//public CtrlVisionRunBase()
//{
// InitializeComponent();
//}
//private object OnUpdateBatchNO(ISubscriber arg1, object arg2, object arg3)
//{
// //获取BatchNO
// if (arg2 is string batchNo)
// {
// ML.BatchNO = string.IsNullOrEmpty(batchNo) ? "OFFline_" + DateTime.Now.ToString("yyyyMMdd") : batchNo;
// }
// return null;
//}
public CtrlVisionRunBase(VisionEngineBase device)
{
InitializeComponent();
Device = device;
InitialLayout();
this.Load += (s, e) =>
{
ML.OnDetectionDone -= ML_OnDetectionDone;
ML.OnDetectionDone += ML_OnDetectionDone;
};
// PubSubCenter.GetInstance().RemoveSubscribers(PubSubCenterMessageType.UpdateBatchNO.ToString());
// PubSubCenter.GetInstance().Subscribe(PubSubCenterMessageType.UpdateBatchNO.ToString(), OnUpdateBatchNO);
}
private async void ML_OnDetectionDone(string detectionId, Bitmap image, List<IShapeElement> detectionResults)
{
await Task.Run(() =>
{
if (!this.IsHandleCreated)
return;
this.Invoke(new Action(() =>
{
if (this.IsDisposed)
return;
var display = displayList.FirstOrDefault(u => u.DetectionId == detectionId);
if (display != null)
{
display.RefreshDetectionResult(image, detectionResults);
}
}));
});
}
public VisionEngineBase Device { get; set; }
protected VisionEngineBase ML
{
get => Device as VisionEngineBase;
}
//VisionEngineInitialConfigBase IConfig => ML?.InitialConfig as VisionEngineInitialConfigBase;
//VisionEngineOperationConfigBase OpConfig = new VisionEngineOperationConfigBase();
//private void btnExecuteOpConfig_Click(object sender, EventArgs e)
//{
// try
// {
// PubSubCenter.GetInstance().Publish(PubSubCenterMessageType.RequestBatchNO.ToString(), null, null);
// var msg = ML.RunWrap(OpConfig);
// if (msg.Result != 1)
// {
// MessageBox.Show(msg.Message);
// }
// }
// catch (Exception ex)
// {
// MessageBox.Show(ex.GetExceptionMessage());
// }
//}
#region Layout
int rows = 1;
int cols = 1;
public int Rows
{
get => rows;
set
{
if (value <= 1)
{
rows = 1;
}
else
{
rows = value;
}
}
}
public int Cols
{
get => cols;
set
{
if (value <= 1)
{
cols = 1;
}
else
{
cols = value;
}
}
}
List<CtrlVisionDisplay> displayList = null;
private void InitialLayout()
{
if (ML.DetectionConfigs.Count == 0)
{
return;
}
var locations = ML.DetectionConfigs.Select(u => u.ShowLocation).ToList();
if (locations.Count > 0)
{
Rows = (int)locations.Max(u => u.Y);
Cols = (int)locations.Max(u => u.X);
}
tableDisplay.ColumnCount = Cols;
tableDisplay.RowCount = Rows;
tableDisplay.ColumnStyles.Clear();
for (int i = 0; i < Cols; i++)
{
ColumnStyle colStyle = new ColumnStyle();
colStyle.SizeType = SizeType.Percent;
colStyle.Width = 1.0f / (float)Cols;
tableDisplay.ColumnStyles.Add(colStyle);
}
tableDisplay.RowStyles.Clear();
for (int i = 0; i < Rows; i++)
{
RowStyle rowStyle = new RowStyle();
rowStyle.SizeType = SizeType.Percent;
rowStyle.Height = 1.0f / (float)Rows;
tableDisplay.RowStyles.Add(rowStyle);
}
tableDisplay.Controls.Clear();
displayList = new List<CtrlVisionDisplay>();
ML.DetectionConfigs.ForEach(d =>
{
//if (!d.IsShowInUI)
// return;
CtrlVisionDisplay display = new CtrlVisionDisplay();
display.DetectionId = d.Id;
display.DetectionName = d.Name;
display.RowIndex = (int)d.ShowLocation.Y - 1;
display.ColIndex = (int)d.ShowLocation.X - 1;
//display.RowIndex = (int)count%row;
//display.ColIndex = (int)count / row;
display.Dock = DockStyle.Fill;
display.OnShowOpConfigMenuStateChanged -= Display_OnShowOpConfigMenuStateChanged;
display.OnShowOpConfigMenuStateChanged += Display_OnShowOpConfigMenuStateChanged;
displayList.Add(display);
tableDisplay.Controls.Add(display);
tableDisplay.SetCellPosition(display, new TableLayoutPanelCellPosition(display.ColIndex, display.RowIndex));
});
splitCMain.Panel2Collapsed = true;
// propOpConfig.SelectedObject = OpConfig;
}
private void Display_OnShowOpConfigMenuStateChanged(bool isVisible)
{
IsShowOpConfig = isVisible;
}
public bool IsShowOpConfig
{
get => !splitCMain.Panel2Collapsed;
set
{
if (splitCMain.Panel2Collapsed == value)
{
splitCMain.Panel2Collapsed = !value;
displayList.ForEach(d => d.IsShowOpConfig = value);
}
}
}
#endregion
//private void btnBatchRun_Click(object sender, EventArgs e)
//{
// FrmMLBatchRun frmMLBatchRun = new FrmMLBatchRun(Device);
// frmMLBatchRun.MdiParent = (this.Parent as DeviceRunFrmBase).MdiParent;
// frmMLBatchRun.DockPanel = (this.Parent as DeviceRunFrmBase).DockPanel;
// frmMLBatchRun.DockState = DockState.Document;
// frmMLBatchRun.Text = $"{Device.Name}_批量检测";
// frmMLBatchRun.Show();
//}
}
}