| | |
| | | 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; |
| | |
| | | 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 = ""; |
| | | }; |
| | | } |
| | | |
| | |
| | | |
| | | try |
| | | { |
| | | Bitmap image = (Bitmap)Image.FromFile(Config.BackgroundImagePath); |
| | | cvImage.LoadImage(image); |
| | | cvImage.SetScreenSize(); |
| | | 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; |
| | | |
| | | 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); |
| | | }); |
| | | |
| | | if (txtBarcode.IsHandleCreated) |
| | | txtBarcode.BeginInvoke(new Action(() => txtBarcode.ReadOnly = Config.IsBarcodeManulInputBlocked)); |
| | | |
| | | Process_M071.OnClearBarcode -= M071_MainForm_OnClearBarcode; |
| | | Process_M071.OnClearBarcode += M071_MainForm_OnClearBarcode; |
| | |
| | | |
| | | 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 图片区右键菜单 |
| | |
| | | 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; |
| | |
| | | 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(); |
| | | //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 |
| | | |
| | |
| | | { |
| | | _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 = ""; |
| | | } |
| | | |
| | |
| | | |
| | | private void txtBarcode_TextChanged(object sender, EventArgs e) |
| | | { |
| | | Process_M071.BarCode = txtBarcode.Text.Trim(); |
| | | //Process_M071.BarCode = txtBarcode.Text.Trim(); |
| | | } |
| | | |
| | | private void M071_MainForm_OnClearBarcode() |
| | |
| | | #region 机台状态 |
| | | private async void M071_MainForm_MachineStateChanged(MachineState state) |
| | | { |
| | | lblMachineState.BeginInvoke(new Action(() => |
| | | if (lblMachineState.IsHandleCreated) |
| | | { |
| | | switch (state) |
| | | lblMachineState.Invoke(new Action(() => |
| | | { |
| | | case MachineState.Alarm: |
| | | btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Red; |
| | | btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.White; |
| | | lblMachineState.Text = "警报"; |
| | | switch (state) |
| | | { |
| | | case MachineState.Alarm: |
| | | btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Red; |
| | | btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.White; |
| | | lblMachineState.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 = 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.White; |
| | | 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.Enabled = true; |
| | | break; |
| | | case MachineState.Running: |
| | | btnStartMeasure.BackColor = lblMachineState.BackColor = Color.Lime; |
| | | btnStartMeasure.ForeColor = lblMachineState.ForeColor = Color.DarkGreen; |
| | | 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.Enabled = true; |
| | | break; |
| | | case MachineState.Unknown: |
| | | btnStartMeasure.BackColor = lblMachineState.BackColor = SystemColors.Control; |
| | | btnStartMeasure.ForeColor = lblMachineState.ForeColor = SystemColors.ControlText; |
| | | lblMachineState.Text = "未知"; |
| | | break; |
| | | } |
| | | })); |
| | | 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); |
| | | } |
| | |
| | | lblProductionState.ForeColor = Color.White; |
| | | lblProductionState.Text = "OK"; |
| | | } |
| | | else |
| | | 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 = "开始测量"; |
| | | //btnStartMeasure.Text = "开始测量"; |
| | | })); |
| | | await Task.Delay(100); |
| | | } |
| | |
| | | lblProductionState.Text = "测试中"; |
| | | |
| | | lblCT.Text = ""; |
| | | |
| | | cvImage.Elements.ToList().ForEach(e => |
| | | { |
| | | if (e is KeyIndicator indicator) |
| | | { |
| | | indicator.Text = ""; |
| | | indicator.ResultState = null; |
| | | } |
| | | }); |
| | | })); |
| | | await Task.Delay(100); |
| | | } |
| | |
| | | |
| | | private async void btnStartMeasure_Click(object sender, EventArgs e) |
| | | { |
| | | btnStartMeasure.Enabled = false; |
| | | bool isBreak = false; |
| | | |
| | | if (btnStartMeasure.Text == "开始测量") |
| | | { |
| | | await Task.Run(() => |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | isBreak = true; |
| | | |
| | | LogAsync(DateTime.Now, "流程异常", ex.Message); |
| | | Process_M071.ExceptionRaisedInMonitor(ex); |
| | | |
| | | btnStartMeasure.Text = "开始测量"; |
| | | |
| | | } |
| | | }); |
| | | |
| | | if (!isBreak) |
| | | btnStartMeasure.Text = "暂停测量"; |
| | | } |
| | | else if (btnStartMeasure.Text == "继续测量") |
| | | { |
| | | Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List<int>() { 0 } }, null, null); |
| | | btnStartMeasure.Text = "暂停测量"; |
| | | Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List<int>() { 10 } }, null, null); |
| | | } |
| | | else |
| | | { |
| | | Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List<int>() { 1 } }, null, null); |
| | | btnStartMeasure.Text = "继续测量"; |
| | | Process_M071.SwitchJobStatus(new OperationConfigBase() { InputPara = new List<int>() { 11 } }, null, null); |
| | | } |
| | | |
| | | btnStartMeasure.Enabled = true; |
| | | } |
| | | |
| | | #region 复位操作 |
| | |
| | | Process_M071.Reset(null, null, null); |
| | | } |
| | | |
| | | Process_M071.ResetTimer.Change(-1, 1000 * 5); |
| | | 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 = ""; |
| | | } |
| | | })); |
| | | }); |
| | | } |
| | | } |
| | | } |