示例#1
0
        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);
            }
        }
示例#2
0
        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());
        }
示例#3
0
        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);
        }