示例#1
0
 private void DrawRoutes(Graphics graphics, Image mapImage, Document.RouteDrawingMode mode, SessionSettings sessionSettings)
 {
     SessionCollection sessionList;
       // which sessions to draw?
       if (currentMouseTool == MouseTool.AdjustRoute)
       {
     sessionList = GetSessions(SessionDrawingMode.Current);
       }
       else
       {
     sessionList = GetSessions(SessionsToDraw);
       }
       document.DrawRoutes(sessionList, zoom, graphics, mapImage, mode, colorCodingAttribute, secondaryColorCodingAttribute, sessionSettings);
 }
示例#2
0
        // todo: skip showRouteLine parameter, use RouteDrawingMode instead
        public Bitmap CreateMapAndRouteImage(bool showRouteLine, double zoomValue, Session sessionToDraw, List<int> legsToDraw, double frameWidth, WaypointAttribute colorCodingAttribute, WaypointAttribute? secondaryColorCodingAttribute, RouteDrawingMode mode, SessionSettings sessionSettings)
        {
            RectangleD frame = GetFrame(zoomValue, sessionToDraw, legsToDraw, frameWidth, colorCodingAttribute, mode);

              var sc = new SessionCollection();
              sc.Add(sessionToDraw);
              var wholeImage = CreateMapAndRouteImage(true, zoomValue, sc, colorCodingAttribute, secondaryColorCodingAttribute, mode, sessionSettings);

              AdjustFrameToImage(frame, wholeImage);

              var croppedImage = new Bitmap(
            Convert.ToInt32(Math.Ceiling(frame.Right) - Math.Floor(frame.Left)),
            Convert.ToInt32(Math.Ceiling(frame.Bottom) - Math.Floor(frame.Top)));
              var croppedImageGraphics = Graphics.FromImage(croppedImage);

              croppedImageGraphics.DrawImage(
            wholeImage,
            -Convert.ToInt32(Math.Floor(frame.Left)),
            -Convert.ToInt32(Math.Floor(frame.Top)));
              croppedImageGraphics.Dispose();
              wholeImage.Dispose();
              return croppedImage;
        }
示例#3
0
        public void DrawRoutes(IEnumerable<Session> sessionsToDraw, double zoom, Graphics graphics, Image mapImage, RouteDrawingMode mode, WaypointAttribute colorCodingAttribute, WaypointAttribute? secondaryColorCodingAttribute, SessionSettings sessionSettings)
        {
            graphics.Clip = new Region(new Rectangle(0, 0, mapImage.Width, mapImage.Height));

              // copy map as a background to route
              graphics.DrawImage(mapImage, new Point(0, 0));

              // draw the routes
              foreach (var s in sessionsToDraw)
              {
            s.DrawRoute(zoom, graphics, mode, colorCodingAttribute, secondaryColorCodingAttribute, sessionSettings);
              }
        }
示例#4
0
 private KmlMarkerStyle GetMarkerStyleFromWaypoint(Waypoint waypoint, ImageExporter imageExporter, SessionSettings sessionSettings)
 {
     var attribute = imageExporter.Properties.ColorCodingAttribute;
       var rls = sessionSettings.RouteLineSettingsCollection[attribute];
       return new KmlMarkerStyle()
       {
     Color = rls.ColorRange.GetColor(waypoint.Attributes[attribute].GetValueOrDefault(0), NoOfColorCodedSteps),
     Size = replayMarkerSizeFactor * ((rls.MaskVisible ? 2 * rls.MaskWidth : 0) + rls.Width)
       };
 }
示例#5
0
        public Bitmap CreateMapAndRouteImage(bool showMap, double zoomValue, SessionCollection sessionsToDraw, WaypointAttribute colorCodingAttribute, WaypointAttribute? secondaryColorCodingAttribute, RouteDrawingMode mode, SessionSettings sessionSettings)
        {
            Bitmap mapImage;
              if(showMap)
              {
            mapImage = CreateMapImage(zoomValue);
              }
              else
              {
            var size = GetMapImageSize(zoomValue);
            mapImage = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppPArgb);
              }

              if (mode == RouteDrawingMode.None) return mapImage;

              var mapAndRouteImage = new Bitmap(mapImage.Width, mapImage.Height, PixelFormat.Format32bppPArgb);
              var mapAndRouteGraphics = Graphics.FromImage(mapAndRouteImage);
              mapAndRouteGraphics.SmoothingMode = SmoothingMode.AntiAlias;

              DrawRoutes(sessionsToDraw, zoomValue, mapAndRouteGraphics, mapImage, mode, colorCodingAttribute, secondaryColorCodingAttribute, sessionSettings);

              mapAndRouteGraphics.Dispose();
              mapImage.Dispose();
              return mapAndRouteImage;
        }
示例#6
0
        // todo: skip showRouteLine parameter, use RouteDrawingMode instead
        public Bitmap CreateMapAndRouteImage(bool showRouteLine, double zoomValue, Session sessionToDraw, List <int> legsToDraw, double frameWidth, WaypointAttribute colorCodingAttribute, WaypointAttribute?secondaryColorCodingAttribute, RouteDrawingMode mode, SessionSettings sessionSettings)
        {
            RectangleD frame = GetFrame(zoomValue, sessionToDraw, legsToDraw, frameWidth, colorCodingAttribute, mode);

            var sc = new SessionCollection();

            sc.Add(sessionToDraw);
            var wholeImage = CreateMapAndRouteImage(true, zoomValue, sc, colorCodingAttribute, secondaryColorCodingAttribute, mode, sessionSettings);

            AdjustFrameToImage(frame, wholeImage);

            var croppedImage = new Bitmap(
                Convert.ToInt32(Math.Ceiling(frame.Right) - Math.Floor(frame.Left)),
                Convert.ToInt32(Math.Ceiling(frame.Bottom) - Math.Floor(frame.Top)));
            var croppedImageGraphics = Graphics.FromImage(croppedImage);

            croppedImageGraphics.DrawImage(
                wholeImage,
                -Convert.ToInt32(Math.Floor(frame.Left)),
                -Convert.ToInt32(Math.Floor(frame.Top)));
            croppedImageGraphics.Dispose();
            wholeImage.Dispose();
            return(croppedImage);
        }
示例#7
0
        private static void UpdateDocumentToCurrentVersion(Document doc)
        {
            var defaultRLS = SessionSettings.CreateDefaultRouteLineSettingsCollection();

            // ensure MonochromeColor is non-invisible
            foreach (Session s in doc.sessions)
            {
                foreach (var rls in s.Settings.RouteLineSettingsCollection.Values)
                {
                    if (rls.MonochromeColor == Color.FromArgb(0, 0, 0, 0))
                    {
                        rls.MonochromeColor = rls.ColorRange.Gradient.GetColor(1);
                        rls.MonochromeWidth = rls.Width;
                    }
                }
            }


            // add some speed waypoint attribute settings, introduced in QR 2.1
            if (!doc.Settings.ColorRangeIntervalSliderSettings.ContainsKey(WaypointAttribute.Speed))
            {
                var defaultCRISS = DocumentSettings.CreateDefaultColorRangeIntervalSliderSettings();
                doc.Settings.ColorRangeIntervalSliderSettings.Add(WaypointAttribute.Speed, defaultCRISS[WaypointAttribute.Speed]);
            }

            if (!doc.Settings.LapHistogramSettings.ContainsKey(WaypointAttribute.Speed))
            {
                var defaultLHS = DocumentSettings.CreateDefaultLapHistogramSettings();
                doc.Settings.LapHistogramSettings.Add(WaypointAttribute.Speed, defaultLHS[WaypointAttribute.Speed]);
            }

            foreach (Session s in doc.sessions)
            {
                if (!s.Settings.RouteLineSettingsCollection.ContainsKey(WaypointAttribute.Speed))
                {
                    s.Settings.RouteLineSettingsCollection.Add(WaypointAttribute.Speed, defaultRLS[WaypointAttribute.Speed]);
                }
            }


            // add some direction waypoint attribute settings, introduced in QR 2.1-4
            if (!doc.Settings.ColorRangeIntervalSliderSettings.ContainsKey(WaypointAttribute.DirectionDeviationToNextLap))
            {
                var defaultCRISS = DocumentSettings.CreateDefaultColorRangeIntervalSliderSettings();
                doc.Settings.ColorRangeIntervalSliderSettings.Add(WaypointAttribute.DirectionDeviationToNextLap, defaultCRISS[WaypointAttribute.DirectionDeviationToNextLap]);
            }

            if (!doc.Settings.LapHistogramSettings.ContainsKey(WaypointAttribute.DirectionDeviationToNextLap))
            {
                var defaultLHS = DocumentSettings.CreateDefaultLapHistogramSettings();
                doc.Settings.LapHistogramSettings.Add(WaypointAttribute.DirectionDeviationToNextLap, defaultLHS[WaypointAttribute.DirectionDeviationToNextLap]);
            }

            foreach (Session s in doc.sessions)
            {
                if (!s.Settings.RouteLineSettingsCollection.ContainsKey(WaypointAttribute.DirectionDeviationToNextLap))
                {
                    s.Settings.RouteLineSettingsCollection.Add(WaypointAttribute.DirectionDeviationToNextLap, defaultRLS[WaypointAttribute.DirectionDeviationToNextLap]);
                }
            }

            // add circle time radius, introduced in QR 2.4
            foreach (var s in doc.sessions)
            {
                if (s.Settings.CircleTimeRadius == 0)
                {
                    s.Settings.CircleTimeRadius = 45;
                }
            }

            // add map reading duration settings, introduced in QR 2.4
            if (!doc.Settings.ColorRangeIntervalSliderSettings.ContainsKey(WaypointAttribute.MapReadingDuration))
            {
                var defaultCRISS = DocumentSettings.CreateDefaultColorRangeIntervalSliderSettings();
                doc.Settings.ColorRangeIntervalSliderSettings.Add(WaypointAttribute.MapReadingDuration, defaultCRISS[WaypointAttribute.MapReadingDuration]);
            }

            if (!doc.Settings.LapHistogramSettings.ContainsKey(WaypointAttribute.MapReadingDuration))
            {
                var defaultLHS = DocumentSettings.CreateDefaultLapHistogramSettings();
                doc.Settings.LapHistogramSettings.Add(WaypointAttribute.MapReadingDuration, defaultLHS[WaypointAttribute.MapReadingDuration]);
            }

            if (!doc.Settings.DefaultSessionSettings.SmoothingIntervals.ContainsKey(WaypointAttribute.MapReadingDuration))
            {
                doc.Settings.DefaultSessionSettings.SmoothingIntervals[WaypointAttribute.MapReadingDuration] = new Interval(0, 0);
            }


            foreach (Session s in doc.sessions)
            {
                if (!s.Settings.RouteLineSettingsCollection.ContainsKey(WaypointAttribute.MapReadingDuration))
                {
                    s.Settings.RouteLineSettingsCollection.Add(WaypointAttribute.MapReadingDuration, defaultRLS[WaypointAttribute.MapReadingDuration]);
                }
            }
        }
示例#8
0
        public Bitmap CreateMapAndRouteImage(bool showMap, double zoomValue, SessionCollection sessionsToDraw, WaypointAttribute colorCodingAttribute, WaypointAttribute?secondaryColorCodingAttribute, RouteDrawingMode mode, SessionSettings sessionSettings)
        {
            Bitmap mapImage;

            if (showMap)
            {
                mapImage = CreateMapImage(zoomValue);
            }
            else
            {
                var size = GetMapImageSize(zoomValue);
                mapImage = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppPArgb);
            }

            if (mode == RouteDrawingMode.None)
            {
                return(mapImage);
            }

            var mapAndRouteImage    = new Bitmap(mapImage.Width, mapImage.Height, PixelFormat.Format32bppPArgb);
            var mapAndRouteGraphics = Graphics.FromImage(mapAndRouteImage);

            mapAndRouteGraphics.SmoothingMode = SmoothingMode.AntiAlias;

            DrawRoutes(sessionsToDraw, zoomValue, mapAndRouteGraphics, mapImage, mode, colorCodingAttribute, secondaryColorCodingAttribute, sessionSettings);

            mapAndRouteGraphics.Dispose();
            mapImage.Dispose();
            return(mapAndRouteImage);
        }
示例#9
0
        public void DrawRoutes(IEnumerable <Session> sessionsToDraw, double zoom, Graphics graphics, Image mapImage, RouteDrawingMode mode, WaypointAttribute colorCodingAttribute, WaypointAttribute?secondaryColorCodingAttribute, SessionSettings sessionSettings)
        {
            graphics.Clip = new Region(new Rectangle(0, 0, mapImage.Width, mapImage.Height));

            // copy map as a background to route
            graphics.DrawImage(mapImage, new Point(0, 0));

            // draw the routes
            foreach (var s in sessionsToDraw)
            {
                s.DrawRoute(zoom, graphics, mode, colorCodingAttribute, secondaryColorCodingAttribute, sessionSettings);
            }
        }
示例#10
0
        private static Session ReadSession(BinaryReader reader, int length)
        {
            List <DateTime>  mapReadingList   = null;
            Route            route            = null;
            HandleCollection handles          = null;
            LongLat          projectionOrigin = null;
            LapCollection    laps             = null;
            var         startPos    = reader.BaseStream.Position;
            SessionInfo sessionInfo = null;
            DateTime    lastTime;

            while (reader.BaseStream.Position < startPos + length)
            {
                var tag       = (Tags)reader.ReadByte();
                var tagLength = Convert.ToInt32(reader.ReadUInt32());
                switch (tag)
                {
                case Tags.Route:
                    var attributes = reader.ReadUInt16();
                    var extraWaypointAttributesLength = reader.ReadUInt16();
                    var routeSegments = new List <RouteSegment>();
                    var segmentCount  = reader.ReadUInt32();
                    lastTime = DateTime.MinValue;
                    for (var i = 0; i < segmentCount; i++)
                    {
                        var rs            = new RouteSegment();
                        var waypointCount = reader.ReadUInt32();
                        for (var j = 0; j < waypointCount; j++)
                        {
                            var w = new Waypoint();
                            w.LongLat = ReadLongLat(reader);
                            w.Time    = ReadTime(lastTime, reader);
                            lastTime  = w.Time;
                            if ((attributes & (UInt16)WaypointAttribute.HeartRate) == (UInt16)WaypointAttribute.HeartRate)
                            {
                                w.HeartRate = reader.ReadByte();
                            }
                            if ((attributes & (UInt16)WaypointAttribute.Altitude) == (UInt16)WaypointAttribute.Altitude)
                            {
                                w.Altitude = reader.ReadInt16();
                            }
                            reader.BaseStream.Position += extraWaypointAttributesLength; // for forward compatibility
                            rs.Waypoints.Add(w);
                        }
                        routeSegments.Add(rs);
                    }
                    route = new Route(routeSegments);
                    break;

                case Tags.Handles:
                    handles = new HandleCollection();
                    var handleCount        = reader.ReadUInt32();
                    var handleMarkerDrawer = SessionSettings.CreateDefaultMarkerDrawers()[MarkerType.Handle];
                    for (var i = 0; i < handleCount; i++)
                    {
                        var handle = new Handle();
                        // transformation matrix
                        handle.TransformationMatrix = new GeneralMatrix(3, 3);
                        for (var j = 0; j < 9; j++)
                        {
                            handle.TransformationMatrix.SetElement(j / 3, j % 3, reader.ReadDouble());
                        }
                        // parameterized location
                        var segmentIndex = Convert.ToInt32(reader.ReadUInt32());
                        var value        = reader.ReadDouble();
                        handle.ParameterizedLocation = new ParameterizedLocation(segmentIndex, value);

                        // pixel location
                        handle.Location = new PointD(reader.ReadDouble(), reader.ReadDouble());
                        // type
                        handle.Type = (Handle.HandleType)reader.ReadInt16();
                        // use default marker drawer
                        handle.MarkerDrawer = handleMarkerDrawer;

                        handles.Add(handle);
                    }
                    break;

                case Tags.ProjectionOrigin:
                    projectionOrigin = ReadLongLat(reader);
                    break;

                case Tags.Laps:
                    laps = new LapCollection();
                    var lapCount = reader.ReadUInt32();
                    for (var i = 0; i < lapCount; i++)
                    {
                        var lap = new Lap();
                        lap.Time    = DateTime.FromBinary(reader.ReadInt64());
                        lap.LapType = (LapType)reader.ReadByte();
                        laps.Add(lap);
                    }
                    break;

                case Tags.SessionInfo:
                    sessionInfo             = new SessionInfo();
                    sessionInfo.Person      = new SessionPerson();
                    sessionInfo.Person.Name = ReadString(reader);
                    sessionInfo.Person.Club = ReadString(reader);
                    sessionInfo.Person.Id   = reader.ReadUInt32();
                    sessionInfo.Description = ReadString(reader);
                    // when more fields are added, check so that tagLength is not passed
                    break;

                case Tags.MapReadingInfo:
                    mapReadingList = new List <DateTime>();
                    lastTime       = DateTime.MinValue;
                    var startPosition = reader.BaseStream.Position;
                    while (reader.BaseStream.Position - startPosition < tagLength)
                    {
                        var time = ReadTime(lastTime, reader);
                        mapReadingList.Add(time);
                        lastTime = time;
                    }
                    break;

                default:
                    reader.BaseStream.Position += tagLength;
                    break;
                }
            }

            if (mapReadingList != null && route != null)
            {
                route = new Route(Route.AddMapReadingWaypoints(route.Segments, mapReadingList));
            }
            var session = new Session(
                route,
                laps,
                new Size(0, 0),
                handles != null && handles.Count > 0 ? handles[0].TransformationMatrix : null,
                projectionOrigin,
                new SessionSettings());

            if (handles != null)
            {
                foreach (var h in handles)
                {
                    session.AddHandle(h);
                }
            }
            if (sessionInfo != null)
            {
                session.SessionInfo = sessionInfo;
            }

            return(session);
        }
 public ExternalRoutePropertyRetriever(SessionSettings sessionSettings)
 {
     SessionSettings = sessionSettings;
 }
 public ExternalRoutePropertyRetriever(SessionSettings sessionSettings)
 {
     SessionSettings = sessionSettings;
 }