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();
|
}
|
else if (keyStr.StartsWith("NumPad"))
|
{
|
_barcode += keyStr.Replace("NumPad", "");
|
}
|
|
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<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 = "";
|
}
|
}));
|
});
|
}
|
}
|
}
|