파일정리
This commit is contained in:
244
AGVLogic/AGVSimulator/Forms/ProgressLogForm.cs
Normal file
244
AGVLogic/AGVSimulator/Forms/ProgressLogForm.cs
Normal file
@@ -0,0 +1,244 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AGVSimulator.Forms
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 경로 예측 테스트 진행 상황 로그 표시 폼
|
||||
/// </summary>
|
||||
public partial class ProgressLogForm : Form
|
||||
{
|
||||
private List<PathTestLogItem> _logItems;
|
||||
|
||||
/// <summary>
|
||||
/// 취소 요청 여부
|
||||
/// </summary>
|
||||
public bool CancelRequested { get; private set; }
|
||||
|
||||
public ProgressLogForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
CancelRequested = false;
|
||||
_logItems = new List<PathTestLogItem>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 로그 추가 (PathTestLogItem)
|
||||
/// </summary>
|
||||
public void AddLogItem(PathTestLogItem item)
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new Action<PathTestLogItem>(AddLogItem), item);
|
||||
return;
|
||||
}
|
||||
|
||||
_logItems.Add(item);
|
||||
|
||||
var listItem = new ListViewItem(item.PreviousPosition ?? "-");
|
||||
listItem.SubItems.Add(item.MotorDirection ?? "-");
|
||||
listItem.SubItems.Add(item.CurrentPosition ?? "-");
|
||||
listItem.SubItems.Add(item.TargetPosition ?? "-");
|
||||
listItem.SubItems.Add(item.DockingPosition ?? "-");
|
||||
listItem.SubItems.Add(item.Success ? "O" : "X");
|
||||
listItem.SubItems.Add(item.Message ?? "-");
|
||||
listItem.SubItems.Add(item.DetailedPath ?? "-");
|
||||
listItem.SubItems.Add(item.Timestamp.ToString("HH:mm:ss"));
|
||||
|
||||
// 성공 여부에 따라 색상 설정
|
||||
if (!item.Success)
|
||||
{
|
||||
listItem.BackColor = Color.LightPink;
|
||||
}
|
||||
|
||||
var dockpos = item.DockingPosition ?? string.Empty;
|
||||
var targerpos = item.TargetPosition ?? string.Empty;
|
||||
if (dockpos.Equals("충전기") && targerpos.StartsWith("0015"))
|
||||
listItem.ForeColor = Color.DarkViolet;
|
||||
|
||||
_logListView.Items.Add(listItem);
|
||||
_logListView.EnsureVisible(_logListView.Items.Count - 1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 간단한 텍스트 로그 추가 (상태 메시지용)
|
||||
/// </summary>
|
||||
public void AppendLog(string message)
|
||||
{
|
||||
var item = new PathTestLogItem
|
||||
{
|
||||
Message = message,
|
||||
Success = true
|
||||
};
|
||||
AddLogItem(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 상태 메시지 업데이트
|
||||
/// </summary>
|
||||
public void UpdateStatus(string status)
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new Action<string>(UpdateStatus), status);
|
||||
return;
|
||||
}
|
||||
|
||||
_statusLabel.Text = status;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 프로그레스바 업데이트
|
||||
/// </summary>
|
||||
public void UpdateProgress(int value, int maximum)
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new Action<int, int>(UpdateProgress), value, maximum);
|
||||
return;
|
||||
}
|
||||
|
||||
_progressBar.Maximum = maximum;
|
||||
_progressBar.Value = Math.Min(value, maximum);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 작업 완료 시 호출
|
||||
/// </summary>
|
||||
public void SetCompleted()
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new Action(SetCompleted));
|
||||
return;
|
||||
}
|
||||
|
||||
_cancelButton.Enabled = false;
|
||||
_closeButton.Enabled = true;
|
||||
UpdateStatus("작업 완료");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 작업 취소 시 호출
|
||||
/// </summary>
|
||||
public void SetCancelled()
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new Action(SetCancelled));
|
||||
return;
|
||||
}
|
||||
|
||||
_cancelButton.Enabled = false;
|
||||
_closeButton.Enabled = true;
|
||||
UpdateStatus("작업 취소됨");
|
||||
}
|
||||
|
||||
private void OnCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = MessageBox.Show(
|
||||
"진행 중인 작업을 취소하시겠습니까?",
|
||||
"취소 확인",
|
||||
MessageBoxButtons.YesNo,
|
||||
MessageBoxIcon.Question);
|
||||
|
||||
if (result == DialogResult.Yes)
|
||||
{
|
||||
CancelRequested = true;
|
||||
_cancelButton.Enabled = false;
|
||||
UpdateStatus("취소 요청됨...");
|
||||
AppendLog("사용자가 취소를 요청했습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSaveCSV_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (_logItems.Count == 0)
|
||||
{
|
||||
MessageBox.Show("저장할 데이터가 없습니다.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
using (var saveDialog = new SaveFileDialog())
|
||||
{
|
||||
saveDialog.Filter = "CSV 파일 (*.csv)|*.csv|모든 파일 (*.*)|*.*";
|
||||
saveDialog.DefaultExt = "csv";
|
||||
saveDialog.FileName = $"경로예측테스트_{DateTime.Now:yyyyMMdd_HHmmss}.csv";
|
||||
|
||||
if (saveDialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
try
|
||||
{
|
||||
SaveToCSV(saveDialog.FileName);
|
||||
MessageBox.Show($"CSV 파일이 저장되었습니다.\n{saveDialog.FileName}",
|
||||
"저장 완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
|
||||
var prc = new System.Diagnostics.Process();
|
||||
prc.StartInfo = new System.Diagnostics.ProcessStartInfo("explorer", saveDialog.FileName);
|
||||
prc.Start();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"CSV 저장 중 오류가 발생했습니다:\n{ex.Message}",
|
||||
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// CSV 파일로 저장
|
||||
/// </summary>
|
||||
private void SaveToCSV(string filePath)
|
||||
{
|
||||
using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
|
||||
{
|
||||
// 헤더 작성
|
||||
writer.WriteLine("이전위치,모터방향,현재위치,대상위치,도킹위치,성공,메세지,상세경로,시간");
|
||||
|
||||
// 데이터 작성
|
||||
foreach (var item in _logItems)
|
||||
{
|
||||
var line = $"{EscapeCSV(item.PreviousPosition)}," +
|
||||
$"{EscapeCSV(item.MotorDirection)}," +
|
||||
$"{EscapeCSV(item.CurrentPosition)}," +
|
||||
$"{EscapeCSV(item.TargetPosition)}," +
|
||||
$"{EscapeCSV(item.DockingPosition)}," +
|
||||
$"{(item.Success ? "O" : "X")}," +
|
||||
$"{EscapeCSV(item.Message)}," +
|
||||
$"{EscapeCSV(item.DetailedPath)}," +
|
||||
$"{item.Timestamp:yyyy-MM-dd HH:mm:ss}";
|
||||
|
||||
writer.WriteLine(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// CSV 셀 데이터 이스케이프 처리
|
||||
/// </summary>
|
||||
private string EscapeCSV(string value)
|
||||
{
|
||||
if (string.IsNullOrEmpty(value))
|
||||
return "";
|
||||
|
||||
// 쉼표, 큰따옴표, 줄바꿈이 있으면 큰따옴표로 감싸고 내부 큰따옴표는 두 개로
|
||||
if (value.Contains(",") || value.Contains("\"") || value.Contains("\n") || value.Contains("\r"))
|
||||
{
|
||||
return "\"" + value.Replace("\"", "\"\"") + "\"";
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
private void OnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user