"feat:Enable-hover-highlight-and-refactor"

This commit is contained in:
2025-12-14 17:20:50 +09:00
parent 34b038c4be
commit 764fbbd204
48 changed files with 3980 additions and 2750 deletions

View File

@@ -427,7 +427,7 @@ namespace AGVSimulator.Forms
if(targetNode.Type == NodeType.Buffer)
{
var lastDetailPath = advancedResult.DetailedPath.Last();
if(lastDetailPath.NodeId == targetNode.NodeId) //마지막노드 재확인
if(lastDetailPath.NodeId == targetNode.Id) //마지막노드 재확인
{
//버퍼에 도킹할때에는 마지막 노드에서 멈추고 시퀀스를 적용해야한다
advancedResult.DetailedPath = advancedResult.DetailedPath.Take(advancedResult.DetailedPath.Count - 1).ToList();
@@ -492,7 +492,7 @@ namespace AGVSimulator.Forms
}
}
private void OnTargetNodeSelected(object sender, List<MapNode> selectedNodes)
private void OnTargetNodeSelected(object sender, List<NodeBase> selectedNodes)
{
try
{
@@ -511,9 +511,9 @@ namespace AGVSimulator.Forms
if (selectedNode == null) return;
// 목적지를 선택된 노드로 설정
SetTargetNodeInCombo(selectedNode.NodeId);
SetTargetNodeInCombo(selectedNode.Id);
var displayText = GetDisplayName(selectedNode.NodeId);
var displayText = GetDisplayName(selectedNode.Id);
_statusLabel.Text = $"타겟계산 - 목적지: {displayText}";
// 자동으로 경로 계산 수행
@@ -578,7 +578,7 @@ namespace AGVSimulator.Forms
for (int i = 0; i < _startNodeCombo.Items.Count; i++)
{
var item = _startNodeCombo.Items[i].ToString();
if (item.Contains($"[{closestNode.NodeId}]"))
if (item.Contains($"[{closestNode.Id}]"))
{
_startNodeCombo.SelectedIndex = i;
break;
@@ -649,7 +649,7 @@ namespace AGVSimulator.Forms
if (existingNode != null)
{
// 이미 존재하는 노드로 이동
Program.WriteLine($"[맵 스캔] RFID '{rfidId}'는 이미 존재합니다 (노드: {existingNode.NodeId})");
Program.WriteLine($"[맵 스캔] RFID '{rfidId}'는 이미 존재합니다 (노드: {existingNode.Id})");
// 기존 노드로 AGV 위치 설정
_simulatorCanvas.SetAGVPosition(selectedAGV.AgvId, existingNode, currentDirection);
@@ -659,7 +659,7 @@ namespace AGVSimulator.Forms
_lastNodeAddTime = DateTime.Now;
_lastScanDirection = currentDirection; // 방향 업데이트
_statusLabel.Text = $"기존 노드로 이동: {existingNode.NodeId} [{GetDirectionSymbol(currentDirection)}]";
_statusLabel.Text = $"기존 노드로 이동: {existingNode.Id} [{GetDirectionSymbol(currentDirection)}]";
_rfidTextBox.Text = "";
return;
}
@@ -720,12 +720,11 @@ namespace AGVSimulator.Forms
var newNodeId = $"{_scanNodeCounter:D3}";
var newNode = new MapNode
{
NodeId = newNodeId,
Id = newNodeId,
RfidId = rfidId,
Position = new Point(newX, newY),
Type = NodeType.Normal,
IsActive = true,
Name = $"N{_scanNodeCounter}"
IsActive = true
};
// 맵에 추가
@@ -738,10 +737,10 @@ namespace AGVSimulator.Forms
if (_lastScannedNode != null)
{
// 양방향 연결 (ConnectedNodes에 추가 - JSON 저장됨)
_lastScannedNode.AddConnection(newNode.NodeId);
newNode.AddConnection(_lastScannedNode.NodeId);
_lastScannedNode.AddConnection(newNode.Id);
newNode.AddConnection(_lastScannedNode.Id);
Program.WriteLine($"[맵 스캔] 연결 생성: {_lastScannedNode.NodeId} ↔ {newNode.NodeId}");
Program.WriteLine($"[맵 스캔] 연결 생성: {_lastScannedNode.Id} ↔ {newNode.Id}");
}
// AGV 위치 설정
@@ -752,7 +751,7 @@ namespace AGVSimulator.Forms
_simulatorCanvas.Nodes = _mapNodes;
// 화면을 새 노드 위치로 이동
_simulatorCanvas.PanToNode(newNode.NodeId);
_simulatorCanvas.PanToNode(newNode.Id);
_simulatorCanvas.Invalidate();
// 상태 업데이트
@@ -764,10 +763,10 @@ namespace AGVSimulator.Forms
// UI 업데이트
UpdateNodeComboBoxes();
_statusLabel.Text = $"노드 생성: {newNode.NodeId} (RFID: {rfidId}) [{GetDirectionSymbol(currentDirection)}] - 총 {_mapNodes.Count}개";
_statusLabel.Text = $"노드 생성: {newNode.Id} (RFID: {rfidId}) [{GetDirectionSymbol(currentDirection)}] - 총 {_mapNodes.Count}개";
_rfidTextBox.Text = "";
Program.WriteLine($"[맵 스캔] 노드 생성 완료: {newNode.NodeId} (RFID: {rfidId}) at ({newX}, {newY}), 방향: {currentDirection}");
Program.WriteLine($"[맵 스캔] 노드 생성 완료: {newNode.Id} (RFID: {rfidId}) at ({newX}, {newY}), 방향: {currentDirection}");
}
catch (Exception ex)
{
@@ -875,15 +874,15 @@ namespace AGVSimulator.Forms
//이전위치와 동일한지 체크한다.
if (selectedAGV.CurrentNodeId == targetNode.NodeId && selectedAGV.CurrentDirection == selectedDirection)
if (selectedAGV.CurrentNodeId == targetNode.Id && selectedAGV.CurrentDirection == selectedDirection)
{
Program.WriteLine($"이전 노드위치와 모터의 방향이 동일하여 현재 위치 변경이 취소됩니다(NODE:{targetNode.NodeId},RFID:{targetNode.RfidId},DIR:{selectedDirection})");
Program.WriteLine($"이전 노드위치와 모터의 방향이 동일하여 현재 위치 변경이 취소됩니다(NODE:{targetNode.Id},RFID:{targetNode.RfidId},DIR:{selectedDirection})");
return;
}
// 콘솔 출력 (상세한 리프트 방향 계산 과정)
Program.WriteLine($"[AGV-{selectedAGV.AgvId}] 위치 설정:");
Program.WriteLine($" RFID: {rfidId} → 노드: {targetNode.NodeId}");
Program.WriteLine($" RFID: {rfidId} → 노드: {targetNode.Id}");
Program.WriteLine($" 위치: ({targetNode.Position.X}, {targetNode.Position.Y})");
Program.WriteLine($" 방향: {selectedDirectionItem?.DisplayText ?? ""} ({selectedDirection})");
@@ -912,14 +911,14 @@ namespace AGVSimulator.Forms
CalculateLiftDirectionDetailed(selectedAGV);
Program.WriteLine("");
_statusLabel.Text = $"{selectedAGV.AgvId} 위치를 RFID '{rfidId}' (노드: {targetNode.NodeId}), 방향: {selectedDirectionItem?.DisplayText ?? ""}로 설정했습니다.";
_statusLabel.Text = $"{selectedAGV.AgvId} 위치를 RFID '{rfidId}' (노드: {targetNode.Id}), 방향: {selectedDirectionItem?.DisplayText ?? ""}로 설정했습니다.";
_rfidTextBox.Text = ""; // 입력 필드 초기화
// 시뮬레이터 캔버스의 해당 노드로 이동
//_simulatorCanvas.PanToNode(targetNode.NodeId);
// 시작 노드 콤보박스를 현재 위치로 자동 선택
SetStartNodeToCombo(targetNode.NodeId);
SetStartNodeToCombo(targetNode.Id);
}
/// <summary>
@@ -956,11 +955,10 @@ namespace AGVSimulator.Forms
return "RFID가 할당된 노드가 없습니다.";
// 처음 10개의 RFID만 표시 (노드 이름 포함)
var rfidList = nodesWithRfid.Take(10).Select(n =>
var rfidList = nodesWithRfid.Take(10).Select((Func<MapNode, string>)(n =>
{
var nodeNamePart = !string.IsNullOrEmpty(n.Name) ? $" {n.Name}" : "";
return $"- {n.RfidId} → {n.NodeId}{nodeNamePart}";
});
return $"- {n.RfidId} → {n.Id}";
}));
var result = string.Join("\n", rfidList);
if (nodesWithRfid.Count > 10)
@@ -1060,8 +1058,7 @@ namespace AGVSimulator.Forms
if (node.IsActive && node.HasRfid())
{
// {rfid} - [{node}] {name} 형식으로 ComboBoxItem 생성
var nodeNamePart = !string.IsNullOrEmpty(node.Name) ? $" {node.Name}" : "";
var displayText = $"{node.RfidId} - [{node.NodeId}]{nodeNamePart}";
var displayText = $"{node.RfidId} - [{node.Id}]";
var item = new ComboBoxItem<MapNode>(node, displayText);
_startNodeCombo.Items.Add(item);
@@ -1262,7 +1259,7 @@ namespace AGVSimulator.Forms
/// </summary>
private string GetRfidByNodeId(string nodeId)
{
var node = _mapNodes?.FirstOrDefault(n => n.NodeId == nodeId);
var node = _mapNodes?.FirstOrDefault(n => n.Id == nodeId);
return node?.HasRfid() == true ? node.RfidId : nodeId;
}
@@ -1271,7 +1268,7 @@ namespace AGVSimulator.Forms
/// </summary>
private string GetDisplayName(string nodeId)
{
var node = _mapNodes?.FirstOrDefault(n => n.NodeId == nodeId);
var node = _mapNodes?.FirstOrDefault(n => n.Id == nodeId);
if (node != null && !string.IsNullOrEmpty(node.RfidId))
{
return node.RfidId;
@@ -1628,7 +1625,7 @@ namespace AGVSimulator.Forms
if (!string.IsNullOrEmpty(node.RfidId))
return node.RfidId;
return $"({node.NodeId})";
return $"({node.Id})";
}
/// <summary>
@@ -1655,7 +1652,7 @@ namespace AGVSimulator.Forms
for (int i = 0; i < _targetNodeCombo.Items.Count; i++)
{
var item = _targetNodeCombo.Items[i] as ComboBoxItem<MapNode>;
if (item?.Value?.NodeId == nodeId)
if (item?.Value?.Id == nodeId)
{
_targetNodeCombo.SelectedIndex = i;
return;
@@ -1669,7 +1666,7 @@ namespace AGVSimulator.Forms
private PathTestLogItem CreateTestResultFromUI(MapNode prevNode, MapNode targetNode,
string directionName, (bool result, string message) calcResult)
{
var currentNode = _mapNodes.FirstOrDefault(n => n.NodeId ==
var currentNode = _mapNodes.FirstOrDefault(n => n.Id ==
(_agvListCombo.SelectedItem as VirtualAGV)?.CurrentNodeId);
var logItem = new PathTestLogItem
@@ -1741,8 +1738,8 @@ namespace AGVSimulator.Forms
continue;
// 중복 방지 (A→B와 B→A를 같은 것으로 간주)
var pairKey1 = $"{nodeA.NodeId}→{nodeB.NodeId}";
var pairKey2 = $"{nodeB.NodeId}→{nodeA.NodeId}";
var pairKey1 = $"{nodeA.Id}→{nodeB.Id}";
var pairKey2 = $"{nodeB.Id}→{nodeA.Id}";
if (nodeA.HasRfid() && nodeB.HasRfid() && !processedPairs.Contains(pairKey1) && !processedPairs.Contains(pairKey2))
{
@@ -1848,7 +1845,7 @@ namespace AGVSimulator.Forms
prb1.Value = (int)((double)currentTest / totalTests * 100);
// 목표 노드 콤보박스 선택
SetTargetNodeComboBox(dockingTarget.NodeId);
SetTargetNodeComboBox(dockingTarget.Id);
// 경로 계산 버튼 클릭 (실제 사용자 동작)
var calcResult = CalcPath();