using OSMDatastructure; using Pathfinding; namespace OSMImporter { public class RegionManager { private string workingDirectory { get; } private readonly Dictionary _regions = new(); public RegionManager(string workingDirectory) { this.workingDirectory = workingDirectory; } /// /// Checks wether the Region is already loaded and returns the Region, or tries to load the Region from file in workingDirectory /// /// Coordinates of the Region (or within the Region) to load /// The Region at the specified Coordinates containing Nodes and Connections /// If the Regionfile can not be found. public Region GetRegion(Coordinates coordinates) { if(this._regions.ContainsKey(coordinates.GetRegionHash())) return this._regions[coordinates.GetRegionHash()]; else { Region loadedRegion = LoadRegion(coordinates); this._regions.Add(loadedRegion.regionHash, value: loadedRegion); return loadedRegion; } } public Region[] GetAllRegions() { return this._regions.Values.ToArray(); } /// /// /// /// Coordinates of the Region (or within the Region) to load /// The Region at the specified Coordinates containing Nodes and Connections /// If the Regionfile can not be found. private Region LoadRegion(Coordinates coordinates) { string fullPath = Path.Combine(workingDirectory, coordinates.GetRegionHash().ToString()); Console.WriteLine("Loading {0}", fullPath); if (!File.Exists(fullPath)) { throw new FileNotFoundException(string.Format("Region does not exist: {0}", fullPath)); } FileStream fileStream = new FileStream(fullPath, FileMode.Open); byte[] regionBytes = new byte[fileStream.Length]; int _ = fileStream.Read(regionBytes, 0, regionBytes.Length); fileStream.Close(); return ByteConverter.ToRegion(regionBytes); } public OsmNode? GetNode(Coordinates coordinates) { Region regionWithNode = GetRegion(coordinates); return regionWithNode.GetNode(coordinates); } } }