using SA_LTT; using SA_LTT.Module; using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace SA_LTT_UI.Viewer { public partial class ScannerViewer : Form { MainFrame _mainFrame; Thread t_UIUpdate; Scanner scanner; object _lockObject = new object(); bool updateCheck; protected override CreateParams CreateParams { get { CreateParams MyCp = base.CreateParams; MyCp.ExStyle |= 0x02000000; return MyCp; } } delegate void ScanListAddDelegate(Coord coord); public ScannerViewer(MainFrame mainFrame) { InitializeComponent(); _mainFrame = mainFrame; cbb_ScanMode.SelectedIndex = 0; scanner = new Scanner(); _mainFrame.equipment.scanner.ScanListAdded += Scanner_ScanListAdded; _mainFrame.equipment.scanner.ScanListCleared += Scanner_ScanListCleared; t_UIUpdate = new Thread(UIUpdateTh); t_UIUpdate.Start(); SettingRefresh(); } private void SettingRefresh() { scanner.Copy(_mainFrame.equipment.scanner); tb_CorrectionFilePath.Text = $"{scanner.CorrectionFilePath}"; tb_EncoderCountPerMmX.Text = $"{scanner.EncoderCountPerMmX}"; tb_EncoderCountPerMmY.Text = $"{scanner.EncoderCountPerMmY}"; tb_BitsPerMm.Text = $"{scanner.BitsPerMm}"; tb_FOV.Text = $"{scanner.FOV}"; tb_HalfPeriod.Text = $"{scanner.HalfPeriod}"; tb_PulseLength.Text = $"{scanner.PulseLength1}"; tb_LaserOnDelay.Text = $"{scanner.LaserOnDelay}"; tb_LaserOffDelay.Text = $"{scanner.LaserOffDelay}"; tb_JumpDelay.Text = $"{scanner.JumpDelay}"; tb_MarkDelay.Text = $"{scanner.MarkDelay}"; tb_PolygonDelay.Text = $"{scanner.PolygonDelay}"; } private void Scanner_ScanListAdded(Coord coord) { if (InvokeRequired) { BeginInvoke(new ScanListAddDelegate(Scanner_ScanListAdded), coord); return; } else { lock (_lockObject) { ListViewItem lvi = new ListViewItem(lv_ScanList.Items.Count.ToString()); lvi.SubItems.Add(coord.ScanMode.ToString()); lvi.SubItems.Add((coord.X / scanner.BitsPerMm).ToString("f3")); lvi.SubItems.Add((coord.Y / scanner.BitsPerMm).ToString("f3")); lv_ScanList.Items.Add(lvi); } } } private void Scanner_ScanListCleared() { if (InvokeRequired) { BeginInvoke(new ScanListCleared(Scanner_ScanListCleared)); return; } else { lock (_lockObject) { lv_ScanList.Items.Clear(); } } } private void UIUpdateTh() { while (_mainFrame.equipment.IsDisposed == false) { Thread.Sleep(10); if (updateCheck == false) { updateCheck = true; UIUpdate(); } } } private void UIUpdate() { if (InvokeRequired) { BeginInvoke(new UIUpdateDelegate(UIUpdate)); return; } else { try { tb_ProcessPosition.Text = _mainFrame.equipment.scanner.IsPosition.ToString(); tb_BitsPerMm.Text = scanner.BitsPerMm.ToString(); lb_Initialized.BackColor = _mainFrame.equipment.scanner.IsInitialized ? System.Drawing.Color.Lime : System.Drawing.Color.Red; lb_Busy.BackColor = _mainFrame.equipment.scanner.IsBusy ? System.Drawing.Color.Lime : System.Drawing.Color.Red; tb_CorrectionFilePath.BackColor = scanner.CorrectionFilePath == _mainFrame.equipment.scanner.CorrectionFilePath ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_EncoderCountPerMmX.BackColor = scanner.EncoderCountPerMmX == _mainFrame.equipment.scanner.EncoderCountPerMmX ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_EncoderCountPerMmY.BackColor = scanner.EncoderCountPerMmY == _mainFrame.equipment.scanner.EncoderCountPerMmY ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_BitsPerMm.BackColor = scanner.BitsPerMm == _mainFrame.equipment.scanner.BitsPerMm ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_FOV.BackColor = scanner.FOV == _mainFrame.equipment.scanner.FOV ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_HalfPeriod.BackColor = scanner.HalfPeriod == _mainFrame.equipment.scanner.HalfPeriod ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_PulseLength.BackColor = scanner.PulseLength1 == _mainFrame.equipment.scanner.PulseLength1 ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_LaserOnDelay.BackColor = scanner.LaserOnDelay == _mainFrame.equipment.scanner.LaserOnDelay ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_LaserOffDelay.BackColor = scanner.LaserOffDelay == _mainFrame.equipment.scanner.LaserOffDelay ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_JumpDelay.BackColor = scanner.JumpDelay == _mainFrame.equipment.scanner.JumpDelay ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_MarkDelay.BackColor = scanner.MarkDelay == _mainFrame.equipment.scanner.MarkDelay ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_PolygonDelay.BackColor = scanner.PolygonDelay == _mainFrame.equipment.scanner.PolygonDelay ? System.Drawing.Color.White : System.Drawing.Color.Red; btn_LaserOn.BackColor = _mainFrame.equipment.scanner.IsLaserOn ? System.Drawing.Color.Lime : System.Drawing.Color.Red; btn_LaserOff.BackColor = !_mainFrame.equipment.scanner.IsLaserOn ? System.Drawing.Color.Lime : System.Drawing.Color.Red; } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); } finally { updateCheck = false; } } } private void SettingData_Leave(object sender, EventArgs e) { SetSettingData(sender); } private void SettingData_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { SetSettingData(sender); } } private void SetSettingData(object sender) { TextBox textBox = (TextBox)sender; double doubleData; int intData; uint uintData; switch (textBox.Name) { case "tb_CorrectionFilePath": { scanner.CorrectionFilePath = tb_CorrectionFilePath.Text; break; } case "tb_EncoderCountPerMmX": { int.TryParse(tb_EncoderCountPerMmX.Text, out intData); scanner.EncoderCountPerMmX = intData; textBox.Text = $"{intData}"; break; } case "tb_EncoderCountPerMmY": { int.TryParse(tb_EncoderCountPerMmY.Text, out intData); scanner.EncoderCountPerMmY = intData; textBox.Text = $"{intData}"; break; } case "tb_FOV": { double.TryParse(tb_FOV.Text, out doubleData); scanner.FOV = doubleData; textBox.Text = $"{doubleData}"; break; } case "tb_HalfPeriod": { uint.TryParse(tb_HalfPeriod.Text, out uintData); scanner.HalfPeriod = uintData; textBox.Text = $"{uintData}"; break; } case "tb_PulseLength": { uint.TryParse(tb_PulseLength.Text, out uintData); scanner.PulseLength1 = uintData; textBox.Text = $"{uintData}"; break; } case "tb_LaserOnDelay": { int.TryParse(tb_LaserOnDelay.Text, out intData); scanner.LaserOnDelay = intData; textBox.Text = $"{intData}"; break; } case "tb_LaserOffDelay": { uint.TryParse(tb_LaserOffDelay.Text, out uintData); scanner.LaserOffDelay = uintData; textBox.Text = $"{uintData}"; break; } case "tb_JumpDelay": { uint.TryParse(tb_JumpDelay.Text, out uintData); scanner.JumpDelay = uintData; textBox.Text = $"{uintData}"; break; } case "tb_MarkDelay": { uint.TryParse(tb_MarkDelay.Text, out uintData); scanner.MarkDelay = uintData; textBox.Text = $"{uintData}"; break; } case "tb_PolygonDelay": { uint.TryParse(tb_PolygonDelay.Text, out uintData); scanner.PolygonDelay = uintData; textBox.Text = $"{uintData}"; break; } } } private void btn_GetEncoder_Click(object sender, EventArgs e) { if (_mainFrame.equipment.scanner.GetEncoder()) { tb_Encoder0.Text = _mainFrame.equipment.scanner.Encoder0.ToString(); tb_Encoder1.Text = _mainFrame.equipment.scanner.Encoder1.ToString(); } } private void btn_Add_Click(object sender, EventArgs e) { ScanMode scanmode = (ScanMode)cbb_ScanMode.SelectedIndex; double posX; double posY; double.TryParse(tb_PosX.Text, out posX); double.TryParse(tb_PosY.Text, out posY); _mainFrame.equipment.scanner.AddScanList(scanmode, posX, posY); } private void btn_Clear_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.ClearScanList(); } private void btn_Run_Click(object sender, EventArgs e) { double markSpeed; double jumpSpeed; double.TryParse(tb_MarkSpeed.Text, out markSpeed); double.TryParse(tb_JumpSpeed.Text, out jumpSpeed); _mainFrame.equipment.scanner.SetScannerDelay(); _mainFrame.equipment.scanner.SetLaserTiming(); _mainFrame.equipment.scanner.SetLaserDelays(); _mainFrame.equipment.scanner.SetJumpMarkSpeed(jumpSpeed, markSpeed); _mainFrame.equipment.scanner.ExcuteScanList(); } private void btn_Stop_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.Stop(); } private void btn_Cancel_Click(object sender, EventArgs e) { SettingRefresh(); } private void btn_Save_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.Copy(scanner); _mainFrame.equipment.scanner.Save(); } private void ScannerViewer_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; this.Hide(); } private void lb_Initialized_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.Initialize(); } private void btn_LaserOn_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.LaserOn(); } private void btn_LaserOff_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.LaserOff(); } private void btn_AddScanField_Click(object sender, EventArgs e) { _mainFrame.equipment.scanner.ClearScanList(); int lineCount = (int)nud_LineCount.Value; double fieldSize = 0; if(double.TryParse(tb_FieldSize.Text, out fieldSize)) { _mainFrame.equipment.scanner.AddScanField(lineCount, fieldSize); } } //오래걸림 스레드로 돌려야 될지도 ..? private void SaveScanFieldExcel(int lineCount, double fieldSize) { try { var excelApp = new Excel.Application(); excelApp.Visible = false; Excel.Workbook workBook = excelApp.Workbooks.Add(); workBook.Worksheets.Add(); Excel._Worksheet workSheet = workBook.Worksheets.get_Item(1) as Excel.Worksheet; double lineMax = fieldSize / 2; double lineMin = -(fieldSize / 2); double intervalLength = fieldSize / (lineCount - 1); intervalLength = double.Parse(intervalLength.ToString("F3")); List bitsX = new List(); List bitsY = new List(); List positionsX = new List(); List positionsY = new List(); for (int i = -(lineCount - 1) / 2; i <= (lineCount - 1) / 2; i++) { bitsX.Add((int)Math.Floor((intervalLength * i) * _mainFrame.equipment.scanner.BitsPerMm)); bitsY.Add((int)Math.Floor(-(intervalLength * i) * _mainFrame.equipment.scanner.BitsPerMm)); positionsX.Add(intervalLength * i); positionsY.Add(-intervalLength * i); } for (int i = 0; i < lineCount; i++) { for (int j = 0; j < lineCount; j++) { workSheet.Cells[1 + (i * 4), 1 + (j * 2)] = bitsX[j]; workSheet.Cells[1 + (i * 4), 2 + (j * 2)] = bitsY[i]; workSheet.Cells[2 + (i * 4), 1 + (j * 2)] = positionsX[j]; workSheet.Cells[2 + (i * 4), 2 + (j * 2)] = positionsY[i]; workSheet.Cells[3 + (i * 4), 1 + (j * 2)] = ""; workSheet.Cells[3 + (i * 4), 2 + (j * 2)] = ""; workSheet.Cells[3 + (i * 4), 1 + (j * 2)].Interior.Color = System.Drawing.Color.PaleGreen; workSheet.Cells[3 + (i * 4), 2 + (j * 2)].Interior.Color = System.Drawing.Color.PaleGreen; workSheet.Cells[4 + (i * 4), 1 + (j * 2)] = $"= {(char)(65 + (j * 2))}{2 + (i * 4)} - {(char)(65 + (j * 2))}{3 + (i * 4)} "; workSheet.Cells[4 + (i * 4), 2 + (j * 2)] = $"= {(char)(66 + (j * 2))}{2 + (i * 4)} - {(char)(66 + (j * 2))}{3 + (i * 4)} "; } } workSheet.Columns[1].AutoFit(); workSheet.Columns[2].AutoFit(); workBook.SaveAs(@"D:\ScannerField.xls"); //workBook.Save(); workBook.Close(true, System.Reflection.Missing.Value, System.Reflection.Missing.Value); excelApp.Quit(); Marshal.ReleaseComObject(workSheet); Marshal.ReleaseComObject(workBook); Marshal.ReleaseComObject(excelApp); } catch (Exception ex) { MessageBoxPad mbp = new MessageBoxPad("Excel 쓰기 실패" + ex.Message); mbp.Show(); } } private void ReadScanFieldExcel(int lineCount, string filePath = @"D:\ScannerField.xls") { try { List result = new List(); DateTime dt = DateTime.Now; StringBuilder sb = new StringBuilder(); sb.Clear(); sb.AppendLine($"OLDCTFILE = Cor_1to1.ct5"); sb.AppendLine($"NEWCTFILE = Correction_{dt.ToString("HH_mm")}.ct5"); sb.AppendLine($"TOLERANCE = 0"); sb.AppendLine($"NEWCAL = {_mainFrame.equipment.scanner.BitsPerMm}"); sb.AppendLine("LIMITS"); var excelApp = new Excel.Application(); excelApp.Visible = false; Excel.Workbook workBook = excelApp.Workbooks.Open(filePath); Excel._Worksheet workSheet = workBook.Worksheets.get_Item(1) as Excel.Worksheet; Excel.Range range = workSheet.UsedRange; object[,] data = (object[,])range.Value; for (int row = 1; row <= data.GetLength(0); row += 4) { int length = data.GetLength(1); string[] arr = new string[lineCount]; for (int column = 1; column <= length; column += 2) { double xbit = double.Parse($"{data[row, column]:F3}"); double ybit = double.Parse($"{data[row, column + 1]:F3}"); double xdata = double.Parse($"{data[row + 2, column] :F3}"); double ydata= double.Parse($"{data[row + 2, column + 1]:F3}"); sb.AppendLine($"{xbit} {ybit} {xdata} {ydata}"); } } workBook.Close(); excelApp.Quit(); Marshal.ReleaseComObject(workSheet); Marshal.ReleaseComObject(workBook); Marshal.ReleaseComObject(excelApp); using (FileStream fs = new FileStream($@"D:\Correction_{dt.ToString("HH_mm")}.ct5.dat", FileMode.Create)) { using (StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("ks_c_5601-1987"))) { sw.Write(sb); } } } catch (Exception ex) { MessageBoxPad mbp = new MessageBoxPad("Excel 변환 실패" + ex.Message); mbp.Show(); } } private void btn_Shot_Click(object sender, EventArgs e) { Thread laserOffThread = new Thread(LaserOff); laserOffThread.Start(); } private void LaserOff() { int laserShotTime = (int)nud_LaserShotTime.Value; _mainFrame.equipment.scanner.LaserOn(); Thread.Sleep(laserShotTime); _mainFrame.equipment.scanner.LaserOff(); } private void btn_WriteExcel_Click(object sender, EventArgs e) { int lineCount = (int)nud_LineCount.Value; double fieldSize = 0; if (double.TryParse(tb_FieldSize.Text, out fieldSize)) { SaveScanFieldExcel(lineCount, fieldSize); } } private void btn_ReadExcel_Click(object sender, EventArgs e) { int lineCount = (int)nud_LineCount.Value; double fieldSize = 0; if (double.TryParse(tb_FieldSize.Text, out fieldSize)) { ReadScanFieldExcel(lineCount); } } private void btn_CorrectionFilePathOpen_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { tb_CorrectionFilePath.Text = ofd.FileName; SetSettingData((object)tb_CorrectionFilePath); } } } }