fix: 맵 에디터 연결 버그 수정 및 기능 개선

주요 변경사항:
- ConnectedMapNodes 속성 추가로 런타임 객체 참조 지원
- 이미지 에디터 UI 개선 (ImageEditorCanvas 추가)
- 연결 생성 버그 수정: 양방향 연결 생성
- 연결 삭제 버그 수정: 양방향 모두 제거
- CleanupDuplicateConnections 비활성화 (단방향 변환 버그)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
backuppc
2025-10-30 09:34:10 +09:00
parent 0b59479d34
commit 3f6db7113f
18 changed files with 838 additions and 1303 deletions

View File

@@ -78,12 +78,13 @@ namespace AGVNavigationCore.Models
// 중복된 NodeId 정리
FixDuplicateNodeIds(result.Nodes);
// 중복 연결 정리 (양방향 중복 제거)
CleanupDuplicateConnections(result.Nodes);
// 양방향 연결 자동 설정 (A→B가 있으면 B→A도 설정)
// 주의: CleanupDuplicateConnections()는 제거됨 - 양방향 연결을 단방향으로 변환하는 버그가 있었음
EnsureBidirectionalConnections(result.Nodes);
// ConnectedMapNodes 채우기 (string ID → MapNode 객체 참조)
ResolveConnectedMapNodes(result.Nodes);
// 이미지 노드들의 이미지 로드
LoadImageNodes(result.Nodes);
@@ -145,6 +146,35 @@ namespace AGVNavigationCore.Models
}
}
/// <summary>
/// ConnectedMapNodes 채우기 (ConnectedNodes의 string ID → MapNode 객체 변환)
/// </summary>
/// <param name="mapNodes">맵 노드 목록</param>
private static void ResolveConnectedMapNodes(List<MapNode> mapNodes)
{
if (mapNodes == null || mapNodes.Count == 0) return;
// 빠른 조회를 위한 Dictionary 생성
var nodeDict = mapNodes.ToDictionary(n => n.NodeId, n => n);
foreach (var node in mapNodes)
{
// ConnectedMapNodes 초기화
node.ConnectedMapNodes.Clear();
if (node.ConnectedNodes != null && node.ConnectedNodes.Count > 0)
{
foreach (var connectedNodeId in node.ConnectedNodes)
{
if (nodeDict.TryGetValue(connectedNodeId, out var connectedNode))
{
node.ConnectedMapNodes.Add(connectedNode);
}
}
}
}
}
/// <summary>
/// 기존 Description 데이터를 Name 필드로 마이그레이션
/// JSON 파일에서 Description 필드가 있는 경우 Name으로 이동
@@ -269,9 +299,12 @@ namespace AGVNavigationCore.Models
}
/// <summary>
/// 중복 연결을 정리합니다. 양방향 중복 연결을 단일 연결로 통합합니다.
/// [사용 중지됨] 중복 연결을 정리합니다. 양방향 중복 연결을 단일 연결로 통합합니다.
/// 주의: 이 함수는 버그가 있어 사용 중지됨 - 양방향 연결을 단방향으로 변환하여 경로 탐색 실패 발생
/// AGV 시스템에서는 모든 연결이 양방향이어야 하므로 EnsureBidirectionalConnections()만 사용
/// </summary>
/// <param name="mapNodes">맵 노드 목록</param>
[Obsolete("이 함수는 양방향 연결을 단방향으로 변환하는 버그가 있습니다. 사용하지 마세요.")]
private static void CleanupDuplicateConnections(List<MapNode> mapNodes)
{
if (mapNodes == null || mapNodes.Count == 0) return;

View File

@@ -44,6 +44,12 @@ namespace AGVNavigationCore.Models
/// </summary>
public List<string> ConnectedNodes { get; set; } = new List<string>();
/// <summary>
/// 연결된 노드 객체 목록 (런타임 전용, JSON 무시)
/// </summary>
[Newtonsoft.Json.JsonIgnore]
public List<MapNode> ConnectedMapNodes { get; set; } = new List<MapNode>();
/// <summary>
/// 회전 가능 여부 (180도 회전 가능한 지점)
/// </summary>