From 6cbe38e1e4c9bdf7552b4d3cc4263b702e78799e Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Tue, 25 Mar 2014 11:54:31 +0000 Subject: [PATCH] CP Refactor 3 of 3 .. fix compare date ranges Now code is ready to extend with new models and display widgets etc. --- src/CPPlot.cpp | 147 +++++++++++-------------------------------------- src/CPPlot.h | 25 ++------- 2 files changed, 36 insertions(+), 136 deletions(-) diff --git a/src/CPPlot.cpp b/src/CPPlot.cpp index 9c006b5af..04d6b342c 100644 --- a/src/CPPlot.cpp +++ b/src/CPPlot.cpp @@ -54,12 +54,8 @@ CPPlot::CPPlot(QWidget *parent, Context *context, bool rangemode) : QwtPlot(pare shadeIntervals(true), rangemode(rangemode), showPercent(false), showHeat(false), showHeatByDate(false), plotType(0), - // curves - rideCurve(NULL), modelCurve(NULL), heatCurve(NULL), heatAgeCurve(NULL), - /*extendedModelCurve2(NULL), extendedModelCurve4(NULL), extendedModelCurve5(NULL), extendedModelCurve6(NULL), - heatCurve(NULL), heatAgeCurve(NULL), extendedModelCurve_WSecond(NULL), extendedModelCurve_WPrime(NULL), - extendedModelCurve_CP(NULL), extendedModelCurve_WPrime_CP(NULL), - level14Curve5(NULL), level15Curve5(NULL), */ curveTitle(NULL) + // curves and plot objects + rideCurve(NULL), modelCurve(NULL), heatCurve(NULL), heatAgeCurve(NULL), curveTitle(NULL) { setAutoFillBackground(true); @@ -493,10 +489,8 @@ CPPlot::plotModel() deriveCPParameters(); // calculate extended CP model from all-time best data - //athleteModeleCP2 = ecp->deriveExtendedCP_2_3_Parameters(bests, series, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); - athleteModeleCP4 = ecp->deriveExtendedCP_4_3_Parameters(true, bestsCache, rideSeries, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); - athleteModeleCP5 = ecp->deriveExtendedCP_5_3_Parameters(true, bestsCache, rideSeries, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); - athleteModeleCP6 = ecp->deriveExtendedCP_6_3_Parameters(true, bestsCache, rideSeries, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); + Model_eCP athleteModeleCP5 = ecp->deriveExtendedCP_5_3_Parameters(true, bestsCache, + rideSeries, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); modelCurve = ecp->getPlotCurveForExtendedCP_5_3(athleteModeleCP5); modelCurve->attach(this); @@ -509,80 +503,6 @@ CPPlot::plotModel() curveTitle->setXValue(5); curveTitle->setYValue(70); curveTitle->attach(this); - - /* - if (extendedModelCurve4) { - delete extendedModelCurve4; - extendedModelCurve4 = NULL; - } - if (extendedModelCurve_WSecond) { - delete extendedModelCurve_WSecond; - extendedModelCurve_WSecond = NULL; - } - if (extendedModelCurve_WPrime) { - delete extendedModelCurve_WPrime; - extendedModelCurve_WPrime = NULL; - } - if (extendedModelCurve_CP) { - delete extendedModelCurve_CP; - extendedModelCurve_CP = NULL; - } - if (extendedModelCurve_WPrime_CP) { - delete extendedModelCurve_WPrime_CP; - extendedModelCurve_WPrime_CP = NULL; - } - - if (extendedModelCurve5) { - delete extendedModelCurve5; - extendedModelCurve5 = NULL; - } - - if (extendedModelCurve6) { - delete extendedModelCurve6; - extendedModelCurve6 = NULL; - } - */ - - //extendedModelCurve4 = ecp->getPlotCurveForExtendedCP_4_3(athleteModeleCP4); - //extendedModelCurve4->attach(thisPlot); - - /*extendedModelCurve_WSecond = ecp->getPlotCurveForExtendedCP_4_3_P1(athleteModeleCP4); - extendedModelCurve_WSecond->attach(thisPlot); - extendedModelCurve_WPrime = ecp->getPlotCurveForExtendedCP_4_3_WPrime(athleteModeleCP4); - extendedModelCurve_WPrime->attach(thisPlot); - extendedModelCurve_CP = ecp->getPlotCurveForExtendedCP_4_3_CP(athleteModeleCP4); - extendedModelCurve_CP->attach(thisPlot);*/ - - /*extendedCurveTitle = ecp->getPlotMarkerForExtendedCP_4_3(athleteModeleCP4); - extendedCurveTitle->attach(thisPlot);*/ - - /*for (int level=15;level>0;level--) { - double best5sec = context->ride->ride()->getWeight() * (23-(15-level)*1); - double best1min = context->ride->ride()->getWeight() * (12-(15-level)*0.5); - double best5min = context->ride->ride()->getWeight() * (8-(15-level)*0.33333); - double best1hour = context->ride->ride()->getWeight() * (6.25-(15-level)*0.25); - - Model_eCP levelModeleCP5 = ecp->deriveExtendedCP_5_3_ParametersForBest(best5sec, best1min, best5min, best1hour); - QwtPlotCurve *levelCurve5 = ecp->getPlotLevelForExtendedCP_5_3(levelModeleCP5); - levelCurve5->attach(thisPlot); - }*/ - - /*extendedModelCurve_WSecond = ecp->getPlotCurveForExtendedCP_5_3_WSecond(athleteModeleCP5, false); - extendedModelCurve_WSecond->attach(thisPlot); - extendedModelCurve_WPrime = ecp->getPlotCurveForExtendedCP_5_3_WPrime(athleteModeleCP5, false); - extendedModelCurve_WPrime->attach(thisPlot); - extendedModelCurve_CP = ecp->getPlotCurveForExtendedCP_5_3_CP(athleteModeleCP5, false); - extendedModelCurve_CP->attach(thisPlot);*/ - - //extendedModelCurve6 = ecp->getPlotCurveForExtendedCP_6_3(athleteModeleCP6); - //extendedModelCurve6->attach(thisPlot); - - /*extendedModelCurve_WSecond = ecp->getPlotCurveForExtendedCP_6_3_WSecond(athleteModeleCP6, false); - extendedModelCurve_WSecond->attach(thisPlot); - extendedModelCurve_WPrime = ecp->getPlotCurveForExtendedCP_6_3_WPrime(athleteModeleCP6, false); - extendedModelCurve_WPrime->attach(thisPlot); - extendedModelCurve_CP = ecp->getPlotCurveForExtendedCP_6_3_CP(athleteModeleCP6, false); - extendedModelCurve_CP->attach(thisPlot);*/ } break; } @@ -1552,19 +1472,24 @@ CPPlot::plotCentile(RideItem *rideItem) void CPPlot::calculateForDateRanges(QList compareDateRanges) { + if (!rangemode) return; + // zap old curves clearCurves(); + foreach(QwtPlotCurve *c, intervalCurves) { + c->detach(); + delete c; + } + intervalCurves.clear(); // If no range - if (compareDateRanges.count() == 0) return; - - int shadeModeOri = shadeMode; - int modelOri = model; + if (compareDateRanges.count() == 0) { + replot(); // show cleared plot + return; + } double ymax = 0; - model = 0; // no model in compareDateRanges - // prepare aggregates for (int j = 0; j < compareDateRanges.size(); ++j) { @@ -1575,14 +1500,8 @@ CPPlot::calculateForDateRanges(QList compareDateRanges) if (cache->meanMaxArray(rideSeries).size()) { - int maxNonZero = 0; - int i=0; - for (; i < cache->meanMaxArray(rideSeries).size(); ++i) { - if (cache->meanMaxArray(rideSeries)[i] > 0) maxNonZero = i; - } - if (i>0) shadeMode = 0; - - //XXX !!! XXX plotBestsCurve(maxNonZero, cache->meanMaxArray(rideSeries).constData() + 1, range.color, true); + // plot using the interval way + plotCache(cache->meanMaxArray(rideSeries), range.color); foreach(double v, cache->meanMaxArray(rideSeries)) { if (v > ymax) ymax = v; @@ -1591,9 +1510,6 @@ CPPlot::calculateForDateRanges(QList compareDateRanges) } } setAxisScale(yLeft, 0, 1.1*ymax); - shadeMode = shadeModeOri; - model = modelOri; - replot(); } @@ -1602,17 +1518,8 @@ CPPlot::calculateForIntervals(QList compareIntervals) { if (rangemode) return; - // unselect current intervals - for (int i=0; iathlete->allIntervalItems()->childCount(); i++) { - context->athlete->allIntervalItems()->child(i)->setSelected(false); - } - - // Remove ride curve if present - if (rideCurve) { - delete rideCurve; - rideCurve = NULL; - } - // Remove current intervals + // Zap what we got + clearCurves(); foreach(QwtPlotCurve *c, intervalCurves) { c->detach(); delete c; @@ -1620,7 +1527,10 @@ CPPlot::calculateForIntervals(QList compareIntervals) intervalCurves.clear(); // If no intervals - if (compareIntervals.count() == 0) return; + if (compareIntervals.count() == 0) { + replot(); // show cleared plot + return; + } // prepare aggregates for (int i = 0; i < compareIntervals.size(); ++i) { @@ -1632,7 +1542,7 @@ CPPlot::calculateForIntervals(QList compareIntervals) if (interval.rideFileCache()->meanMaxArray(rideSeries).count() == 0) return; // create curve data arrays - plotInterval(interval.rideFileCache()->meanMaxArray(rideSeries), interval.color); + plotCache(interval.rideFileCache()->meanMaxArray(rideSeries), interval.color); } } @@ -1640,8 +1550,13 @@ CPPlot::calculateForIntervals(QList compareIntervals) } void -CPPlot::plotInterval(QVector vector, QColor intervalColor) +CPPlot::plotCache(QVector vector, QColor intervalColor) { + // we don't shade if we're plotting in compare mode + bool wantShadeIntervals = false; + if ((rangemode && !context->isCompareDateRanges) || (!rangemode && !context->isCompareIntervals)) + wantShadeIntervals = shadeIntervals; + QVectorx; QVectory; for (int i=1; i vector, QColor intervalColor) //pen.setStyle(Qt::DotLine); intervalColor.setAlpha(64); QBrush brush = QBrush(intervalColor); - if (shadeIntervals) curve->setBrush(brush); + if (wantShadeIntervals) curve->setBrush(brush); else curve->setBrush(Qt::NoBrush); curve->setPen(pen); curve->setSamples(x.data(), y.data(), x.count()-1); diff --git a/src/CPPlot.h b/src/CPPlot.h index d8044e806..6bba67410 100644 --- a/src/CPPlot.h +++ b/src/CPPlot.h @@ -106,18 +106,17 @@ class CPPlot : public QwtPlot void calculateForDateRanges(QList compareDateRanges); void calculateForIntervals(QList compareIntervals); void deriveCPParameters(); - void deriveExtendedCPParameters(); // plotters - void plotRide(RideItem *); // done :) - void plotBests(); // done :) (refresh issues) - void plotModel(); // done :) (refresh issues) + void plotRide(RideItem *); + void plotBests(); + void plotModel(); void plotCentile(RideItem *); - void plotInterval(QVector vector, QColor plotColor); + void plotCache(QVector vector, QColor plotColor); // utility void clearCurves(); - QStringList filterForSeason(QStringList cpints, QDate startDate, QDate endDate); + //QStringList filterForSeason(QStringList cpints, QDate startDate, QDate endDate); void setAxisTitle(int axis, QString label); void refreshReferenceLines(RideItem*); @@ -125,13 +124,6 @@ class CPPlot : public QwtPlot int model; double sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2; double cp, tau, t0; // CP model parameters - - Model_eCP athleteModeleCP2; - Model_eCP athleteModeleCP4; - Model_eCP athleteModeleCP5; - Model_eCP athleteModeleCP6; - Model_eCP level14ModeleCP5; - Model_eCP level15ModeleCP5; ExtendedCriticalPower *ecp; // Data and State @@ -164,13 +156,6 @@ class CPPlot : public QwtPlot QwtPlotCurve *heatCurve; CpPlotCurve *heatAgeCurve; - //Not sure if you need these Damien (?) - //QwtPlotCurve *extendedModelCurve2, *extendedModelCurve4, - // *extendedModelCurve5, *extendedModelCurve6; - //QwtPlotIntervalCurve *extendedModelCurve_WSecond, *extendedModelCurve_WPrime, - // *extendedModelCurve_CP, *extendedModelCurve_WPrime_CP; - //QwtPlotCurve *level14Curve5, *level15Curve5; - // other plot objects QwtPlotMarker *curveTitle; QList referenceLines;