Beispiel #1
0
        static void RouteEdges(LgLayoutSettings lgLayoutSettings,
                               GeometryGraph tmpGraphForRouting,
                               LgData lgData,
                               LgLevel level)
        {
            int routedEdges = 0;

            Console.WriteLine("\nrouting for level {0}", level.ZoomLevel);
            var router = new SplineRouter(tmpGraphForRouting, lgLayoutSettings.EdgeRoutingSettings.Padding,
                                          lgLayoutSettings.EdgeRoutingSettings.PolylinePadding, Math.PI / 6,
                                          null)
            {
                RouteMultiEdgesAsBundles     = false,
                UseEdgeLengthMultiplier      = true,
                UsePolylineEndShortcutting   = false,
                UseInnerPolylingShortcutting = false,
                // LineSweeperPorts = GetLineSweeperPorts(tmpGraphForRouting, tileSize),
                AllowedShootingStraightLines = false,
                ContinueOnOverlaps           = true,
                CacheCornersForSmoothing     = true,
                ReplaceEdgeByRails           =
                    e => {
                    routedEdges++;
                    if (routedEdges % 1000 == 0)
                    {
                        Console.Write(".");
                    }
                    level.RegisterRailsOfEdge(lgData.GeometryEdgesToLgEdgeInfos[e]);
                },
                Bidirectional = true
            };    //new BundlingSettings {KeepOverlaps = true, EdgeSeparation = 0, StopAfterShortestPaths = true});

            router.Run();
            level.CreateRailTree();
            foreach (var edge in tmpGraphForRouting.Edges)
            {
                level.FillRailDictionaryForEdge(edge);
                edge.Curve = null;
            }
            // level.RunLevelStatistics(lgData.GeometryNodesToLgNodeInfos.Where(e=>e.Value.ZoomLevel<=level.ZoomLevel).Select(p=>p.Key));
        }
 void WriteRailsGeometry(LgLevel level, Dictionary<Rail, int> railIds) {
     WriteStartElement(GeometryToken.Rails);
     foreach (var rail in level._railDictionary.Values)
         WriteRail(rail, railIds[rail]);
     WriteEndElement();
 }
 void WriteLevelRails(LgLevel level, Dictionary<Rail, int> railIds) {
     WriteStartElement(GeometryToken.RailsPerEdge);
     foreach (var t in level._railsOfEdges) {
         WriteEdgeRails(t.Key, t.Value, railIds);
     }
     WriteEndElement();
     WriteRailsGeometry(level, railIds);
 }
 void WriteLevel(LgLevel level, Dictionary<Rail, int> railsToIds, int nodeCountOnLevel) {
     WriteStartElement(GeometryToken.Level);
     WriteAttribute(GeometryToken.NodeCountOnLevel, nodeCountOnLevel);
     WriteAttribute(GeometryToken.Zoomlevel, level.ZoomLevel);
     WriteLevelRails(level, railsToIds);
     WriteEndElement();
 }
 internal LgLevel AddLevel() {
     int zoomLevel = (int) Math.Pow(2, _levels.Count());
     var level = new LgLevel(zoomLevel, mainGeomGraph);
     _levels.Add(level);
     return level;
 }
 Set<Rail> GetRailsThatShouldBeHighlighted(LgLevel level, Set<Edge> edgesToPutOff) {
     var ret = new Set<Rail>();
     foreach (var edge in SelectedEdges) {
         if (edgesToPutOff.Contains(edge)) continue;
         Set<Rail> railsOfEdge;
         if (level._railsOfEdges.TryGetValue(edge, out railsOfEdge)) {
             ret.InsertRange(railsOfEdge);
         }
     }
     return ret;
 }
 static bool RailBelongsToLevel(LgLevel level, Rail rail) {
     return level.ZoomLevel >= rail.ZoomLevel;
 }
/*
        void HiglightEdge(Edge edge) {
            Set<Rail> railsOfEdge = null;
            //adding highlight for edge rails in each level
            for (int i = levels.Count - 1; i >= 0; i--) {                
                var level = levels[i];

                Set<Rail> railsOfEdgeOfLevelWithHigherZoom;
                if (level._railsOfEdges.TryGetValue(edge, out railsOfEdgeOfLevelWithHigherZoom)) {
                    railsOfEdge = railsOfEdgeOfLevelWithHigherZoom;
                }
                else {
                    //the edge is not represented at the level, so we are reusing the rails from the level above
                    level._railsOfEdges[edge] = railsOfEdge;
                    foreach (var rail1 in railsOfEdge)
                        AddRailToRailTreeOfLowerLevel(rail1, level);
                }
                foreach (var rail1 in railsOfEdge) //highlight every rail: does not matter new or old
                    rail1.HiglightCount ++;
            }
        }
*/

        static void AddRailToRailTreeOfLowerLevel(Rail rail, LgLevel lowerLevel) {
            var pt = rail.PointTuple();
            var box = new Rectangle(pt.Item1, pt.Item2);
            if (!lowerLevel._railTree.Contains(box, rail))
                lowerLevel._railTree.Add(box, rail);
        }
 static void TransferHighlightedRails(LgLevel level, Edge edge, Set<Rail> railsOfEdge) {
     //need to remove those rails later, when putting them off
     foreach (var rail in railsOfEdge)
         AddRailToRailTreeOfLowerLevel(rail, level);
     level._railsOfEdges[edge] = railsOfEdge;
     level.HighlightedRails.InsertRange(railsOfEdge);
 }
        Rail ContinueReadingRail(LgEdgeInfo topRankedEdgoInfo, int zoomLevel, LgLevel level) {
            XmlRead();
            string pointString;
            if (TokenIs(GeometryToken.Arrowhead)) {
                Point arrowheadPosition = TryGetPointAttribute(GeometryToken.ArrowheadPosition);
                Point attachmentPoint = TryGetPointAttribute(GeometryToken.CurveAttachmentPoint);
                Arrowhead ah = new Arrowhead {
                    TipPosition = arrowheadPosition,
                    Length = (attachmentPoint - arrowheadPosition).Length
                };
                XmlRead();
                ReadEndElement();
                var rail = new Rail(ah, attachmentPoint, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(arrowheadPosition, attachmentPoint);
                level._railDictionary[tuple] = rail;
                return rail;
            }

            if (TokenIs(GeometryToken.LineSegment)) {
                pointString = GetAttribute(GeometryToken.Points);
                var linePoints = ParsePoints(pointString);
                Debug.Assert(linePoints.Length == 2);
                LineSegment ls = new LineSegment(linePoints[0], linePoints[1]);
                XmlRead();
                ReadEndElement();
                var rail = new Rail(ls, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(ls.Start, ls.End);
                level._railDictionary[tuple] = rail;
                level._railTree.Add(ls.BoundingBox, rail);
                return rail;
            }
            if (TokenIs(GeometryToken.CubicBezierSegment)) {
                pointString = GetAttribute(GeometryToken.Points);
                var controlPoints = ParsePoints(pointString);
                Debug.Assert(controlPoints.Length == 4);
                var bs = new CubicBezierSegment(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3]);
                XmlRead();
                ReadEndElement();
                var rail = new Rail(bs, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(bs.Start, bs.End);
                level._railDictionary[tuple] = rail;
                return rail;
            }
            throw new Exception();
        }
        void ReadRail(LgLevel level) {
            string railId = GetAttribute(GeometryToken.Id);
            int zoomLevel = (int) GetDoubleAttribute(GeometryToken.Zoomlevel);
            double minPassigEdgeZoomLevel =
                (double) GetDoubleAttributeOrDefault(GeometryToken.MinPassingEdgeZoomLevel, zoomLevel);
            var topRankedEdgoInfo = GetTopRankedEdgeInfoOfRail(railId);
            Rail rail = ContinueReadingRail(topRankedEdgoInfo, zoomLevel, level);
            rail.MinPassingEdgeZoomLevel = minPassigEdgeZoomLevel;
            idToRails[railId] = rail;

        }
        void ReadRails(LgLevel level) {
            //CheckToken(GeometryToken.Rails);
            //XmlRead();
            //while (TokenIs(GeometryToken.Rail)) {
            //    ReadRail(level);
            //}

            CheckToken(GeometryToken.Rails);
            if (XmlReader.IsEmptyElement) {
                XmlRead();
                return;
            }
            XmlRead();
            while (TokenIs(GeometryToken.Rail)) {
                ReadRail(level);
            }
            ReadEndElement();
        }
 void FillRailsOfEdges(LgLevel level, Dictionary<string, Set<string>> edgeIdToEdgeRailsSet) {
     foreach (var edgeRails in edgeIdToEdgeRailsSet) {
         var edge = idToEdges[edgeRails.Key];
         var railSet = new Set<Rail>(edgeRails.Value.Where(s => s != "").Select(r => idToRails[r]));
         level._railsOfEdges[edge] = railSet;
     }
 }
 void ReadLevel(LgData lgData, int zoomLevel) {
     int levelNodeCount = GetIntAttribute(GeometryToken.NodeCountOnLevel);
     if (lgData.LevelNodeCounts == null) {
         lgData.LevelNodeCounts = new List<int>();
     }
     lgData.LevelNodeCounts.Add(levelNodeCount);
     LgLevel level = new LgLevel(zoomLevel, _graph);
     lgData.Levels.Add(level);
     XmlRead();
     Dictionary<string, Set<string>> edgeIdToEdgeRailsSet = new Dictionary<string, Set<string>>();
     ReadRailIdsPerEdgeIds(lgData, edgeIdToEdgeRailsSet);
     ReadRails(level);
     ReadEndElement();
     FillRailsOfEdges(level, edgeIdToEdgeRailsSet);
 }