diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs index d2176ec..fd9f912 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs @@ -78,6 +78,9 @@ namespace AGVNavigationCore.Models // 중복된 NodeId 정리 FixDuplicateNodeIds(result.Nodes); + // 존재하지 않는 노드에 대한 연결 정리 (고아 연결 제거) + CleanupOrphanConnections(result.Nodes); + // 양방향 연결 자동 설정 (A→B가 있으면 B→A도 설정) // 주의: CleanupDuplicateConnections()는 제거됨 - 양방향 연결을 단방향으로 변환하는 버그가 있었음 EnsureBidirectionalConnections(result.Nodes); @@ -113,6 +116,9 @@ namespace AGVNavigationCore.Models { try { + // 저장 전 고아 연결 정리 (삭제된 노드에 대한 연결 제거) + CleanupOrphanConnections(nodes); + var mapData = new MapFileData { Nodes = nodes, @@ -298,6 +304,35 @@ namespace AGVNavigationCore.Models } } + /// + /// 존재하지 않는 노드에 대한 연결을 정리합니다 (고아 연결 제거). + /// 노드 삭제 후 저장된 맵 파일에서 삭제된 노드 ID가 ConnectedNodes에 남아있는 경우를 처리합니다. + /// + /// 맵 노드 목록 + private static void CleanupOrphanConnections(List mapNodes) + { + if (mapNodes == null || mapNodes.Count == 0) return; + + // 존재하는 모든 노드 ID 집합 생성 + var validNodeIds = new HashSet(mapNodes.Select(n => n.NodeId)); + + // 각 노드의 연결을 검증하고 존재하지 않는 노드 ID 제거 + foreach (var node in mapNodes) + { + if (node.ConnectedNodes == null || node.ConnectedNodes.Count == 0) + continue; + + var orphanConnections = node.ConnectedNodes + .Where(connectedId => !validNodeIds.Contains(connectedId)) + .ToList(); + + foreach (var orphanId in orphanConnections) + { + node.RemoveConnection(orphanId); + } + } + } + /// /// [사용 중지됨] 중복 연결을 정리합니다. 양방향 중복 연결을 단일 연결로 통합합니다. /// 주의: 이 함수는 버그가 있어 사용 중지됨 - 양방향 연결을 단방향으로 변환하여 경로 탐색 실패 발생 diff --git a/Cs_HMI/Data/NewMap.agvmap b/Cs_HMI/Data/NewMap.agvmap index 6806987..1ca0c86 100644 --- a/Cs_HMI/Data/NewMap.agvmap +++ b/Cs_HMI/Data/NewMap.agvmap @@ -1082,6 +1082,6 @@ "DisplayText": "N031 - [030]" } ], - "CreatedDate": "2025-10-30T09:30:01.9333244+09:00", + "CreatedDate": "2025-10-30T09:37:03.9172219+09:00", "Version": "1.0" } \ No newline at end of file