Files
ATV_STDLabelAttach/Handler/Project_form2/Util.cs
2025-07-17 16:11:46 +09:00

615 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Windows.Forms;
namespace Project
{
public static class Util
{
public static Boolean TouchKeyShow(TextBox tb,string title)
{
//입력창 표시
var f = new Dialog.fTouchKeyFull(title, tb.Text);
if (f.ShowDialog() == DialogResult.OK)
{
tb.Text = f.tbInput.Text;
tb.Focus();
tb.SelectAll();
return true;
}
else return false;
}
#region "MessageBox"
public static void MsgI(string m, Boolean legacy = false)
{
if (legacy)
MessageBox.Show(m, "확인", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
{
var f = new fMsgQuestion("알림\n" + m, "확인", "");
f.lbTitle.BackColor = Color.DeepSkyBlue;
f.lbTitle.BackColor2 = Color.DodgerBlue;
f.EnableUserClose = true;
f.DialogMode = true;
f.ShowDialog();
}
}
public static void MsgE(string m, Boolean legacy = false)
{
if (legacy)
{
MessageBox.Show(m, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
var f = new fMsgQuestion("오류 알림\n" + m, "확인", "");
f.lbTitle.BackColor = Color.Red;
f.lbTitle.BackColor2 = Color.Red;
f.EnableUserClose = true;
f.DialogMode = true;
f.ShowDialog();
}
}
public static DialogResult MsgQ(string m, string btOK = "확인", string btCancel = "아니오")
{
var f = new fMsgQuestion("선택 알림\n" + m, btOK, btCancel);
f.lbTitle.BackColor = Color.DeepSkyBlue;
f.lbTitle.BackColor2 = Color.DodgerBlue;
f.EnableUserClose = true;
f.DialogMode = true;
var dlg = f.ShowDialog();
return dlg;
}
#endregion
public static string JobListToFile(Class.CHistoryJOB data, string jobdate, string jobseq, out int cnt)
{
cnt = 0;
if (string.IsNullOrEmpty(jobdate)) return string.Empty;
//이미저장된 목록을 가져오고 중복된것은 피한다
var preSavedFile = System.IO.Path.Combine(Pub.setting.Path_Data, "JobData", jobdate.Substring(0, 6), jobdate + "-" + jobseq + ".txt");
List<string> preList = new List<string>();
if (System.IO.File.Exists(preSavedFile)) preList.AddRange(System.IO.File.ReadAllLines(preSavedFile, System.Text.Encoding.UTF8));
//Temp
var fiName = System.IO.Path.Combine(Pub.setting.Path_Data, "UploadTemp", jobdate + "_" + jobseq + ".tab");
var fi = new System.IO.FileInfo(fiName);
if (fi.Directory.Exists == false) fi.Directory.Create();
var sb = new System.Text.StringBuilder();
sb.AppendLine("#Time\tSID\tRID\tRAW");
var oklist = data.Items.Where(t => t.VisionData.RID.isEmpty() == false).ToArray();
foreach (var item in oklist)
{
//기존에 전송한 목록에 없어야 한다
if (item.error == Class.JobData.ErrorCode.None && item.VisionData.RID.isEmpty() == false)
{
sb.AppendLine(string.Format("{0}\t{1}\t{2}\t{3}",
item.JobStart.ToString("yyyy-MM-dd HH:mm:sss"), item.VisionData.SID, item.VisionData.RID, item.VisionData.QROutRaw));
cnt += 1;
}
}
try
{
System.IO.File.WriteAllText(fi.FullName, sb.ToString(), System.Text.Encoding.UTF8);
return fi.FullName;
}
catch (Exception ex)
{
Pub.log.AddE("JobListToFile:" + ex.Message);
return string.Empty;
}
}
public static bool SendMail(string seqdate, string seqno)
{
Chilkat.MailMan mailman = new Chilkat.MailMan();
bool success = mailman.UnlockComponent("BLUPRT.CBX012020_rzDFf7pQAsCS");
if (success != true)
{
Debug.WriteLine(mailman.LastErrorText);
return false;
}
mailman.SmtpHost = "10.101.10.6";
mailman.SmtpPort = 25;
// Create a new email object
Chilkat.Email email = new Chilkat.Email();
var mailform = Pub.mailForm.FirstOrDefault();
if (mailform == null)
return false;
var subject = mailform.subject.Trim();
subject = subject.Replace("{seqdate}", seqdate);
subject = subject.Replace("{seqno}", seqno);
var buffer = System.IO.File.ReadAllText(Util.CurrentPath + "\\Mailform.html");
//시드별집계데이터생성
System.Text.StringBuilder sbFileSID = new StringBuilder();
System.Text.StringBuilder sbFileREEL = new StringBuilder();
sbFileSID.AppendLine(string.Format("NO,SID,작업수량,예정수량,UNIT"));
sbFileREEL.AppendLine(string.Format("NO,SID,REEL,QTY,TIME"));
// int cntrid = 1;
System.IO.File.WriteAllText(Util.CurrentPath + "\\result_sidsummary.csv", sbFileSID.ToString(), System.Text.Encoding.Default);
System.IO.File.WriteAllText(Util.CurrentPath + "\\result_reelist.csv", sbFileREEL.ToString(), System.Text.Encoding.Default);
//메일본문의 내용 치환
var contents = buffer.Trim();
contents = contents.Replace("{seqdate}", seqdate);
contents = contents.Replace("{seqno}", seqno);
email.Subject = subject;
email.SetHtmlBody(contents);
email.From = "ReelSorter";
email.AddFileAttachment(Util.CurrentPath + "\\result_sidsummary.csv");
email.AddFileAttachment(Util.CurrentPath + "\\result_reelist.csv");
System.Text.StringBuilder maillist = new StringBuilder();
foreach (DataSet1.MailRecipientRow r in Pub.mailList.Rows)
{
success = email.AddTo(r.Name, r.Address);
maillist.Append(string.Format("{0}({1})", r.Name, r.Address));
}
success = mailman.SendEmail(email);
if (success != true)
{
Debug.WriteLine(mailman.LastErrorText);
return false;
}
success = mailman.CloseSmtpConnection();
if (success != true)
{
Debug.WriteLine("Connection to SMTP server not closed cleanly.");
Pub.log.AddE("메일 발송 실패(" + maillist.ToString() + ")");
}
Pub.log.AddI("메일 발송 완료(" + maillist.ToString() + ")");
return true;
}
public static T FileDeSerialize<T>(string file)
{
T Retval = default(T);
if (System.IO.File.Exists(file) == false) return Retval;
var xmlSerializer = new BinaryFormatter();
using (FileStream fs = new FileStream(file, FileMode.Open))
{
try
{
var value = xmlSerializer.Deserialize(fs);
Retval = (T)Convert.ChangeType(value, typeof(T));
}
catch (Exception ex)
{
Pub.log.AddE("File DeSerialized Error : " + ex.Message);
}
//Retval = (T)xmlSerializer.Deserialize(fs);
}
return Retval;
}
public static void FileSerialize(object data, string file)
{
if (data == null) return;
var xmlSerializer = new BinaryFormatter();
using (FileStream fs = new FileStream(file, FileMode.Create))
{
xmlSerializer.Serialize(fs, data);
}
}
public static void splitID(string ID, out string ww, out string seq)
{
if (ID.Length < 3)
{
ww = "";
seq = "";
}
else
{
try
{
ww = ID.Substring(0, 2);// int.Parse(ID.Substring(0, 2));
seq = ID.Substring(2);// int.Parse(ID.Substring(2));
}
catch (Exception ex)
{
Pub.log.AddE("slit id eerr" + ex.Message);
ww = "";
seq = "-1";
}
}
}
public static void ScreenCaptrue(int _BitmapWidth, int _BitmapHeight, Point ptSouce)
{
try
{
Bitmap bitmap = new Bitmap(_BitmapWidth, _BitmapHeight);
Graphics _graphic = Graphics.FromImage(bitmap);
_graphic.CopyFromScreen(ptSouce, new Point(0, 0), new Size(_BitmapWidth, _BitmapHeight));
string savefile = System.IO.Path.Combine(Util.CurrentPath, "ScreenShot", DateTime.Now.ToString("yyyyMMddHHmmss") + ".png");
System.IO.FileInfo grpath = new FileInfo(savefile);
if (!grpath.Directory.Exists) grpath.Directory.Create();
bitmap.Save(grpath.FullName, System.Drawing.Imaging.ImageFormat.Png);
Util.MsgI("화면 캡쳐 성공\n" +
"위치:" + grpath.Directory.FullName + "\n" +
"파일명: " + grpath.Name);
}
catch (Exception ex)
{
Util.MsgE("화면 캡쳐 실패\n" + ex.Message);
}
}
public static void SaveBugReport(string content, string subdirName = "BugReport")
{
try
{
var path = CurrentPath + subdirName;
if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path);
var file = path + "\\" + DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + ".txt";
System.IO.File.WriteAllText(file, content, System.Text.Encoding.UTF8);
}
catch
{
//nothing
}
}
public static void CopyData(System.Data.DataRow drSrc, System.Data.DataRow drDes)
{
if (drDes == null || drSrc == null) return;
foreach (System.Data.DataColumn col in drSrc.Table.Columns)
{
if (col.ColumnName.ToUpper() == "IDX") continue;
drDes[col.ColumnName] = drSrc[col.ColumnName];
}
}
/// <summary>
/// 현재실행중인폴더를 반환합니다.
/// </summary>
public static string CurrentPath
{
get
{
return AppDomain.CurrentDomain.BaseDirectory;
}
}
/// <summary>
/// 콤마와 줄바꿈등을 제거합니다.
/// </summary>
/// <returns></returns>
public static string ToCSVString(string src)
{
string retval = src.Replace("\r", "").Replace("\n", "").Replace(",", "");
return retval;
}
public static Boolean RunProcess(string file, string arg = "")
{
var fi = new System.IO.FileInfo(file);
if (!fi.Exists)
{
Pub.log.AddE("Run Error : " + file);
return false;
}
System.Diagnostics.Process prc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(file);
si.Arguments = arg;
prc.StartInfo = si;
prc.Start();
return true;
}
#region "convert"
public static string RectToStr(Rectangle rect)
{
return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height);
}
public static string RectToStr(RectangleF rect)
{
return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height);
}
public static string PointToStr(Point pt)
{
return string.Format("{0};{1}", pt.X, pt.Y);
}
public static string PointToStr(PointF pt)
{
return string.Format("{0};{1}", pt.X, pt.Y);
}
public static Rectangle StrToRect(string str)
{
if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0";
var roibuf1 = str.Split(';');
return new System.Drawing.Rectangle(
int.Parse(roibuf1[0]),
int.Parse(roibuf1[1]),
int.Parse(roibuf1[2]),
int.Parse(roibuf1[3]));
}
public static RectangleF StrToRectF(string str)
{
if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0";
var roibuf1 = str.Split(';');
return new System.Drawing.RectangleF(
float.Parse(roibuf1[0]),
float.Parse(roibuf1[1]),
float.Parse(roibuf1[2]),
float.Parse(roibuf1[3]));
}
public static Point StrToPoint(string str)
{
if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0";
var roibuf1 = str.Split(';');
return new System.Drawing.Point(
int.Parse(roibuf1[0]),
int.Parse(roibuf1[1]));
}
public static PointF StrToPointF(string str)
{
if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0";
var roibuf1 = str.Split(';');
return new System.Drawing.PointF(
float.Parse(roibuf1[0]),
float.Parse(roibuf1[1]));
}
#endregion
#region "NIC"
/// <summary>
/// 지정된 nic카드가 현재 목록에 존재하는지 확인한다.
/// </summary>
/// <returns></returns>
public static Boolean ExistNIC(string NICName)
{
if (string.IsNullOrEmpty(NICName)) return false;
foreach (string NetName in NICCardList())
{
if (NetName.ToLower() == NICName.ToLower())
{
return true;
}
}
return false;
}
/// <summary>
/// Ehternet Card 를 사용안함으로 설정합니다.(관리자권한필요)
/// </summary>
/// <param name="NicName"></param>
public static Boolean NICDisable(string NICName)
{
//해당 nic 가 현재 목록에 존재하는지 확인한다.
string cmd = "interface set interface " + NICName + " disable";
Process prc = new Process();
ProcessStartInfo si = new ProcessStartInfo("netsh", cmd);
si.WindowStyle = ProcessWindowStyle.Hidden;
prc.StartInfo = si;
prc.Start();
////목록에서 사라질때까지 기다린다.
DateTime SD = DateTime.Now;
Boolean timeout = false;
while ((true))
{
bool FindNetwork = false;
foreach (string NetName in NICCardList())
{
if (NetName == NICName.ToLower())
{
FindNetwork = true;
break; // TODO: might not be correct. Was : Exit For
}
}
if (!FindNetwork)
break; // TODO: might not be correct. Was : Exit While
System.Threading.Thread.Sleep(1000);
TimeSpan ts = DateTime.Now - SD;
if (ts.TotalSeconds > 10)
{
timeout = true;
break; // TODO: might not be correct. Was : Exit While
}
}
return !timeout;
}
public static List<String> NICCardList()
{
List<String> Retval = new List<string>();
foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
{
if (Net.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet)
{
Retval.Add(Net.Name.ToUpper());
}
}
return Retval;
}
/// <summary>
/// 이더넷카드를 사용함으로 설정합니다.
/// </summary>
/// <param name="NicName"></param>
public static Boolean NICEnable(string NICName)
{
string cmd = "interface set interface " + NICName + " enable";
System.Diagnostics.Process prc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("netsh", cmd);
si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
prc.StartInfo = si;
prc.Start();
////목록에생길떄까지 대기
DateTime SD = DateTime.Now;
while ((true))
{
bool FindNetwork = false;
foreach (string NetName in NICCardList())
{
if (NetName.ToLower() == NICName.ToLower())
{
FindNetwork = true;
break; // TODO: might not be correct. Was : Exit For
}
}
if (FindNetwork)
break; // TODO: might not be correct. Was : Exit While
System.Threading.Thread.Sleep(1000);
TimeSpan ts = DateTime.Now - SD;
if (ts.TotalSeconds > 10)
{
return false;
}
}
////결이 완료될떄까지 기다린다.
SD = DateTime.Now;
while ((true))
{
bool FindNetwork = false;
foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
{
if (Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.GigabitEthernet &&
Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) continue;
if (Net.Name.ToLower() == NICName.ToLower())
{
//string data = Net.GetIPProperties().GatewayAddresses[0].ToString();
if (Net.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up)
{
FindNetwork = true;
break; // TODO: might not be correct. Was : Exit For
}
}
}
if (FindNetwork)
return true;
System.Threading.Thread.Sleep(1000);
TimeSpan ts = DateTime.Now - SD;
if (ts.TotalSeconds > 10)
{
return false;
}
}
}
#endregion
public static void RunExplorer(string arg)
{
System.Diagnostics.ProcessStartInfo si = new ProcessStartInfo("explorer");
si.Arguments = arg;
System.Diagnostics.Process.Start(si);
}
#region "watchdog"
public static void WatchDog_Run()
{
System.IO.FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "WatchCat.exe");
if (!fi.Exists) return;
var Exist = CheckExistProcess("watchcat");
if (Exist != null) return;
RunProcess(fi.FullName);
}
public static System.Diagnostics.Process CheckExistProcess(string ProcessName)
{
foreach (var prc in System.Diagnostics.Process.GetProcesses())
{
if (prc.ProcessName.StartsWith("svchost")) continue;
if (prc.ProcessName.ToUpper() == ProcessName.ToUpper()) return prc;
}
return null;
}
#endregion
#region "web function"
/// <summary>
/// URL로부터 문자열을 수신합니다.
/// </summary>
/// <param name="url"></param>
/// <param name="isError"></param>
/// <returns></returns>
public static string GetStrfromurl(string url, out Boolean isError)
{
isError = false;
string result = "";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.Timeout = 60000;
request.ReadWriteTimeout = 60000;
request.MaximumAutomaticRedirections = 4;
request.MaximumResponseHeadersLength = 4;
request.Credentials = CredentialCache.DefaultCredentials;
var response = request.GetResponse() as HttpWebResponse;
var txtReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
result = txtReader.ReadToEnd();
}
catch (Exception ex)
{
isError = true;
result = ex.Message.ToString();
}
return result;
}
#endregion
}
}