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; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Bro.Common.Helper.EnumHelper; namespace Bro.M071.Process.UI { [MenuNode("M071_MainForm", "运行界面", 1, "M071Node", true)] public partial class M071_MainForm : MenuFrmBase { Canvas cvImage = new Canvas(); M071Config Config => Process?.IConfig as M071Config; M071Process Process_M071 => Process as M071Process; public M071_MainForm() { InitializeComponent(); cvImage.IsShowElementList = false; tsmiShowStatusBar.Checked = cvImage.IsShowStatusBar = false; tsmiShowToolBar.Checked = cvImage.IsShowToolBar = false; cvImage.Dock = DockStyle.Fill; 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() { base.OnProcessUpdated(); if (Config == null) return; if (string.IsNullOrWhiteSpace(Config.BackgroundImagePath)) return; try { 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) { } 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; Process_M071.OnMeasureStart -= M071_MainForm_MeasureStart; Process_M071.OnMeasureStart += M071_MainForm_MeasureStart; Process_M071.OnMachineStateChanged -= M071_MainForm_MachineStateChanged; Process_M071.OnMachineStateChanged += M071_MainForm_MachineStateChanged; Process_M071.OnFullResetDone -= Process_M071_FullResetDone; Process_M071.OnFullResetDone += Process_M071_FullResetDone; 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 图片区右键菜单 private void tsmiShowToolBar_CheckedChanged(object sender, EventArgs e) { cvImage.IsShowToolBar = tsmiShowToolBar.Checked; } private void tsmiShowStatusBar_CheckedChanged(object sender, EventArgs e) { cvImage.IsShowStatusBar = tsmiShowStatusBar.Checked; } private void tsmiShowEditor_CheckedChanged(object sender, EventArgs e) { 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; } private void btnCancelEdit_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); }); MessageBox.Show("取消标签修改"); } private void btnConfirmEdit_Click(object sender, EventArgs e) { cvImage.Elements.ToList().ForEach(ele => { var measure = Config.MeasurementUnitCollection.FirstOrDefault(u => u.Id == ele.ID); if (measure != null) { measure.DisplayLocation = (ele as KeyIndicator).DisplayRect; } }); 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 上方状态区 #region 条码 string _barcode = ""; private void M071_MainForm_KeyUp(object sender, KeyEventArgs e) { string keyStr = e.KeyCode.ToString(); if (keyStr.Length == 1) { _barcode += keyStr.ToUpper(); } else if (keyStr.Length == 2 && keyStr.StartsWith("D")) { _barcode += keyStr.Substring(1).ToUpper(); } if (e.KeyValue == 13) { 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_M071.BarCode = txtBarcode.Text.Trim(); } private void M071_MainForm_OnClearBarcode() { txtBarcode.BeginInvoke(new Action(() => txtBarcode.Clear())); } #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() { 10 } }, null, null); } else { Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List() { 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 = ""; } })); }); } } }