using CCWin.Win32; using MaiMuAOI.SysCtrl; using MaiMuAOI.SysUI.DefectPicShow; using MaiMuAOI.SysUI.ProcessStep.Prop; using MaiMuAOI.SysUI.ProductAndStep; using Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OpenCvSharp.Flann; using ProductionControl.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; using System.Threading.Tasks; using System.Windows.Forms; namespace MaiMuAOI.SysUI.ProcessStep { public partial class StepProcessFrm : Form { public int StepID = 0; Service.StepService service = new Service.StepService(); Models.Step model = new Models.Step(); DebugTestFrm frm; //工序库参数 string LibprocessCode; TensionProp _libTensionProp; ThicknessProp _libThicknessProp; LensProp _libLensProp; LightProp _libLightProp; MarkProp _libMarkProp; PointTestProp _libPointTestProp; SizeDefectProp _libSizeDefectProp; ForProp _libForProp; //流程参数 TensionProp _ProcessTensionProp; ThicknessProp _ProcessThicknessProp; LensProp _ProcessLensProp; LightProp _ProcessLightProp; MarkProp _ProcessMarkProp; PointTestProp _ProcessPointTestProp; SizeDefectProp _ProcessSizeDefectProp; ForProp _ProcessForProp; SynchronizationContext SyncContext = null; public StepProcessFrm(Models.Step m = null) { InitializeComponent(); UIStyle.SetUIStyle(this); this.uiTitel1.FatherForm = this; dataGridView1.AutoGenerateColumns = false; dataGridView2.AutoGenerateColumns = false; //显示行号与列宽度自动调整 dataGridView2.RowHeadersVisible = true; dataGridView2.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; dataGridView2.RowPostPaint += (sender, e) => { SysMgr.showRowNum_onDataGrid_RowPostPaint(this.dataGridView2, sender, e); }; dataGridView1.DefaultCellStyle.ForeColor = Color.Black; dataGridView2.DefaultCellStyle.ForeColor = Color.Black; //获取UI线程同步上下文 SyncContext = SynchronizationContext.Current; if (m == null) model.ProcessList = new List(); else model = m; } private void InitDataView() { this.Cursor = Cursors.WaitCursor; dataGridView1.Columns.Add("colCode", "code"); //DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn(); //col.Name = "colName"; //col.HeaderText = "工序"; //dataGridView1.Columns.Add(col); dataGridView1.Columns.Add("colName", "工序"); dataGridView1.Columns[0].Visible = false; dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; foreach (var item in SysMgr.ProcessType) dataGridView1.Rows.Add(item.Key, item.Value); for (int i = 0; i < this.dataGridView1.Columns.Count; i++) { this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } int rowHeight = (dataGridView1.Height - dataGridView1.ColumnHeadersHeight - 5)/ dataGridView1.Rows.Count; for (int i = 0; i < this.dataGridView1.Rows.Count; i++) { this.dataGridView1.Rows[i].Height = rowHeight; } // this.txtCode.Text = model.Code; this.txtName.Text = model.Name; this.numStartTimeIndex.Value = model.StartTimeIndex; if (model.ProcessList != null) dataGridView2.DataSource = new BindingSource(model.ProcessList, null); for (int i = 0; i < this.dataGridView2.Columns.Count; i++) { this.dataGridView2.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } this.Cursor = Cursors.Default; } private void StepProcessFrm_Load(object sender, EventArgs e) { InitDataView(); } #region private private void reOrderProcess() { for (int i = 0; i < model.ProcessList.Count; i++) model.ProcessList[i].Order = i; } private void refreshDataGridView() { dataGridView2.DataSource = null; dataGridView2.DataSource = new BindingSource(model.ProcessList, null); } #endregion #region 工具栏 private void tsbtnSave_Click(object sender, EventArgs e) { try { SaveOldValue(); //string szCode = this.txtCode.Text.Trim(); string szCode = this.txtName.Text.Trim(); string szName = this.txtName.Text.Trim(); if (szCode == "" || szName == "") throw new Exception("请填写编号和名称!"); if (model.ProcessList == null || model.ProcessList.Count == 0) throw new Exception("请添加流程工序!"); int index = 0; int TensionCnt = 0; foreach (var item in model.ProcessList) { if (string.IsNullOrWhiteSpace(item.ProcessParams)) throw new Exception($"{SysMgr.ProcessType[item.ProcessCode]} 配方未设置!"); //张力检测一定要第一步,防呆 if (item.ProcessCode == "Tension" && index != 0) { throw new Exception("张力测量工序必须在第一步!"); } else if (item.ProcessCode == "Tension") { TensionCnt++;//记录张力测试是否重复 } if(TensionCnt >1) throw new Exception("张力测量工序只能存在一次!"); if (item.ProcessCode == "Height" ) { if(TensionCnt >0 && index != 1) throw new Exception("厚度测量工序必须在张力测量工序之后!"); else if (TensionCnt == 0 && index != 0) throw new Exception("厚度测量工序必须在第一步!"); } List tlist = model.ProcessList.GroupBy(p => p.ProcessName).Select(q => q.First()).ToList(); if (tlist.Count() != model.ProcessList.Count()) { throw new Exception("步骤名称重复!"); } index++; } model.ProcessType = "快速流程"; model.Code = szCode; model.Name = szName; model.StartTimeIndex = (int)numStartTimeIndex.Value; model.ModifyUserCode = SysMgr.Instance.UserMgr.LoginUser.Code; bool result; if (model.Id == 0) { model.CreateUserCode = SysMgr.Instance.UserMgr.LoginUser.Code; result = service.InsertNav(model); model = service.GetListNav(0).Find(x => x.Code == szCode && x.Name == szName); } else result = service.UpdateNav(model); StepID = model.Id; if (!result) throw new Exception("保存失败!"); SysMgr.Instance.WriteSysEditLog("流程设置修改", JsonConvert.SerializeObject(model)); MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void tsbtnExit_Click(object sender, EventArgs e) { this.Close(); } private void tsbDebug_Click(object sender, EventArgs e) { if ((frm == null) || (frm.IsDisposed)) frm = new DebugTestFrm(); //frm.TopMost = true; frm.Show(); } #endregion #region 工序库表格 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { int Index = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引 if (Index < this.dataGridView1.Rows.Count) { string processCode = this.dataGridView1.Rows[Index].Cells["colCode"].Value.ToString(); bool IsSupport = SysMgr.ProcessType.ContainsKey(processCode); if (IsSupport) { LibprocessCode = processCode; switch (processCode) { case "Tension": _libTensionProp = new TensionProp(); LibPropertyGrid.SelectedObject = _libTensionProp; break; case "Height": _libThicknessProp = new ThicknessProp(); LibPropertyGrid.SelectedObject = _libThicknessProp; break; case "LensMotor": _libLensProp = new LensProp(); LibPropertyGrid.SelectedObject = _libLensProp; break; case "Light": _libLightProp = new LightProp(); LibPropertyGrid.SelectedObject = _libLightProp; break; case "Mark": _libMarkProp = new MarkProp(); LibPropertyGrid.SelectedObject = _libMarkProp; break; case "PointTest": _libPointTestProp = new PointTestProp(); LibPropertyGrid.SelectedObject = _libPointTestProp; break; case "SizeAndDefect": _libSizeDefectProp = new SizeDefectProp(); LibPropertyGrid.SelectedObject = _libSizeDefectProp; break; case "For": _libForProp = new ForProp(); LibPropertyGrid.SelectedObject = _libForProp; break; } LibPropertyGrid.Refresh(); this.Refresh(); } else { //MessageBox.Show("不支持改功能!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Information ); } } } #endregion #region 流程表格 //单元格编译完成 private void dataGridView2_CellEndEdit(object sender, DataGridViewCellEventArgs e) { var value = dataGridView2.Rows[e.RowIndex].Cells["colProcessName"].Value; if (value == null || value.ToString().Trim() == "") { dataGridView2.Rows[e.RowIndex].Cells["colProcessName"].Value = dataGridView2.Rows[e.RowIndex].Cells["colTypeName"].Value; } } int oldIndex = 0; string oldProcessCode = ""; private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e) { int Index = this.dataGridView2.CurrentRow.Index;//获取当前选中行的索引 if (Index < this.dataGridView2.Rows.Count) { SaveOldValue(); string processCode = this.dataGridView2.Rows[Index].Cells["colProcessCode"].Value.ToString(); string processParams = this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value.ToString(); bool IsSupport = SysMgr.ProcessType.ContainsKey(processCode); oldIndex = Index; if (IsSupport) { oldProcessCode = processCode; switch (processCode) { case "Tension": _ProcessTensionProp = new TensionProp(); _ProcessTensionProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessTensionProp; break; case "Height": _ProcessThicknessProp = new ThicknessProp(); _ProcessThicknessProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessThicknessProp; break; case "LensMotor": _ProcessLensProp = new LensProp(); _ProcessLensProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessLensProp; break; case "Light": _ProcessLightProp = new LightProp(); _ProcessLightProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessLightProp; break; case "Mark": _ProcessMarkProp = new MarkProp(); _ProcessMarkProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessMarkProp; break; case "PointTest": _ProcessPointTestProp = new PointTestProp(); _ProcessPointTestProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessPointTestProp; break; case "SizeAndDefect": _ProcessSizeDefectProp = new SizeDefectProp(); _ProcessSizeDefectProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessSizeDefectProp; break; case "For": _ProcessForProp = new ForProp(); _ProcessForProp.deserialize(processParams); ProcessPropertyGrid.SelectedObject = _ProcessForProp; break; } ProcessPropertyGrid.Refresh(); this.Refresh(); } else { //MessageBox.Show("不支持改功能!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Information ); } } } private void SaveOldValue() { bool IsSupport = SysMgr.ProcessType.ContainsKey(oldProcessCode); if (oldIndex >= this.dataGridView2.Rows.Count) return; if (IsSupport) { switch (oldProcessCode) { case "Tension": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessTensionProp.serialize(); break; case "Height": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessThicknessProp.serialize(); break; case "LensProp": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessLensProp.serialize(); break; case "Light": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessLightProp.serialize(); break; case "Mark": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessMarkProp.serialize(); break; case "SizeAndDefect": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessSizeDefectProp.serialize(); break; case "PointTest": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessPointTestProp.serialize(); break; case "For": this.dataGridView2.Rows[oldIndex].Cells["colProcessParams"].Value = _ProcessForProp.serialize(); break; } } } private void dataGridView2_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { for (int i = 0; i < dataGridView2.Rows.Count; i++) { if (SysMgr.ProcessType.ContainsKey(dataGridView2.Rows[i].Cells[0].Value.ToString())) { dataGridView2.Rows[i].Cells["colTypeName"].Value = SysMgr.ProcessType[dataGridView2.Rows[i].Cells[0].Value.ToString()]; } else { dataGridView2.Rows[i].Cells["colTypeName"].Value = "不支持"; dataGridView2.Rows[i].DefaultCellStyle.BackColor = Color.Yellow; } } } #endregion #region 操作按钮 private void btnAdd_Click(object sender, EventArgs e) { try { if (this.dataGridView1.SelectedRows.Count != 1) throw new Exception("请选择要插入的工序!"); string processCode = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); string processParams = ""; switch (LibprocessCode) { case "Tension": processParams = _libTensionProp.serialize(); break; case "Height": processParams = _libThicknessProp.serialize(); break; case "LensMotor": processParams = _libLensProp.serialize(); break; case "Light": processParams = _libLightProp.serialize(); break; case "Mark": processParams = _libMarkProp.serialize(); break; case "PointTest": processParams = _libPointTestProp.serialize(); break; case "SizeAndDefect": processParams = _libSizeDefectProp.serialize(); break; case "For": processParams = _libForProp.serialize(); break; } model.ProcessList.Add(new Models.StepProcess() { ProcessCode = processCode, ProcessName = SysMgr.ProcessType[processCode], ModifyUserCode = SysMgr.Instance.UserMgr.LoginUser.Code, CreateUserCode = SysMgr.Instance.UserMgr.LoginUser.Code, ProcessParams = processParams }); reOrderProcess(); this.refreshDataGridView(); this.dataGridView2.Rows[this.dataGridView2.Rows.Count - 1].Selected = true; dataGridView2.CurrentCell = dataGridView2.Rows[this.dataGridView2.Rows.Count - 1].Cells[1]; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnInsert_Click(object sender, EventArgs e) { try { if (this.dataGridView1.SelectedRows.Count != 1) throw new Exception("请选择要插入的工序!"); string processCode = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); int liInsertIndex = this.dataGridView2.Rows.Count; if (this.dataGridView2.SelectedRows.Count > 0) liInsertIndex = this.dataGridView2.SelectedRows[0].Index; if (liInsertIndex <= oldIndex) oldIndex++; string processParams = ""; switch (LibprocessCode) { case "Tension": processParams = _libTensionProp.serialize(); break; case "Height": processParams = _libThicknessProp.serialize(); break; case "LensMotor": processParams = _libLensProp.serialize(); break; case "Light": processParams = _libLightProp.serialize(); break; case "Mark": processParams = _libMarkProp.serialize(); break; case "PointTest": processParams = _libPointTestProp.serialize(); break; case "SizeAndDefect": processParams = _libSizeDefectProp.serialize(); break; } model.ProcessList.Insert(liInsertIndex, new Models.StepProcess() { ProcessCode = processCode, ProcessName = SysMgr.ProcessType[processCode], Order = liInsertIndex, ModifyUserCode = SysMgr.Instance.UserMgr.LoginUser.Code, CreateUserCode = SysMgr.Instance.UserMgr.LoginUser.Code, ProcessParams = processParams }); reOrderProcess(); this.refreshDataGridView(); this.dataGridView2.Rows[liInsertIndex].Selected = true; dataGridView2.CurrentCell = dataGridView2.Rows[liInsertIndex].Cells[1]; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnDel_Click(object sender, EventArgs e) { try { if (this.dataGridView2.SelectedRows.Count != 1) throw new Exception("请选择要删除的工序!"); int liRowIndex = this.dataGridView2.SelectedRows[0].Index; model.ProcessList.RemoveAt(liRowIndex); if (liRowIndex >= dataGridView2.Rows.Count - 1) liRowIndex = dataGridView2.Rows.Count - 1; if (liRowIndex < oldIndex) oldIndex--; else if (liRowIndex == oldIndex) { oldIndex = 0; oldProcessCode = ""; } dataGridView2.CurrentCell = dataGridView2.Rows[liRowIndex].Cells[1]; //reOrderProcess(); this.refreshDataGridView(); if (dataGridView2.Rows.Count < 1) return; if (liRowIndex >= dataGridView2.Rows.Count) liRowIndex = dataGridView2.Rows.Count - 1; dataGridView2.CurrentCell = dataGridView2.Rows[liRowIndex].Cells[1]; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnUp_Click(object sender, EventArgs e) { try { if (this.dataGridView2.SelectedRows.Count != 1) throw new Exception("请选择要调整顺序的工序!"); int liSelIndex = this.dataGridView2.SelectedRows[0].Index; if (liSelIndex == 0) return; if(liSelIndex == oldIndex) oldIndex--; else if (liSelIndex == (oldIndex + 1)) oldIndex++; model.ProcessList.Insert(liSelIndex - 1, model.ProcessList[liSelIndex]); model.ProcessList.RemoveAt(liSelIndex + 1); reOrderProcess(); this.refreshDataGridView(); this.dataGridView2.Rows[liSelIndex - 1].Selected = true; dataGridView2.CurrentCell = dataGridView2.Rows[liSelIndex - 1].Cells[1]; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnDown_Click(object sender, EventArgs e) { try { if (this.dataGridView2.SelectedRows.Count != 1) throw new Exception("请选择要调整顺序的工序!"); int liSelIndex = this.dataGridView2.SelectedRows[0].Index; if (liSelIndex == this.dataGridView2.Rows.Count - 1) return; if (liSelIndex == oldIndex) oldIndex++; else if (liSelIndex == (oldIndex - 1)) oldIndex--; model.ProcessList.Insert(liSelIndex + 2, model.ProcessList[liSelIndex]); model.ProcessList.RemoveAt(liSelIndex); reOrderProcess(); this.refreshDataGridView(); this.dataGridView2.Rows[liSelIndex + 1].Selected = true; dataGridView2.CurrentCell = dataGridView2.Rows[liSelIndex + 1].Cells[1]; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #endregion private void refreshUI() { SyncContext.Post(m => { var result = m as string; ProcessPropertyGrid.Refresh(); //tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog"; //tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG); }, "异步操作完成结果"); } private void ProcessPropertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { //其中包含了两个重要的属性:OldValue和ChangeItem。 //ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。 //而通过ChangeItem的Label,则可以查看到当前在属性编辑输入框中显示的值。 int Index = this.dataGridView2.CurrentRow.Index;//获取当前选中行的索引 string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name; string propertyName = e.ChangedItem.PropertyDescriptor.Name; var oldValue = e.OldValue; var newValue = e.ChangedItem.Value; switch (propertyName) { case "ChannelIndex": if ((int)newValue < 1 || (int)newValue > 6) { _ProcessLightProp.ChannelIndex = (int)oldValue; this.refreshUI(); } else { //dev.getDigitalValue((int)newValue); } break; case "DigitalValue": if ((int)newValue < 0 || (int)newValue > 255) { _ProcessLightProp.DigitalValue = (int)oldValue; this.refreshUI(); } break; //case "ThresholdsClass": // if (!IsNumber(newValue.ToString().Replace("-", "").Replace(",", "").Replace(";", "").Replace(".", ""))) // txtLog.Text = "种类阀值只可输入数字!"; // else if (!verifyThresholdsCount(newValue.ToString(), prop.ThresholdsClassCount)) // txtLog.Text = "输入种类阀值与数量不一致!"; // else // txtLog.Text = ""; // break; //case "ThresholdsClassCount": // if (!verifyThresholdsCount(prop.ThresholdsClass, (int)newValue)) // txtLog.Text = "输入种类阀值与数量不一致!"; // else // txtLog.Text = ""; // break; } switch (className) { case "TensionProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessTensionProp.serialize(); break; case "ThicknessProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessThicknessProp.serialize(); break; case "LensProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessLensProp.serialize(); break; case "LightProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessLightProp.serialize(); break; case "MarkProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessMarkProp.serialize(); break; case "SizeDefectProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessSizeDefectProp.serialize(); break; case "PointTestProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessPointTestProp.serialize(); break; case "ForProp": this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = _ProcessForProp.serialize(); break; } } private void ProcessPropertyGrid_SelectedObjectsChanged(object sender, EventArgs e) { } private void StepProcessFrm_FormClosed(object sender, FormClosedEventArgs e) { if (frm != null) frm.Close(); } } }