private void ReadRoad(IRoadDefinition road, IRoadmapFactory roadmapFactory, XmlNode roadNode) { var roadGraphEdgeIndex = StrWithMaxValueNegativeOneToUshort(roadNode.GetFieldValue("roadGraphEdgeIndex")); var oppositeRoadGraphEdgeIndex = StrWithMaxValueNegativeOneToUshort(roadNode.GetFieldValue("oppositeRoadGraphEdgeIndex")); var oppositeLanesCount = byte.Parse(roadNode.GetFieldValue("oppositeLanesCount")); var forwardLanesCount = byte.Parse(roadNode.GetFieldValue("forwardLanesCount")); var maxSpawnedCars = byte.Parse(roadNode.GetFieldValue("maxSpawnedCars")); var direction = (RoadDirection)Enum.Parse(typeof(RoadDirection), roadNode.GetFieldValue("direction")); var splineIndex = ushort.Parse(roadNode.GetFieldValue("splineIndex")); var type = (RoadType)Enum.Parse(typeof(RoadType), roadNode.GetFieldValue("type")); road.RoadGraphEdgeIndex = roadGraphEdgeIndex; road.OppositeRoadGraphEdgeIndex = oppositeRoadGraphEdgeIndex; road.OppositeLanesCount = oppositeLanesCount; road.ForwardLanesCount = forwardLanesCount; road.MaxSpawnedCars = maxSpawnedCars; road.Direction = direction; road.RoadSplineIndex = splineIndex; road.RoadType = type; var laneNodes = roadNode.SelectNodes("lanes/lane"); foreach (XmlNode laneNode in laneNodes) { ILaneDefinition lane = roadmapFactory.Lane(); ReadLane(lane, roadmapFactory, laneNode); road.Lanes.Add(lane); } var rangeFlagNodes = roadNode.SelectNodes("rangeFlags/rangeFlag"); foreach (XmlNode rangeFlagNode in rangeFlagNodes) { IRangeFlag rangeFlag = roadmapFactory.RangeFlag(); ReadRangeFlag(rangeFlag, rangeFlagNode); road.RangeFlags.Add(rangeFlag); } }
private void WriteRoad(IRoadDefinition road, ushort fromCrossroad, ushort toCrossroad, XmlDocument xml, XmlElement node) { node.AddAttrWithValue(xml, "fromCrossroad", fromCrossroad.ToString()); node.AddAttrWithValue(xml, "toCrossroad", toCrossroad.ToString()); node.AddFieldWithValue(xml, "roadGraphEdgeIndex", road.RoadGraphEdgeIndex.ToStrMaxAsNegOne()); node.AddFieldWithValue(xml, "oppositeRoadGraphEdgeIndex", road.OppositeRoadGraphEdgeIndex.ToStrMaxAsNegOne()); node.AddFieldWithValue(xml, "oppositeLanesCount", road.OppositeLanesCount); node.AddFieldWithValue(xml, "forwardLanesCount", road.ForwardLanesCount); var lanesNode = xml.CreateElement("lanes"); node.AppendChild(lanesNode); for (var i = 0; i < road.Lanes.Count; i++) { var laneNode = xml.CreateElement("lane"); laneNode.AddAttrWithValue(xml, "index", i.ToString()); WriteLane(road.Lanes[i], xml, laneNode); lanesNode.AppendChild(laneNode); } var rangeFlagsNode = xml.CreateElement("rangeFlags"); node.AppendChild(rangeFlagsNode); for (var i = 0; i < road.RangeFlags.Count; i++) { var rangeFlagNode = xml.CreateElement("rangeFlag"); rangeFlagNode.AddAttrWithValue(xml, "index", i.ToString()); WriteRangeFlag(road.RangeFlags[i], xml, rangeFlagNode); rangeFlagsNode.AppendChild(rangeFlagNode); } node.AddFieldWithValue(xml, "maxSpawnedCars", road.MaxSpawnedCars); node.AddFieldWithValue(xml, "direction", road.Direction.ToString()); node.AddFieldWithValue(xml, "splineIndex", road.RoadSplineIndex); node.AddFieldWithValue(xml, "type", road.RoadType.ToString()); }
public IRoadmap Deserialize(IRoadmapFactory roadmapFactory, string filePath) { IRoadmap roadmap = roadmapFactory.Roadmap(); using (FileStream fileStream = File.Open(filePath, FileMode.Open)) { XmlDocument xml = new XmlDocument(); xml.Load(fileStream); XmlElement root = xml.DocumentElement; var roadSplinesNode = root.SelectSingleNode("roadSplines"); foreach (XmlNode splineNode in roadSplinesNode.ChildNodes) { if (splineNode.Name == "roadSpline") { IRoadSpline spline = roadmapFactory.Spline(); ReadSpline(spline, splineNode); roadmap.Splines.Add(spline); } } var roadNodes = root.SelectNodes("roads/road"); foreach (XmlNode roadNode in roadNodes) { IRoadDefinition road = roadmapFactory.Road(); ReadRoad(road, roadmapFactory, roadNode); roadmap.Roads.Add(road); var fromCrossroad = ushort.Parse(roadNode.GetAttrValue("fromCrossroad")); var toCrossroad = ushort.Parse(roadNode.GetAttrValue("toCrossroad")); roadmap.RoadToCrossroadMapping.Add(fromCrossroad); roadmap.RoadToCrossroadMapping.Add(toCrossroad); } var crossroadNodes = root.SelectNodes("crossroads/crossroad"); foreach (XmlNode crossroadNode in crossroadNodes) { ICrossroad crossroad = roadmapFactory.Crossroad(); ReadCrossroad(crossroad, roadmapFactory, crossroadNode); roadmap.Crossroads.Add(crossroad); } var roadGraphEdgeNodes = root.SelectNodes("roadGraph/roadGraphEdge"); foreach (XmlNode edgeNode in roadGraphEdgeNodes) { ICostMapEntry costMapEntry = roadmapFactory.CostMapEntry(); roadmap.CostMap.Add(costMapEntry); var type = (RoadGraphEdgeType)Enum.Parse(typeof(RoadGraphEdgeType), edgeNode.GetFieldValue("edgeType")); var cost = ushort.Parse(edgeNode.GetFieldValue("cost")); costMapEntry.RoadGraphEdgeType = type; costMapEntry.Cost = cost; if (type == RoadGraphEdgeType.Road) { var roadIndex = ushort.Parse(edgeNode.GetFieldValue("roadIndex")); costMapEntry.RoadGraphEdgeLink = roadIndex; roadmap.AddRoadEdge(roadIndex); } else if (type == RoadGraphEdgeType.CrossroadJunction) { var crossroadIndex = ushort.Parse(edgeNode.GetFieldValue("crossroadIndex")); var targetRoadIndex = ushort.Parse(edgeNode.GetFieldValue("targetRoadIndex")); costMapEntry.RoadGraphEdgeLink = crossroadIndex; roadmap.AddCrossroadJunctionEdge(targetRoadIndex); } } } return(roadmap); }