Python - Add compare support to activity series (#4349)

All activity functions working with data series,
both standard and xdata, now include an optional
compareindex=-1 parameter.
When compare mode is enabled compareindex parameter
is used as an index to get data for the corresponding
compare item, be an activity or an interval.
Sample chart contributed by Marcen at the users forum
Fixes #4346
This commit is contained in:
Alejandro Martinez
2023-04-11 18:06:39 -03:00
committed by GitHub
parent 26bf31a3d6
commit 1ecc6f9ec9
8 changed files with 254 additions and 212 deletions

View File

@@ -554,19 +554,27 @@ Bindings::fromDateTime(PyObject* activity) const
}
RideFile *
Bindings::selectRideFile(PyObject *activity) const
Bindings::selectRideFile(PyObject *activity, int compareindex) const
{
Context *context = python->contexts.value(threadid()).context;
RideFile *f;
RideItem* item = fromDateTime(activity);
if (item && item->ride()) return item->ride();
// return compare item when requested
if (compareindex >= 0 && context && context->isCompareIntervals) {
int idx = 0;
foreach(CompareInterval p, context->compareIntervals)
if (p.isChecked() && compareindex == idx++) return p.rideItem->ride();
return nullptr;
}
f = python->contexts.value(threadid()).rideFile;
if (f) return f;
item = python->contexts.value(threadid()).item;
if (item && item->ride()) return item->ride();
Context *context = python->contexts.value(threadid()).context;
if (context) {
item = const_cast<RideItem*>(context->currentRideItem());
if (item && item->ride()) return item->ride();
@@ -577,9 +585,9 @@ Bindings::selectRideFile(PyObject *activity) const
// get the data series for the currently selected ride
PythonDataSeries*
Bindings::series(int type, PyObject* activity) const
Bindings::series(int type, PyObject* activity, int compareindex) const
{
RideFile *f = selectRideFile(activity);
RideFile *f = selectRideFile(activity, compareindex);
if (f == nullptr) return nullptr;
// count the included points, create data series output and copy data
@@ -606,9 +614,9 @@ Bindings::series(int type, PyObject* activity) const
// get the wbal series for the currently selected ride
PythonDataSeries*
Bindings::activityWbal(PyObject* activity) const
Bindings::activityWbal(PyObject* activity, int compareindex) const
{
RideFile *f = selectRideFile(activity);
RideFile *f = selectRideFile(activity, compareindex);
if (f == nullptr) return nullptr;
f->recalculateDerivedSeries();
@@ -634,7 +642,7 @@ Bindings::activityWbal(PyObject* activity) const
// get the xdata series for the currently selected ride
PythonDataSeries*
Bindings::xdata(QString name, QString series, QString join, PyObject* activity) const
Bindings::xdata(QString name, QString series, QString join, PyObject* activity, int compareindex) const
{
// XDATA join method
RideFile::XDataJoin xjoin;
@@ -649,7 +657,7 @@ Bindings::xdata(QString name, QString series, QString join, PyObject* activity)
case 3: xjoin = RideFile::RESAMPLE; break;
}
RideFile *f = selectRideFile(activity);
RideFile *f = selectRideFile(activity, compareindex);
if (f == nullptr) return nullptr;
if (!f->xdata().contains(name)) return NULL; // No such XData series
@@ -674,9 +682,9 @@ Bindings::xdata(QString name, QString series, QString join, PyObject* activity)
}
// get the xdata series for the currently selected ride, without interpolation
PythonXDataSeries *Bindings::xdataSeries(QString name, QString series, PyObject* activity) const
PythonXDataSeries *Bindings::xdataSeries(QString name, QString series, PyObject* activity, int compareindex) const
{
RideFile *f = selectRideFile(activity);
RideFile *f = selectRideFile(activity, compareindex);
if (f == nullptr) return nullptr;
if (!f->xdata().contains(name)) return NULL; // No such XData series
@@ -723,9 +731,9 @@ PythonXDataSeries *Bindings::xdataSeries(QString name, QString series, PyObject*
}
PyObject*
Bindings::xdataNames(QString name, PyObject* activity) const
Bindings::xdataNames(QString name, PyObject* activity, int compareindex) const
{
RideFile *f = selectRideFile(activity);
RideFile *f = selectRideFile(activity, compareindex);
if (f == nullptr) return nullptr;
QStringList namelist;
@@ -756,9 +764,9 @@ Bindings::seriesName(int type) const
}
bool
Bindings::seriesPresent(int type, PyObject* activity) const
Bindings::seriesPresent(int type, PyObject* activity, int compareindex) const
{
RideFile *f = selectRideFile(activity);
RideFile *f = selectRideFile(activity, compareindex);
if (f == nullptr) return false;
return f->isDataPresent(static_cast<RideFile::SeriesType>(type));

View File

@@ -85,14 +85,14 @@ class Bindings {
PyObject* season(bool all=false, bool compare=false) const;
// working with data series
bool seriesPresent(int type, PyObject* activity=NULL) const;
bool seriesPresent(int type, PyObject* activity=NULL, int compareindex=-1) const;
int seriesLast() const;
QString seriesName(int type) const;
PythonDataSeries *series(int type, PyObject* activity=NULL) const;
PythonDataSeries *activityWbal(PyObject* activity=NULL) const;
PythonDataSeries *xdata(QString name, QString series, QString join="repeat", PyObject* activity=NULL) const;
PythonXDataSeries *xdataSeries(QString name, QString series, PyObject* activity=NULL) const;
PyObject* xdataNames(QString name=QString(), PyObject* activity=NULL) const;
PythonDataSeries *series(int type, PyObject* activity=NULL, int compareindex=-1) const;
PythonDataSeries *activityWbal(PyObject* activity=NULL, int compareindex=-1) const;
PythonDataSeries *xdata(QString name, QString series, QString join="repeat", PyObject* activity=NULL, int compareindex=-1) const;
PythonXDataSeries *xdataSeries(QString name, QString series, PyObject* activity=NULL, int compareindex=-1) const;
PyObject* xdataNames(QString name=QString(), PyObject* activity=NULL, int compareindex=-1) const;
// working with metrics
PyObject* activityMetrics(bool compare=false) const;
@@ -133,7 +133,7 @@ class Bindings {
private:
// find a RideItem by DateTime
RideItem* fromDateTime(PyObject* activity=NULL) const;
RideFile *selectRideFile(PyObject *activity = nullptr) const;
RideFile *selectRideFile(PyObject *activity = nullptr, int compareindex=-1) const;
// get a dict populated with metrics and metadata
PyObject* activityMetrics(RideItem* item) const;

View File

@@ -356,14 +356,14 @@ public:
PyObject* season(bool all=false, bool compare=false) /TransferBack/;
// working with series
bool seriesPresent(int type=10, PyObject* activity=NULL) const;
bool seriesPresent(int type=10, PyObject* activity=NULL, int compareindex=-1) const;
QString seriesName(int type=10) const;
int seriesLast() const;
PythonDataSeries series(int type=10, PyObject* activity=NULL) /TransferBack/;
PythonDataSeries activityWbal(PyObject* activity=NULL) /TransferBack/;
PythonDataSeries xdata(QString name, QString series, QString join="repeat", PyObject* activity=NULL) /TransferBack/;
PythonXDataSeries xdataSeries(QString name, QString series, PyObject* activity=NULL) /TransferBack/;
PyObject* xdataNames(QString name=QString(), PyObject* activity=NULL) /TransferBack/;
PythonDataSeries series(int type=10, PyObject* activity=NULL, int compareindex=-1) /TransferBack/;
PythonDataSeries activityWbal(PyObject* activity=NULL, int compareindex=-1) /TransferBack/;
PythonDataSeries xdata(QString name, QString series, QString join="repeat", PyObject* activity=NULL, int compareindex=-1) /TransferBack/;
PythonXDataSeries xdataSeries(QString name, QString series, PyObject* activity=NULL, int compareindex=-1) /TransferBack/;
PyObject* xdataNames(QString name=QString(), PyObject* activity=NULL, int compareindex=-1) /TransferBack/;
// working with metrics
PyObject* activityMetrics(bool compare=false) /TransferBack/;

View File

@@ -47,170 +47,172 @@
#define sipName_intervalType &sipStrings_goldencheetah[238]
#define sipNameNr_activityWbal 251
#define sipName_activityWbal &sipStrings_goldencheetah[251]
#define sipNameNr_athleteZones 264
#define sipName_athleteZones &sipStrings_goldencheetah[264]
#define sipNameNr_configChart 277
#define sipName_configChart &sipStrings_goldencheetah[277]
#define sipNameNr_orientation 289
#define sipName_orientation &sipStrings_goldencheetah[289]
#define sipNameNr_postProcess 301
#define sipName_postProcess &sipStrings_goldencheetah[301]
#define sipNameNr_seasonPeaks 313
#define sipName_seasonPeaks &sipStrings_goldencheetah[313]
#define sipNameNr_xdataSeries 325
#define sipName_xdataSeries &sipStrings_goldencheetah[325]
#define sipNameNr_QStringList 337
#define sipName_QStringList &sipStrings_goldencheetah[337]
#define sipNameNr___setitem__ 349
#define sipName___setitem__ &sipStrings_goldencheetah[349]
#define sipNameNr___getitem__ 361
#define sipName___getitem__ &sipStrings_goldencheetah[361]
#define sipNameNr_configAxis 373
#define sipName_configAxis &sipStrings_goldencheetah[373]
#define sipNameNr_categories 384
#define sipName_categories &sipStrings_goldencheetah[384]
#define sipNameNr_labelcolor 395
#define sipName_labelcolor &sipStrings_goldencheetah[395]
#define sipNameNr_datalabels 406
#define sipName_datalabels &sipStrings_goldencheetah[406]
#define sipNameNr_symbolsize 417
#define sipName_symbolsize &sipStrings_goldencheetah[417]
#define sipNameNr_seriesUnit 428
#define sipName_seriesUnit &sipStrings_goldencheetah[428]
#define sipNameNr_xdataNames 439
#define sipName_xdataNames &sipStrings_goldencheetah[439]
#define sipNameNr_seriesLast 450
#define sipName_seriesLast &sipStrings_goldencheetah[450]
#define sipNameNr_seriesName 461
#define sipName_seriesName &sipStrings_goldencheetah[461]
#define sipNameNr_activities 472
#define sipName_activities &sipStrings_goldencheetah[472]
#define sipNameNr_processor 483
#define sipName_processor &sipStrings_goldencheetah[483]
#define sipNameNr_seasonPmc 493
#define sipName_seasonPmc &sipStrings_goldencheetah[493]
#define sipNameNr_setCurve 503
#define sipName_setCurve &sipStrings_goldencheetah[503]
#define sipNameNr_duration 512
#define sipName_duration &sipStrings_goldencheetah[512]
#define sipNameNr_activity 521
#define sipName_activity &sipStrings_goldencheetah[521]
#define sipNameNr_threadid 530
#define sipName_threadid &sipStrings_goldencheetah[530]
#define sipNameNr_Bindings 539
#define sipName_Bindings &sipStrings_goldencheetah[539]
#define sipNameNr_visible 548
#define sipName_visible &sipStrings_goldencheetah[548]
#define sipNameNr_opacity 556
#define sipName_opacity &sipStrings_goldencheetah[556]
#define sipNameNr_fseries 564
#define sipName_fseries &sipStrings_goldencheetah[564]
#define sipNameNr_yseries 572
#define sipName_yseries &sipStrings_goldencheetah[572]
#define sipNameNr_xseries 580
#define sipName_xseries &sipStrings_goldencheetah[580]
#define sipNameNr_animate 588
#define sipName_animate &sipStrings_goldencheetah[588]
#define sipNameNr_metrics 596
#define sipName_metrics &sipStrings_goldencheetah[596]
#define sipNameNr_compare 604
#define sipName_compare &sipStrings_goldencheetah[604]
#define sipNameNr_athlete 612
#define sipName_athlete &sipStrings_goldencheetah[612]
#define sipNameNr_webpage 620
#define sipName_webpage &sipStrings_goldencheetah[620]
#define sipNameNr_version 628
#define sipName_version &sipStrings_goldencheetah[628]
#define sipNameNr___len__ 636
#define sipName___len__ &sipStrings_goldencheetah[636]
#define sipNameNr___str__ 644
#define sipName___str__ &sipStrings_goldencheetah[644]
#define sipNameNr_QString 652
#define sipName_QString &sipStrings_goldencheetah[652]
#define sipNameNr_legend 660
#define sipName_legend &sipStrings_goldencheetah[660]
#define sipNameNr_opengl 667
#define sipName_opengl &sipStrings_goldencheetah[667]
#define sipNameNr_symbol 674
#define sipName_symbol &sipStrings_goldencheetah[674]
#define sipNameNr_colors 681
#define sipName_colors &sipStrings_goldencheetah[681]
#define sipNameNr_labels 410
#define sipName_labels &sipStrings_goldencheetah[410]
#define sipNameNr_legpos 688
#define sipName_legpos &sipStrings_goldencheetah[688]
#define sipNameNr_getTag 695
#define sipName_getTag &sipStrings_goldencheetah[695]
#define sipNameNr_hasTag 702
#define sipName_hasTag &sipStrings_goldencheetah[702]
#define sipNameNr_delTag 709
#define sipName_delTag &sipStrings_goldencheetah[709]
#define sipNameNr_setTag 716
#define sipName_setTag &sipStrings_goldencheetah[716]
#define sipNameNr_metric 723
#define sipName_metric &sipStrings_goldencheetah[723]
#define sipNameNr_series 565
#define sipName_series &sipStrings_goldencheetah[565]
#define sipNameNr_season 730
#define sipName_season &sipStrings_goldencheetah[730]
#define sipNameNr_filter 737
#define sipName_filter &sipStrings_goldencheetah[737]
#define sipNameNr_result 744
#define sipName_result &sipStrings_goldencheetah[744]
#define sipNameNr_remove 751
#define sipName_remove &sipStrings_goldencheetah[751]
#define sipNameNr_append 758
#define sipName_append &sipStrings_goldencheetah[758]
#define sipNameNr_align 765
#define sipName_align &sipStrings_goldencheetah[765]
#define sipNameNr_color 400
#define sipName_color &sipStrings_goldencheetah[400]
#define sipNameNr_yname 771
#define sipName_yname &sipStrings_goldencheetah[771]
#define sipNameNr_xname 777
#define sipName_xname &sipStrings_goldencheetah[777]
#define sipNameNr_stack 783
#define sipName_stack &sipStrings_goldencheetah[783]
#define sipNameNr_title 789
#define sipName_title &sipStrings_goldencheetah[789]
#define sipNameNr_index 795
#define sipName_index &sipStrings_goldencheetah[795]
#define sipNameNr_group 801
#define sipName_group &sipStrings_goldencheetah[801]
#define sipNameNr_xdata 807
#define sipName_xdata &sipStrings_goldencheetah[807]
#define sipNameNr_sport 813
#define sipName_sport &sipStrings_goldencheetah[813]
#define sipNameNr_value 819
#define sipName_value &sipStrings_goldencheetah[819]
#define sipNameNr_build 825
#define sipName_build &sipStrings_goldencheetah[825]
#define sipNameNr_fill 831
#define sipName_fill &sipStrings_goldencheetah[831]
#define sipNameNr_line 836
#define sipName_line &sipStrings_goldencheetah[836]
#define sipNameNr_join 841
#define sipName_join &sipStrings_goldencheetah[841]
#define sipNameNr_name 772
#define sipName_name &sipStrings_goldencheetah[772]
#define sipNameNr_type 846
#define sipName_type &sipStrings_goldencheetah[846]
#define sipNameNr_date 851
#define sipName_date &sipStrings_goldencheetah[851]
#define sipNameNr_log 856
#define sipName_log &sipStrings_goldencheetah[856]
#define sipNameNr_compareindex 264
#define sipName_compareindex &sipStrings_goldencheetah[264]
#define sipNameNr_athleteZones 277
#define sipName_athleteZones &sipStrings_goldencheetah[277]
#define sipNameNr_configChart 290
#define sipName_configChart &sipStrings_goldencheetah[290]
#define sipNameNr_orientation 302
#define sipName_orientation &sipStrings_goldencheetah[302]
#define sipNameNr_postProcess 314
#define sipName_postProcess &sipStrings_goldencheetah[314]
#define sipNameNr_seasonPeaks 326
#define sipName_seasonPeaks &sipStrings_goldencheetah[326]
#define sipNameNr_xdataSeries 338
#define sipName_xdataSeries &sipStrings_goldencheetah[338]
#define sipNameNr_QStringList 350
#define sipName_QStringList &sipStrings_goldencheetah[350]
#define sipNameNr___setitem__ 362
#define sipName___setitem__ &sipStrings_goldencheetah[362]
#define sipNameNr___getitem__ 374
#define sipName___getitem__ &sipStrings_goldencheetah[374]
#define sipNameNr_configAxis 386
#define sipName_configAxis &sipStrings_goldencheetah[386]
#define sipNameNr_categories 397
#define sipName_categories &sipStrings_goldencheetah[397]
#define sipNameNr_labelcolor 408
#define sipName_labelcolor &sipStrings_goldencheetah[408]
#define sipNameNr_datalabels 419
#define sipName_datalabels &sipStrings_goldencheetah[419]
#define sipNameNr_symbolsize 430
#define sipName_symbolsize &sipStrings_goldencheetah[430]
#define sipNameNr_seriesUnit 441
#define sipName_seriesUnit &sipStrings_goldencheetah[441]
#define sipNameNr_xdataNames 452
#define sipName_xdataNames &sipStrings_goldencheetah[452]
#define sipNameNr_seriesLast 463
#define sipName_seriesLast &sipStrings_goldencheetah[463]
#define sipNameNr_seriesName 474
#define sipName_seriesName &sipStrings_goldencheetah[474]
#define sipNameNr_activities 485
#define sipName_activities &sipStrings_goldencheetah[485]
#define sipNameNr_processor 496
#define sipName_processor &sipStrings_goldencheetah[496]
#define sipNameNr_seasonPmc 506
#define sipName_seasonPmc &sipStrings_goldencheetah[506]
#define sipNameNr_setCurve 516
#define sipName_setCurve &sipStrings_goldencheetah[516]
#define sipNameNr_duration 525
#define sipName_duration &sipStrings_goldencheetah[525]
#define sipNameNr_activity 534
#define sipName_activity &sipStrings_goldencheetah[534]
#define sipNameNr_threadid 543
#define sipName_threadid &sipStrings_goldencheetah[543]
#define sipNameNr_Bindings 552
#define sipName_Bindings &sipStrings_goldencheetah[552]
#define sipNameNr_visible 561
#define sipName_visible &sipStrings_goldencheetah[561]
#define sipNameNr_opacity 569
#define sipName_opacity &sipStrings_goldencheetah[569]
#define sipNameNr_fseries 577
#define sipName_fseries &sipStrings_goldencheetah[577]
#define sipNameNr_yseries 585
#define sipName_yseries &sipStrings_goldencheetah[585]
#define sipNameNr_xseries 593
#define sipName_xseries &sipStrings_goldencheetah[593]
#define sipNameNr_animate 601
#define sipName_animate &sipStrings_goldencheetah[601]
#define sipNameNr_metrics 609
#define sipName_metrics &sipStrings_goldencheetah[609]
#define sipNameNr_compare 617
#define sipName_compare &sipStrings_goldencheetah[617]
#define sipNameNr_athlete 625
#define sipName_athlete &sipStrings_goldencheetah[625]
#define sipNameNr_webpage 633
#define sipName_webpage &sipStrings_goldencheetah[633]
#define sipNameNr_version 641
#define sipName_version &sipStrings_goldencheetah[641]
#define sipNameNr___len__ 649
#define sipName___len__ &sipStrings_goldencheetah[649]
#define sipNameNr___str__ 657
#define sipName___str__ &sipStrings_goldencheetah[657]
#define sipNameNr_QString 665
#define sipName_QString &sipStrings_goldencheetah[665]
#define sipNameNr_legend 673
#define sipName_legend &sipStrings_goldencheetah[673]
#define sipNameNr_opengl 680
#define sipName_opengl &sipStrings_goldencheetah[680]
#define sipNameNr_symbol 687
#define sipName_symbol &sipStrings_goldencheetah[687]
#define sipNameNr_colors 694
#define sipName_colors &sipStrings_goldencheetah[694]
#define sipNameNr_labels 423
#define sipName_labels &sipStrings_goldencheetah[423]
#define sipNameNr_legpos 701
#define sipName_legpos &sipStrings_goldencheetah[701]
#define sipNameNr_getTag 708
#define sipName_getTag &sipStrings_goldencheetah[708]
#define sipNameNr_hasTag 715
#define sipName_hasTag &sipStrings_goldencheetah[715]
#define sipNameNr_delTag 722
#define sipName_delTag &sipStrings_goldencheetah[722]
#define sipNameNr_setTag 729
#define sipName_setTag &sipStrings_goldencheetah[729]
#define sipNameNr_metric 736
#define sipName_metric &sipStrings_goldencheetah[736]
#define sipNameNr_series 578
#define sipName_series &sipStrings_goldencheetah[578]
#define sipNameNr_season 743
#define sipName_season &sipStrings_goldencheetah[743]
#define sipNameNr_filter 750
#define sipName_filter &sipStrings_goldencheetah[750]
#define sipNameNr_result 757
#define sipName_result &sipStrings_goldencheetah[757]
#define sipNameNr_remove 764
#define sipName_remove &sipStrings_goldencheetah[764]
#define sipNameNr_append 771
#define sipName_append &sipStrings_goldencheetah[771]
#define sipNameNr_align 778
#define sipName_align &sipStrings_goldencheetah[778]
#define sipNameNr_color 413
#define sipName_color &sipStrings_goldencheetah[413]
#define sipNameNr_yname 784
#define sipName_yname &sipStrings_goldencheetah[784]
#define sipNameNr_xname 790
#define sipName_xname &sipStrings_goldencheetah[790]
#define sipNameNr_stack 796
#define sipName_stack &sipStrings_goldencheetah[796]
#define sipNameNr_title 802
#define sipName_title &sipStrings_goldencheetah[802]
#define sipNameNr_index 271
#define sipName_index &sipStrings_goldencheetah[271]
#define sipNameNr_group 808
#define sipName_group &sipStrings_goldencheetah[808]
#define sipNameNr_xdata 814
#define sipName_xdata &sipStrings_goldencheetah[814]
#define sipNameNr_sport 820
#define sipName_sport &sipStrings_goldencheetah[820]
#define sipNameNr_value 826
#define sipName_value &sipStrings_goldencheetah[826]
#define sipNameNr_build 832
#define sipName_build &sipStrings_goldencheetah[832]
#define sipNameNr_fill 838
#define sipName_fill &sipStrings_goldencheetah[838]
#define sipNameNr_line 843
#define sipName_line &sipStrings_goldencheetah[843]
#define sipNameNr_join 848
#define sipName_join &sipStrings_goldencheetah[848]
#define sipNameNr_name 785
#define sipName_name &sipStrings_goldencheetah[785]
#define sipNameNr_type 853
#define sipName_type &sipStrings_goldencheetah[853]
#define sipNameNr_date 858
#define sipName_date &sipStrings_goldencheetah[858]
#define sipNameNr_log 863
#define sipName_log &sipStrings_goldencheetah[863]
#define sipNameNr_max 120
#define sipName_max &sipStrings_goldencheetah[120]
#define sipNameNr_min 860
#define sipName_min &sipStrings_goldencheetah[860]
#define sipNameNr_all 864
#define sipName_all &sipStrings_goldencheetah[864]
#define sipNameNr_url 868
#define sipName_url &sipStrings_goldencheetah[868]
#define sipNameNr_s2 872
#define sipName_s2 &sipStrings_goldencheetah[872]
#define sipNameNr_s1 875
#define sipName_s1 &sipStrings_goldencheetah[875]
#define sipNameNr_min 867
#define sipName_min &sipStrings_goldencheetah[867]
#define sipNameNr_all 871
#define sipName_all &sipStrings_goldencheetah[871]
#define sipNameNr_url 875
#define sipName_url &sipStrings_goldencheetah[875]
#define sipNameNr_s2 879
#define sipName_s2 &sipStrings_goldencheetah[879]
#define sipNameNr_s1 882
#define sipName_s1 &sipStrings_goldencheetah[882]
#define sipMalloc sipAPI_goldencheetah->api_malloc
#define sipFree sipAPI_goldencheetah->api_free

View File

@@ -293,18 +293,20 @@ static PyObject *meth_Bindings_seriesPresent(PyObject *sipSelf, PyObject *sipArg
{
int a0 = 10;
PyObject * a1 = 0;
int a2 = -1;
const ::Bindings *sipCpp;
static const char *sipKwdList[] = {
sipName_type,
sipName_activity,
sipName_compareindex,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|iP0", &sipSelf, sipType_Bindings, &sipCpp, &a0, &a1))
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|iP0i", &sipSelf, sipType_Bindings, &sipCpp, &a0, &a1, &a2))
{
bool sipRes;
sipRes = sipCpp->seriesPresent(a0,a1);
sipRes = sipCpp->seriesPresent(a0,a1,a2);
return PyBool_FromLong(sipRes);
}
@@ -380,18 +382,20 @@ static PyObject *meth_Bindings_series(PyObject *sipSelf, PyObject *sipArgs, PyOb
{
int a0 = 10;
PyObject * a1 = 0;
int a2 = -1;
::Bindings *sipCpp;
static const char *sipKwdList[] = {
sipName_type,
sipName_activity,
sipName_compareindex,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|iP0", &sipSelf, sipType_Bindings, &sipCpp, &a0, &a1))
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|iP0i", &sipSelf, sipType_Bindings, &sipCpp, &a0, &a1, &a2))
{
::PythonDataSeries*sipRes;
sipRes = new ::PythonDataSeries(sipCpp->series(a0,a1));
sipRes = new ::PythonDataSeries(sipCpp->series(a0,a1,a2));
return sipConvertFromNewType(sipRes,sipType_PythonDataSeries,Py_None);
}
@@ -411,17 +415,19 @@ static PyObject *meth_Bindings_activityWbal(PyObject *sipSelf, PyObject *sipArgs
{
PyObject * a0 = 0;
int a1 = -1;
::Bindings *sipCpp;
static const char *sipKwdList[] = {
sipName_activity,
sipName_compareindex,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|P0", &sipSelf, sipType_Bindings, &sipCpp, &a0))
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|P0i", &sipSelf, sipType_Bindings, &sipCpp, &a0, &a1))
{
::PythonDataSeries*sipRes;
sipRes = new ::PythonDataSeries(sipCpp->activityWbal(a0));
sipRes = new ::PythonDataSeries(sipCpp->activityWbal(a0,a1));
return sipConvertFromNewType(sipRes,sipType_PythonDataSeries,Py_None);
}
@@ -448,6 +454,7 @@ static PyObject *meth_Bindings_xdata(PyObject *sipSelf, PyObject *sipArgs, PyObj
::QString* a2 = &a2def;
int a2State = 0;
PyObject * a3 = 0;
int a4 = -1;
::Bindings *sipCpp;
static const char *sipKwdList[] = {
@@ -455,13 +462,14 @@ static PyObject *meth_Bindings_xdata(PyObject *sipSelf, PyObject *sipArgs, PyObj
sipName_series,
sipName_join,
sipName_activity,
sipName_compareindex,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "BJ1J1|J1P0", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QString,&a2, &a2State, &a3))
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "BJ1J1|J1P0i", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QString,&a2, &a2State, &a3, &a4))
{
::PythonDataSeries*sipRes;
sipRes = new ::PythonDataSeries(sipCpp->xdata(*a0,*a1,*a2,a3));
sipRes = new ::PythonDataSeries(sipCpp->xdata(*a0,*a1,*a2,a3,a4));
sipReleaseType(a0,sipType_QString,a0State);
sipReleaseType(a1,sipType_QString,a1State);
sipReleaseType(a2,sipType_QString,a2State);
@@ -488,19 +496,21 @@ static PyObject *meth_Bindings_xdataSeries(PyObject *sipSelf, PyObject *sipArgs,
::QString* a1;
int a1State = 0;
PyObject * a2 = 0;
int a3 = -1;
::Bindings *sipCpp;
static const char *sipKwdList[] = {
sipName_name,
sipName_series,
sipName_activity,
sipName_compareindex,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "BJ1J1|P0", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, &a2))
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "BJ1J1|P0i", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, &a2, &a3))
{
::PythonXDataSeries*sipRes;
sipRes = new ::PythonXDataSeries(sipCpp->xdataSeries(*a0,*a1,a2));
sipRes = new ::PythonXDataSeries(sipCpp->xdataSeries(*a0,*a1,a2,a3));
sipReleaseType(a0,sipType_QString,a0State);
sipReleaseType(a1,sipType_QString,a1State);
@@ -525,18 +535,20 @@ static PyObject *meth_Bindings_xdataNames(PyObject *sipSelf, PyObject *sipArgs,
::QString* a0 = &a0def;
int a0State = 0;
PyObject * a1 = 0;
int a2 = -1;
::Bindings *sipCpp;
static const char *sipKwdList[] = {
sipName_name,
sipName_activity,
sipName_compareindex,
};
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|J1P0", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, &a1))
if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|J1P0i", &sipSelf, sipType_Bindings, &sipCpp, sipType_QString,&a0, &a0State, &a1, &a2))
{
PyObject * sipRes;
sipRes = sipCpp->xdataNames(*a0,a1);
sipRes = sipCpp->xdataNames(*a0,a1,a2);
sipReleaseType(a0,sipType_QString,a0State);
return sipRes;

View File

@@ -35,6 +35,7 @@ const char sipStrings_goldencheetah[] = {
'd', 'e', 'l', 'e', 't', 'e', 'S', 'e', 'r', 'i', 'e', 's', 0,
'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'T', 'y', 'p', 'e', 0,
'a', 'c', 't', 'i', 'v', 'i', 't', 'y', 'W', 'b', 'a', 'l', 0,
'c', 'o', 'm', 'p', 'a', 'r', 'e', 'i', 'n', 'd', 'e', 'x', 0,
'a', 't', 'h', 'l', 'e', 't', 'e', 'Z', 'o', 'n', 'e', 's', 0,
'c', 'o', 'n', 'f', 'i', 'g', 'C', 'h', 'a', 'r', 't', 0,
'o', 'r', 'i', 'e', 'n', 't', 'a', 't', 'i', 'o', 'n', 0,
@@ -95,7 +96,6 @@ const char sipStrings_goldencheetah[] = {
'x', 'n', 'a', 'm', 'e', 0,
's', 't', 'a', 'c', 'k', 0,
't', 'i', 't', 'l', 'e', 0,
'i', 'n', 'd', 'e', 'x', 0,
'g', 'r', 'o', 'u', 'p', 0,
'x', 'd', 'a', 't', 'a', 0,
's', 'p', 'o', 'r', 't', 0,

View File

@@ -7,24 +7,24 @@
#--------------------------------------------------
# basic activity data
def __GCactivity(join="repeat", activity=None):
def __GCactivity(join="repeat", activity=None, compareindex=-1):
rd={}
for x in range(0,GC.seriesLast()):
if (GC.seriesPresent(x, activity)):
rd[GC.seriesName(x)] = GC.series(x, activity)
for name in GC.xdataNames("", activity):
for serie in GC.xdataNames(name, activity):
xd = GC.xdata(name, serie, join, activity)
if (GC.seriesPresent(x, activity, compareindex)):
rd[GC.seriesName(x)] = GC.series(x, activity, compareindex)
for name in GC.xdataNames("", activity, compareindex):
for serie in GC.xdataNames(name, activity, compareindex):
xd = GC.xdata(name, serie, join, activity, compareindex)
rd[str(xd)] = xd
return rd
# xdata
def __GCactivityXdata(name="", activity=None):
def __GCactivityXdata(name="", activity=None, compareindex=-1):
if not name:
return GC.xdataNames("")
return GC.xdataNames("", activity, compareindex)
rd={}
for serie in GC.xdataNames(name, activity):
xd = GC.xdataSeries(name, serie, activity)
for serie in GC.xdataNames(name, activity, compareindex):
xd = GC.xdataSeries(name, serie, activity, compareindex)
rd[str(xd)] = xd
return rd

View File

@@ -0,0 +1,20 @@
{
"CHART":{
"VERSION":"1",
"VIEW":"analysis",
"TYPE":"43",
"PROPERTIES":{
"title":"Watt over Duration ",
"subtitle":" ",
"widthFactor":"2",
"heightFactor":"2",
"style":"0",
"resizable":"0",
"script":"##\n## Python program will run on selection.\n##\n## \nimport plotly.graph_objects as go\nimport pandas as pd\nimport tempfile\nimport pathlib\nimport plotly\nimport time\nimport datetime\n\n# Define tempory file\ntemp_file = tempfile.NamedTemporaryFile(mode=\"w+t\", prefix=\"GC_\", suffix=\".html\", delete=False)\n\n## Create dataframe\ndf = pd.DataFrame()\n\n## Get GC Data for activity and metrics\nmetricsAll = GC.activityMetrics(compare=True)\n\ntime = []\nfor i in range(0, len(metricsAll)):\n time.append(str(datetime.timedelta(seconds=int(metricsAll[i][0]['Duration']))))\n df.at[i, 'dateLocal'] = metricsAll[i][0]['date'].strftime('%a %x')\n df.at[i, 'colors'] = metricsAll[i][1]\n\ndf['time'] = time\n\nduration = []\npower = []\nisPower = []\nfor i in range(0, len(metricsAll)):\n activityAll = GC.activity(compareindex =i)\n sec = list(activityAll['seconds'])\n\n durationTemp = []\n for seconds in sec:\n minutes, seconds = divmod(seconds, 60)\n hours, minutes = divmod(minutes, 60)\n durationTemp.append(\"%02i:%02i:%02i\" % (hours, minutes, seconds))\n\n if 'power' in activityAll:\n power.append(list(activityAll['power']))\n isPower.append(1)\n\n else:\n power.append(list([0]))\n isPower.append(0)\n\n duration.append(durationTemp)\n\n## Add Data to the dataframe\ndf['duration'] = duration\ndf['power'] = power\ndf['isPower'] = isPower\n\n## Filter out data without power\ndfFilter = df.loc[df['isPower'] > 0]\n\n## Plot Data\nfig = go.Figure()\n\nfor i in dfFilter.index:\n fig.add_trace(go.Scatter(\n x = dfFilter['duration'][i],\n y = dfFilter['power'][i],\n mode = 'lines',\n name = str(dfFilter['dateLocal'][i]) +\n \"<br>\" 'Duration: ' +\n str(dfFilter['time'][i]),\n\n marker_color = dfFilter['colors'][i],\n hovertemplate =\n '<b>Power<\/b>: %{y} watts' +\n '<br><b>Duration<\/b>: %{x}',\n ))\n\nfig.update_xaxes(\n tickmode = 'auto',\n nticks = 10,\n ticks = \"outside\",\n tickwidth = 2,\n ticklen = 10,\n tickcolor = 'white',\n linewidth = 2,\n linecolor = 'white',\n)\n\n## Update layout properties\nfig.update_layout(\n xaxis_title=\"Duration\",\n yaxis_title=\"Watts\",\n template='plotly_dark',\n xaxis_showgrid=False,\n yaxis_showgrid=True,\n #hovermode=\"x unified\",\n)\n\n## Prepare Plot\nplotly.offline.plot(fig, auto_open=False, filename=temp_file.name)\n\n## Load the webpage\nGC.webpage(pathlib.Path(temp_file.name).as_uri())\n ",
"state":" ",
"showConsole":"0",
"asWeb":"1",
"__LAST__":"1"
}
}
}