From 3142e886b4cd5456937e41341a130ac8ed4619fc Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 29 Sep 2025 14:34:16 +0200 Subject: [PATCH] building a graph now basically works! --- src/lib/aqdiagram/draw/w_drawable.c | 5 +- src/lib/aqdiagram/graph/0BUILD | 2 + src/lib/aqdiagram/graph/axis.t2d | 217 +++++++++++++++++++- src/lib/aqdiagram/graph/graph.c | 85 ++++++++ src/lib/aqdiagram/graph/graph.h | 3 + src/lib/aqdiagram/graph/subgraph.t2d | 53 ++++- src/lib/aqdiagram/graph/w_axis.c | 3 - src/lib/aqdiagram/graph/w_graph.c | 53 +++-- src/lib/aqdiagram/graph/w_graph.h | 12 +- src/lib/aqdiagram/graph/w_viewport.c | 285 +++++++++++++++++++++++++++ src/lib/aqdiagram/graph/w_xaxis.c | 15 +- src/lib/aqdiagram/graph/w_yaxis.c | 15 +- src/lib/aqdiagram/libtest.c | 104 +++++++++- 13 files changed, 793 insertions(+), 59 deletions(-) diff --git a/src/lib/aqdiagram/draw/w_drawable.c b/src/lib/aqdiagram/draw/w_drawable.c index fbf5673..fc96bf0 100644 --- a/src/lib/aqdiagram/draw/w_drawable.c +++ b/src/lib/aqdiagram/draw/w_drawable.c @@ -353,8 +353,9 @@ int AQDG_DrawableWidget_DrawChildren(AQDG_OBJECT *object) child=AQDG_Object_Tree2_GetFirstChild(object); if (child) { - while (child) { - AQDG_DrawableWidget_Draw(child); + while (child) { + if (!(AQDG_Object_GetFlags(child) & AQDG_OBJECT_FLAGS_HIDDEN)) + AQDG_DrawableWidget_Draw(child); child=AQDG_Object_Tree2_GetNext(child); } return 1; diff --git a/src/lib/aqdiagram/graph/0BUILD b/src/lib/aqdiagram/graph/0BUILD index 403205f..69ed382 100644 --- a/src/lib/aqdiagram/graph/0BUILD +++ b/src/lib/aqdiagram/graph/0BUILD @@ -78,6 +78,7 @@ graph.h + timegraph.h w_graph.h w_axis.h w_xaxis.h @@ -97,6 +98,7 @@ $(local/typefiles) graph.c + timegraph.c w_graph.c w_axis.c w_xaxis.c diff --git a/src/lib/aqdiagram/graph/axis.t2d b/src/lib/aqdiagram/graph/axis.t2d index cc98872..5d84139 100644 --- a/src/lib/aqdiagram/graph/axis.t2d +++ b/src/lib/aqdiagram/graph/axis.t2d @@ -20,6 +20,8 @@
aqdiagram/aqdg_api.h
aqdiagram/graph/tick.h
gwenhywfar/buffer.h
+
gwenhywfar/timestamp.h
+
gwenhywfar/gwendate.h
math.h
@@ -90,7 +92,7 @@ } \n \n vRun=startValue; \n - v/=10.0; \n + v/=2.0; \n while(vRun<=(st->maxValue)) { \n if (vRun>=(st->minValue)) { \n if (!$(struct_prefix)_HasTickValue(st, vRun)) { \n @@ -130,6 +132,214 @@ + + + + $(api) void $(struct_prefix)_GenHourTicks($(struct_type) *st, int lvl); + + + + + + void $(struct_prefix)_GenHourTicks($(struct_type) *st, int lvl) \n + { \n + double minValue; \n + double maxValue; \n + double endTime; \n + GWEN_BUFFER *dbuf; \n + GWEN_TIMESTAMP *ts; \n + \n + maxValue=st->maxValue; \n + ts=GWEN_Timestamp_fromLocalTime(maxValue); \n + GWEN_Timestamp_SetTime(ts, GWEN_Timestamp_GetHour(ts), 0, 0); \n + GWEN_Timestamp_AddSeconds(ts, 60*60); \n + endTime=GWEN_Timestamp_toTimeT(ts); \n + GWEN_Timestamp_free(ts); \n + \n + minValue=st->minValue; \n + ts=GWEN_Timestamp_fromLocalTime(minValue); \n + GWEN_Timestamp_SetTime(ts, GWEN_Timestamp_GetHour(ts), 0, 0); \n + \n + dbuf=GWEN_Buffer_new(0, 256, 0, 1); \n + while(1) { \n + double v; \n + \n + v=GWEN_Timestamp_toTimeT(ts); \n + if (v>=minValue && v<endTime) { \n + GWEN_Buffer_AppendArgs(dbuf, \n + "%02d:%02d", \n + GWEN_Timestamp_GetHour(ts), \n + GWEN_Timestamp_GetMinute(ts)); \n + $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), v, lvl, 0); \n + GWEN_Buffer_Reset(dbuf); \n + } \n + GWEN_Timestamp_AddSeconds(ts, 60*60); \n + if (v>=endTime) \n + break; \n + } \n + GWEN_Buffer_free(dbuf); \n + GWEN_Timestamp_free(ts); \n + } \n + + + + + + + $(api) void $(struct_prefix)_GenDayTicks($(struct_type) *st, int lvl); + + + + + + void $(struct_prefix)_GenDayTicks($(struct_type) *st, int lvl) \n + { \n + double minValue; \n + double maxValue; \n + double endTime; \n + GWEN_BUFFER *dbuf; \n + GWEN_TIMESTAMP *ts; \n + \n + maxValue=st->maxValue; \n + ts=GWEN_Timestamp_fromLocalTime(maxValue); \n + GWEN_Timestamp_SetTime(ts, 0, 0, 0); \n + GWEN_Timestamp_AddSeconds(ts, 24*60*60); \n + endTime=GWEN_Timestamp_toTimeT(ts); \n + GWEN_Timestamp_free(ts); \n + \n + minValue=st->minValue; \n + ts=GWEN_Timestamp_fromLocalTime(minValue); \n + GWEN_Timestamp_SetTime(ts, 0, 0, 0); \n + \n + dbuf=GWEN_Buffer_new(0, 256, 0, 1); \n + while(1) { \n + double v; \n + \n + v=GWEN_Timestamp_toTimeT(ts); \n + if (v>=minValue && v<endTime) { \n + GWEN_Buffer_AppendArgs(dbuf, \n + "%04d/%02d/%02d", \n + GWEN_Timestamp_GetYear(ts), \n + GWEN_Timestamp_GetMonth(ts), \n + GWEN_Timestamp_GetDay(ts)); \n + $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), v, lvl, 0); \n + GWEN_Buffer_Reset(dbuf); \n + } \n + GWEN_Timestamp_AddSeconds(ts, 24*60*60); \n + if (v>=endTime) \n + break; \n + } \n + GWEN_Buffer_free(dbuf); \n + GWEN_Timestamp_free(ts); \n + } \n + + + + + + + + $(api) void $(struct_prefix)_GenWeekTicks($(struct_type) *st, int lvl); + + + + + + void $(struct_prefix)_GenWeekTicks($(struct_type) *st, int lvl) \n + { \n + double minValue; \n + double maxValue; \n + double endTime; \n + GWEN_BUFFER *dbuf; \n + GWEN_TIMESTAMP *ts; \n + \n + maxValue=st->maxValue; \n + ts=GWEN_Timestamp_fromLocalTime(maxValue); \n + GWEN_Timestamp_SetTime(ts, 0, 0, 0); \n + GWEN_Timestamp_AddSeconds(ts, 24*60*60); \n + endTime=GWEN_Timestamp_toTimeT(ts); \n + GWEN_Timestamp_free(ts); \n + \n + minValue=st->minValue; \n + ts=GWEN_Timestamp_fromLocalTime(minValue); \n + GWEN_Timestamp_SetTime(ts, 0, 0, 0); \n + GWEN_Timestamp_AddSeconds(ts, -GWEN_Timestamp_GetWeekDay(ts)*24*60*60); \n + \n + dbuf=GWEN_Buffer_new(0, 256, 0, 1); \n + while(1) { \n + double v; \n + \n + v=GWEN_Timestamp_toTimeT(ts); \n + if (v>=minValue && v<endTime) { \n + GWEN_Buffer_AppendArgs(dbuf, \n + "%04d/%02d/%02d", \n + GWEN_Timestamp_GetYear(ts), \n + GWEN_Timestamp_GetMonth(ts), \n + GWEN_Timestamp_GetDay(ts)); \n + $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), v, lvl, 0); \n + GWEN_Buffer_Reset(dbuf); \n + } \n + GWEN_Timestamp_AddSeconds(ts, 7*24*60*60); \n + if (v>=endTime) \n + break; \n + } \n + GWEN_Buffer_free(dbuf); \n + GWEN_Timestamp_free(ts); \n + } \n + + + + + + + $(api) void $(struct_prefix)_GenMonthTicks($(struct_type) *st, int lvl); + + + + + + void $(struct_prefix)_GenMonthTicks($(struct_type) *st, int lvl) \n + { \n + double minValue; \n + double maxValue; \n + double endTime; \n + GWEN_BUFFER *dbuf; \n + GWEN_DATE *dt; \n + \n + maxValue=st->maxValue; \n + dt=GWEN_Date_fromLocalTime(maxValue); \n + endTime=GWEN_Date_toLocalTime(dt); \n + GWEN_Date_free(dt); \n + \n + minValue=st->minValue; \n + dt=GWEN_Date_fromLocalTime(minValue); \n + \n + dbuf=GWEN_Buffer_new(0, 256, 0, 1); \n + while(1) { \n + double v; \n + GWEN_DATE *dtCurrent; \n + \n + dtCurrent=GWEN_Date_GetThisMonthStart(dt); \n + v=GWEN_Date_toLocalTime(dt); \n + if (v>=minValue && v<endTime) { \n + GWEN_Buffer_AppendArgs(dbuf, \n + "%04d/%02d", \n + GWEN_Date_GetYear(dt), \n + GWEN_Date_GetMonth(dt)); \n + $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), v, lvl, 0); \n + GWEN_Date_free(dtCurrent); \n + GWEN_Buffer_Reset(dbuf); \n + } \n + GWEN_Date_AddDays(dt, 32); \n + if (v>=endTime) \n + break; \n + } \n + GWEN_Buffer_free(dbuf); \n + GWEN_Date_free(dt); \n + } \n + + + @@ -141,6 +351,11 @@ + + + + + diff --git a/src/lib/aqdiagram/graph/graph.c b/src/lib/aqdiagram/graph/graph.c index c68fe93..363562d 100644 --- a/src/lib/aqdiagram/graph/graph.c +++ b/src/lib/aqdiagram/graph/graph.c @@ -17,6 +17,21 @@ #include +/* ------------------------------------------------------------------------------------------------ + * forward declarations + * ------------------------------------------------------------------------------------------------ + */ + + +static void _updateAxisMinMaxValues(AQDG_GRAPH_AXIS *axis, double minValue, double maxValue); + + + +/* ------------------------------------------------------------------------------------------------ + * code + * ------------------------------------------------------------------------------------------------ + */ + AQDG_GRAPH *AQDG_Graph_new(void) { @@ -135,3 +150,73 @@ void AQDG_Graph_AddSubGraph(AQDG_GRAPH *g, AQDG_GRAPH_SUBGRAPH *sg) +AQDG_GRAPH_SUBGRAPH *AQDG_Graph_GetFirstSubGraph(const AQDG_GRAPH *g) +{ + return (g && g->subGraphList)?AQDG_Graph_SubGraph_List_First(g->subGraphList):NULL; +} + + + +void AQDG_Graph_CalcMinMaxValues(AQDG_GRAPH *g) +{ + if (g) { + AQDG_GRAPH_SUBGRAPH *sg; + + sg=AQDG_Graph_SubGraph_List_First(g->subGraphList); + while(sg) { + AQDG_GRAPH_AXIS *axis; + + AQDG_Graph_SubGraph_CalcMinMaxValues(sg); + DBG_ERROR(NULL, "SubGraph: minX=%f, maxX=%f", AQDG_Graph_SubGraph_GetMinValueX(sg), AQDG_Graph_SubGraph_GetMaxValueX(sg)); + axis=AQDG_Graph_GetAxisByIndex(g, AQDG_Graph_SubGraph_GetIndexAxisX(sg)); + if (axis) + _updateAxisMinMaxValues(axis, AQDG_Graph_SubGraph_GetMinValueX(sg), AQDG_Graph_SubGraph_GetMaxValueX(sg)); + axis=AQDG_Graph_GetAxisByIndex(g, AQDG_Graph_SubGraph_GetIndexAxisY(sg)); + if (axis) + _updateAxisMinMaxValues(axis, AQDG_Graph_SubGraph_GetMinValueY(sg), AQDG_Graph_SubGraph_GetMaxValueY(sg)); + + sg=AQDG_Graph_SubGraph_List_Next(sg); + } + } +} + + + +void _updateAxisMinMaxValues(AQDG_GRAPH_AXIS *axis, double minValue, double maxValue) +{ + if (axis) { + uint32_t flags; + + flags=AQDG_Graph_Axis_GetFlags(axis); + + if (flags & AQDG_GRAPH_AXIS_FLAGS_HASMINVALUE) { + double value; + + value=AQDG_Graph_Axis_GetMinValue(axis); + if (minValuevalue) + AQDG_Graph_Axis_SetMaxValue(axis, maxValue); + } + else { + AQDG_Graph_Axis_SetMaxValue(axis, maxValue); + AQDG_Graph_Axis_AddFlags(axis, AQDG_GRAPH_AXIS_FLAGS_HASMAXVALUE); + } + } +} + + + + + + diff --git a/src/lib/aqdiagram/graph/graph.h b/src/lib/aqdiagram/graph/graph.h index befe11e..f41e143 100644 --- a/src/lib/aqdiagram/graph/graph.h +++ b/src/lib/aqdiagram/graph/graph.h @@ -63,10 +63,13 @@ AQDG_API int AQDG_Graph_SetAxis(AQDG_GRAPH *g, int idx, AQDG_GRAPH_AXIS *ax); AQDG_API AQDG_GRAPH_SUBGRAPH_LIST *AQDG_Graph_GetSubGraphList(const AQDG_GRAPH *g); AQDG_API void AQDG_Graph_AddSubGraph(AQDG_GRAPH *g, AQDG_GRAPH_SUBGRAPH *sg); +AQDG_API AQDG_GRAPH_SUBGRAPH *AQDG_Graph_GetFirstSubGraph(const AQDG_GRAPH *g); AQDG_API AQDG_DRAW_CONTEXT *AQDG_Graph_GetDrawContext(const AQDG_GRAPH *g); AQDG_API void AQDG_Graph_SetDrawContext(AQDG_GRAPH *g, AQDG_DRAW_CONTEXT *dc); +AQDG_API void AQDG_Graph_CalcMinMaxValues(AQDG_GRAPH *g); + #endif diff --git a/src/lib/aqdiagram/graph/subgraph.t2d b/src/lib/aqdiagram/graph/subgraph.t2d index b9d696c..65a7e20 100644 --- a/src/lib/aqdiagram/graph/subgraph.t2d +++ b/src/lib/aqdiagram/graph/subgraph.t2d @@ -37,6 +37,10 @@ void $(struct_prefix)_CalcMinMaxValues($(struct_type) *st) \n { \n if (st && st->curves) { \n + int hasMinX=0; \n + int hasMaxX=0; \n + int hasMinY=0; \n + int hasMaxY=0; \n double minX; \n double maxX; \n double maxY; \n @@ -49,14 +53,35 @@ \n AQDG_Graph_Curve_CalcMinMaxValues(curve); \n d=AQDG_Graph_Curve_GetMinValueX(curve); \n - minX=(d<minX)?d:minX; \n + if (hasMinX) \n + minX=(d<minX)?d:minX; \n + else { \n + minX=d; \n + hasMinX=1; \n + } \n + \n d=AQDG_Graph_Curve_GetMinValueY(curve); \n - minY=(d<minY)?d:minY; \n + if (hasMinY) \n + minY=(d<minY)?d:minY; \n + else { \n + minY=d; \n + hasMinY=1; \n + } \n \n d=AQDG_Graph_Curve_GetMaxValueX(curve); \n - maxX=(d>maxX)?d:maxX; \n + if (hasMaxX) \n + maxX=(d>maxX)?d:maxX; \n + else { \n + maxX=d; \n + hasMaxX=1; \n + } \n d=AQDG_Graph_Curve_GetMaxValueY(curve); \n - maxY=(d>maxY)?d:maxY; \n + if (hasMaxY) \n + maxY=(d>maxY)?d:maxY; \n + else { \n + maxY=d; \n + hasMaxY=1; \n + } \n \n curve=AQDG_Graph_Curve_List_Next(curve); \n } \n @@ -69,6 +94,26 @@ } \n + + + + + $(api) void $(struct_prefix)_AddCurve($(struct_type) *st, AQDG_GRAPH_CURVE *curve); + + + + + + void $(struct_prefix)_AddCurve($(struct_type) *st, AQDG_GRAPH_CURVE *curve) \n + { \n + if (st && curve) { \n + if (st->curves==NULL) \n + st->curves=AQDG_Graph_Curve_List_new(); \n + AQDG_Graph_Curve_List_Add(curve, st->curves); \n + } \n + } \n + + diff --git a/src/lib/aqdiagram/graph/w_axis.c b/src/lib/aqdiagram/graph/w_axis.c index 6a57ddc..2edb841 100644 --- a/src/lib/aqdiagram/graph/w_axis.c +++ b/src/lib/aqdiagram/graph/w_axis.c @@ -373,6 +373,3 @@ int _hideEverySecondLabel(AQDG_OBJECT *o) - - - diff --git a/src/lib/aqdiagram/graph/w_graph.c b/src/lib/aqdiagram/graph/w_graph.c index 8716c61..4a5b619 100644 --- a/src/lib/aqdiagram/graph/w_graph.c +++ b/src/lib/aqdiagram/graph/w_graph.c @@ -480,30 +480,31 @@ void AQDG_GraphWidget_SetupDefaultPens(AQDG_OBJECT *o) AQDG_DRAW_CONTEXT *dc; dc=AQDG_DrawableWidget_GetDrawContext(o); -#define MKSOLIDPEN(penArrayIdx, penColour, penSize) \ - xo->penArray[penArrayIdx]=AQDG_Draw_Context_PenCreate(dc, penColour, penSize, AQDG_Dash_None); +#define MKPEN(penArrayIdx, penColour, penSize, penDash) \ + xo->penArray[penArrayIdx]=AQDG_Draw_Context_PenCreate(dc, penColour, penSize, penDash); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_TITLE, AQDG_GRAPHWIDGET_COL_BLACK, 2); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_SUBTITLE, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_AXISLINE, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_AXISLABEL, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKLABELMAINLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKLABELSUBLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKMAINLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKSUBLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_GRAPHBACKGROUND, AQDG_GRAPHWIDGET_COL_WHITESMOKE, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_GRID, AQDG_GRAPHWIDGET_COL_BLACK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_BACKGROUND, AQDG_GRAPHWIDGET_COL_GAINSBORO, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE0, AQDG_GRAPHWIDGET_COL_LIME, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE1, AQDG_GRAPHWIDGET_COL_BLUE, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE2, AQDG_GRAPHWIDGET_COL_CYAN, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE3, AQDG_GRAPHWIDGET_COL_MAGENTA, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE4, AQDG_GRAPHWIDGET_COL_GREEN, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE5, AQDG_GRAPHWIDGET_COL_TURQUOISE, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE6, AQDG_GRAPHWIDGET_COL_DEEPPINK, 1); - MKSOLIDPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE7, AQDG_GRAPHWIDGET_COL_NAVY, 1); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_TITLE, AQDG_GRAPHWIDGET_COL_BLACK, 2, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_SUBTITLE, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_AXISLINE, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_AXISLABEL, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKLABELMAINLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKLABELSUBLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKMAINLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_TICKSUBLEVEL, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_GRAPHBACKGROUND, AQDG_GRAPHWIDGET_COL_WHITESMOKE, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_GRID1, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_Format1); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_GRID2, AQDG_GRAPHWIDGET_COL_BLACK, 1, AQDG_Dash_Format2); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_BACKGROUND, AQDG_GRAPHWIDGET_COL_GAINSBORO, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE0, AQDG_GRAPHWIDGET_COL_GREEN, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE1, AQDG_GRAPHWIDGET_COL_BLUE, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE2, AQDG_GRAPHWIDGET_COL_RED, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE3, AQDG_GRAPHWIDGET_COL_MAGENTA, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE4, AQDG_GRAPHWIDGET_COL_ORANGE, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE5, AQDG_GRAPHWIDGET_COL_TURQUOISE, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE6, AQDG_GRAPHWIDGET_COL_DEEPPINK, 1, AQDG_Dash_None); + MKPEN(AQDG_GRAPHWIDGET_PEN_IDX_CURVE7, AQDG_GRAPHWIDGET_COL_NAVY, 1, AQDG_Dash_None); -#undef MKSOLIDPEN +#undef MKPEN } } @@ -534,11 +535,3 @@ void AQDG_GraphWidget_SetupDefaultFonts(AQDG_OBJECT *o) - - - - - - - - diff --git a/src/lib/aqdiagram/graph/w_graph.h b/src/lib/aqdiagram/graph/w_graph.h index e555a42..cc84535 100644 --- a/src/lib/aqdiagram/graph/w_graph.h +++ b/src/lib/aqdiagram/graph/w_graph.h @@ -52,7 +52,8 @@ enum { AQDG_GRAPHWIDGET_PEN_IDX_TICKMAINLEVEL, AQDG_GRAPHWIDGET_PEN_IDX_TICKSUBLEVEL, AQDG_GRAPHWIDGET_PEN_IDX_GRAPHBACKGROUND, - AQDG_GRAPHWIDGET_PEN_IDX_GRID, + AQDG_GRAPHWIDGET_PEN_IDX_GRID1, + AQDG_GRAPHWIDGET_PEN_IDX_GRID2, AQDG_GRAPHWIDGET_PEN_IDX_BACKGROUND, AQDG_GRAPHWIDGET_PEN_IDX_CURVE0, AQDG_GRAPHWIDGET_PEN_IDX_CURVE1, @@ -102,6 +103,15 @@ AQDG_API void AQDG_GraphWidget_SetupDefaultPens(AQDG_OBJECT *o); AQDG_API void AQDG_GraphWidget_SetupDefaultFonts(AQDG_OBJECT *o); +AQDG_API AQDG_OBJECT *AQDG_GraphWidget_GenerateTimeGraph(const char *sTitle, + const char *sSubTitle, + int width, + int height, + const char *sYLabel, + const char *sYUnits, + int yPrecision); +AQDG_API void AQDG_GraphWidget_AddCurve(AQDG_OBJECT *o); + #endif diff --git a/src/lib/aqdiagram/graph/w_viewport.c b/src/lib/aqdiagram/graph/w_viewport.c index 527169d..993d245 100644 --- a/src/lib/aqdiagram/graph/w_viewport.c +++ b/src/lib/aqdiagram/graph/w_viewport.c @@ -11,6 +11,7 @@ #endif #include "./w_viewport_p.h" +#include "./w_axis.h" #include "aqdiagram/draw/w_drawable.h" #include @@ -23,6 +24,19 @@ */ static GWENHYWFAR_CB void _freeData(void *bp, void *p); +static int _draw(AQDG_OBJECT *object); +static void _drawCurves(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); +static void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); +static void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); +static void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); +static void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); +static void _drawHorizontalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); @@ -45,6 +59,8 @@ AQDG_OBJECT *AQDG_ViewportWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG GWEN_NEW_OBJECT(AQDG_WIDGET_VIEWPORT, xo); GWEN_INHERIT_SETDATA(AQDG_OBJECT, AQDG_WIDGET_VIEWPORT, o, xo, _freeData); + AQDG_DrawableWidget_SetDrawFn(o, _draw); + xo->graphObject=graphObject; AQDG_DrawableWidget_SetBackgroundPenId(o, AQDG_GraphWidget_GetPen(graphObject, AQDG_GRAPHWIDGET_PEN_IDX_GRAPHBACKGROUND)); @@ -70,6 +86,21 @@ GWENHYWFAR_CB void _freeData(void *bp, void *p) +int _draw(AQDG_OBJECT *object) +{ + AQDG_DRAW_CONTEXT *dc; + + AQDG_DrawableWidget_DefaultDraw(object); + + dc=AQDG_DrawableWidget_GetDrawContext(object); + _drawVerticalGrid(object, dc); + _drawHorizontalGrid(object, dc); + _drawCurves(object, dc); + return 1; +} + + + int _calcHorizontalPos(double value, int contentSize, double minValue, double maxValue) { return ((value-minValue)*(contentSize/(maxValue-minValue))); @@ -84,3 +115,257 @@ int _calcVerticalPos(double value, int contentSize, double minValue, double maxV +void _drawCurves(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc) +{ + AQDG_WIDGET_VIEWPORT *xo; + AQDG_GRAPH *graph; + const AQDG_GRAPH_SUBGRAPH_LIST *subGraphList; + const AQDG_GRAPH_SUBGRAPH *subGraph; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_WIDGET_VIEWPORT, o); + graph=AQDG_GraphWidget_GetGraph(xo->graphObject); + + subGraphList=AQDG_Graph_GetSubGraphList(graph); + subGraph=subGraphList?AQDG_Graph_SubGraph_List_First(subGraphList):NULL; + while (subGraph) { + double minValueX; + double maxValueX; + double minValueY; + double maxValueY; + int penIdx=AQDG_GRAPHWIDGET_PEN_IDX_CURVE0; + const AQDG_GRAPH_CURVE_LIST *curveList; + const AQDG_GRAPH_CURVE *curve; + + minValueX=AQDG_Graph_SubGraph_GetMinValueX(subGraph); + maxValueX=AQDG_Graph_SubGraph_GetMaxValueX(subGraph); + minValueY=AQDG_Graph_SubGraph_GetMinValueY(subGraph); + maxValueY=AQDG_Graph_SubGraph_GetMaxValueY(subGraph); + + curveList=AQDG_Graph_SubGraph_GetCurves(subGraph); + curve=curveList?AQDG_Graph_Curve_List_First(curveList):NULL; + while(curve) { + int pen; + + pen=AQDG_GraphWidget_GetPen(xo->graphObject, penIdx); + _drawCurve(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); + + penIdx++; + curve=AQDG_Graph_Curve_List_Next(curve); + } + + subGraph=AQDG_Graph_SubGraph_List_Next(subGraph); + } +} + + + +void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + switch(AQDG_Graph_Curve_GetGraphType(curve)) { + case AQDG_GRAPH_TYPE_LINE: + _drawCurveLines(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); + break; + case AQDG_GRAPH_TYPE_POINTS: + _drawCurvePoints(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); + break; + case AQDG_GRAPH_TYPE_BARS: + default: + break; + } +} + + + +void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + int width; + int height; + const AQDG_GRAPH_DATAPAIR_LIST *dpList; + const AQDG_GRAPH_DATAPAIR *dp; + int absX; + int absY; + int lastX=-1; + int lastY=-1; + + absX=AQDG_Object_GetAbsoluteX(o); + absY=AQDG_Object_GetAbsoluteY(o); + width=AQDG_Object_GetWidth(o); + height=AQDG_Object_GetHeight(o); + dpList=AQDG_Graph_Curve_GetDataPairs(curve); + dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; + while(dp) { + int xPos; + int yPos; + double xValue; + double yValue; + + xValue=AQDG_Graph_DataPair_GetValueX(dp); + yValue=AQDG_Graph_DataPair_GetValueY(dp); + + xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); + yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); + if (lastX>=0 && lastY>=0) + AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+yPos); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2); + lastX=xPos; + lastY=yPos; + dp=AQDG_Graph_DataPair_List_Next(dp); + } +} + + + +void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + int width; + int height; + const AQDG_GRAPH_DATAPAIR_LIST *dpList; + const AQDG_GRAPH_DATAPAIR *dp; + int absX; + int absY; + + absX=AQDG_Object_GetAbsoluteX(o); + absY=AQDG_Object_GetAbsoluteY(o); + width=AQDG_Object_GetWidth(o); + height=AQDG_Object_GetHeight(o); + dpList=AQDG_Graph_Curve_GetDataPairs(curve); + dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; + while(dp) { + int xPos; + int yPos; + double xValue; + double yValue; + + xValue=AQDG_Graph_DataPair_GetValueX(dp); + yValue=AQDG_Graph_DataPair_GetValueY(dp); + + xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX); + yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos-4, absX+xPos+4, absY+yPos+4); + AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos+4, absX+xPos+4, absY+yPos-4); + dp=AQDG_Graph_DataPair_List_Next(dp); + } +} + + + + + + +void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc) +{ + AQDG_WIDGET_VIEWPORT *xo; + AQDG_GRAPH *graph; + AQDG_GRAPH_AXIS *axis; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_WIDGET_VIEWPORT, o); + graph=AQDG_GraphWidget_GetGraph(xo->graphObject); + axis=AQDG_Graph_GetAxisByIndex(graph, AQDG_GRAPH_AXISPOS_BOTTOM); + if (axis==NULL) + axis=AQDG_Graph_GetAxisByIndex(graph, AQDG_GRAPH_AXISPOS_TOP); + if (axis) { + const AQDG_GRAPH_TICK_LIST *tickList; + + tickList=AQDG_Graph_Axis_GetTickList(axis); + if (tickList) { + const AQDG_GRAPH_TICK *tick; + int contentSize; + double minValue; + double maxValue; + int absX; + int pen1; + int pen2; + int y1; + int y2; + + y1=AQDG_Object_GetAbsoluteY(o)+AQDG_Object_GetBorderTop(o); + y2=AQDG_Object_GetAbsoluteY(o)+AQDG_Object_GetHeight(o)-AQDG_Object_GetBorderBottom(o); + contentSize=AQDG_Object_GetWidth(o)-AQDG_Object_GetBorderLeft(o)-AQDG_Object_GetBorderRight(o); + absX=AQDG_Object_GetAbsoluteX(o); + minValue=AQDG_Graph_Axis_GetMinValue(axis); + maxValue=AQDG_Graph_Axis_GetMaxValue(axis); + pen1=AQDG_GraphWidget_GetPen(xo->graphObject, AQDG_GRAPHWIDGET_PEN_IDX_GRID1); + pen2=AQDG_GraphWidget_GetPen(xo->graphObject, AQDG_GRAPHWIDGET_PEN_IDX_GRID2); + + tick=AQDG_Graph_Tick_List_First(tickList); + while(tick) { + double value; + int xpos; + + value=AQDG_Graph_Tick_GetValue(tick); + xpos=_calcHorizontalPos(value, contentSize, minValue, maxValue); + xpos+=AQDG_Object_GetBorderLeft(o); + if (AQDG_Graph_Tick_GetLevel(tick)==0) + AQDG_Draw_Context_DrawLine(dc, pen1, absX+xpos, y1, absX+xpos, y2); + else if (AQDG_Graph_Tick_GetLevel(tick)==1) + AQDG_Draw_Context_DrawLine(dc, pen2, absX+xpos, y1, absX+xpos, y2); + tick=AQDG_Graph_Tick_List_Next(tick); + } + } + } +} + + + +void _drawHorizontalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc) +{ + AQDG_WIDGET_VIEWPORT *xo; + AQDG_GRAPH *graph; + AQDG_GRAPH_AXIS *axis; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_WIDGET_VIEWPORT, o); + graph=AQDG_GraphWidget_GetGraph(xo->graphObject); + axis=AQDG_Graph_GetAxisByIndex(graph, AQDG_GRAPH_AXISPOS_LEFT); + if (axis==NULL) + axis=AQDG_Graph_GetAxisByIndex(graph, AQDG_GRAPH_AXISPOS_RIGHT); + if (axis) { + const AQDG_GRAPH_TICK_LIST *tickList; + + tickList=AQDG_Graph_Axis_GetTickList(axis); + if (tickList) { + const AQDG_GRAPH_TICK *tick; + int contentSize; + double minValue; + double maxValue; + int absY; + int pen1; + int pen2; + int x1; + int x2; + + x1=AQDG_Object_GetAbsoluteX(o)+AQDG_Object_GetBorderLeft(o); + x2=AQDG_Object_GetAbsoluteX(o)+AQDG_Object_GetWidth(o)-AQDG_Object_GetBorderLeft(o)-AQDG_Object_GetBorderRight(o); + contentSize=AQDG_Object_GetHeight(o)-AQDG_Object_GetBorderTop(o)-AQDG_Object_GetBorderBottom(o); + absY=AQDG_Object_GetAbsoluteY(o); + minValue=AQDG_Graph_Axis_GetMinValue(axis); + maxValue=AQDG_Graph_Axis_GetMaxValue(axis); + pen1=AQDG_GraphWidget_GetPen(xo->graphObject, AQDG_GRAPHWIDGET_PEN_IDX_GRID1); + pen2=AQDG_GraphWidget_GetPen(xo->graphObject, AQDG_GRAPHWIDGET_PEN_IDX_GRID2); + + tick=AQDG_Graph_Tick_List_First(tickList); + while(tick) { + double value; + int ypos; + + value=AQDG_Graph_Tick_GetValue(tick); + ypos=_calcVerticalPos(value, contentSize, minValue, maxValue); + ypos+=AQDG_Object_GetBorderTop(o); + if (AQDG_Graph_Tick_GetLevel(tick)==0) + AQDG_Draw_Context_DrawLine(dc, pen1, x1, absY+ypos, x2, absY+ypos); + else + AQDG_Draw_Context_DrawLine(dc, pen2, x1, absY+ypos, x2, absY+ypos); + tick=AQDG_Graph_Tick_List_Next(tick); + } + } + } +} + + + diff --git a/src/lib/aqdiagram/graph/w_xaxis.c b/src/lib/aqdiagram/graph/w_xaxis.c index dd10540..bfe2b10 100644 --- a/src/lib/aqdiagram/graph/w_xaxis.c +++ b/src/lib/aqdiagram/graph/w_xaxis.c @@ -131,15 +131,16 @@ void _drawTicks(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, int absY) tick=AQDG_Graph_Tick_List_First(tickList); while(tick) { - if (AQDG_Graph_Tick_GetLevel(tick)==0) { - double value; - int xpos; + double value; + int xpos; - value=AQDG_Graph_Tick_GetValue(tick); - xpos=_calcHorizontalPos(value, contentSize, minValue, maxValue); - xpos+=AQDG_Object_GetBorderLeft(o); + value=AQDG_Graph_Tick_GetValue(tick); + xpos=_calcHorizontalPos(value, contentSize, minValue, maxValue); + xpos+=AQDG_Object_GetBorderLeft(o); + if (AQDG_Graph_Tick_GetLevel(tick)==0) AQDG_Draw_Context_DrawLine(dc, pen, absX+xpos, absY-(scaleSize/2), absX+xpos, absY+(scaleSize/2)); - } + else if (AQDG_Graph_Tick_GetLevel(tick)==1) + AQDG_Draw_Context_DrawLine(dc, pen, absX+xpos, absY-(scaleSize/4), absX+xpos, absY+(scaleSize/4)); tick=AQDG_Graph_Tick_List_Next(tick); } } diff --git a/src/lib/aqdiagram/graph/w_yaxis.c b/src/lib/aqdiagram/graph/w_yaxis.c index 17f6f12..42519f0 100644 --- a/src/lib/aqdiagram/graph/w_yaxis.c +++ b/src/lib/aqdiagram/graph/w_yaxis.c @@ -158,15 +158,16 @@ void _drawTicks(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, int absX) tick=AQDG_Graph_Tick_List_First(tickList); while(tick) { - if (AQDG_Graph_Tick_GetLevel(tick)==0) { - double value; - int ypos; + double value; + int ypos; - value=AQDG_Graph_Tick_GetValue(tick); - ypos=_calcVerticalPos(value, contentSize, minValue, maxValue); - ypos+=AQDG_Object_GetBorderTop(o); + value=AQDG_Graph_Tick_GetValue(tick); + ypos=_calcVerticalPos(value, contentSize, minValue, maxValue); + ypos+=AQDG_Object_GetBorderTop(o); + if (AQDG_Graph_Tick_GetLevel(tick)==0) AQDG_Draw_Context_DrawLine(dc, pen, absX-(scaleSize/2), absY+ypos, absX+(scaleSize/2), absY+ypos); - } + else + AQDG_Draw_Context_DrawLine(dc, pen, absX-(scaleSize/4), absY+ypos, absX+(scaleSize/4), absY+ypos); tick=AQDG_Graph_Tick_List_Next(tick); } } diff --git a/src/lib/aqdiagram/libtest.c b/src/lib/aqdiagram/libtest.c index 0678724..4cc9f02 100644 --- a/src/lib/aqdiagram/libtest.c +++ b/src/lib/aqdiagram/libtest.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,8 @@ static AQDG_GRAPH *_mkTestGraph(); +static AQDG_GRAPH_DATAPAIR_LIST *_mkTestData1(); +static AQDG_GRAPH_DATAPAIR_LIST *_mkTestData2(); static void _dumpTicks(const AQDG_GRAPH_TICK_LIST *tickList); @@ -165,6 +168,46 @@ int test3() +int test4() +{ + AQDG_GRAPH *g; + AQDG_GRAPH_DATAPAIR_LIST *dpList; + AQDG_DRAW_CONTEXT *dc; + AQDG_OBJECT *graphObject; + + g=AQDG_TimeGraph_new("Title", "Subtitle", "Value", "mm", 0); + dpList=_mkTestData1(); + AQDG_TimeGraph_AddCurve(g, "Testdata", AQDG_GRAPH_TYPE_LINE, dpList); + + dpList=_mkTestData2(); + AQDG_TimeGraph_AddCurve(g, "Testdata", AQDG_GRAPH_TYPE_POINTS, dpList); + + AQDG_TimeGraph_SetupTicks(g); + + dc=AQDG_Draw_ContextCairo_Png_new("/tmp/testgraph.png", 800, 600); + graphObject=AQDG_GraphWidget_new(NULL, AQDG_OBJECT_OPTIONS_STRETCHX | AQDG_OBJECT_OPTIONS_STRETCHY, dc); + AQDG_Object_SetWidth(graphObject, 800); + AQDG_Object_SetHeight(graphObject, 600); + + AQDG_GraphWidget_SetupDefaultPens(graphObject); + AQDG_GraphWidget_SetupDefaultFonts(graphObject); + + AQDG_GraphWidget_SetupForGraph(graphObject, g); + + AQDG_Object_ModifyBranchFlagsDown(graphObject, AQDG_OBJECT_FLAGS_RECALC, AQDG_OBJECT_FLAGS_RECALC); + AQDG_Object_ModifyBranchFlagsDown(graphObject, AQDG_OBJECT_FLAGS_LAYOUT, AQDG_OBJECT_FLAGS_LAYOUT); + AQDG_Object_Layout(graphObject); + AQDG_Object_Tree2_CalculateAbsPositions(graphObject); + AQDG_Object_Dump(graphObject, 2); + + AQDG_DrawableWidget_Draw(graphObject); + AQDG_Draw_Context_Finish(dc); + + return 0; +} + + + AQDG_GRAPH *_mkTestGraph() { AQDG_GRAPH *g; @@ -177,12 +220,13 @@ AQDG_GRAPH *_mkTestGraph() xAxis=AQDG_Graph_Axis_new(); AQDG_Graph_Axis_SetLabel(xAxis, "Label X"); - AQDG_Graph_Axis_SetMinValue(xAxis, -23.0); - AQDG_Graph_Axis_SetMaxValue(xAxis, 117.0); + AQDG_Graph_Axis_SetMinValue(xAxis, time(NULL)-(4*7*24*60*60)); + AQDG_Graph_Axis_SetMaxValue(xAxis, time(NULL)); AQDG_Graph_Axis_SetPrecision(xAxis, 0); AQDG_Graph_SetAxis(g, AQDG_GRAPH_AXISPOS_BOTTOM, xAxis); fprintf(stderr, "Generating ticks for X-axis\n"); - AQDG_Graph_Axis_GenLog10Ticks(xAxis); + AQDG_Graph_Axis_GenWeekTicks(xAxis, 0); + AQDG_Graph_Axis_GenDayTicks(xAxis, 1); fprintf(stderr, "Ticks for X-Axis (%f - %f)\n", AQDG_Graph_Axis_GetMinValue(xAxis), AQDG_Graph_Axis_GetMaxValue(xAxis)); @@ -206,6 +250,58 @@ AQDG_GRAPH *_mkTestGraph() +AQDG_GRAPH_DATAPAIR_LIST *_mkTestData1() +{ + AQDG_GRAPH_DATAPAIR_LIST *dpList; + GWEN_TIMESTAMP *ts; + int i; + + dpList=AQDG_Graph_DataPair_List_new(); + ts=GWEN_Timestamp_new(2025, 1, 1, 0, 0, 0); + for(i=0; i<60; i++) { + AQDG_GRAPH_DATAPAIR *dp; + double v; + + v=i*2; + dp=AQDG_Graph_DataPair_new(); + AQDG_Graph_DataPair_SetValueX(dp, GWEN_Timestamp_toTimeT(ts)); + AQDG_Graph_DataPair_SetValueY(dp, v); + AQDG_Graph_DataPair_List_Add(dp, dpList); + + GWEN_Timestamp_AddSeconds(ts, 24*60*60); /* add a day */ + } + + return dpList; +} + + + +AQDG_GRAPH_DATAPAIR_LIST *_mkTestData2() +{ + AQDG_GRAPH_DATAPAIR_LIST *dpList; + GWEN_TIMESTAMP *ts; + int i; + + dpList=AQDG_Graph_DataPair_List_new(); + ts=GWEN_Timestamp_new(2025, 1, 1, 0, 0, 0); + for(i=0; i<60; i++) { + AQDG_GRAPH_DATAPAIR *dp; + double v; + + v=random() % 200; + dp=AQDG_Graph_DataPair_new(); + AQDG_Graph_DataPair_SetValueX(dp, GWEN_Timestamp_toTimeT(ts)); + AQDG_Graph_DataPair_SetValueY(dp, v); + AQDG_Graph_DataPair_List_Add(dp, dpList); + + GWEN_Timestamp_AddSeconds(ts, 24*60*60); /* add a day */ + } + + return dpList; +} + + + void _dumpTicks(const AQDG_GRAPH_TICK_LIST *tickList) { const AQDG_GRAPH_TICK *tick; @@ -270,7 +366,7 @@ int main(int argc, char **argv) // rv=test1(argc, argv); // rv=test2(argc, argv); - rv=test3(); + rv=test4(); if (rv!=0){ DBG_ERROR(NULL, "here (%d)", rv);