using System; using System.Collections.Generic; using System.IO; using System.Linq; using Newtonsoft.Json; namespace AGVNavigationCore.Models { /// /// AGV 맵 파일 로딩/저장을 위한 공용 유틸리티 클래스 /// AGVMapEditor와 AGVSimulator에서 공통으로 사용 /// public static class MapLoader { /// /// 맵 파일 로딩 결과 /// public class MapLoadResult { public bool Success { get; set; } public List Nodes { get; set; } = new List(); public string ErrorMessage { get; set; } = string.Empty; public string Version { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } } /// /// 맵 파일 저장용 데이터 구조 /// public class MapFileData { public List Nodes { get; set; } = new List(); public DateTime CreatedDate { get; set; } public string Version { get; set; } = "1.0"; } /// /// 맵 파일을 로드하여 노드를 반환 /// /// 맵 파일 경로 /// 로딩 결과 public static MapLoadResult LoadMapFromFile(string filePath) { var result = new MapLoadResult(); try { if (!File.Exists(filePath)) { result.ErrorMessage = $"파일을 찾을 수 없습니다: {filePath}"; return result; } var json = File.ReadAllText(filePath); var mapData = JsonConvert.DeserializeObject(json); if (mapData != null) { result.Nodes = mapData.Nodes ?? new List(); result.Version = mapData.Version ?? "1.0"; result.CreatedDate = mapData.CreatedDate; // 이미지 노드들의 이미지 로드 LoadImageNodes(result.Nodes); result.Success = true; } else { result.ErrorMessage = "맵 데이터 파싱에 실패했습니다."; } } catch (Exception ex) { result.ErrorMessage = $"맵 파일 로딩 중 오류 발생: {ex.Message}"; } return result; } /// /// 맵 데이터를 파일로 저장 /// /// 저장할 파일 경로 /// 맵 노드 목록 /// 저장 성공 여부 public static bool SaveMapToFile(string filePath, List nodes) { try { var mapData = new MapFileData { Nodes = nodes, CreatedDate = DateTime.Now, Version = "1.0" }; var json = JsonConvert.SerializeObject(mapData, Formatting.Indented); File.WriteAllText(filePath, json); return true; } catch (Exception) { return false; } } /// /// 이미지 노드들의 이미지 로드 /// /// 노드 목록 private static void LoadImageNodes(List nodes) { foreach (var node in nodes) { if (node.Type == NodeType.Image) { node.LoadImage(); } } } /// /// MapNode 목록에서 RFID가 없는 노드들에 자동으로 RFID ID를 할당합니다. /// /// 맵 노드 목록 public static void AssignAutoRfidIds(List mapNodes) { foreach (var node in mapNodes) { // 네비게이션 가능한 노드이면서 RFID가 없는 경우에만 자동 할당 if (node.IsNavigationNode() && !node.HasRfid()) { // 기본 RFID ID 생성 (N001 -> 001) var rfidId = node.NodeId.Replace("N", "").PadLeft(3, '0'); node.SetRfidInfo(rfidId, "", "정상"); } } } } }