예제 #1
0
        private void SelectFrameFromMouseClick(MouseEventArgs e)
        {
            float selectedFramePercent = (float)e.X / (float)graphPanel.Width;

            int selectedFrameIdx = (int)(TelemetryData.GetLapFrameCount(_selectedLapIdx) * selectedFramePercent);

            OnSelectedFrameChangeRequest(selectedFrameIdx);
        }
예제 #2
0
        public void SetCurrentFrame(int frameIdx)
        {
            if (_selectedFrameIdx != frameIdx)
            {
                var frameCountForLap = TelemetryData.GetLapFrameCount(_selectedLapIdx);
                _selectedFramePercent = (float)frameIdx / (float)frameCountForLap;
                _selectedFrameX       = (int)(graphPanel.Width * _selectedFramePercent);

                UpdateSeriesListValues(frameIdx);

                _selectedFrameIdx = frameIdx;

                // to refresh the selected frame indicator
                RedrawGraph();
            }
        }
예제 #3
0
        public void SetCurrentLap(int lapIndex)
        {
            if (lapIndex < 0 || lapIndex > TelemetryData.LapCount)
            {
                return;
            }

            if (_selectedLapIdx == lapIndex)
            {
                return;
            }

            _selectedLapIdx = lapIndex;

            int framesInCurrentLap = TelemetryData.GetLapFrameCount(_selectedLapIdx);

            int newFrameIdx = framesInCurrentLap < _selectedFrameIdx ? framesInCurrentLap : _selectedFrameIdx;

            _selectedFrameIdx = -1;

            ResetGraphGraphics();

            SetCurrentFrame(newFrameIdx);
        }
예제 #4
0
        private Bitmap GetGraphBitmap()
        {
            Bitmap bitmap = _graphBitmap;

            try
            {
                Size size = GetGraphSize();

                if (bitmap != null && bitmap.Size == size)
                {
                    return(bitmap);
                }

                bitmap = new Bitmap(
                    size.Width,
                    size.Height,
                    pixelFormat);

                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.SmoothingMode = smoothingMode;

                    g.Clear(Color.Black);

                    Bitmap backgroundBitmap = GetGraphBackgroundBitmap();

                    g.DrawImage(backgroundBitmap, 0, 0);

                    int frameCount = TelemetryData.GetLapFrameCount(_selectedLapIdx);

                    if (frameCount > 0)
                    {
                        float frameSpacing = (float)graphPanel.Width / (float)frameCount;

                        int seriesCount = Model.SeriesCollection.Count();

                        ILineGraphSeries[] seriesArray = new ILineGraphSeries[seriesCount];
                        IEnumerable <TelemetryValues>[] telemetryValuesArray = new IEnumerable <TelemetryValues> [seriesCount];
                        Pen[]          seriesPens      = new Pen[seriesCount];
                        PointF[]       seriesLastPoint = new PointF[seriesCount];
                        GraphicsPath[] graphicsPaths   = new GraphicsPath[seriesCount];
                        float[][]      fieldLapValues  = new float[seriesCount][];

                        for (int s = 0; s < seriesCount; s++)
                        {
                            var lapFieldValues = TelemetryData.GetLapFieldValues(_selectedLapIdx, s);
                            telemetryValuesArray[s] = lapFieldValues;

                            fieldLapValues[s] = lapFieldValues.Select(v => v.Value.Value).ToArray();

                            ILineGraphSeries series = Model.SeriesCollection.ToArray()[s];
                            series.SeriesMapper.GraphicsSize = size;
                            seriesArray[s] = series;

                            Pen seriesPen = new Pen(series.Color, series.AxisBaseLineThickness);
                            seriesPens[s] = seriesPen;

                            seriesLastPoint[s] = PointF.Empty;

                            graphicsPaths[s] = new GraphicsPath();
                        }

                        for (int x = 0; x < frameCount; x++)
                        {
                            float frameX = x * frameSpacing;

                            float frameY = 0;

                            for (int s = 0; s < seriesCount; s++)
                            {
                                float seriesFrameValue = fieldLapValues[s][x];

                                if (seriesArray[s].InvertRange)
                                {
                                    frameY = seriesArray[s].SeriesMapper.MapValueInverted(seriesFrameValue);
                                }
                                else
                                {
                                    frameY = seriesArray[s].SeriesMapper.MapValue(seriesFrameValue);
                                }

                                if (seriesLastPoint[s] == PointF.Empty)
                                {
                                    seriesLastPoint[s] = new PointF(frameX, frameY);
                                }

                                graphicsPaths[s].AddLine(seriesLastPoint[s], new PointF(frameX, frameY));

                                seriesLastPoint[s] = new PointF(frameX, frameY);
                            } // for (int s = 0; s < Model.SeriesCollection.Count(); s++)
                        }     // for (int x = 0; x < frameCount; x++)

                        for (int s = 0; s < seriesCount; s++)
                        {
                            g.DrawPath(seriesPens[s], graphicsPaths[s]);

                            if (seriesArray[s].ShowMinimumWarning)
                            {
                                float minWarningY = 0F;
                                if (seriesArray[s].InvertRange)
                                {
                                    minWarningY = seriesArray[s].SeriesMapper.MapValueInverted(seriesArray[s].MinWarning);
                                }
                                else
                                {
                                    minWarningY = seriesArray[s].SeriesMapper.MapValue(seriesArray[s].MinWarning);
                                }

                                seriesPens[s].DashStyle = DashStyle.DashDotDot;
                                g.DrawLine(seriesPens[s], new PointF(0, minWarningY), new PointF(graphPanel.Width, minWarningY));
                            }
                            if (seriesArray[s].ShowMaximumWarning)
                            {
                                float maxWarningY = 0F;
                                if (seriesArray[s].InvertRange)
                                {
                                    maxWarningY = seriesArray[s].SeriesMapper.MapValueInverted(seriesArray[s].MaxWarning);
                                }
                                else
                                {
                                    maxWarningY = seriesArray[s].SeriesMapper.MapValue(seriesArray[s].MaxWarning);
                                }

                                seriesPens[s].DashStyle = DashStyle.Dash;
                                g.DrawLine(seriesPens[s], new PointF(0, maxWarningY), new PointF(graphPanel.Width, maxWarningY));
                            }
                        }

                        for (int p = 0; p < seriesPens.Length; p++)
                        {
                            seriesPens[p].Dispose();
                        }
                    } // if (frameCount > 0)
                }     // using (Graphics g = Graphics.FromImage(bitmap))
            }         // try
            catch (Exception ex)
            {
                ExceptionHandler(ex);
            }

            _graphBitmap = bitmap;

            return(bitmap);
        }