private void SelectFrameFromMouseClick(MouseEventArgs e) { float selectedFramePercent = (float)e.X / (float)graphPanel.Width; int selectedFrameIdx = (int)(TelemetryData.GetLapFrameCount(_selectedLapIdx) * selectedFramePercent); OnSelectedFrameChangeRequest(selectedFrameIdx); }
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(); } }
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); }
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); }