领胜LDS 键盘AOI检测项目
src/Bro.M071.Process/UI/M071_MainForm.cs
@@ -1,5 +1,7 @@
using Bro.Common.Helper;
using Bro.Common.Base;
using Bro.Common.Helper;
using Bro.UI.Model.Winform;
using Bro.UI.Model.Winform.UI;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -9,6 +11,7 @@
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Bro.Common.Helper.EnumHelper;
namespace Bro.M071.Process.UI
{
@@ -17,6 +20,7 @@
    {
        Canvas cvImage = new Canvas();
        M071Config Config => Process?.IConfig as M071Config;
        M071Process Process_M071 => Process as M071Process;
        public M071_MainForm()
        {
@@ -29,6 +33,21 @@
            plImage.Controls.Add(cvImage);
            tscEditLocation.Visible = tsmiShowEditor.Checked = false;
            this.Load += async (s, e) =>
               {
                   await Task.Delay(300);
                   cvImage.SetScreenSize();
                   cvImage.OnElementChangedHandle -= CvImage_OnElementChangedHandle;
                   cvImage.OnElementChangedHandle += CvImage_OnElementChangedHandle;
                   timer1.Enabled = true;
                   btnReset.Text = $"复位(长按{Config.FullResetRequiredDuration}秒大复位)";
                   lblCT.Text = tsslError.Text = "";
               };
        }
        public override void OnProcessUpdated()
@@ -43,34 +62,74 @@
            try
            {
                Bitmap image = (Bitmap)Image.FromFile(Config.BackgroundImagePath);
                cvImage.LoadImage(image);
                this.Invoke(new Action(() =>
                   {
                       try
                       {
                           Bitmap image = (Bitmap)Image.FromFile(Config.BackgroundImagePath);
                           cvImage.LoadImage(image);
                           cvImage.SetScreenSize();
                       }
                       catch (Exception ex)
                       {
                           LogAsync(new LogMsg(DateTime.Now, "载入背景图异常", ex.Message));
                           return;
                       }
                       cvImage.Elements.Clear();
                       lvMeasures.Items.Clear();
                       txtBarcode.Enabled = !Config.IsBarcodeManualInputBlocked;
                       Config.MeasurementUnitCollection.ForEach(u =>
                       {
                           if (!u.IsEnabled)
                               return;
                           var ele = new KeyIndicator(u.Id, u.DisplayLocation);
                           cvImage.Elements.Add(ele);
                           ListViewItem item = new ListViewItem(u.GetDisplayText());
                           item.Tag = u.Id;
                           lvMeasures.Items.Add(item);
                       });
                       lblOperator.Text = string.IsNullOrWhiteSpace(Process_M071.OperatorCode) ? "NotLogin" : Process_M071.OperatorCode;
                   }));
            }
            catch (Exception ex)
            {
                LogAsync(new LogMsg(DateTime.Now, "载入背景图异常", ex.Message));
                return;
            }
            cvImage.Elements.Clear();
            lvMeasures.Items.Clear();
            Config.MeasurementUnitCollection.ForEach(u =>
            {
                if (!u.IsEnabled)
                    return;
            Process_M071.OnClearBarcode -= M071_MainForm_OnClearBarcode;
            Process_M071.OnClearBarcode += M071_MainForm_OnClearBarcode;
            Process_M071.OnUpdateResult -= M071_MainForm_UpdateResult;
            Process_M071.OnUpdateResult += M071_MainForm_UpdateResult;
            Process_M071.OnUpdateCT -= M071_MainForm_UpdateCT;
            Process_M071.OnUpdateCT += M071_MainForm_UpdateCT;
                var ele = new KeyIndicator(u.Id, u.DisplayLocation);
                cvImage.Elements.Add(ele);
            Process_M071.OnMeasureStart -= M071_MainForm_MeasureStart;
            Process_M071.OnMeasureStart += M071_MainForm_MeasureStart;
                ListViewItem item = new ListViewItem(u.GetDisplayText());
                item.Tag = u.Id;
                lvMeasures.Items.Add(item);
            });
            Process_M071.OnMachineStateChanged -= M071_MainForm_MachineStateChanged;
            Process_M071.OnMachineStateChanged += M071_MainForm_MachineStateChanged;
            txtBarcode.ReadOnly = Config.IsBarcodeManulInputBlocked;
            Process_M071.OnFullResetDone -= Process_M071_FullResetDone;
            Process_M071.OnFullResetDone += Process_M071_FullResetDone;
            (Process as M071Process).OnClearBarcode -= M071_MainForm_OnClearBarcode;
            (Process as M071Process).OnClearBarcode += M071_MainForm_OnClearBarcode;
            Config.PropertyChanged -= Config_PropertyChanged;
            Config.PropertyChanged += Config_PropertyChanged;
            Process_M071.OnElementUpdated -= Process_M071_OnElementUpdated;
            Process_M071.OnElementUpdated += Process_M071_OnElementUpdated;
            Process_M071.OnCheckHintUpload = OnCheckHintUpload;
            Process_M071.OnOperatorLogin = OnOperatorLogin;
        }
        private void Config_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            txtBarcode.Enabled = !Config.IsBarcodeManualInputBlocked;
        }
        #region 图片区右键菜单
@@ -89,13 +148,69 @@
            tscEditLocation.Visible = tsmiShowEditor.Checked;
            tscEditLocation.BringToFront();
        }
        private void tsmiRefreshLabels_Click(object sender, EventArgs e)
        {
            cvImage.Elements.Clear();
            lvMeasures.Items.Clear();
            Config.MeasurementUnitCollection.ForEach(u =>
            {
                if (!u.IsEnabled)
                    return;
                var ele = new KeyIndicator(u.Id, u.DisplayLocation);
                cvImage.Elements.Add(ele);
                ListViewItem item = new ListViewItem(u.GetDisplayText());
                item.Tag = u.Id;
                lvMeasures.Items.Add(item);
            });
            this.Invalidate();
        }
        #endregion
        #region 标签编辑区
        private async void CvImage_OnElementChangedHandle(Common.Interface.IShapeElement ele)
        {
            this.Invoke(new Action(() =>
            {
                if (ele is KeyIndicator indicator)
                {
                    if (indicator.State == ElementState.Selected)
                    {
                        foreach (ListViewItem item in lvMeasures.Items)
                        {
                            if (item.Tag.ToString() == indicator.ID)
                            {
                                item.Selected = true;
                                lvMeasures.EnsureVisible(item.Index);
                                break;
                            }
                        }
                    }
                }
            }));
            await Task.Delay(100);
        }
        private void lvMeasures_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvMeasures.SelectedItems.Count <= 0)
                return;
            foreach (ListViewItem item in lvMeasures.Items)
            {
                item.BackColor = SystemColors.Control;
            }
            foreach (ListViewItem item in lvMeasures.SelectedItems)
            {
                item.BackColor = Color.Orange;
            }
            var ele = cvImage.Elements.FirstOrDefault(u => u.ID == lvMeasures.SelectedItems[0].Tag.ToString());
            propGridKeyIndicator.SelectedObject = ele;
@@ -134,6 +249,57 @@
            MessageBox.Show("标签修改完成");
        }
        private void lvMeasures_DoubleClick(object sender, EventArgs e)
        {
            if (lvMeasures.SelectedItems.Count <= 0)
                return;
            cvImage.Elements.ToList().ForEach(u => u.State = ElementState.Normal);
            var ele = cvImage.Elements.FirstOrDefault(u => u.ID == lvMeasures.SelectedItems[0].Tag.ToString());
            if (ele != null)
            {
                ele.State = ElementState.Selected;
                //cvImage.Invalidate();
            }
        }
        #endregion
        #region 标签结果显示
        private async void Process_M071_OnElementUpdated(Common.Interface.IShapeElement obj)
        {
            //this.Invoke(new Action(() =>
            //{
            //    if (obj is KeyIndicator keyIndicator)
            //    {
            //        var ele = cvImage.Elements.FirstOrDefault(u => u.ID == keyIndicator.ID);
            //        //(ele as KeyIndicator).Text = keyIndicator.Text;
            //        //(ele as KeyIndicator).ResultState = keyIndicator.ResultState;
            //        if (ele != null)
            //        {
            //            ele = keyIndicator;
            //        }
            //        this.Invalidate();
            //    }
            //}));
            if (obj is KeyIndicator keyIndicator)
            {
                this.Invoke(new Action(() =>
                {
                    var ele = cvImage.Elements.FirstOrDefault(u => u.ID == keyIndicator.ID);
                    (ele as KeyIndicator).Text = keyIndicator.Text;
                    (ele as KeyIndicator).ResultState = keyIndicator.ResultState;
                    this.Invalidate();
                }));
            }
            await Task.Delay(100);
        }
        #endregion
        #region 上方状态区
@@ -147,17 +313,26 @@
            {
                _barcode += keyStr.ToUpper();
            }
            else if (keyStr.Length == 2 && keyStr.StartsWith("D"))
            {
                _barcode += keyStr.Substring(1).ToUpper();
            }
            if (e.KeyValue == 13)
            {
                txtBarcode.Text = _barcode;
                Process_M071.BarCode = txtBarcode.Text = _barcode;
                _barcode = "";
            }
            if (e.KeyValue == 27)
            {
                cvImage.Elements.ToList().ForEach(ele => ele.State = ElementState.Normal);
            }
        }
        private void txtBarcode_TextChanged(object sender, EventArgs e)
        {
            (Process as M071Process).BarCode = txtBarcode.Text.Trim();
            //Process_M071.BarCode = txtBarcode.Text.Trim();
        }
        private void M071_MainForm_OnClearBarcode()
@@ -166,7 +341,221 @@
        }
        #endregion
        #region 机台状态
        private async void M071_MainForm_MachineStateChanged(MachineState state)
        {
            if (lblMachineState.IsHandleCreated)
            {
                lblMachineState.Invoke(new Action(() =>
                {
                    switch (state)
                    {
                        case MachineState.Alarm:
                            btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Red;
                            btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.White;
                            lblMachineState.Text = "警报";
                            btnStartMeasure.Text = "开始测量";
                            btnStartMeasure.Enabled = false;
                            break;
                        case MachineState.Pause:
                            btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Yellow;
                            btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.Black;
                            lblMachineState.Text = "暂停";
                            btnStartMeasure.Text = "继续测量";
                            btnStartMeasure.Enabled = true;
                            break;
                        case MachineState.Ready:
                            btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Lime;
                            btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.Black;
                            lblMachineState.Text = "就绪";
                            btnStartMeasure.Text = "开始测量";
                            btnStartMeasure.Enabled = true;
                            break;
                        case MachineState.Running:
                            btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Transparent;
                            btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.DarkGreen;
                            lblMachineState.Text = "运行";
                            btnStartMeasure.Text = "暂停测量";
                            btnStartMeasure.Enabled = true;
                            break;
                        case MachineState.Unknown:
                            btnStartMeasure.BackColor = lblMachineState.BackColor = SystemColors.Control;
                            btnStartMeasure.ForeColor = lblMachineState.ForeColor = SystemColors.ControlText;
                            lblMachineState.Text = "未知";
                            btnStartMeasure.Enabled = false;
                            break;
                    }
                }));
            }
            await Task.Delay(100);
        }
        #endregion
        #region 产品结果
        private async void M071_MainForm_UpdateCT(float ct)
        {
            lblCT.BeginInvoke(new Action(() =>
            {
                lblCT.Text = ct.ToString("f2") + " 秒";
            }));
            await Task.Delay(100);
        }
        private async void M071_MainForm_UpdateResult(DateTime arg1, int result)
        {
            this.BeginInvoke(new Action(() =>
            {
                if (result == 1)
                {
                    lblProductionState.BackColor = Color.Green;
                    lblProductionState.ForeColor = Color.White;
                    lblProductionState.Text = "OK";
                }
                else if (result == 0)
                {
                    lblProductionState.BackColor = Color.Red;
                    lblProductionState.ForeColor = Color.White;
                    lblProductionState.Text = "NG";
                }
                else
                {
                    lblProductionState.BackColor = Color.White;
                    lblProductionState.ForeColor = Color.Red;
                    lblProductionState.Text = "NA";
                }
                //btnStartMeasure.Text = "开始测量";
            }));
            await Task.Delay(100);
        }
        private async void M071_MainForm_MeasureStart()
        {
            this.BeginInvoke(new Action(() =>
            {
                lblProductionState.BackColor = SystemColors.Control;
                lblProductionState.ForeColor = SystemColors.ControlText;
                lblProductionState.Text = "测试中";
                lblCT.Text = "";
                cvImage.Elements.ToList().ForEach(e =>
                {
                    if (e is KeyIndicator indicator)
                    {
                        indicator.Text = "";
                        indicator.ResultState = null;
                    }
                });
            }));
            await Task.Delay(100);
        }
        #endregion
        #endregion
        private async void btnStartMeasure_Click(object sender, EventArgs e)
        {
            if (btnStartMeasure.Text == "开始测量")
            {
                await Task.Run(() =>
                {
                    try
                    {
                        Process_M071.StartJob(null, null, null);
                    }
                    catch (Exception ex)
                    {
                        LogAsync(DateTime.Now, "流程异常", ex.Message);
                        Process_M071.ExceptionRaisedInMonitor(ex);
                    }
                });
            }
            else if (btnStartMeasure.Text == "继续测量")
            {
                Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List<int>() { 10 } }, null, null);
            }
            else
            {
                Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List<int>() { 11 } }, null, null);
            }
        }
        #region 复位操作
        private async void Process_M071_FullResetDone()
        {
            btnStartMeasure.BeginInvoke(new Action(() =>
            {
                btnStartMeasure.Enabled = true;
                btnStartMeasure.Text = "开始测量";
            }));
            await Task.Delay(100);
        }
        private void btnReset_MouseDown(object sender, MouseEventArgs e)
        {
            if (Process_M071.MachineState != MachineState.Running)
            {
                Process_M071.Reset(null, null, null);
            }
            Process_M071.ResetTimer.Change(1000 * Config.FullResetRequiredDuration, -1);
        }
        private void btnReset_MouseUp(object sender, MouseEventArgs e)
        {
            Process_M071.ResetTimer.Change(-1, -1);
        }
        #endregion
        private void timer1_Tick(object sender, EventArgs e)
        {
            cvImage.Refresh();
        }
        private void lblOperator_DoubleClick(object sender, EventArgs e)
        {
            InputWindow inputFrm = new InputWindow("请输入操作员工号");
            if (inputFrm.ShowDialog() == DialogResult.OK)
            {
                Process_M071.OperatorCode = inputFrm.Input;
            }
        }
        private void OnOperatorLogin(string operatorCode)
        {
            this.Invoke(new Action(() =>
            {
                lblOperator.Text = operatorCode;
            }));
        }
        private async void OnCheckHintUpload(string hintMsg, bool isAlarm)
        {
            await Task.Run(() =>
            {
                this.Invoke(new Action(() =>
                {
                    if (!string.IsNullOrWhiteSpace(hintMsg))
                    {
                        stStripHint.Visible = true;
                        tsslError.Text = hintMsg;
                        tsslError.BackColor = isAlarm ? Color.Red : Color.Green;
                    }
                    else
                    {
                        stStripHint.Visible = false;
                        tsslError.Text = "";
                    }
                }));
            });
        }
    }
}