using AiControlRequest; using OpenCvSharp; using PaintDotNet; using PaintDotNet.Adjust; using PaintDotNet.Base.CommTool; using PaintDotNet.Camera; using PaintDotNet.DbOpreate.DbBll; using PaintDotNet.DbOpreate.DbModel; using PaintDotNet.ImageCollect; using StageController; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static AiControlRequest.AiControl; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Metis.AutoAnalysis { internal partial class AutoAnalysisDialog : FloatingToolForm, IStageEvent { /// /// 样品台展示控件 /// SampleStageControl _samplesControl; Dictionary _stageSettingList; SampleStageModel _stageSettingNow; string _stageSettingName; /// /// 结果展示控件 /// ScanGridControl _scanGird; AxisController m_stage; private double m_PxLength; Dictionary ResultList = new Dictionary(); String[] infoList; private RulerPainter m_rulerPainter = new RulerPainter();//画标尺用 private ReportExporter m_reportExporter = new ReportExporter();//输出报表用 private int m_groupIndex = 0; //夹杂物分组序号 private int m_imageIndex = 0; //夹杂物分组内图片序号 private int m_totalImageCount = 0;//需要发送的AI的图片个数 private int m_imageCountToAI = 0;//记录四组会换模式中发送到AI的图片数量 private List m_lstSentFiles = new List();//存放已经发送到AI的文件 private List m_lstWorkDir = new List(); private string m_grabedDirName = "\\grabed"; private string m_cmbProjuctSelectText; private DataUpload m_dataUpload = new DataUpload(); /// /// 分析设置存储信息 /// protected AutoAnalyzeSettingModel autoAnalyzeSettingModel; public AutoAnalyzeSettingModel AutoAnalyzeSettingModel { get { return this.autoAnalyzeSettingModel; } set { this.autoAnalyzeSettingModel = value; } } protected int ConvertUMToPX(double length) { return (int)(length / m_PxLength); } protected double ConvertPXToUm(double length) { return length * m_PxLength; } public int VisionWidthPixel = 2448; public int VisionHeightPixel = 2048; public double VisionWidth = 2448; public double VisionHeight = 2048; public int NumRow; public int NumCol; private AppWorkspace _app; public string lblResultText; public AutoAnalysisDialog(AppWorkspace app) { LogHelper.log.Debug("Start AutoAnalysisDialog"); _app = app; InitializeComponent(); Startup.instance.rules.TryGetValue(MeasurementUnit.Micron, out m_PxLength); _scanGird = new ScanGridControl(); _scanGird.MouseDown += _scanGird_MouseDown; pnlScanGrid.Controls.Add(_scanGird); InitSmapleStageControl(); //DirRoot = @"D:\AiTest";//Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); _camera = CameraManager.CurrentCamera; if (_camera.IsOpen()) { var size = _camera.Resolution; VisionWidthPixel = size.Width == 0 ? 1000 : size.Width; VisionHeightPixel = size.Height == 0 ? 1000 : size.Height; VisionWidth = ConvertPXToUm(VisionWidthPixel); VisionHeight = ConvertPXToUm(VisionHeightPixel); lblImageSize.Text = string.Format("{0:f0}*{1:f0}", VisionWidthPixel, VisionHeightPixel); } SetAnalyzeModelFromXml("自动分析"); m_reportExporter.form = this; } #region Load Close private void AutoAnalysisDialog_Load(object sender, EventArgs e) { InitializeText(); CameraConfigs.GetInstance().CameraParamInit(); _stageSettingList = SampleStageManager.GetAll(); foreach (var s in _stageSettingList.Keys) { if (SampleStageManager.Validation(_stageSettingList[s])) cmbSampleStageList.Items.Add(s); } if (cmbSampleStageList.Items.Count > 0) cmbSampleStageList.SelectedIndex = 0; cmbScanMode.SelectedIndex = 0; cmbAutoFocusParm.SelectedIndex = 0; tmrUpdateUI.Start(); tmrUpdateUI.Tick += TmrUpdateUI_Tick; UpdateUserList(); InitStage(); InitOfflineTest(); InitCheckConfig(); CameraManager.FrameCallback += CallbackDraw; m_dataUpload.ConnectServer(); } void InitializeText() { this.Text = PdnResources.GetString("AutoAnalysis"); grpStage.Text = PdnResources.GetString("AutoAnalysis.Stage"); grpFocus.Text = PdnResources.GetString("AutoAnalysis.FocusSetting"); grpStageInfo.Text = PdnResources.GetString("AutoAnalysis.StageInfo"); grpStageDisplay.Text = PdnResources.GetString("AutoAnalysis.StageSketch"); grpResult.Text = PdnResources.GetString("AutoAnalysis.ResultSketch"); grpRange.Text = PdnResources.GetString("AutoAnalysis.DetectRange"); grpAnalysis.Text = PdnResources.GetString("AutoAnalysis.AnalysisResult"); grpAiOperate.Text = PdnResources.GetString("AutoAnalysis.SameOperate"); grpWorkOperate.Text = PdnResources.GetString("AutoAnalysis.SameOperate"); grpFilePath.Text = PdnResources.GetString("AutoAnalysis.SaveDir"); label1.Text = PdnResources.GetString("AutoAnalysis.StageSelect"); label2.Text = PdnResources.GetString("AutoAnalysis.FocusSelect"); lblUser.Text = PdnResources.GetString("AutoAnalysis.Inspector"); lblInfo.Text = PdnResources.GetString("AutoAnalysis.Info"); label5.Text = PdnResources.GetString("AutoAnalysis.Horizon"); label7.Text = PdnResources.GetString("AutoAnalysis.Vertical"); label6.Text = PdnResources.GetString("AutoAnalysis.Point"); label8.Text = PdnResources.GetString("AutoAnalysis.Point"); label9.Text = PdnResources.GetString("AutoAnalysis.Mode"); label10.Text = PdnResources.GetString("AutoAnalysis.Total"); label12.Text = PdnResources.GetString("AutoAnalysis.CaptureSize"); label14.Text = PdnResources.GetString("AutoAnalysis.DetectSize"); lblDiskUsed.Text = PdnResources.GetString("AutoAnalysis.DiskUsage"); rbtWithoutFocus.Text = PdnResources.GetString("AutoAnalysis.Without"); rbtAutoFocus.Text = PdnResources.GetString("AutoAnalysis.AutoFocus"); rdbStratFormCurrent.Text = PdnResources.GetString("AutoAnalysis.DetectFrom"); rdbOnlyCurrent.Text = PdnResources.GetString("AutoAnalysis.DetectOne"); rdbReplayAll.Text = PdnResources.GetString("AutoAnalysis.DetectAll"); btnAddUser.Text = PdnResources.GetString("AutoAnalysis.Button.Add"); btnDelUser.Text = PdnResources.GetString("AutoAnalysis.Button.Delete"); btnAddInfo.Text = PdnResources.GetString("AutoAnalysis.Button.Add"); btnDelInfo.Text = PdnResources.GetString("AutoAnalysis.Button.Delete"); btnLookBack.Text = PdnResources.GetString("AutoAnalysis.Button.OriginalImage"); btnAnalysis.Text = PdnResources.GetString("AutoAnalysis.Button.ProcessImage"); btnLocate.Text = PdnResources.GetString("AutoAnalysis.Button.LocalCamera"); btnReport.Text = PdnResources.GetString("AutoAnalysis.Button.CreateReport"); btnStart.Text = PdnResources.GetString("AutoAnalysis.Button.Start"); btnStop.Text = PdnResources.GetString("AutoAnalysis.Button.Stop"); btnPreview.Text = PdnResources.GetString("AutoAnalysis.Button.Preview"); btnChangDir.Text = PdnResources.GetString("AutoAnalysis.Button.ChangeDir"); cmbScanMode.Items.Add(PdnResources.GetString("AutoAnalysis.ModeS")); cmbScanMode.Items.Add(PdnResources.GetString("AutoAnalysis.ModeJump")); cmbScanMode.Items.Add("回环四组"); //cmbScanMode.Items.Add("回环四组o"); } int[] _detectParams = new int[3]; private CheckConfigModel _checkconfig; private void CheckItemChange(string str) { for (int i = 0; i < 3; i++) _detectParams[i] = int.Parse(str.Split(',')[i]); } string CheckconfigPath = Application.StartupPath + @"\Automation\checkitem\checkconfig.xml"; private void InitCheckConfig() { try { _checkconfig = XmlSerializeHelper.Load(CheckconfigPath); DirRoot = _checkconfig.Path; cmbProjuctSelect.DropDownStyle = ComboBoxStyle.DropDownList; foreach (var item in _checkconfig.Items) { cmbProjuctSelect.Items.Add(item.Name); } cmbProjuctSelect.SelectedIndex = 0; } catch { MessageBox.Show("请检查\"\\Automation\\checkitem\\checkconfig.xml\"文件是否有错误。", "检测配置文件错误"); } } /// /// 更新控件状态 /// private void TmrUpdateUI_Tick(object sender, EventArgs e) { grpStage.Enabled = !_isWorking; grpFocus.Enabled = !_isWorking; grpStageInfo.Enabled = !_isWorking; grpStageDisplay.Enabled = !_isWorking; //grpWorkOperate.Enabled = m_stage.IsOpen; //removed by songxk for test //grpAiOperate.Enabled = !_isWorking || _pause; grpRange.Enabled = !_isWorking; btnLocate.Enabled = !_isWorking & m_stage.IsOpen; btnLookBack.Enabled = _workDone || _pause; btnAnalysis.Enabled = _workDone || _pause; btnReport.Enabled = _workDone; //btnStart.Text = !_isWorking || _pause ? "开始" : "暂停"; btnStart.Enabled = !_isWorking || _pause ? true : false;//取消暂停 btnStop.Enabled = _isWorking; cmbProjuctSelect.Enabled = !_isWorking; if (_isWorking) { _resultScanSelect = -1; } } private void AutoAnalysisDialog_FormClosing(object sender, FormClosingEventArgs e) { CameraManager.FrameCallback -= CallbackDraw; StopWork(); //XmlSerializeHelper.Save(_checkconfig, CheckconfigPath); } public void InitStage() { m_stage = AxisController.GetInstance(); pnlTest.Width = 0; if (!m_stage.IsOpen) { // MessageBox.Show(PdnResources.GetString("Message.AxisController.NotConnected")); //grpWorkOperate.Enabled = false; return; } m_stage.SetWorkspeedXY(); var dialog = TransferProgressDialog.CreatDialog("平台复位", "复位中...", null, "Stop"); m_stage.ResetStage( () => { this.Invoke(new Action(dialog.Close)); }); dialog.ShowDialog(); } #endregion private void cmbSampleStageList_SelectedIndexChanged(object sender, EventArgs e) { _stageSettingNow = _stageSettingList[cmbSampleStageList.Text]; _stageSettingName = cmbSampleStageList.Text; UpdateSmapleStageControl(); BuildTableList(); var hc = Math.Ceiling(_stageSettingNow.Width * 1000 / VisionWidth); var vc = Math.Ceiling(_stageSettingNow.Height * 1000 / VisionHeight); nupHorizon.Value = (decimal)Math.Max(hc, 1); nupVertical.Value = (decimal)Math.Max(vc, 1); //Add by shayg 20220718 start SetBasePointsComboBox(hc, vc); //Add by shayg 20220718 end ClearResult(); } //Add by shayg 20220718 start private void SetBasePointsComboBox(double hcount, double vcount) { var selectIndex = cmbFocusCount.SelectedIndex; cmbFocusCount.Items.Clear(); if (hcount <= 1 || vcount <= 1) { rbtFocusForecast.Checked = false; rbtFocusForecast.Enabled = false; return; } if (hcount >= 2 && vcount >= 2) { rbtFocusForecast.Enabled = true; cmbFocusCount.Items.Add(3); } if (hcount >= 3 && vcount >= 3) cmbFocusCount.Items.Add(5); if (hcount >= 5 && vcount >= 5) cmbFocusCount.Items.Add(9); if (cmbFocusCount.Items.Count > 0 && selectIndex < 0 || selectIndex >= cmbFocusCount.Items.Count) { cmbFocusCount.SelectedIndex = cmbFocusCount.Items.Count - 1; } else { cmbFocusCount.SelectedIndex = selectIndex; } } private void rbtFocusForecast_CheckedChanged(object sender, EventArgs e) { cmbFocusCount.Enabled = rbtFocusForecast.Checked; } //Add by shayg 20220718 end #region ScanGrid Display private void nupHorizon_ValueChanged(object sender, EventArgs e) { var colN = (int)nupHorizon.Value; var rowN = (int)nupVertical.Value; if (colN != 0 && rowN != 0) UpdateScanGrid(colN, rowN); else { return; } var width = ConvertUMToPX(_stageSettingNow.Width * 1000 / colN); var height = ConvertUMToPX(_stageSettingNow.Height * 1000 / rowN); lblStageSize.Text = string.Format("{0:f0}*{1:f0}", width, height); //Add by shayg 20220718 start SetBasePointsComboBox(colN, rowN); //Add by shayg 20220718 end } private void UpdateScanGrid(int c, int r) { lblTotal.Text = (c * r).ToString(); NumCol = c; NumRow = r; _scanGird.NumCol = c; _scanGird.NumRow = r; _scanGird.VsnWitch = VisionWidth; _scanGird.VsnHeight = VisionHeight; _scanGird.InitGrid(_stageSettingNow); } private void _scanGird_MouseDown(object sender, MouseEventArgs e) { _resultLookId = _scanGird.GetHitId(e.X, e.Y); _resultScanSelect = _scanGird.GetIndex(e.X, e.Y); ShowResult(); } #endregion #region SampleStage void InitSmapleStageControl() { _samplesControl = new SampleStageControl(); _samplesControl.OnSelectChanged += (value) => { UpdateInfoTable(value); // if (_workDone) UpdateScanGridByResult(value); }; pnlStageDisplay.Controls.Add(_samplesControl); } private void UpdateSmapleStageControl() { _samplesControl.Update(_stageSettingNow); } private void ResetSmapleState() { for (int i = 0; i < _tables.Length; i++) { var table = _tables[i]; if (table == null) _samplesControl.SetState(i, 0); else _samplesControl.SetState(i, 1); } } #endregion #region User List _userList; private void UpdateUserList() { cmbUser.Items.Clear(); _userList = SampleStageManager.GetUsers(); foreach (var s in _userList) cmbUser.Items.Add(s); if (cmbUser.Items.Count > 0) cmbUser.SelectedIndex = 0; } private void btnAddUser_Click(object sender, EventArgs e) { var form = new AddUser() { CallOK = AddUser }; form.TopMost = true; form.ShowDialog(); } private void AddUser(string s) { if (_userList.Contains(s)) return; _userList.Insert(0, s); SampleStageManager.SaveUsers(_userList); UpdateUserList(); } private void DelUser(string s) { _userList.Remove(s); SampleStageManager.SaveUsers(_userList); UpdateUserList(); } private void btnDelUser_Click(object sender, EventArgs e) { DelUser(cmbUser.Text); } #endregion #region Information string[] _infos; DataTable[] _tables; char _spliter = ';'; string GetUser() { return cmbUser.Text; } void BuildTableList() { dgvStageInfo.DataSource = null; _tables = new DataTable[_stageSettingNow.WorkPoits.Count]; _infos = new string[_stageSettingNow.WorkPoits.Count]; } private void txbInfo_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { btnAddInfo_Click(null, null); } } private void btnAddInfo_Click(object sender, EventArgs e) { if (!_tables.Any((t) => t == null)) { MessageBox.Show("所有工位已经添加完成"); return; } var user = GetUser(); if (string.IsNullOrEmpty(user)) { MessageBox.Show("请先添加检测员。"); return; } //var infostr = txbInfo.Text; //if (string.IsNullOrEmpty(infostr)) return; //txbInfo.Text = ""; //infoList = infostr.Split(_spliter); var sampleEditSelect = _tables.ToList().FindIndex((t) => t == null); _samplesControl.SelectIndex = sampleEditSelect; var table = new DataTable(); table.Columns.Add("工位 ", typeof(string)); table.Columns.Add("检测项目 ", typeof(string)); table.Columns.Add("检验批号 ", typeof(string)); table.Columns.Add("试批顺序号 ", typeof(string)); table.Columns.Add("试样号 ", typeof(string)); table.Columns.Add("收样时间", typeof(string)); table.Columns.Add("牌号(钢级)", typeof(string)); table.Columns.Add("检测 ", typeof(bool)); table.Columns.Add("结果 ", typeof(string)); table.Columns.Add("检测员 ", typeof(string)); SelectSampleInfo frm = new SelectSampleInfo(); var dr = frm.ShowDialog(); if (dr != DialogResult.OK) return; var row = table.NewRow(); row[0] = "#" + (sampleEditSelect + 1); int j = 1; row[j++] = frm.TESTCODE; row[j++] = frm.SAMPLELOTNO; row[j++] = frm.SAMPLEID; row[j++] = frm.FD_SAMPLE_NO; row[j++] = frm.RECVTIME; row[j++] = frm.FD_SG_SIGN; row[j++] = true; row[j++] = ""; row[j++] = user; table.Rows.Add(row); _tables[sampleEditSelect] = table; //_infos[sampleEditSelect] = infostr; _samplesControl.SetState(sampleEditSelect, 1); UpdateInfoTable(sampleEditSelect); } private void UpdateInfoTable(int i) { var table = _tables[i]; dgvStageInfo.DataSource = table; } private void btnDelInfo_Click(object sender, EventArgs e) { if (_samplesControl.SelectIndex < 0) return; var i = _samplesControl.SelectIndex; _tables[i] = null; _infos[i] = null; dgvStageInfo.DataSource = null; _samplesControl.SetState(i, 0); } private bool IsCheck(int id) { return (bool)dgvStageInfo.Rows[id].Cells[2].Value; } #endregion #region Work int _workSampleIndex; int _workScanIndex; bool _isWorking; bool _pause = false; bool _workDone; bool _isOnce = false; bool _restart = false; ResultModel _resultWorking; /// /// 聚焦间隔 /// int _focusInterval = 1; /// /// 蛇形扫描: 0:连续,1:间隔 /// int _mode = 0; private void btnStart_Click(object sender, EventArgs e) { if (cmbScanMode.SelectedIndex == 2) { int hVal = (int)nupHorizon.Value; int vVal = (int)nupVertical.Value; if (hVal % 2 != 0) { MessageBox.Show("请将横向设定为偶数"); return; } if (vVal % 2 != 0) { MessageBox.Show("请将纵向设定为偶数"); return; } } if (string.IsNullOrEmpty(_dirRoot)) { MessageBox.Show("请选择"); return; } var str = cmbProjuctSelect.Text; if (string.IsNullOrEmpty(str)) { MessageBox.Show("检测项目不能为空"); return; } m_cmbProjuctSelectText = str; var item = _checkconfig.Items.First((i) => i.Name == str); CheckItemChange(item.Value); var table = _tables[0]; if (table == null) { MessageBox.Show("请添加样品信息。"); return; } var hasCheck = false; for (int i = 0; i < table.Rows.Count; i++) { hasCheck |= (bool)table.Rows[i][7]; } if (!hasCheck) { MessageBox.Show("请选择检测项。"); return; } if (!_isWorking) { StartWork(); } else { if (_pause) { _restart = rdbReplayAll.Checked; _isWorking = !_restart; } else { } _pause = !_pause; } _isOnce = rdbOnlyCurrent.Checked; } private void btnStop_Click(object sender, EventArgs e) { StopWork(); } private void StartWork() { m_lstSentFiles.Clear(); m_totalImageCount = 0; m_imageCountToAI = 0; _workSampleIndex = 0; _workScanIndex = 0; _resultCmpAll = new List(); _resultList = new List(); NewWorkDir(); InitAi(_dirCurrent); Directory.Delete(_dirCurrent); _isWorking = true; ResetSmapleState(); //Add by shayg 20220718 start scanMode = cmbScanMode.SelectedIndex; if (cmbFocusCount.SelectedItem != null) { int.TryParse(cmbFocusCount.SelectedItem.ToString(), out focusCount); } //Add by shayg 20220718 end new Thread(Runtime).Start(); } private void PauseWork() { _pause = true; } private void StopWork() { AutoFocusWorkflow.Stop(); _pause = false; _isWorking = false; } private void Runtime() { Console.WriteLine("In to work runtime"); m_lstWorkDir.Clear(); while (_isWorking) { while (_pause) { Thread.Sleep(50); if (!_isWorking) break; } //Delete by shayg 20220718 start //ToWorkStartPoint(_workSampleIndex); //Delete by shayg 20220718 end NewWorkDir(); m_lstWorkDir.Add(_dirCurrent); aicontrol.GradePaht = _dirCurrent; var rule = Startup.instance.ruleDB; if (rule != null) { int mul = (int)rule.gain_multiple; double umperpx = (double)(rule.physical_length / (decimal)rule.pixel_length); // aicontrol.StartAndSetGradeParam(catagoryParam.Inclusion, itemParam.Inclusion, jsonParam.InclusionALL, mul, umperpx); aicontrol.StartAndSetGradeParam((catagoryParam)_detectParams[0], (itemParam)_detectParams[1], (jsonParam)_detectParams[2], mul, umperpx); } else { aicontrol.StartAndSetGradeParam((catagoryParam)_detectParams[0], (itemParam)_detectParams[1], (jsonParam)_detectParams[2], 1, 1); } _samplesControl.SetState(_workSampleIndex, 2); _scanGird.Reset(); //Add by shayg 20220718 start if (rbtFocusForecast.Checked) { GenerateFocalPlanes(() => _imgNow, 3, _dirCurrent); } ToWorkStartPoint(_workSampleIndex); //Add by shayg 20220718 end //Scan ScanSampleWorkflow(); LogHelper.log.Debug("扫描样品结束"); if (!_isWorking) { LogHelper.log.Debug("点击了停止,退出"); break; } _samplesControl.SetState(_workSampleIndex, 3); _resultFlag = _workSampleIndex + 1; EndGrade(_workSampleIndex); if (_workSampleIndex < _stageSettingNow.WorkPoits.Count - 1) ToWorkStartPoint(_workSampleIndex + 1); LogHelper.log.Debug("等待所有AI处理结束..."); WaitAiCompleteAll(); LogHelper.log.Debug("AI已经结束"); _workSampleIndex++; if (_workSampleIndex >= _stageSettingNow.WorkPoits.Count) break; } Console.WriteLine("Out of work runtime."); if(chkAutoUpload.Checked) { UploadData(); } this.Invoke(new Action(() => { PrintReport(true); })); //当全部扫码完成退出循环,_isWorking依然为true,则认为完成 _workDone = _isWorking; StopWork(); if (_restart) { _restart = false; StartWork(); } } //Add by shayg 20220718 start #region 聚焦补偿,焦平面创建 private int scanMode; private int focusCount; private FocalPlanes3D focalPlanes; private void SetScanGridVision(int index) { if (scanMode == 0) { _scanGird.VisionAt(index); } } private bool GenerateFocalPlanes(Func currentImage, int windowLength, string dirCurrent) { if (NumCol <= 1 || NumRow <= 1 || focusCount < 3) { focalPlanes = null; } m_stage.WaitMoveDone(); var startPoint = GetWorkStartPoint(_workSampleIndex); if (focusCount == 3) { var focusPoints = GetFocusPoints3(); if (focusPoints != null && focusPoints.Count == 3) { SetScanGridVision(focusPoints[0].ScanIndex); m_stage.To(startPoint.X + focusPoints[0].TotalOffx, startPoint.Y + focusPoints[0].TotalOffy); m_stage.WaitMoveDone(); var focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent); var point1 = new Point3D(startPoint.X + focusPoints[0].TotalOffx, -(startPoint.Y + focusPoints[0].TotalOffy), (float)focusImage.Z); if (!_isWorking) return false; SetScanGridVision(focusPoints[1].ScanIndex); m_stage.To(startPoint.X + focusPoints[1].TotalOffx, startPoint.Y + focusPoints[1].TotalOffy); m_stage.WaitMoveDone(); focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent); var point2 = new Point3D(startPoint.X + focusPoints[1].TotalOffx, -(startPoint.Y + focusPoints[1].TotalOffy), (float)focusImage.Z); if (!_isWorking) return false; SetScanGridVision(focusPoints[2].ScanIndex); m_stage.To(startPoint.X + focusPoints[2].TotalOffx, startPoint.Y + focusPoints[2].TotalOffy); m_stage.WaitMoveDone(); focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent); var point3 = new Point3D(startPoint.X + focusPoints[2].TotalOffx, -(startPoint.Y + focusPoints[2].TotalOffy), (float)focusImage.Z); focalPlanes = new FocalPlanes3D(point1, point2, point3); } return true; } else { var focusPoints = GetFocusPoints5Or9(focusCount); if (focusPoints != null && focusPoints.Count >= 5) { double x, y; Point3D center = null; var points = new List(); for (int i = 0; i < focusPoints.Count; i++) { SetScanGridVision(focusPoints[i].ScanIndex); x = startPoint.X + focusPoints[i].TotalOffx; y = startPoint.Y + focusPoints[i].TotalOffy; m_stage.To(x, y); m_stage.WaitMoveDone(); var focusImage = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, windowLength, _workScanIndex, _dirCurrent); if (i == 0) center = new Point3D(x, -y, focusImage.Z); else points.Add(new Point3D(x, -y, focusImage.Z)); if (!_isWorking) return false; } focalPlanes = new FocalPlanes3D(center, points); return true; } return false; } } #endregion #region 计算需要自动聚焦点的索引及坐标 private List<(int ScanIndex, double TotalOffx, double TotalOffy)> GetFocusPoints3() { var focusPoints = new List<(int ScanIndex, double X, double Y)>(); //第1点 focusPoints.Add((0, 0, 0)); if (NumCol > NumRow) { //第2点 focusPoints.Add((NumCol - 1, Offx * (NumCol - 1), 0)); //第3点 focusPoints.Add((NumRow % 2 == 0 ? NumRow * NumCol - NumCol / 2 - 1 : (NumRow - 1) * NumCol + NumCol / 2, Offx * (NumCol / 2), Offy * (NumRow - 1))); } else { //第2点 focusPoints.Add((NumRow / 2 % 2 == 0 ? (NumRow / 2 + 1) * NumCol - 1 : NumRow / 2 * NumCol, Offx * (NumCol - 1), Offy * (NumRow / 2))); //第3点 focusPoints.Add((NumRow % 2 == 0 ? NumRow * NumCol - 1 : (NumRow - 1) * NumCol, 0, Offy * (NumRow - 1))); } return focusPoints; } private List<(int ScanIndex, double TotalOffx, double TotalOffy)> GetFocusPoints5Or9(int focusCount) { var focusPoints = new List<(int ScanIndex, double X, double Y)>(); if (NumRow >= 3 && NumCol >= 3 && (focusCount == 5 || focusCount == 9)) { var totalOffx = 0d; var totalOffy = 0d; //中心(0) if (NumRow / 2 % 2 == 0) { focusPoints.Add((NumRow / 2 * NumCol + NumCol / 2, Offx * (NumCol / 2), Offy * (NumRow / 2))); } else { focusPoints.Add(((NumRow / 2 + 1) * NumCol - NumCol / 2 - 1, Offx * (NumCol / 2), Offy * (NumRow / 2))); } //第1点(1) focusPoints.Add((0, totalOffx, totalOffy)); //第2点 if (focusCount == 9) { totalOffx = Offx * (NumCol / 2); focusPoints.Add((NumCol / 2, totalOffx, totalOffy)); } //第3点(2) totalOffx = Offx * (NumCol - 1); focusPoints.Add((NumCol - 1, totalOffx, totalOffy)); //第4点 if (focusCount == 9) { totalOffy = Offy * (NumRow / 2); if (NumRow / 2 % 2 == 0) { focusPoints.Add(((NumRow / 2 + 1) * NumCol - 1, totalOffx, totalOffy)); } else { focusPoints.Add((NumRow / 2 * NumCol, totalOffx, totalOffy)); } } //第5点(3) totalOffy = Offy * (NumRow - 1); if (NumRow % 2 == 0) { focusPoints.Add(((NumRow - 1) * NumCol, totalOffx, totalOffy)); } else { focusPoints.Add((NumRow * NumCol - 1, totalOffx, totalOffy)); } //第6点 if (focusCount == 9) { totalOffx = totalOffx - Offx * (NumCol / 2); if (NumRow % 2 == 0) { focusPoints.Add(((NumRow - 1) * NumCol + NumCol / 2, totalOffx, totalOffy)); } else { focusPoints.Add((NumRow * NumCol - NumCol / 2 - 1, totalOffx, totalOffy)); } } //第7点(4) totalOffx = 0; if (NumRow % 2 == 0) { focusPoints.Add((NumRow * NumCol - 1, totalOffx, totalOffy)); } else { focusPoints.Add(((NumRow - 1) * NumCol, totalOffx, totalOffy)); } //第8点 if (focusCount == 9) { totalOffy = totalOffy - Offy * (NumCol / 2); if ((NumRow + 1) / 2 % 2 == 0) { focusPoints.Add(((NumRow + 1) / 2 * NumCol - 1, totalOffx, totalOffy)); } else { focusPoints.Add((((NumRow + 1) / 2 - 1) * NumCol, totalOffx, totalOffy)); } } return focusPoints; } return null; } #endregion //Add by shayg 20220718 end private void ScanSampleWorkflow() { if (_mode <= 1) { for (; _workScanIndex < NumCol * NumRow && _isWorking; _workScanIndex += 1 + _mode) { while (_pause) { Thread.Sleep(50); if (!_isWorking) return; } if (_isOnce) _pause = true; //Console.Write("Before To Next:"); m_stage.WaitMoveDone(); ToNext(Offx, Offy, _workScanIndex); _scanGird.SetDoning(_workScanIndex, _workScanIndex / (_mode + 1) + 1); _resultWorking = new ResultModel() { SampleId = _workSampleIndex, ScanId = _workScanIndex, ResultId = _workScanIndex / (_mode + 1) + 1 }; _resultList.Add(_resultWorking); if (rbtAutoFocus.Checked) { if ((_workScanIndex / (_mode + 1) + 1) % _focusInterval == 0) { // Modify by shayg 20220718 start //AutoFocusWorkflow.AutoFocusFast(m_stage, () => _imgNow); var bitmap = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, 4, _workScanIndex, _dirCurrent); CatchShoot(bitmap.Image); // Modify by shayg 20220718 end } } //Modify by shayg 20220718 start //SetShoot(); else if (rbtFocusForecast.Checked && focalPlanes != null) { var z = focalPlanes.GetFocusValue(m_stage.X, -m_stage.Y); m_stage.UpTo(z); m_stage.WaitMoveDone(); SetShoot(); } else { SetShoot(); } // Modify by shayg 20220718 end } _workScanIndex = 0; } //else if(_mode == 2) else { //NumRow和NumCol需要设定为偶数 //每拍四张照片,合成一张后找最差视场,提交给AI分析 int dispIndex = 0; m_groupIndex = 0; m_lstSentFiles.Clear(); m_totalImageCount = NumRow * NumCol / 4; for (int i = 0; i < NumRow; i = i + 2) { for (int j = 0; j < NumCol; j = j + 2) { m_groupIndex++; for (int k = 0; k < 4; k++) { if (_isWorking == false) break; while (_pause) { Thread.Sleep(50); if (!_isWorking) return; } if (_isOnce) _pause = true; m_stage.WaitMoveDone(); m_imageIndex = k + 1; ToNext_Four(Offx, Offy, i, j, k); _workScanIndex = NextScanIndex(i, j, k); dispIndex++; _scanGird.SetDoning(_workScanIndex, dispIndex); _resultWorking = new ResultModel() { SampleId = _workSampleIndex, ScanId = _workScanIndex, ResultId = _workScanIndex + 1 }; _resultList.Add(_resultWorking); if (rbtAutoFocus.Checked) { //Modify by shayg 20220718 start //if (((dispIndex - 1) % _focusInterval) == 0) // AutoFocusWorkflow.AutoFocusFast(m_stage, () => _imgNow); if (((dispIndex - 1) % _focusInterval) == 0) { var bitmap = AutoFocusWorkflow.AutoFocusFastM3H(m_stage, () => _imgNow, 4, _workScanIndex, _dirCurrent); CatchShoot(bitmap.Image); } //Modify by shayg 20220718 end } //Modify by shayg 20220718 start //SetShoot(); else if (rbtFocusForecast.Checked && focalPlanes != null) { var z = focalPlanes.GetFocusValue(m_stage.X, -m_stage.Y); m_stage.UpTo(z); m_stage.WaitMoveDone(); SetShoot(); } else { SetShoot(); } // Modify by shayg 20220718 end } } } _workScanIndex = 0; } } /// /// 拼接图片 /// /// private void MergeImage(int groupIndex) { var dir = _dirCurrent + m_grabedDirName + "\\" + groupIndex.ToString(); var desDir = _dirCurrent + "\\temp"; //var desDir = _dirCurrent; if (Directory.Exists(desDir) == false) { Directory.CreateDirectory(desDir); } var outfileName = desDir + "\\" + groupIndex.ToString() + ".jpg"; Console.WriteLine("start to stitch"); DateTime startTime = DateTime.Now; Process p = new Process(); //设置要启动的应用程序 p.StartInfo.FileName = "java.exe"; p.StartInfo.Arguments = " -Xmx500m -jar Stitching\\stitching.jar " + dir + " " + outfileName; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); string strOuput = p.StandardOutput.ReadToEnd(); Console.WriteLine(strOuput); p.WaitForExit(); p.Close(); if (File.Exists(outfileName) == false) { LogHelper.log.Error(strOuput); } DateTime endTime = DateTime.Now; var gap = endTime - startTime; Console.WriteLine("duration time :" + gap.TotalMilliseconds.ToString() + " ms"); CutImage(outfileName); } /// /// 截取最严重的710*710的视场 /// /// private void CutImage(string fileName) { //if(_mode == 2) //{ // try // { // m_lstSentFiles.Add(fileName); // _resultWorking.File = fileName; // aicontrol.PostFileName(_resultWorking.FileName); // LogHelper.log.Debug(fileName + " was post to AI"); // } // catch (Exception ex) //sxk add 20211029 // { // LogHelper.log.Error("post image to AI error", ex); // } // return; //} if (File.Exists(fileName) == false) { LogHelper.log.Debug("file not exist " + fileName); return; } Mat mat = Cv2.ImRead(fileName, ImreadModes.Color); var unit = m_rulerPainter.MicronRatioPerPixel; int w = (int)(710.0 / unit); OpenCvSharp.Size roiSize = new OpenCvSharp.Size(w, w); WorstfieldFinder finder = new WorstfieldFinder(); LogHelper.log.Debug("WorstfieldFinder.Find "); Mat roi = WorstfieldFinder.Find(mat, roiSize); //Mat roi = new Mat(mat, new Rect(new OpenCvSharp.Point(150, 150), roiSize)); //Mat roi = mat(roiSize); var img = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(roi); //画标尺 m_rulerPainter.DrawRuler(ref img); var outfileName = _dirCurrent + "\\" + Path.GetFileName(fileName); try { LogHelper.log.Debug("save image "); img.Save(outfileName, ImageFormat.Jpeg); m_lstSentFiles.Add(outfileName); _resultWorking.File = outfileName; aicontrol.PostFileName(_resultWorking.FileName); LogHelper.log.Debug("image cuted and sent to ai server " + _resultWorking.FileName); } catch (Exception ex) //sxk add 20211029 { LogHelper.log.Error("image save error", ex); } //Cv2.ImWrite(outfileName, roi); mat.Dispose(); } /// /// 切换到下一个扫描索引 /// /// /// /// /// private int NextScanIndex(int row, int col, int num) { int scanIndex = 0; if ((row == 0) && (col == 0) && (num == 0)) return scanIndex;//不需要移动 if (row % 4 == 0) { //大方向从左向右移动 if (num == 0) { scanIndex = row * NumCol + col; } else if (num == 1) { scanIndex = (row + 1) * NumCol + (NumCol - col) - 1; } else if (num == 2) { scanIndex = (row + 1) * NumCol + (NumCol - col - 1) - 1; } else { scanIndex = row * NumCol + col + 1; } } else { //大方向从右向左移动 if (num == 0) { scanIndex = row * NumCol + (NumCol - col - 2); } else if (num == 1) { scanIndex = (row + 1) * NumCol + col + 1; } else if (num == 2) { scanIndex = (row + 1) * NumCol + col; } else { scanIndex = row * NumCol + (NumCol - col - 1); } } return scanIndex; } bool _shootFlag = false; private void SetShoot() { _shootFlag = true; while (_isWorking && _shootFlag) { Thread.Sleep(10); } } private void CatchShoot(Bitmap img) { if (_mode >= 2) { //夹杂物拼图采集 _shootFlag = false; _resultWorking.File = Save_Four(img); return; } else { //画标尺 m_rulerPainter.DrawRuler(ref img); _shootFlag = false; _resultWorking.File = Save(img); // if (string.IsNullOrEmpty(_resultWorking.File)) return; var type = CheckPicBoundary(img); aicontrol.PostFileName(_resultWorking.FileName); //if (type == 3 || (type == 2 && _checkconfig.Border == 1)) //aicontrol.PostFileName(_resultWorking.FileName); } } class ResultModel { public int SampleId; public int ScanId = -1; public bool Done; //public string Result; string _file; public string File { get => _file; set { _file = value; var i = value.LastIndexOf('\\'); Dir = value.Substring(0, i + 1); FileName = value.Substring(i + 1); } } public string Dir; public string FileName; public int ResultId; } #endregion #region Move To float Offx => _stageSettingNow.Width * 1000 / NumCol; float Offy => _stageSettingNow.Height * 1000 / NumRow; /// /// 移动到开始位置 /// /// private void ToWorkStartPoint(int i) { var p = GetWorkStartPoint(i); m_stage.To(p.X, p.Y); } private PointF GetWorkStartPoint(int i) { var x = (_stageSettingNow.WorkPoits[i].X - _stageSettingNow.Width / 2) * 1000; var y = (_stageSettingNow.WorkPoits[i].Y - _stageSettingNow.Height / 2) * 1000; return new PointF(x, y); } /// /// 夹杂物4个一组组合方式的扫描 /// 四个一组, /// 11 14 21 24 /// 12 13 22 23 /// 41 44 31 34 /// 42 43 32 33 /// /// 横向移动单位 /// 纵向移动单位 /// 行号 /// 列号 /// 组内序号 private void ToNext_Four(double offx, double offy, int row, int col, int num) { double x = 0; double y = 0; if ((row == 0) && (col == 0) && (num == 0)) return;//不需要移动 if (row % 4 == 0) { //大方向从左向右移动 if (col == 0) { //第一列 if (num == 0) { x = -offx; y = offy * 2; } else if (num == 1) { y = offy; } else if (num == 2) { x = offx; } else { y = -offy; } } else { //其他 if (num == 0) { x = offx; } else if (num == 1) { y = offy; } else if (num == 2) { x = offx; } else { y = -offy; } } } else { //大方向从右向左移动 if (col == 0) { //第一列 if (num == 0) { x = -offx; y = offy * 2; } else if (num == 1) { y = offy; } else if (num == 2) { x = offx; } else { y = -offy; } } else { //其他列 if (num == 0) { x = -offx * 3;//移动到前一组 } else if (num == 1) { y = offy; } else if (num == 2) { x = offx; } else { y = -offy; } } } m_stage.Move(x, y); LogHelper.log.Debug("ToNext_Four : x = " + x.ToString() + ", y = " + y.ToString()); m_stage.WaitMoveDone(); return; } private void ToNext(double offx, double offy, int i) { double x = 0, y = 0; int r = i / NumCol; int c = i % NumCol; if (_mode == 0) { if (i == 0) ; else if (c == 0) y = offy; else if (r % 2 == 0) x = offx; else x = -offx; } if (_mode == 1) { if (i == 0) ; else if (r % 2 == 0) { if (c == 0) { x = -offx; y = offy; } else if (c == 1) { x = offx; y = offy; } else x = 2 * offx; } else { if (c == 0) { x = offx; y = offy; } else if (c == 1) { x = -offx; y = offy; } else x = -2 * offx; } } m_stage.Move(x, y); // Console.Write("To Next:"); m_stage.WaitMoveDone(); } private void ToScanPoint(int sampleId, int scanId) { var p = GetWorkStartPoint(sampleId); float offx = scanId / NumCol % 2 == 0 ? scanId % NumCol : NumCol - scanId % NumCol - 1; float offy = (int)(scanId / NumCol); offx *= Offx; offy *= Offy; m_stage.To(p.X + offx, p.Y + offy); } #endregion #region Preview private void btnPreview_Click(object sender, EventArgs e) { PreviewPure.StartPreiew(sender as Button); } private ICamera _camera; private Bitmap _imgNow; private void CallbackDraw(Bitmap obj) { if (obj == null) return; var bmp = (Bitmap)obj.Clone(); if (bmp.PixelFormat == PixelFormat.Format8bppIndexed) { ColorPalette palette = bmp.Palette; for (int i = 0; i < 256; i++) { palette.Entries[i] = Color.FromArgb(i, i, i); } bmp.Palette = palette; } if (_shootFlag) { CatchShoot(bmp); } else { try { _imgNow = (Bitmap)bmp.Clone(); PreviewPure.ShowPrieview(bmp); } catch (Exception ex) { Console.WriteLine(ex.StackTrace, ex.Message); } } } #endregion #region Save string _dirRoot; string DirRoot { get => _dirRoot; set { _dirRoot = value; lblDirectory.Text = value; _checkconfig.Path = value; try { GetDriverInfo(value); } catch { } } } string _dirCurrent; private void btnChangDir_Click(object sender, EventArgs e) { if (_isWorking) return; var path = SelectFolder(); if (string.IsNullOrEmpty(path)) return; DirRoot = path; } public string SelectFolder() { FolderBrowserDialog dialog = new FolderBrowserDialog(); if (dialog.ShowDialog() == DialogResult.OK) { if (string.IsNullOrEmpty(dialog.SelectedPath)) { // System.Windows.MessageBox.Show("文件夹路径不能为空", "提示"); return null; } else return dialog.SelectedPath; } else return null; } /// /// 读取硬盘信息 /// /// 盘符 public void GetDriverInfo(string disk) { long lsum = 0, ldr = 0; long gb = 1024 * 1024 * 1024; DriveInfo drive = new DriveInfo(disk); lsum = drive.TotalSize / gb; ldr = drive.TotalFreeSpace / gb; lblDisk.Width = (int)(lblDisk.Parent.Width - lblDisk.Parent.Width * ldr / lsum); } /// /// 夹杂图四个一组图像保存 /// /// /// public string Save_Four(Bitmap img) { var grpIndex = m_groupIndex; var path = _dirCurrent + m_grabedDirName; if (Directory.Exists(path) == false) { Directory.CreateDirectory(path); } var subDir = grpIndex.ToString(); var path2 = path + "\\" + subDir; if (Directory.Exists(path2) == false) { Directory.CreateDirectory(path2); } var fileName = path2 + "\\" + string.Format("{0}.jpg", m_imageIndex); try //sxk add 20211029 { img.Save(fileName, ImageFormat.Jpeg); if (m_imageIndex == 4) { //拍完一组,开始拼图 Task mergeTask = new Task(() => { MergeImage(grpIndex); m_imageCountToAI++; }); mergeTask.Start(); } return fileName; } catch (Exception ex) //sxk add 20211029 { LogHelper.log.Error("image save error", ex); return ""; } } public string Save(Bitmap img) { var time = DateTime.Now.ToString("yyyyMMddHHmmss");//日期时间 var id = _workSampleIndex + 1;//工位号 var x = m_stage.X;//坐标x var y = m_stage.Y;//坐标y var i = _workScanIndex + 1;//图序号 var stage = _stageSettingName;//样品台名称 var fileName = _dirCurrent + "\\" + string.Format("{0}_{1}_{2}_{3}_{4:f2}_{5:f2}.jpg", time, i, stage, id, x, y); try //sxk add 20211029 { img.Save(fileName, ImageFormat.Jpeg); return fileName; } catch (Exception ex) //sxk add 20211029 { LogHelper.log.Error("image save error", ex); return ""; } } /// /// 创建工作目录 /// public void NewWorkDir() { this.Invoke(new Action(() => { _dirCurrent = DirRoot + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss");// + "_" + cmbSampleStageList.Text; Directory.CreateDirectory(_dirCurrent); })); } #endregion #region Ai Api AiControl aicontrol; int _resultFlag = -1; /// /// AI处理全部结束 /// /// void InitAi(string dir) { aicontrol = new AiControl(dir); aicontrol.CompleteBatchEvent += Aicontrol_CompleteBatchEvent; aicontrol.CompleteAllEvent += Aicontrol_CompleteAllEvent; } public string re = ""; private List GrainFileList = new List(); /// /// AI处理全部结束 /// /// void Aicontrol_CompleteAllEvent(string result) { var item = _checkconfig.Items.First((i) => i.Name == m_cmbProjuctSelectText); var name = "Automation.Inclusions";//夹杂物 //轴承钢带状、轴承钢网状、亚共析钢带状、球退查找最差级别 if (item.Value == "17,16,0"|| item.Value == "16,4,6" || item.Value == "16,2,0" || item.Value == "16,1,0") { name = "Automation.Grain";//晶粒度 AIResultReader arr = new AIResultReader(); string level = arr.LoadOnlyResult(_dirCurrent + "\\AI"); _resultCmpAll.Add(level); this.Invoke(new Action(() => { lblResult.Text = level; })); _resultFlag = -1; re = level; lblResultText = level; return; } //晶粒度查找查找众数 if (item.Value == "18,10,0" || item.Value == "18,11,0") { name = "Automation.Grain";//晶粒度 AIResultReader arr = new AIResultReader(); string level = arr.LoadGrainResult(_dirCurrent+"\\AI", ref GrainFileList); _resultCmpAll.Add(level); this.Invoke(new Action(() => { lblResult.Text = level; })); _resultFlag = -1; re = level; lblResultText = level; return; } result = result.Trim(); if(string.IsNullOrEmpty(result)) { LogHelper.log.Debug("AI全部完成,结果为空, 重新取 work dir = " + _dirCurrent); result = AnalysisAIFile(); } //Console.WriteLine("CompleteAllEvent"); Console.WriteLine("全部完成,结果:" + result); LogHelper.log.Debug("AI全部完成,结果:" + result); _resultCmpAll.Add(result); this.Invoke(new Action(() => { lblResult.Text = JsonHelper.ParseResultString(result); })); //ResultList.Add(_resultFlag, resultfilename); _resultFlag = -1; re = result; //生成报告 } /// /// 批次结束 /// /// void Aicontrol_CompleteBatchEvent(List batchfilenames) { foreach (var file in batchfilenames) { try { var result = _resultList.First((r) => r.FileName == file); _scanGird.SetDone(result.ScanId); result.Done = true; } catch { Console.WriteLine("获取结果时发生错误"); } } Console.WriteLine("批次完成"); } void EndGrade(int flag) { _resultFlag = flag; if (_mode >= 2) { for (int i = 0; i < 1000; i++) { if (m_imageCountToAI >= m_totalImageCount) { aicontrol.EndGrade(); break; } Thread.Sleep(50); } } else { aicontrol.EndGrade(); } } void WaitAiCompleteAll() { while (_resultFlag != -1) { if (!_isWorking && !_offlineWorking) _resultFlag = -1; Thread.Sleep(50); } } #endregion #region Ai Operate List _resultList = new List(); int _resultLookId = -1; int _resultSampleSelect = -1; int _resultScanSelect = -1; List _resultCmpAll = new List(); ResultModel ResultSelect => _resultList.FirstOrDefault((r) => r.ResultId == _resultLookId && r.SampleId == _resultSampleSelect); private void ClearResult() { _resultList = new List(); _resultLookId = -1; _resultSampleSelect = -1; _resultScanSelect = -1; _resultCmpAll = new List(); } private void btnLookBack_Click(object sender, EventArgs e) { if (_resultLookId < 1) return; try { PreviewPure.ShowImage(ResultSelect.File, "查看原图"); } catch { } } private void btnAnalysis_Click(object sender, EventArgs e) { if (_resultLookId < 1) return; var file = aicontrol.GetImageProcess(ResultSelect.File); try { PreviewPure.ShowImage(file, "分析过程"); } catch { } } private void ShowResult() { if (_resultLookId < 1) { Console.WriteLine("尚未分析"); return; } var result = ResultSelect; if (result == null || string.IsNullOrEmpty(result.File)) return; var str = aicontrol.GetImageTestResult(ResultSelect.File); ConsoleResult(string.IsNullOrEmpty(str) ? "没有结果" : str); } private void ConsoleResult(string msg) { lblResult.Text = msg; } private void UpdateScanGridByResult(int sampleId) { try { var list = _resultList.Where((r) => r.SampleId == sampleId).ToList(); _resultSampleSelect = sampleId; _scanGird.Reset(); foreach (var item in list) { if (_resultCmpAll[sampleId].Contains(item.FileName)) _scanGird.SetResult(item.ScanId, item.ResultId); else if (item.Done) { _scanGird.SetDone(item.ScanId, item.ResultId); } else { _scanGird.SetDoning(item.ScanId, item.ResultId); } } lblResult.Text = JsonHelper.ParseResultString(_resultCmpAll[sampleId]); if (JsonHelper.ParseResultString(_resultCmpAll[sampleId]) == "") { lblResult.Text = _resultCmpAll[sampleId]; } } catch { } } private void btnLocate_Click(object sender, EventArgs e) { if (!_isWorking) { if (_resultSampleSelect > -1 && _resultScanSelect > -1) ToScanPoint(_resultSampleSelect, _resultScanSelect); } } private string GetReportName(string str) { var item = _checkconfig.Items.First((i) => i.Name == str); var name = "Automation.Inclusions";//夹杂物 if (item.Value == "18,5,5" || item.Value == "18,1,5") { name = "Automation.Inclusions";//夹杂物 } if (item.Value == "18,10,0" || item.Value == "18,11,0") { name = "Automation.Grain";//晶粒度 } if (item.Value == "17,16,0") { name = "Automation.HypoeutectoidStrip";//亚共析钢带状 } if (item.Value == "16,4,6") { name = "Automation.BearingSteel";//轴承钢带状 } if (item.Value == "16,2,0") { name = "Automation.BearingSteelMesh";//轴承钢网状 } if (item.Value == "0,0,0") { name = "Automation.OrganizationalIdentification";//组织识别 } if (item.Value == "16,1,0") { name = "Automation.Spheroidization"; //轴承钢球退 } return name; } private void btnReport_Click(object sender, EventArgs e) { PrintReport(false); } private void PrintReport(bool autoFalg) { var str = m_cmbProjuctSelectText; if (string.IsNullOrEmpty(str)) { //MessageBox.Show("检测项目不能为空"); return; } var name = GetReportName(str); var result = new List(); AutoAnalysisReportDialog reportDialog = new AutoAnalysisReportDialog(this, name, result); if (reportDialog.hasModule) { reportDialog.AutoExportFlag = autoFalg; reportDialog.StartPosition = FormStartPosition.CenterScreen; reportDialog.ExportReport = ExportReport; reportDialog.ShowDialog(); } else { reportDialog = null; } } private bool IsDigit(string str) { if (string.IsNullOrEmpty(str)) return false; ASCIIEncoding ascii = new ASCIIEncoding(); byte[] bytestr = ascii.GetBytes(str); foreach (var c in bytestr) { if (c < 48 || c > 57) { return false; } } return true; } /// /// 取得夹杂物中每个级别中最严重的那张图片 /// /// /// private List findWorstResult(List> resultList) { LogHelper.log.Error("输出报告 findWorstResult"); var result = new List(); double maxValue_A = -1; double maxValue_B = -1; double maxValue_C = -1; double maxValue_D = -1; double maxValue_DS = -1; int count = resultList.Count; string fileName_A = ""; string fileName_B = ""; string fileName_C = ""; string fileName_D = ""; string fileName_DS = ""; for (int i = 0; i < count; i++) { List rstOne = resultList[i]; if (rstOne.Count < 2) continue; string rst = rstOne[0]; string[] rstarr = rst.Split('+'); if (rstarr.Length <= 0) continue; //rst = rstarr[0]; foreach (var item in rstarr) { LogHelper.log.Error("输出报告(findWorstResult) " + item + " file name = " + rstOne[1]); string type = item.Substring(0, 1); string type2 = item.Substring(1, 1); int gradeStart = 1; if ("S".Equals(type2)) { gradeStart = 2; type = "DS"; } string grade = item.Substring(gradeStart); bool isDigit = IsDigit(grade); if (isDigit == false) { grade = grade.Substring(0, grade.Length - 1);//后一位是e或s } if ("A".Equals(type)) { double curpj = 0; double.TryParse(grade, out curpj); if (maxValue_A < curpj) { maxValue_A = curpj; fileName_A = rstOne[1]; } } if ("B".Equals(type)) { double curpj = 0; double.TryParse(grade, out curpj); if (maxValue_B < curpj) { maxValue_B = curpj; fileName_B = rstOne[1]; } } if ("C".Equals(type)) { double curpj = 0; double.TryParse(grade, out curpj); if (maxValue_C < curpj) { maxValue_C = curpj; fileName_C = rstOne[1]; } } if ("D".Equals(type)) { double curpj = 0; double.TryParse(grade, out curpj); if (maxValue_D < curpj) { maxValue_D = curpj; fileName_D = rstOne[1]; } } if ("DS".Equals(type)) { double curpj = 0; double.TryParse(grade, out curpj); if (maxValue_DS < curpj) { maxValue_DS = curpj; fileName_DS = rstOne[1]; } } } } if (string.IsNullOrEmpty(fileName_A) == false) { result.Add(fileName_A); LogHelper.log.Error("输出报告 找到A类图片 " + fileName_A); } if ((result.Contains(fileName_B) == false) && (string.IsNullOrEmpty(fileName_B) == false)) { result.Add(fileName_B); LogHelper.log.Error("找到B类图片 " + fileName_B); } if ((result.Contains(fileName_C) == false) && (string.IsNullOrEmpty(fileName_C) == false)) { result.Add(fileName_C); LogHelper.log.Error("找到C类图片 " + fileName_C); } if ((result.Contains(fileName_D) == false) && (string.IsNullOrEmpty(fileName_D) == false)) { result.Add(fileName_D); LogHelper.log.Error("找到D类图片 " + fileName_D); } if ((result.Contains(fileName_DS) == false) && (string.IsNullOrEmpty(fileName_DS) == false)) { result.Add(fileName_DS); LogHelper.log.Error("找到DS类图片 " + fileName_DS); } if (result.Count <= 0) { LogHelper.log.Error("没有找到图片 " + fileName_DS); } return result; } /// /// 取得夹杂物最严重的那张图片 /// /// /// private string findMaxResult(List> resultList) { double maxValue = -1; int count = resultList.Count; string resultFileName = ""; for (int i = 0; i < count; i++) { List rstOne = resultList[i]; if (rstOne.Count < 2) continue; string rst = rstOne[0]; string[] rstarr = rst.Split('+'); if (rstarr.Length <= 0) continue; rst = rstarr[0]; string type = rst.Substring(0, 1); string grade = rst.Substring(1); bool isDigit = IsDigit(grade); if (isDigit == false) { grade = grade.Substring(0, grade.Length - 1); } if ("A".Equals(type)) { double curpj = 0; double.TryParse(grade, out curpj); if (maxValue < curpj) { maxValue = curpj; resultFileName = rstOne[1]; } } } return resultFileName; } /// ///取得夹杂物各个级别最严重视场-zm /// private List findBigResult() { List res = new List(); Dictionary> le = JsonHelper.ParseResultArray(re); foreach (var key in le.Keys) { res.Add(le[key][0]); } return res; } /// /// 取文件夹下随机文件 /// /// /// /// private List GetRandomFiles(string dir) { List lstResult = new List(); if (Directory.Exists(dir) == false) return lstResult; var totalFiles = Directory.GetFiles(dir, "*.jpg"); int count = 1;//只取5张 int totalCount = totalFiles.Count(); if (totalCount <= count) { lstResult.AddRange(totalFiles); return lstResult; } int pos = totalCount / 2 - count / 2; while (lstResult.Count < count) { if (pos >= totalCount) break; var fileName = totalFiles[pos++]; lstResult.Add(fileName); } return lstResult; } /// /// 取文件夹下一个文件 /// /// /// /// private List GetOnlyFile(string dir) { List lstResult = new List(); string filename = dir + "\\report.ai"; if (Directory.Exists(dir) == false) return lstResult; var totalFiles = Directory.GetFiles(dir, "*.jpg"); int count = 1;//只取1张 int totalCount = totalFiles.Count(); if (totalCount <= count) { lstResult.AddRange(totalFiles); return lstResult; } using (System.IO.StreamReader _file = System.IO.File.OpenText(filename)) { using (JsonTextReader reader = new JsonTextReader(_file)) { JObject o = (JObject)JToken.ReadFrom(reader); JObject arrList = JObject.Parse(o["file_results"].ToString()); List gradeList = new List(); foreach (var item in arrList) { string name = item.Key.ToString(); string grade = item.Value.ToString(); if (grade == re) { lstResult.Add(name); break; } } } } return lstResult; } /// /// 输出报表,生成word和excel文件 /// void ExportReport() { //获取word书签与excel单元格的关系,以字典方式存储 List infos = mic_module_infos_BLL.FindAll().FindAll(a => a.analyze_classify == this.autoAnalyzeSettingModel.analyzeClassify); Dictionary tagInfos = new Dictionary(); if (infos != null && infos.Count > 0) { foreach (mic_module_infos info in infos) { tagInfos.Add(info.tag_name, info.cell_position); } } List> inclusionList = new List>(); List bitList = new List(); var name = GetReportName(cmbProjuctSelect.Text); //夹杂物报告 if (name == "Automation.Inclusions") { List inclusionHead = new List(); string path = ""; for (int i = 0; i < _resultCmpAll.Count; i++) { var item = _resultCmpAll[i]; var list = new List(); var rStr = JsonHelper.ParseResultString(item); path = JsonHelper.ParseImagePath(item); //list.Add("样品" + (i + 1) + ", 测试结果:"); //list.Add(rStr); //var path = JsonHelper.ParseImagePath(item); //list.Add(path); //inclusionList.Add(list); if (string.IsNullOrEmpty(rStr)) continue; list = rStr.Split(';').ToList(); var dict = JsonHelper.ParseResultArray(item); foreach (var head in list) { var list1 = dict[head]; foreach (var f in list1) { var list2 = new List(); list2.Add(head); list2.Add(f); LogHelper.log.Debug("head = " + head); LogHelper.log.Debug("f = " + f); inclusionList.Add(list2); } } } //每个级别中最严重的图片记入到报告中 List maxPath = findBigResult(); //去除重复图像 for (int j = 0; j < maxPath.Count; j++) { for (int k = maxPath.Count - 1; k > j; k--) { if (maxPath[k] == maxPath[j]) { maxPath.RemoveAt(k); } } } for (int i = 0; i < maxPath.Count; i++) { if ((string.IsNullOrEmpty(path) == false) && (string.IsNullOrEmpty(maxPath[i]) == false)) { string fileName = path + "\\AI\\" + maxPath[i]; Bitmap bmp = (Bitmap)Image.FromFile(fileName); bmp.Tag = Convert.ToDouble(this.m_rulerPainter.RulerValue * m_rulerPainter.Multiple); bitList.Add(bmp); } } m_reportExporter.CreateAnalysisReport(AutoAnalyzeSettingModel, inclusionList, bitList, tagInfos); } //晶粒度、亚共析钢带状、轴承钢带状、轴承钢网状、球退报告(只有一张) if(name == "Automation.Grain" || name== "Automation.HypoeutectoidStrip" || name== "Automation.BearingSteel"|| name=="Automation.BearingSteelMesh" || name== "Automation.Spheroidization") { int sampleNum = 1; List lstModel = new List(); List> lstBit = new List>(); foreach (var dir in m_lstWorkDir) { List lstBitamp = new List(); var randomFiles = GetOnlyFile(dir + "\\AI"); inclusionList.Clear(); bitList.Clear(); foreach (var fileName in randomFiles) { string f = dir + "\\AI\\" + fileName; if (File.Exists(f) == false) continue; Bitmap bmp = (Bitmap)Image.FromFile(f); bmp.Tag = Convert.ToDouble(this.m_rulerPainter.RulerValue * m_rulerPainter.Multiple); lstBitamp.Add(bmp); } lstBit.Add(lstBitamp); var settingModel = autoAnalyzeSettingModel.Clone(); settingModel.reportNumber = settingModel.reportNumber + "_" + sampleNum.ToString(); sampleNum++; lstModel.Add(settingModel); } m_reportExporter.CreateGrainReport(lstModel, lstBit, lblResultText); MessageBox.Show(PdnResources.GetString("Menu.Analysisreporfoldertoview.text")); } //组织识别、轴承钢退火暂时无报告 #region //else //{ // int sampleNum = 1; // List lstModel = new List(); // List> lstBit = new List>(); // foreach (var dir in m_lstWorkDir) // { // List lstBitamp = new List(); // //任意找5张图片 // var randomFiles = GetRandomFiles(dir + "\\AI"); // inclusionList.Clear(); // bitList.Clear(); // foreach (var fileName in randomFiles) // { // if (File.Exists(fileName) == false) // continue; // Bitmap bmp = (Bitmap)Image.FromFile(fileName); // bmp.Tag = Convert.ToDouble(this.m_rulerPainter.RulerValue * m_rulerPainter.Multiple); // lstBitamp.Add(bmp); // } // lstBit.Add(lstBitamp); // var settingModel = autoAnalyzeSettingModel.Clone(); // settingModel.reportNumber = settingModel.reportNumber + "_" + sampleNum.ToString(); // sampleNum++; // lstModel.Add(settingModel); // } // m_reportExporter.CreateGrainReport(lstModel, lstBit,lblResultText); // MessageBox.Show(PdnResources.GetString("Menu.Analysisreporfoldertoview.text")); //} #endregion } #endregion #region Offline work bool _offlineWorking = false; string _srcDir = ""; List _srcList = new List(); double _x; double _y; void InitOfflineTest() { } private void btnOfflineTest_Click(object sender, EventArgs e) { if (_offlineWorking) { StopWorkOffline(); btnOfflineTest.Text = "脱机运行"; return; } _srcDir = SelectFolder(); if (string.IsNullOrEmpty(_srcDir)) return; _srcList = Directory.GetFiles(_srcDir).ToList(); if (string.IsNullOrEmpty(_dirRoot)) { MessageBox.Show("Please select a dir first."); return; } StartWorkOffline(); btnOfflineTest.Text = "停止"; } void StartWorkOffline() { _offlineWorking = true; _workSampleIndex = 0; _workScanIndex = 0; NewWorkDir(); InitAi(_dirCurrent); //_sampleStage.Reset(); new Thread(RunTimeOffline).Start(); } void StopWorkOffline() { _offlineWorking = false; } private void RunTimeOffline() { while (_offlineWorking) { if (_srcList.Count < NumCol * NumRow * (_workSampleIndex + 1)) { _offlineWorking = false; return; } _x = _stageSettingNow.WorkPoits[_workSampleIndex].X * 1000; _y = _stageSettingNow.WorkPoits[_workSampleIndex].Y * 1000; //_scanGird.Reset(); //_sampleStage.SetState(_sampleIndex, 2); Console.WriteLine("样品" + (_workSampleIndex + 1) + "开始"); // aicontrol.StartAndSetGradeParam(cat, item, json, 100, 0.2755); OfflineWorkflow(); EndGrade(_workSampleIndex); Console.WriteLine("扫描完成"); WaitAiCompleteAll(); //_sampleStage.SetState(_sampleIndex, 3); _workSampleIndex++; //_offlineWorking = false; if (_workSampleIndex >= _stageSettingNow.WorkPoits.Count) _offlineWorking = false; } } private void OfflineWorkflow() { var offx = _stageSettingNow.Width * 1000 / NumCol; var offy = _stageSettingNow.Height * 1000 / NumRow; for (int i = _workScanIndex; i < NumCol * NumRow && _offlineWorking; i++) { _workScanIndex = i; int r = i / NumCol; int c = i % NumCol; if (i == 0) ; else if (c == 0) _y += offy; else if (r % 2 == 0) _x += offx; else _x -= offx; Thread.Sleep(300); aicontrol.PostFileName(CopyFile()); //_scanGird.SetDone(r * NumCol + c); } _workScanIndex = 0; } private string CopyFile() { var file = _srcList[_workScanIndex + NumCol * NumRow * _workSampleIndex]; var disFile = CreateFileOffline(); File.Copy(file, _dirCurrent + "\\" + disFile); return disFile; } private string CreateFileOffline() { var time = DateTime.Now.ToString("yyyyMMddHHmmss");//日期时间 var id = _workSampleIndex;//工位号 var i = _workScanIndex + 1;//图序号 var stage = _stageSettingName;//样品台名称 var fileName = string.Format("{0}_{1}_{2}_{3}_{4}_{5}.jpg", time, i, stage, id, _x, _y); return fileName; } #endregion #region Stage Event public void OnUpdatePosition() { } public void OnTimeoutConnect() { btnStart.Enabled = false; StopWork(); } public void OnErrorSend() { } #endregion private void cmbScanMode_SelectedIndexChanged(object sender, EventArgs e) { _mode = cmbScanMode.SelectedIndex; } private void cmbAutoFocusParm_SelectedIndexChanged(object sender, EventArgs e) { int.TryParse(cmbAutoFocusParm.Text, out _focusInterval); } /// /// 是否包含胶体 /// 1、全胶体 /// 2、部分胶体 /// 3、无胶体 /// /// 源图像 /// private unsafe int CheckPicBoundary(Bitmap source) { int type = 3; Mat gray = null; try { var mat = PaintDotNet.Camera.Tools.ToMat(source); if (mat.Channels() == 3) gray = mat.CvtColor(ColorConversionCodes.BGR2GRAY); else gray = mat; gray.ForEachAsByte(this.Gray_ForEachAsByte); OpenCvSharp.Point leftTop = new OpenCvSharp.Point(0, 0); OpenCvSharp.Point rightTop = new OpenCvSharp.Point(gray.Width - 1, 0); OpenCvSharp.Point leftBottom = new OpenCvSharp.Point(0, gray.Height - 1); OpenCvSharp.Point rightBottom = new OpenCvSharp.Point(gray.Width - 1, gray.Height - 1); byte leftTopV = gray.At(0, 0); byte rightTopV = gray.At(0, gray.Width - 1); byte leftBottomV = gray.At(gray.Height - 1, 0); byte rightBottomV = gray.At(gray.Height - 1, gray.Width - 1); Rect rect; int leftTopNum = 0, rightTopNum = 0, leftBottomNum = 0, rightBottomNum = 0; if (leftTopV == 0) leftTopNum = Cv2.FloodFill(gray, leftTop, new Scalar(0), out rect, null, null, FloodFillFlags.Link8); if (rightTopV == 0) rightTopNum = Cv2.FloodFill(gray, rightTop, new Scalar(0), out rect, null, null, FloodFillFlags.Link8); if (leftBottomV == 0) leftBottomNum = Cv2.FloodFill(gray, leftBottom, new Scalar(0), out rect, null, null, FloodFillFlags.Link8); if (rightBottomV == 0) rightBottomNum = Cv2.FloodFill(gray, rightBottom, new Scalar(0), out rect, null, null, FloodFillFlags.Link8); if (leftTopNum == 0 && rightTopNum == 0 && leftBottomNum == 0 && rightBottomNum == 0) { type = 3; } else if (leftTopNum > 0 && rightTopNum > 0 && leftBottomNum > 0 && rightBottomNum > 0) { type = 1; } else { if (leftTopNum > 10000 || rightTopNum > 10000 || leftBottomNum > 10000 || rightBottomNum > 10000) { type = 2; } } } catch (Exception) { } finally { if (gray != null) { gray.Dispose(); GC.Collect(); } } return type; } private unsafe void Gray_ForEachAsByte(byte* value, int* position) { int y = position[0]; int x = position[1]; if (*value <= 90) { *value = 0; } else { *value = 255; } } private void btnUpData_Click(object sender, EventArgs e) { var dr = MessageBox.Show("请确认是否上传数据?", "upload", MessageBoxButtons.YesNo); if (dr != DialogResult.Yes) return; UploadData(); //UploadDataDialog frm = new UploadDataDialog(infoList); //string str = cmbProjuctSelect.Text; //var item = _checkconfig.Items.First((i) => i.Name == str); //frm.CheckItem = 1;//夹杂物 //if (item.Value == "18,10,0" || item.Value == "18,11,0") //{ // frm.CheckItem = 2;//晶粒度 //} //if(_resultCmpAll.Count > 0) // frm.CheckResult = _resultCmpAll[0]; //frm.ShowDialog(); } private String AnalysisAIFile() { String ret = ""; try { String aiFile = Path.Combine(_dirCurrent, "AI") + "\\report.ai"; if (File.Exists(aiFile)) { using (System.IO.StreamReader _file = System.IO.File.OpenText(aiFile)) { using (JsonTextReader reader = new JsonTextReader(_file)) { try { Dictionary> gradeA = new Dictionary>(); Dictionary> gradeAe = new Dictionary>(); Dictionary> gradeAs = new Dictionary>(); Dictionary> gradeB = new Dictionary>(); Dictionary> gradeBe = new Dictionary>(); Dictionary> gradeBs = new Dictionary>(); Dictionary> gradeC = new Dictionary>(); Dictionary> gradeCe = new Dictionary>(); Dictionary> gradeCs = new Dictionary>(); Dictionary> gradeD = new Dictionary>(); Dictionary> gradeDe = new Dictionary>(); Dictionary> gradeDs = new Dictionary>(); JObject o = (JObject)JToken.ReadFrom(reader); JObject arrList = JObject.Parse(o["file_results"].ToString()); foreach (var item in arrList) { string temp = item.Value.ToString(); string[] v = temp.Split('+'); for (int j = 0; j < v.Length; j++) { //包含A的 if (v[j].IndexOf("A") > -1) { if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0) { if (gradeA.ContainsKey(v[j])) { gradeA[v[j]].Add(item.Key); } else { gradeA.Add(v[j], new List()); gradeA[v[j]].Add(item.Key); } } else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0) { if (gradeAe.ContainsKey(v[j])) { gradeAe[v[j]].Add(item.Key); } else { gradeAe.Add(v[j], new List()); gradeAe[v[j]].Add(item.Key); } } else if (v[j].IndexOf("s") > -1) { if (gradeAs.ContainsKey(v[j])) { gradeAs[v[j]].Add(item.Key); } else { gradeAs.Add(v[j], new List()); gradeAs[v[j]].Add(item.Key); } } } //包含B的 if (v[j].IndexOf("B") > -1) { if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0) { if (gradeB.ContainsKey(v[j])) { gradeB[v[j]].Add(item.Key); } else { gradeB.Add(v[j], new List()); gradeB[v[j]].Add(item.Key); } } else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0) { if (gradeBe.ContainsKey(v[j])) { gradeBe[v[j]].Add(item.Key); } else { gradeBe.Add(v[j], new List()); gradeBe[v[j]].Add(item.Key); } } else if (v[j].IndexOf("s") > -1) { if (gradeBs.ContainsKey(v[j])) { gradeBs[v[j]].Add(item.Key); } else { gradeBs.Add(v[j], new List()); gradeBs[v[j]].Add(item.Key); } } } //包含C的 if (v[j].IndexOf("C") > -1) { if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0) { if (gradeC.ContainsKey(v[j])) { gradeC[v[j]].Add(item.Key); } else { gradeC.Add(v[j], new List()); gradeC[v[j]].Add(item.Key); } } else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0) { if (gradeCe.ContainsKey(v[j])) { gradeCe[v[j]].Add(item.Key); } else { gradeCe.Add(v[j], new List()); gradeCe[v[j]].Add(item.Key); } } else if (v[j].IndexOf("s") > -1) { if (gradeCs.ContainsKey(v[j])) { gradeCs[v[j]].Add(item.Key); } else { gradeCs.Add(v[j], new List()); gradeCs[v[j]].Add(item.Key); } } } //包含D的 if (v[j].IndexOf("D") > -1) { if (v[j].IndexOf("e") < 0 && v[j].IndexOf("S") < 0) { if (gradeD.ContainsKey(v[j])) { gradeD[v[j]].Add(item.Key); } else { gradeD.Add(v[j], new List()); gradeD[v[j]].Add(item.Key); } } else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("S") < 0) { if (gradeDe.ContainsKey(v[j])) { gradeDe[v[j]].Add(item.Key); } else { gradeDe.Add(v[j], new List()); gradeDe[v[j]].Add(item.Key); } } else if (v[j].IndexOf("S") > -1) { if (gradeDs.ContainsKey(v[j])) { gradeDs[v[j]].Add(item.Key); } else { gradeDs.Add(v[j], new List()); gradeDs[v[j]].Add(item.Key); } } } } } //结果JSON JObject res = new JObject(); res.Add("path", o["path"]); //结果显示 String result = ""; //排序,S的都输出,所以无需排序(DS除外) if (gradeA.Count > 0) { string maxStr = ""; foreach (string key in gradeA.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeA[maxStr].Count; i++) { jarr.Add(gradeA[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeAe.Count > 0) { string maxStr = ""; foreach (string key in gradeAe.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeAe[maxStr].Count; i++) { jarr.Add(gradeAe[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeB.Count > 0) { string maxStr = ""; foreach (string key in gradeB.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeB[maxStr].Count; i++) { jarr.Add(gradeB[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeBe.Count > 0) { string maxStr = ""; foreach (string key in gradeBe.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeBe[maxStr].Count; i++) { jarr.Add(gradeBe[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeC.Count > 0) { string maxStr = ""; foreach (string key in gradeC.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeC[maxStr].Count; i++) { jarr.Add(gradeC[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeCe.Count > 0) { string maxStr = ""; foreach (string key in gradeCe.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeCe[maxStr].Count; i++) { jarr.Add(gradeCe[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeD.Count > 0) { string maxStr = ""; foreach (string key in gradeD.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeD[maxStr].Count; i++) { jarr.Add(gradeD[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeDe.Count > 0) { string maxStr = ""; foreach (string key in gradeDe.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeDe[maxStr].Count; i++) { jarr.Add(gradeDe[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeDs.Count > 0) { string maxStr = ""; foreach (string key in gradeDs.Keys) { if (maxStr == "") { maxStr = key; } else { if (string.Compare(maxStr, key, true) < 0) { maxStr = key; } } } JArray jarr = new JArray(); for (int i = 0; i < gradeDs[maxStr].Count; i++) { jarr.Add(gradeDs[maxStr][i]); } if (res.ContainsKey(maxStr)) { } else { result += maxStr + ";"; res.Add(maxStr, jarr); } } if (gradeAs.Count > 0) { foreach (string key in gradeAs.Keys) { result += key + ";"; JArray jarr = new JArray(); for (int i = 0; i < gradeAs[key].Count; i++) { jarr.Add(gradeAs[key][i]); } if (res.ContainsKey(key)) { continue; } else { res.Add(key, jarr); } } } if (gradeBs.Count > 0) { foreach (string key in gradeBs.Keys) { result += key + ";"; JArray jarr = new JArray(); for (int i = 0; i < gradeBs[key].Count; i++) { jarr.Add(gradeBs[key][i]); } if (res.ContainsKey(key)) { continue; } else { res.Add(key, jarr); } } } if (gradeCs.Count > 0) { foreach (string key in gradeCs.Keys) { result += key + ";"; JArray jarr = new JArray(); for (int i = 0; i < gradeCs[key].Count; i++) { jarr.Add(gradeCs[key][i]); } if (res.ContainsKey(key)) { continue; } else { res.Add(key, jarr); } } } return result; } catch (Exception e) { } reader.Close(); _file.Close(); _file.Dispose(); return ""; } } } } catch { } return ret; } public void UploadData() { var name = GetReportName(cmbProjuctSelect.Text); if (name == "Automation.Inclusions") { for (int i = 0; i < _resultCmpAll.Count; i++) { var item = _resultCmpAll[i]; var rStr = JsonHelper.ParseResultString(item); LogHelper.log.Debug("夹杂物结果:" + rStr); m_dataUpload.CheckItem = 1; int m = 1; var table = _tables[i]; m_dataUpload.TESTCODE = table.Rows[0][m++].ToString(); m_dataUpload.SAMPLELOTNO = table.Rows[0][m++].ToString(); m_dataUpload.SAMPLEID = table.Rows[0][m++].ToString(); m_dataUpload.FD_SAMPLE_NO = table.Rows[0][m++].ToString(); m_dataUpload.RECVTIME = table.Rows[0][m++].ToString(); m_dataUpload.FD_SG_SIGN = table.Rows[0][m++].ToString(); m_dataUpload.CheckResult = rStr; m_dataUpload.Send(); } } else if (name == "Automation.Grain") { for (int i = 0; i < _resultCmpAll.Count; i++) { var item = _resultCmpAll[i]; var rStr = item; LogHelper.log.Debug("晶粒度结果:" + rStr); m_dataUpload.CheckItem = 2; int m = 1; var table = _tables[i]; m_dataUpload.TESTCODE = table.Rows[0][m++].ToString(); m_dataUpload.SAMPLELOTNO = table.Rows[0][m++].ToString(); m_dataUpload.SAMPLEID = table.Rows[0][m++].ToString(); m_dataUpload.FD_SAMPLE_NO = table.Rows[0][m++].ToString(); m_dataUpload.RECVTIME = table.Rows[0][m++].ToString(); m_dataUpload.FD_SG_SIGN = table.Rows[0][m++].ToString(); m_dataUpload.CheckResult = rStr; m_dataUpload.Send(); } } } } }