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, "", "정상");
}
}
}
}
}