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 System.IO; using Bro.Common; using Bro.Common.Util; using System.Configuration; namespace P066.Data { public partial class Form1 : Form { DirectoryInfo directoryInfo1; DirectoryInfo directoryInfo2; DirectoryInfo directoryInfo3; DirectoryInfo directoryInfo4; private P066RunParam runparam = new P066RunParam(); private ReadFile readfile = new ReadFile(); private WriteFile writefile = new WriteFile(); public Form1() { InitializeComponent(); //ConfigHelper.Save(@"D:\P066-Data\P066XML\1.xml", runparam); var configuraPath = Environment.CurrentDirectory+ "\\Config\\Jin_Mid.xml"; runparam = ConfigHelper.Load(configuraPath); } private void btnLoadData1_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog() != DialogResult.OK) return; directoryInfo1 = new DirectoryInfo(folderBrowserDialog1.SelectedPath); } private void btnLoadData2_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog() != DialogResult.OK) return; directoryInfo2 = new DirectoryInfo(folderBrowserDialog1.SelectedPath); } private void btnLoadData3_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog()!=DialogResult.OK) { return; } directoryInfo3 = new DirectoryInfo(folderBrowserDialog1.SelectedPath); } private void butPictur_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog()!=DialogResult.OK) { return; } directoryInfo4 = new DirectoryInfo(folderBrowserDialog1.SelectedPath); } private void btnAnalyze_Click(object sender, EventArgs e) { //var fileinfos1 = directoryInfo1.GetFiles().ToList().FindAll(a => a.Extension == ".csv"); //List listSum1 = new List(); //List listTask = new List(); //for (int i = 0; i < fileinfos1.Count; i++) //{ // int index = i; // var task= Task.Run(() => { // listSum1.AddRange(GetFileData(fileinfos1[index])); // }); // listTask.Add(task); //} //var fileinfos2 = directoryInfo3.GetFiles().ToList().FindAll(a => a.Extension == ".csv"); //List listSum2 = new List(); //for (int i = 0; i < fileinfos2.Count; i++) //{ // int index = i; // var task = Task.Run(() => { // listSum2.AddRange(GetFileData(fileinfos2[index])); // }); // listTask.Add(task); //} //Task.WaitAll(listTask.ToArray()); //List str = new List(); //var listsumgrb = listSum2.GroupBy(a => a.FileName); //foreach (var item in listsumgrb) //{ // var tst = item.Key; // str.Add(item.Key); //} var Start = DateTime.Now; #region 读取文件夹下的所有文件,并将文件按照上下进行区分;上表格为fileInfo1,下表格为fileInfo2 List fileInfo1 = new List(); List fileInfo2 = new List(); List fileInfo3 = new List(); List fileInfo4 = new List(); Task task1 = new Task(() => { if (directoryInfo1 != null) { GentClassificationFile(directoryInfo1, out List FileInfo1, out List FileInfo2); //fileInfo1复检上文件夹,fileInfo2复检下文件夹 fileInfo1 = FileInfo1; fileInfo2 = FileInfo2; } if (directoryInfo3 != null) { GentClassificationFile(directoryInfo3, out List FileInfo3, out List FileInfo4); //fileInfo3初检上文件夹,fileInfo4初检下文件夹 fileInfo3 = FileInfo3; fileInfo4 = FileInfo4; } }); task1.Start(); task1.Wait(); #endregion var ListReexaminationSum = new List(); //复检报表数据 var ListPreliminarySum = new List(); //初检报表数据 string filenameDir = ""; #region 读取一个表格中所有时间戳并排序 var dataList = GetFileData(fileInfo1[0]); var dataGroup = dataList.GroupBy(a => a.TimeTip); var DataTipsor = new List(); //白夜班总时间戳 var DataNightTipsor = new List(); //夜班时间戳 var DataDayTipsor = new List(); //白天时间戳 foreach (var item in dataGroup) { int.TryParse(item.Key, out int start); DataTipsor.Add(item.Key); if (start > 80000) { DataDayTipsor.Add(item.Key); } else { DataNightTipsor.Add(item.Key); } } DataTipsor.Distinct().ToList().Sort(); DataDayTipsor.Distinct().ToList().Sort(); DataNightTipsor.Distinct().ToList().Sort(); #endregion #region 读取划伤、镀膜破损文件夹文件 if (directoryInfo2 != null) { var fileinfos22 = directoryInfo2.GetFiles().ToList().FindAll(a=>a.Extension==".csv"); for (int i = 0; i < fileinfos22.Count; i++) { var list = GetFileData(fileinfos22[i]); if (fileinfos22[i].Name.Contains("划伤")) { //ScratchI++; //list.ForEach(a => a.Lensnumber = ScratchI); GetMaxSize(list); GetBkLocation(list); ListReexaminationSum.AddRange(list); } else if (fileinfos22[i].Name.Contains("镀膜破损")) { //ZoomI++; //list.ForEach(a => a.Lensnumber = ZoomI); ListReexaminationSum.AddRange(list); } } directoryInfo2 = null; } #endregion var tt1 =DateTime.Now; var taskReexamination = Task.Run (() => { //复检报表 ListReexaminationSum.AddRange(GetClassificationLens(fileInfo1, fileInfo2, DataTipsor)); }); var taskPreliminary = Task.Run(() => { //初检报表 ListPreliminarySum.AddRange(GetClassificationLens(fileInfo3, fileInfo4, DataTipsor)); //合并初检上下报表,输出合并后数据 }); taskReexamination.Wait(); //夜班 var taskNight= Task.Run(() => { #region//将夜班设备判断结果输出到CSV报表中 //ListReexaminationSum.AddRange(GetClassificationLens(fileInfo1, fileInfo2, DataTipsor)); var title12 = $"时间戳,相机序号,设备判断结果,缺陷类型,设备后处理结果,最大尺寸,位置,X,Y,R,角度"; var file12 = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "夜班设备判断结果"}.csv"; File.AppendAllText(file12, title12, Encoding.UTF8); File.AppendAllText(file12, "\r\n"); foreach (var item in DataNightTipsor) { var Lens1 = ListReexaminationSum.FindAll(a => a.TimeTip == item && a.Lensnumber == 1); writefile.WriteJR(Lens1, item, 1, file12); for (int i = 2; i < 5; i++) { var Lens = ListReexaminationSum.FindAll(a => a.TimeTip == item && a.Lensnumber == i); writefile.WriteJR(Lens, "", i, file12); } } #endregion }); //白班 var taskDay = Task.Run(() => { #region//将夜班设备判断结果输出到CSV报表中 //ListReexaminationSum.AddRange(GetClassificationLens(fileInfo1, fileInfo2, DataTipsor)); var title12 = $"时间戳,相机序号,设备判断结果,缺陷类型,设备后处理结果,最大尺寸,位置,X,Y,R,角度"; var file12 = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "白班班设备判断结果"}.csv"; File.AppendAllText(file12, title12, Encoding.UTF8); File.AppendAllText(file12, "\r\n"); foreach (var item in DataDayTipsor) { var Lens1 = ListReexaminationSum.FindAll(a => a.TimeTip == item && a.Lensnumber == 1); writefile.WriteJR(Lens1, item, 1, file12); for (int i = 2; i < 5; i++) { var Lens = ListReexaminationSum.FindAll(a => a.TimeTip == item && a.Lensnumber == i); writefile.WriteJR(Lens, "", i, file12); } } #endregion }); if (directoryInfo4!=null) { Task.Run(() => { List listPicyreSor = new List(); //加载图片时间戳 var directoties = directoryInfo4.GetDirectories(); for (int i = 0; i < directoties.Length; i++) { listPicyreSor.Add(directoties[i].Name); } listPicyreSor.Sort(); #region//将设备判断结果输出到CSV报表中 //ListReexaminationSum.AddRange(GetClassificationLens(fileInfo1, fileInfo2, DataTipsor)); var title12 = $"时间戳,相机序号,设备判断结果,缺陷类型,设备后处理结果,最大尺寸,位置,X,Y,R,角度"; var file12 = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "设备检索结果"}.csv"; File.AppendAllText(file12, title12, Encoding.UTF8); File.AppendAllText(file12, "\r\n"); foreach (var item in listPicyreSor) { var Lens1 = ListReexaminationSum.FindAll(a => a.TimeTip == item && a.Lensnumber == 1); writefile.WriteJR(Lens1, item, 1, file12); for (int i = 2; i < 5; i++) { var Lens = ListReexaminationSum.FindAll(a => a.TimeTip == item && a.Lensnumber == i); writefile.WriteJR(Lens, "", i, file12); } } }); } taskPreliminary.Wait(); var task6 = Task.Run(() => { #region//根据产品编号输出总缺陷报表 if (directoryInfo3 != null) { List ListNoClearNub = new List(); //清除失败数 List ListMayNub = new List(); //复检多检出数数 CompareFile2(ListReexaminationSum, ListPreliminarySum, DataNightTipsor, out ListNoClearNub, out ListMayNub); var title = $"产品编号,镜头编号,总缺陷数量,设备清除数,未清除数,复检多检出数"; var file = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "夜班缺陷总数报表"}.csv"; File.AppendAllText(file, title, Encoding.UTF8); File.AppendAllText(file, "\r\n"); #region 夜班 foreach (var item in DataNightTipsor) { //总缺陷数 var ListLenSum1 = ListPreliminarySum.FindAll(a => a.TimeTip == item && a.Lensnumber == 1 && a.DefectType == "白点" && !a.Result); var listlensum1 = ListLenSum1.Count; //未清除数 var ListLenNoClearSum1 = ListNoClearNub.FindAll(a => a.TimeTip == item && a.Lensnumber == 1 && a.DefectType == "白点" && !a.Result); var listlennoclearsum1 = ListLenNoClearSum1.Count; //设备清除数 var listlenclearsum1 = listlensum1 - listlennoclearsum1; //复检多检出数 var ListLenMaySum1 = ListMayNub.FindAll(a => a.TimeTip == item && a.Lensnumber == 1 && a.DefectType == "白点" && !a.Result); var listlenmaysum1 = ListLenMaySum1.Count; var content1 = $"{item},{1},{listlensum1},{listlenclearsum1},{listlennoclearsum1},{listlenmaysum1}"; File.AppendAllText(file, content1, Encoding.UTF8); File.AppendAllText(file, "\r\n"); for (int i = 2; i < 5; i++) { //总缺陷数 var ListLenSum = ListPreliminarySum.FindAll(a => a.TimeTip == item && a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlensum = ListLenSum.Count; //未清除数 var ListLenNoClearSum = ListNoClearNub.FindAll(a => a.TimeTip == item && a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlennoclearsum = ListLenNoClearSum.Count; //设备清除数 var listlenclearsum = listlensum - listlennoclearsum; //复检多检出数 var ListLenMaySum = ListMayNub.FindAll(a => a.TimeTip == item && a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlenmaysum = ListLenMaySum.Count; var content = $"{""},{i},{listlensum},{listlenclearsum},{listlennoclearsum},{listlenmaysum}"; File.AppendAllText(file, content, Encoding.UTF8); File.AppendAllText(file, "\r\n"); } } var title1 = $"镜头编号,总缺陷数量,设备清除数,清除率"; var file1 = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "夜班缺陷总数报表"}.csv"; File.AppendAllText(file1, title1, Encoding.UTF8); File.AppendAllText(file1, "\r\n"); for (int i =1; i < 5; i++) { //初检缺陷数 var ListLenSum1 = ListPreliminarySum.FindAll(a => a.Lensnumber ==i && a.DefectType == "白点" && !a.Result); var listlensum1 = ListLenSum1.Count; //复检多检出数 var ListLenMaySum1 = ListMayNub.FindAll(a=> a.Lensnumber ==i&& a.DefectType == "白点" && !a.Result); var listlenmaysum1 = ListLenMaySum1.Count; //总缺陷数 var defectSum = listlenmaysum1 + listlensum1; //除尘数 var ListLenNoClearSum1 = ListNoClearNub.FindAll(a => a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlennoclearsum1 = ListLenNoClearSum1.Count; var defectClearSum = listlensum1 - listlennoclearsum1; var content1 = $"{i},{defectSum},{defectClearSum},{(double)(defectSum / defectClearSum)}"; File.AppendAllText(file1, content1, Encoding.UTF8); File.AppendAllText(file1, "\r\n"); } #endregion directoryInfo3 = null; } #endregion }); var task7 = Task.Run(() => { #region//根据产品编号输出总缺陷报表 if (directoryInfo3 != null) { List ListNoClearNub = new List(); //清除失败数 List ListMayNub = new List(); //复检多检出数数 CompareFile2(ListReexaminationSum, ListPreliminarySum, DataDayTipsor, out ListNoClearNub, out ListMayNub); var title = $"产品编号,镜头编号,总缺陷数量,设备清除数,未清除数,复检多检出数"; var file = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "白班缺陷总数报表"}.csv"; File.AppendAllText(file, title, Encoding.UTF8); File.AppendAllText(file, "\r\n"); #region 夜班 foreach (var item in DataDayTipsor) { //总缺陷数 var ListLenSum1 = ListPreliminarySum.FindAll(a => a.TimeTip == item && a.Lensnumber == 1 && a.DefectType == "白点" && !a.Result); var listlensum1 = ListLenSum1.Count; //未清除数 var ListLenNoClearSum1 = ListNoClearNub.FindAll(a => a.TimeTip == item && a.Lensnumber == 1 && a.DefectType == "白点" && !a.Result); var listlennoclearsum1 = ListLenNoClearSum1.Count; //设备清除数 var listlenclearsum1 = listlensum1 - listlennoclearsum1; //复检多检出数 var ListLenMaySum1 = ListMayNub.FindAll(a => a.TimeTip == item && a.Lensnumber == 1 && a.DefectType == "白点" && !a.Result); var listlenmaysum1 = ListLenMaySum1.Count; var content1 = $"{item},{1},{listlensum1},{listlenclearsum1},{listlennoclearsum1},{listlenmaysum1}"; File.AppendAllText(file, content1, Encoding.UTF8); File.AppendAllText(file, "\r\n"); for (int i = 2; i < 5; i++) { //总缺陷数 var ListLenSum = ListPreliminarySum.FindAll(a => a.TimeTip == item && a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlensum = ListLenSum.Count; //未清除数 var ListLenNoClearSum = ListNoClearNub.FindAll(a => a.TimeTip == item && a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlennoclearsum = ListLenNoClearSum.Count; //设备清除数 var listlenclearsum = listlensum - listlennoclearsum; //复检多检出数 var ListLenMaySum = ListMayNub.FindAll(a => a.TimeTip == item && a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlenmaysum = ListLenMaySum.Count; var content = $"{""},{i},{listlensum},{listlenclearsum},{listlennoclearsum},{listlenmaysum}"; File.AppendAllText(file, content, Encoding.UTF8); File.AppendAllText(file, "\r\n"); } } var title1 = $"镜头编号,总缺陷数量,设备清除数,清除率"; var file1 = $"{directoryInfo1.Parent.FullName}\\{filenameDir + "白班缺陷总数报表"}.csv"; File.AppendAllText(file1, title1, Encoding.UTF8); File.AppendAllText(file1, "\r\n"); for (int i = 1; i < 5; i++) { //初检缺陷数 var ListLenSum1 = ListPreliminarySum.FindAll(a => a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlensum1 = ListLenSum1.Count; //复检多检出数 var ListLenMaySum1 = ListMayNub.FindAll(a => a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlenmaysum1 = ListLenMaySum1.Count; //总缺陷数 var defectSum = listlenmaysum1 + listlensum1; //除尘数 var ListLenNoClearSum1 = ListNoClearNub.FindAll(a => a.Lensnumber == i && a.DefectType == "白点" && !a.Result); var listlennoclearsum1 = ListLenNoClearSum1.Count; var defectClearSum = listlensum1 - listlennoclearsum1; var content1 = $"{i},{defectSum},{defectClearSum},{(double)(defectSum / defectClearSum)}"; File.AppendAllText(file1, content1, Encoding.UTF8); File.AppendAllText(file1, "\r\n"); } #endregion directoryInfo3 = null; } #endregion }); Task.WaitAll(new Task[]{ taskNight, taskDay, task6, task7 }); var tt2 =DateTime.Now; var sumtt = tt2 - tt1; var End = DateTime.Now; var Time = Start - End; MessageBox.Show("处理完毕,用时"+Convert.ToString(Time)); } #region 两个表格进行比较,如果两个表格中有设备判断标准不统一,将该点变为NG,删除两个表格中NG点相近的最小尺寸点. private List CompareFile(FileInfo fileInfo1, FileInfo fileInfo2,List DataTipsor) { var dataList1 = GetFileData(fileInfo1); var dataList2 = GetFileData(fileInfo2); var dataList = new List(); foreach (var item in DataTipsor) { var list1 = dataList1.FindAll(a => a.TimeTip == item && !a.Result); var list2 = dataList2.FindAll(a => a.TimeTip == item && !a.Result); var itemToRemove = new List(); //计算表格1最大尺寸 GetMaxSize(list1); //计算表格2最大尺寸 GetMaxSize(list2); for (int i = 0; i < list1.Count; i++) { for (int j = 0; j < list2.Count; j++) { if (list1[i].JudgmentResult != list2[j].JudgmentResult) { list1[i].JudgmentResult = list2[j].JudgmentResult = "NG"; } if (list1[i].PostTreatmentResults.Lengthlist2[j].ex) { itemToRemove.Add(list2[j]); } else { itemToRemove.Add(list1[i]); } } } } dataList.AddRange(list1); dataList.AddRange(list2); for (int i = 0; i < itemToRemove.Count; i++) { dataList.Remove(itemToRemove[i]); } } return dataList; } #endregion #region 获取中框角度和位置 private List GetMidLocation(List list) { var group = list.GroupBy(a => a.TimeTip); foreach (var item in group) { //计算镜头1缺陷位置及角度 var ListLenSum1 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 1); for (int k = 0; k < ListLenSum1.Count; k++) { var lenAngle = GetAngle(ListLenSum1[k].X, ListLenSum1[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } ListLenSum1[k].angle = lenAngle; var distance = GetDistance(1050, 1050, ListLenSum1[k].X, ListLenSum1[k].Y); ListLenSum1[k].R = distance; if (distance <= runparam.MidLens1R1) { ListLenSum1[k].location = "镜头"; } else if (runparam.MidLens1R1 < distance && distance <= runparam.MidLens1R2) { ListLenSum1[k].location = "斜面"; } else { ListLenSum1[k].location = "平面"; } } //计算镜头2位置及角度 var listLensnumber2 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 2); for (int k = 0; k < listLensnumber2.Count; k++) { var lenAngle = GetAngle(listLensnumber2[k].X, listLensnumber2[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber2[k].angle = lenAngle; var distance = GetDistance(1050, 1050, listLensnumber2[k].X, listLensnumber2[k].Y); listLensnumber2[k].R = distance; if (distance <= runparam.MidLens2R1) { listLensnumber2[k].location = "镜头"; } else if (runparam.MidLens2R1 < distance && distance <= runparam.MidLens2R2) { listLensnumber2[k].location = "斜面"; } else { listLensnumber2[k].location = "平面"; } } //计算镜头3位置及角度 var listLensnumber3 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 3); for (int k = 0; k < listLensnumber3.Count; k++) { var lenAngle = GetAngle(listLensnumber3[k].X, listLensnumber3[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber3[k].angle = lenAngle; var distance = GetDistance(1050, 1050, listLensnumber3[k].X, listLensnumber3[k].Y); listLensnumber3[k].R = distance; if (distance <= runparam.MidLens3R1) { listLensnumber3[k].location = "镜头"; } else if ( runparam.MidLens3R1< distance && distance <= runparam.MidLens3R2) { listLensnumber3[k].location = "斜面"; } else { listLensnumber3[k].location = "平面"; } } //计算镜头4位置及角度 var listLensnumber4 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 4); for (int k = 0; k < listLensnumber4.Count; k++) { var lenAngle = GetAngle(listLensnumber4[k].X, listLensnumber4[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber4[k].angle = lenAngle; var distance = GetDistance(1050, 1050, listLensnumber4[k].X, listLensnumber4[k].Y); listLensnumber4[k].R = distance; if (distance <= runparam.MidLens4R1) { listLensnumber4[k].location = "镜头"; } else if (runparam.MidLens4R1 < distance && distance <= runparam.MidLens4R2) { listLensnumber4[k].location = "斜面"; } else { listLensnumber4[k].location = "平面"; } } } return list; } #endregion #region 获取中框刮白角度和位置 private List GetWhiteLocation(List list) { var group = list.GroupBy(a => a.TimeTip); foreach (var item in group) { //计算镜头1缺陷位置及角度 var ListLenSum1 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 1); for (int k = 0; k < ListLenSum1.Count; k++) { var lenAngle = GetAngle(ListLenSum1[k].X, ListLenSum1[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } ListLenSum1[k].angle = lenAngle; var distance = GetDistance(1050, 1050, ListLenSum1[k].X, ListLenSum1[k].Y); ListLenSum1[k].R = distance; if (distance <= runparam.MidLens1R1) { ListLenSum1[k].location = "镜头"; } else if (runparam.MidLens1R1 < distance && distance <= runparam.MidLens1R2) { ListLenSum1[k].location = "斜面"; } else if(runparam.MidLens1R2 < distance && distance <= runparam.BkLens1R1) { ListLenSum1[k].location = "平面可视区"; } else { ListLenSum1[k].location = "平面非可视区"; } } //计算镜头2位置及角度 var listLensnumber2 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 2); for (int k = 0; k < listLensnumber2.Count; k++) { var lenAngle = GetAngle(listLensnumber2[k].X, listLensnumber2[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber2[k].angle = lenAngle; var distance = GetDistance(1050, 1050, listLensnumber2[k].X, listLensnumber2[k].Y); listLensnumber2[k].R = distance; if (distance <= runparam.MidLens2R1) { listLensnumber2[k].location = "镜头"; } else if (runparam.MidLens2R1 < distance && distance <= runparam.MidLens2R2) { listLensnumber2[k].location = "斜面"; } else if (runparam.MidLens2R2 < distance && distance <= runparam.BkLens2R1) { listLensnumber2[k].location = "平面可视区"; } else { listLensnumber2[k].location = "平面非可视区"; } } //计算镜头3位置及角度 var listLensnumber3 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 3); for (int k = 0; k < listLensnumber3.Count; k++) { var lenAngle = GetAngle(listLensnumber3[k].X, listLensnumber3[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber3[k].angle = lenAngle; var distance = GetDistance(1050, 1050, listLensnumber3[k].X, listLensnumber3[k].Y); listLensnumber3[k].R = distance; if (distance <= runparam.MidLens3R1) { listLensnumber3[k].location = "镜头"; } else if (runparam.MidLens3R1 < distance && distance <= runparam.MidLens3R2) { listLensnumber3[k].location = "斜面"; } else if (runparam.MidLens3R2 < distance && distance <= runparam.BkLens3R1) { listLensnumber3[k].location = "平面可视区"; } else { listLensnumber3[k].location = "平面非可视区"; } } //计算镜头4位置及角度 var listLensnumber4 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 4); for (int k = 0; k < listLensnumber4.Count; k++) { var lenAngle = GetAngle(listLensnumber4[k].X, listLensnumber4[k].Y,1050); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber4[k].angle = lenAngle; var distance = GetDistance(1050, 1050, listLensnumber4[k].X, listLensnumber4[k].Y); listLensnumber4[k].R = distance; if (distance <= runparam.MidLens4R1) { listLensnumber4[k].location = "镜头"; } else if (runparam.MidLens4R1 < distance && distance <= runparam.MidLens4R2) { listLensnumber4[k].location = "斜面"; } else if (runparam.MidLens4R2 < distance && distance <= runparam.BkLens4R1) { listLensnumber4[k].location = "平面可视区"; } else { listLensnumber4[k].location = "平面非可视区"; } } } return list; } #endregion #region 获取背板角度和位置 private List GetBkLocation(List list) { var group = list.GroupBy(a => a.TimeTip); foreach (var item in group) { //计算镜头1缺陷位置及角度 var ListLenSum1 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 1); for (int k = 0; k < ListLenSum1.Count; k++) { var lenAngle = GetAngle(ListLenSum1[k].X, ListLenSum1[k].Y,1350); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } ListLenSum1[k].angle = lenAngle; var distance = GetDistance(1350, 1350, ListLenSum1[k].X, ListLenSum1[k].Y); ListLenSum1[k].R = distance; if (distance <= runparam.BkLens1R1) { ListLenSum1[k].location = "可视区"; } else { ListLenSum1[k].location = "非可视区"; } } //计算镜头2位置及角度 var listLensnumber2 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 2); for (int k = 0; k < listLensnumber2.Count; k++) { var lenAngle = GetAngle(listLensnumber2[k].X, listLensnumber2[k].Y,1350); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber2[k].angle = lenAngle; var distance = GetDistance(1350, 1350, listLensnumber2[k].X, listLensnumber2[k].Y); listLensnumber2[k].R = distance; if (distance <= runparam.BkLens2R1) { listLensnumber2[k].location = "可视区"; } else { listLensnumber2[k].location = "非可视区"; } } //计算镜头3位置及角度 var listLensnumber3 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 3); for (int k = 0; k < listLensnumber3.Count; k++) { var lenAngle = GetAngle(listLensnumber3[k].X, listLensnumber3[k].Y,1350); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber3[k].angle = lenAngle; var distance = GetDistance(1350, 1350, listLensnumber3[k].X, listLensnumber3[k].Y); listLensnumber3[k].R = distance; if (distance <= runparam.BkLens3R1) { listLensnumber3[k].location = "可视区"; } else { listLensnumber3[k].location = "非可视区"; } } //计算镜头4位置及角度 var listLensnumber4 = list.FindAll(a => a.TimeTip == item.Key && a.Lensnumber == 4); for (int k = 0; k < listLensnumber4.Count; k++) { var lenAngle = GetAngle(listLensnumber4[k].X, listLensnumber4[k].Y,1350); if (lenAngle < 0) { lenAngle = 360 + lenAngle; } listLensnumber4[k].angle = lenAngle; var distance = GetDistance(1350, 1350, listLensnumber4[k].X, listLensnumber4[k].Y); listLensnumber4[k].R = distance; if (distance <= runparam.BkLens4R1) { listLensnumber4[k].location = "可视区"; } else { listLensnumber4[k].location = "非可视区"; } } } return list; } #endregion #region 计算两点之间距离 private double GetDistance(double x1, double y1, double x2, double y2) { return Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2)); } #endregion #region 计算角度 private double GetAngle(double x1, double y1,double size) { return Math.Atan2((y1 - size), (x1 - size)) * (180 / Math.PI); } #endregion #region 计算最大尺寸 private List GetMaxSize(List list) { for (int i = 0; i < list.Count; i++) { if (list[i].Width > list[i].Height) { list[i].ex = list[i].Width * 0.0043; } else { list[i].ex = list[i].Height * 0.0043; } } return list; } #endregion #region 获取文件名称并确定缺陷类型 private string GetDefactType(FileInfo fileinfo) { string defatType=""; if (fileinfo.Name.Contains("白点")) { defatType= "白点"; } else if (fileinfo.Name.Contains("刮白")) { defatType = "刮白"; } else if (fileinfo.Name.Contains("镀膜破损")) { defatType = "镀膜破损"; } else if (fileinfo.Name.Contains("划伤")) { defatType = "划伤"; } return defatType; } #endregion #region 将文件夹进行区分上表格、下表格 private void GentClassificationFile(DirectoryInfo directoryInfo,out List fileinfo1, out List fileinfo2) { var fileinfos11 = directoryInfo.GetFiles().ToList().FindAll(a => a.Extension == ".csv"); List fileInfo1 = new List(); List fileInfo2 = new List(); for (int i = 0; i < fileinfos11.Count; i++) { if (fileinfos11[i].Name.Contains("1_1") || fileinfos11[i].Name.Contains("2_1") || fileinfos11[i].Name.Contains("3_1") || fileinfos11[i].Name.Contains("4_1")) { fileInfo1.Add(fileinfos11[i]); } else { fileInfo2.Add(fileinfos11[i]); } } fileinfo1 = fileInfo1; fileinfo2 = fileInfo2; } #endregion #region 获取白点、刮白数据并按镜头输出 private List GetClassificationLens(List fileInfo1, List fileInfo2, List DataTipsor) { List ListReexaminationSum = new List(); List listTask = new List(); for (int i = 0; i < fileInfo1.Count; i++) { int index = i; Task task = new Task(() => { var list = CompareFile(fileInfo1[index], fileInfo2[index], DataTipsor); ListReexaminationSum.AddRange(list); if (fileInfo1[index].Name.Contains("初检中框")) { list = GetMidLocation(list); } else if (fileInfo1[index].Name.Contains("复检中框") && fileInfo1[index].Name.Contains("白点")) { list = GetMidLocation(list); } else if (fileInfo1[index].Name.Contains("复检中框") && fileInfo1[index].Name.Contains("刮白")) { list = GetWhiteLocation(list); } else if (fileInfo1[index].Name.Contains("初检背板")) { //给镜头区分位置及角度 list = GetBkLocation(list); } else if (fileInfo1[index].Name.Contains("复检背板") && fileInfo1[index].Name.Contains("白点")) { list = GetBkLocation(list); } }); task.Start(); listTask.Add(task); } Task.WaitAll(listTask.ToArray()); return ListReexaminationSum; } #endregion #region //统计设备未清除数、复检多检出数 private void CompareFile2(List ListReexaminationSum, List ListPreliminarySum,List DataTipsor, out List ListNoClearNub, out List ListMayNub) //ListReexaminationSum是复检数据,ListPreliminarySum是初检数据 { var listNCN = new List(); //var listmany = new List(); var itemToRemove = new List(); for (int i = 0; i < DataTipsor.Count; i++) { for (int j = 1; j < 5; j++) { var ListReexaminationLens = ListReexaminationSum.FindAll(a => a.TimeTip == DataTipsor[i] && a.Lensnumber == j&&a.DefectType=="白点"&&!a.Result); var ListPreliminaryLens = ListPreliminarySum.FindAll(a => a.TimeTip == DataTipsor[i] && a.Lensnumber == j && a.DefectType == "白点" && !a.Result); for (int k = 0; k < ListPreliminaryLens.Count; k++) { for (int L = 0; L < ListReexaminationLens.Count; L++) { var distance = GetDistance(ListPreliminaryLens[k].X, ListPreliminaryLens[k].Y, ListReexaminationLens[L].X, ListReexaminationLens[L].Y); if (distance<20) { listNCN.Add(ListReexaminationLens[L]); //未清除数 } } } } } var listmany = ListReexaminationSum.FindAll(a => a.DefectType == "白点" && !a.Result); for (int M = 0; M < listNCN.Count; M++) { listmany.Remove(listNCN[M]); } ListNoClearNub = listNCN; ListMayNub = listmany; } #endregion private List GetFileData(FileInfo fileInfos) { var allLines = File.ReadAllLines(fileInfos.FullName, Encoding.Default); List dataList = new List(); if (allLines.Length > 1) { switch (GetDefactType(fileInfos)) { case "白点": dataList = readfile.GetWhiteFile(allLines); break; case "刮白": dataList = readfile.GetWhiteningFile(allLines); break; case "划伤": dataList = readfile.GetScratchPartFile(allLines); break; case "镀膜破损": dataList = readfile.GetZoomPartFile(allLines); break; } } return dataList; } } } #endregion