Files
ENIG/HMI/Project/Dialog/fSetCurrentPosition.cs
backuppc faf13f5c37 ..
2026-01-30 16:58:14 +09:00

129 lines
4.6 KiB
C#

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 AGVNavigationCore.Models;
using AGVNavigationCore.Controls;
namespace Project.Dialog
{
public partial class fSetCurrentPosition : Form
{
private UnifiedAGVCanvas _canvas;
private MapNode _selectedNode;
private AgvDirection _selectedDirection = AgvDirection.Forward;
private AGVTurn _selectedTurn = AGVTurn.None;
public MapNode SelectedNode => _selectedNode;
public AgvDirection SelectedDirection => _selectedDirection;
public AGVTurn SelectedTurn => _selectedTurn;
public fSetCurrentPosition()
{
InitializeComponent();
if (PUB.setting.FullScreen) this.WindowState = FormWindowState.Maximized;
SetupCanvas();
WireEvents();
this.Load += FSetCurrentPosition_Load;
}
private void SetupCanvas()
{
_canvas = new UnifiedAGVCanvas
{
Dock = DockStyle.Fill,
Mode = UnifiedAGVCanvas.CanvasMode.Run,
BackColor = Color.FromArgb(45, 45, 48),
ShowGrid=false,
};
mainLayout.Controls.Add(_canvas, 1, 0);
}
private void WireEvents()
{
_canvas.NodeSelect += _canvas_NodeSelect;
btnForward.Click += (s, e) => { _selectedDirection = AgvDirection.Forward; UpdateStatus(); };
btnBackward.Click += (s, e) => { _selectedDirection = AgvDirection.Backward; UpdateStatus(); };
btnTurnNone.Click += (s, e) => { _selectedTurn = AGVTurn.None; UpdateStatus(); };
btnTurnL90.Click += (s, e) => { _selectedTurn = AGVTurn.L90; UpdateStatus(); };
btnTurnR90.Click += (s, e) => { _selectedTurn = AGVTurn.R90; UpdateStatus(); };
btnOK.Click += BtnOK_Click;
btnCancel.Click += (s, e) => { this.DialogResult = DialogResult.Cancel; this.Close(); };
}
private void FSetCurrentPosition_Load(object sender, EventArgs e)
{
// 맵 데이터 강제 복사 (PUB과 동일한 맵 사용)
if (PUB._mapCanvas != null)
{
_canvas.SetMapData(PUB._mapCanvas.Nodes, PUB._mapCanvas.Labels, PUB._mapCanvas.Images, PUB._mapCanvas.Marks, PUB._mapCanvas.Magnets);
}
// 마지막 위치 로드
var lastPos = PUB.LoadLastPosition();
if (lastPos != null)
{
_selectedNode = _canvas.Nodes.FirstOrDefault(n => n.Id == lastPos.NodeId);
_selectedDirection = lastPos.Direction;
_selectedTurn = lastPos.Turn;
if (_selectedNode != null)
{
_canvas.SelectedNode = _selectedNode;
_canvas.PanToNode(_selectedNode.Id);
UpdateStatus(isRestore: true);
}
}
this.Show();
_canvas.ResetZoom();
}
private void _canvas_NodeSelect(object sender, NodeBase node, MouseEventArgs e)
{
if (node is MapNode mapNode && mapNode.IsNavigationNode())
{
_selectedNode = mapNode;
_canvas.SelectedNode = mapNode;
UpdateStatus();
}
}
private void UpdateStatus(bool isRestore = false)
{
if (_selectedNode == null)
{
_lblStatus.Text = "위치를 선택해 주세요.";
_lblStatus.ForeColor = Color.White;
return;
}
string dirStr = _selectedDirection == AgvDirection.Forward ? "전진" : "후진";
_lblStatus.Text = $"{(isRestore ? "[] " : "")}위치: {_selectedNode.Id} ({_selectedNode.ID2}) | 방향: {dirStr} | Turn: {_selectedTurn}";
_lblStatus.ForeColor = isRestore ? Color.Yellow : Color.Cyan;
// 캔버스에 가상 AGV 미리보기 (선택 사항)
_canvas.Invalidate();
}
private void BtnOK_Click(object sender, EventArgs e)
{
if (_selectedNode == null)
{
MessageBox.Show("AGV의 현재 위치를 맵에서 클릭하여 선택해 주세요.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
this.DialogResult = DialogResult.OK;
this.Close();
}
}
}