svghmi/widget_xygraph.ysl2
author Edouard Tisserant
Wed, 11 May 2022 12:12:16 +0200
changeset 3484 32eaba9cf30e
parent 3474 3ba74350237d
child 3488 6ef4ffcf9761
permissions -rw-r--r--
SVGHMI: many fixes on xy trend graph. WIP.
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     1
// widget_xygraph.ysl2
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     2
widget_desc("XYGraph") {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     3
    longdesc
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     4
    ||
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     5
    XYGraph draws a cartesian trend graph re-using styles given for axis,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     6
    grid/marks, legends and curves.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     7
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     8
    Elements labeled "x_axis" and "y_axis" are svg:groups containg:
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
     9
     - "axis_label" svg:text gives style an alignment for axis labels.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    10
     - "interval_major_mark" and "interval_minor_mark" are svg elements to be
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    11
       duplicated along axis line to form intervals marks.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    12
     - "axis_line"  svg:path is the axis line. Paths must be intersect and their
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    13
       bounding box is the chart wall.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    14
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    15
    Elements labeled "curve_0", "curve_1", ... are paths whose styles are used
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    16
    to draw curves corresponding to data from variables passed as HMI tree paths.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    17
    "curve_0" is mandatory. HMI variables outnumbering given curves are ignored.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    18
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    19
    ||
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    20
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    21
    shortdesc > Cartesian trend graph showing values of given variables over time
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    22
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    23
    path name="value" count="1+" accepts="HMI_INT,HMI_REAL" > value
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    24
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    25
    arg name="size" accepts="int" > buffer size
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    26
    arg name="xformat" count="optional" accepts="string" > format string for X label
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    27
    arg name="yformat" count="optional" accepts="string" > format string for Y label
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    28
    arg name="ymin" count="optional" accepts="int,real" > minimum value foe Y axis
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    29
    arg name="ymax" count="optional" accepts="int,real" > maximum value for Y axis
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    30
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    31
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    32
widget_class("XYGraph") {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    33
    ||
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    34
        frequency = 1;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    35
        init() {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    36
            [this.x_size,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    37
             this.x_format, this.y_format] = this.args;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    38
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    39
            // Min and Max given with paths are meant to describe visible range,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    40
            // not to clip data.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    41
            this.clip = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    42
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    43
            let y_min = Infinity, y_max = -Infinity;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    44
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    45
            // Compute visible Y range by merging fixed curves Y ranges
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    46
            for(let minmax of this.minmaxes){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    47
               if(minmax){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    48
                   let [min,max] = minmax;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    49
                   if(min < y_min)
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    50
                       y_min = min;
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    51
                   if(max > y_max)
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    52
                       y_max = max;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    53
               }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    54
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    55
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    56
            if(y_min !== Infinity && y_max !== -Infinity){
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    57
               this.fixed_y_range = true;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    58
            } else {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    59
               this.fixed_y_range = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    60
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    61
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    62
            this.ymin = y_min;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    63
            this.ymax = y_max;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    64
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    65
            this.curves = [];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    66
            this.init_specific();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    67
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    68
            this.reference = new ReferenceFrame(
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    69
                [[this.x_interval_minor_mark_elt, this.x_interval_major_mark_elt],
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    70
                 [this.y_interval_minor_mark_elt, this.y_interval_major_mark_elt]],
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    71
                [this.x_axis_label_elt, this.y_axis_label_elt],
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    72
                [this.x_axis_line_elt, this.y_axis_line_elt],
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    73
                [this.x_format, this.y_format]);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    74
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    75
            // create <clipPath> path and attach it to widget
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    76
            let clipPath = document.createElementNS(xmlns,"clipPath");
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    77
            let clipPathPath = document.createElementNS(xmlns,"path");
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    78
            let clipPathPathDattr = document.createAttribute("d");
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    79
            clipPathPathDattr.value = this.reference.getClipPathPathDattr();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    80
            clipPathPath.setAttributeNode(clipPathPathDattr);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    81
            clipPath.appendChild(clipPathPath);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    82
            this.element.appendChild(clipPath);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    83
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    84
            // assign created clipPath to clip-path property of curves
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    85
            for(let curve of this.curves){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    86
                curve.setAttribute("clip-path", "url(#" + clipPath.id + ")");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    87
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    88
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
    89
            this.curves_data = this.curves.map(_unused => []);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    90
            this.max_data_length = this.args[0];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    91
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    92
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    93
        dispatch(value,oldval, index) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    94
            // naive local buffer impl. 
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    95
            // data is updated only when graph is visible
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    96
            // TODO: replace with separate recording
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    97
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    98
            this.curves_data[index].push(value);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    99
            let data_length = this.curves_data[index].length;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   100
            let ymin_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   101
            let ymax_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   102
            let overflow;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   103
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   104
            if(data_length > this.max_data_length){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   105
                // remove first item
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   106
                overflow = this.curves_data[index].shift();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   107
                data_length = data_length - 1;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   108
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   109
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   110
            if(!this.fixed_y_range){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   111
                ymin_damaged = overflow <= this.ymin;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   112
                ymax_damaged = overflow >= this.ymax;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   113
                if(value > this.ymax){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   114
                    ymax_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   115
                    this.ymax = value;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   116
                }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   117
                if(value < this.ymin){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   118
                    ymin_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   119
                    this.ymin = value;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   120
                }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   121
            }
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   122
            let Ylength = this.ymax - this.ymin;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   123
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   124
            // recompute X range based on curent time ad buffer depth
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   125
            // TODO: get PLC time instead of browser time
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   126
            const d = new Date();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   127
            let time = d.getTime();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   128
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   129
            // FIXME: this becomes wrong when graph is not visible and updated all the time
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   130
            [this.xmin, this.xmax] = [time - data_length*1000/this.frequency, time];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   131
            let Xlength = this.xmax - this.xmin;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   132
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   133
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   134
            // recompute curves "d" attribute
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   135
            // FIXME: use SVG getPathData and setPathData when available.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   136
            //        https://svgwg.org/specs/paths/#InterfaceSVGPathData
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   137
            //        https://github.com/jarek-foksa/path-data-polyfill
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   138
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   139
            let [base_point, xvect, yvect] = this.reference.getBaseRef();
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   140
            this.curves_d_attr =
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   141
                zip(this.curves_data, this.curves).map(([data,curve]) => {
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   142
                    let new_d = data.map((y, i) => {
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   143
                        // compute curve point from data, ranges, and base_ref
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   144
                        let x = this.xmin + i * Xlength / data_length;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   145
                        let xv = vectorscale(xvect, (x - this.xmin) / Xlength);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   146
                        let yv = vectorscale(yvect, (y - this.ymin) / Ylength);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   147
                        let px = base_point.x + xv.x + yv.x;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   148
                        let py = base_point.y + xv.y + yv.y;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   149
                        if(!this.fixed_y_range){
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   150
                            if(ymin_damaged && y < this.ymin) this.ymin = y;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   151
                            if(ymax_damaged && y > this.ymax) this.ymax = y;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   152
                        }
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   153
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   154
                        return " " + px + "," + py;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   155
                    });
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   156
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   157
                    new_d.unshift("M ");
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   158
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   159
                    return new_d.join('');
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   160
                });
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   161
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   162
            // computed curves "d" attr is applied to svg curve during animate();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   163
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   164
            this.request_animate();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   165
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   166
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   167
        animate(){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   168
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   169
            // move elements only if enough data
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   170
            if(this.curves_data.some(data => data.length > 1)){
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   171
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   172
                // move marks and update labels
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   173
                this.reference.applyRanges([[this.xmin, this.xmax],
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   174
                                            [this.ymin, this.ymax]]);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   175
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   176
                // apply computed curves "d" attributes
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   177
                for(let [curve, d_attr] of zip(this.curves, this.curves_d_attr)){
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   178
                    curve.setAttribute("d", d_attr);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   179
                }
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   180
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   181
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   182
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   183
    ||
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   184
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   185
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   186
widget_defs("XYGraph") {
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   187
    labels("/x_interval_minor_mark /x_axis_line /x_interval_major_mark /x_axis_label");
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   188
    labels("/y_interval_minor_mark /y_axis_line /y_interval_major_mark /y_axis_label");
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   189
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   190
    |     init_specific() {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   191
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   192
    // collect all curve_n labelled children
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   193
    foreach "$hmi_element/*[regexp:test(@inkscape:label,'^curve_[0-9]+$')]" {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   194
        const "label","@inkscape:label";
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   195
        const "id","@id";
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   196
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   197
        // detect non-unique names
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   198
        if "$hmi_element/*[not($id = @id) and @inkscape:label=$label]"{
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   199
            error > XYGraph id="«$id»", label="«$label»" : elements with data_n label must be unique.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   200
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   201
    |         this.curves[«substring(@inkscape:label, 7)»] = id("«@id»"); /* «@inkscape:label» */
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   202
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   203
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   204
    |     }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   205
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   206
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   207
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   208
emit "declarations:XYGraph"
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   209
||
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   210
function lineFromPath(path_elt) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   211
    let start = path_elt.getPointAtLength(0);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   212
    let end = path_elt.getPointAtLength(path_elt.getTotalLength());
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   213
    return [start, new DOMPoint(end.x - start.x , end.y - start.y)];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   214
};
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   215
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   216
function vector(p1, p2) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   217
    return new DOMPoint(p2.x - p1.x , p2.y - p1.y);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   218
};
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   219
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   220
function vectorscale(p1, p2) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   221
    return new DOMPoint(p2 * p1.x , p2 * p1.y);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   222
};
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   223
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   224
function move_elements_to_group(elements) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   225
    let newgroup = document.createElementNS(xmlns,"g");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   226
    for(let element of elements){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   227
        let parent = element.parentElement;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   228
        if(parent !== null)
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   229
            parent.removeChild(element);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   230
        newgroup.appendChild(element);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   231
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   232
    return newgroup;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   233
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   234
function getLinesIntesection(l1, l2) {
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   235
    let [l1start, l1vect] = l1;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   236
    let [l2start, l2vect] = l2;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   237
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   238
    let b;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   239
    /*
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   240
    Compute intersection of two lines
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   241
    =================================
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   242
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   243
                          ^ l2vect
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   244
                         /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   245
                        /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   246
                       /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   247
    l1start ----------X--------------> l1vect
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   248
                     / intersection
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   249
                    /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   250
                   /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   251
                   l2start
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   252
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   253
    intersection = l1start + l1vect * a
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   254
    intersection = l2start + l2vect * b
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   255
    ==> solve : "l1start + l1vect * a = l2start + l2vect * b" to find a and b and then intersection
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   256
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   257
    (1)   l1start.y + l1vect.y * a = l2start.y + l2vect.y * b
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   258
    (2)   l1start.x + l1vect.x * a = l2start.x + l2vect.x * b
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   259
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   260
    // express a
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   261
    (1)   a = (l2start.y + l2vect.y * b - l1start.y) / l1vect.y
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   262
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   263
    // substitute a to have only b
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   264
    (1+2) l1start.x + l1vect.x * (l2start.y + l2vect.y * b - l1start.y) / l1vect.y = l2start.x + l2vect.x * b
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   265
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   266
    // expand to isolate b
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   267
    l1start.x + l1vect.x * l2start.y / l1vect.y + l2vect.y / l1vect.y * b - l1start.y / l1vect.y = l2start.x + l2vect.x * b
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   268
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   269
    // factorize b
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   270
    l1start.x + l1vect.x * l2start.y / l1vect.y - l1start.y / l1vect.y - l2start.x = b * ( l2vect.x - l2vect.y / l1vect.y)
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   271
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   272
    // extract b
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   273
    b = (l1start.x + l1vect.x * l2start.y / l1vect.y  - l1start.y / l1vect.y - l2start.x)  / ( l2vect.x - l2vect.y / l1vect.y)
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   274
    */
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   275
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   276
    /* avoid divison by zero by swapping (1) and (2) */
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   277
    if(l1vect.y == 0 ){
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   278
        b = (l1start.y + l1vect.y * l2start.x / l1vect.x  - l1start.x / l1vect.x - l2start.y)  / ( l2vect.y - l2vect.x / l1vect.x);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   279
    }else{
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   280
        b = (l1start.x + l1vect.x * l2start.y / l1vect.y  - l1start.y / l1vect.y - l2start.x)  / ( l2vect.x - l2vect.y / l1vect.y);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   281
    }
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   282
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   283
    return new DOMPoint(l2start.x + l2vect.x * b, l2start.y + l2vect.y * b);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   284
};
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   285
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   286
class ReferenceFrame {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   287
    constructor(
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   288
        // [[Xminor,Xmajor], [Yminor,Ymajor]]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   289
        marks,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   290
        // [Xlabel, Ylabel]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   291
        labels,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   292
        // [Xline, Yline]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   293
        lines,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   294
        // [Xformat, Yformat] printf-like formating strings
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   295
        formats
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   296
    ){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   297
        this.axes = zip(labels,marks,lines,formats).map(args => new Axis(...args));
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   298
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   299
        let [lx,ly] = this.axes.map(axis => axis.line);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   300
        let [[xstart, xvect], [ystart, yvect]] = [lx,ly];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   301
        let base_point = this.getBasePoint();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   302
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   303
        // setup clipping for curves
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   304
        this.clipPathPathDattr =
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   305
            "m " + base_point.x + "," + base_point.y + " "
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   306
                 + xvect.x + "," + xvect.y + " "
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   307
                 + yvect.x + "," + yvect.y + " "
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   308
                 + -xvect.x + "," + -xvect.y + " "
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   309
                 + -yvect.x + "," + -yvect.y + " z";
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   310
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   311
        this.base_ref = [base_point, xvect, yvect];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   312
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   313
        for(let axis of this.axes){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   314
            axis.setBasePoint(base_point);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   315
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   316
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   317
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   318
	getBaseRef(){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   319
        return this.base_ref;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   320
	}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   321
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   322
    getClipPathPathDattr(){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   323
        return this.clipPathPathDattr;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   324
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   325
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   326
    applyRanges(ranges){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   327
        for(let [range,axis] of zip(ranges,this.axes)){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   328
            axis.applyRange(...range);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   329
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   330
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   331
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   332
    getBasePoint() {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   333
        let [[xstart, xvect], [ystart, yvect]] = this.axes.map(axis => axis.line);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   334
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   335
        /*
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   336
        Compute graph clipping region base point
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   337
        ========================================
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   338
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   339
        Clipping region is a parallelogram containing axes lines,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   340
        and whose sides are parallel to axes line respectively.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   341
        Given axes lines are not starting at the same point, hereafter is
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   342
        calculus of parallelogram base point.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   343
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   344
                              ^ given Y axis (yvect)
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   345
                   /         /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   346
                  /         /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   347
                 /         /
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   348
         xstart *---------*--------------> given X axis (xvect)
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   349
               /         /origin
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   350
              /         /
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   351
             *---------*--------------
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   352
        base_point   ystart
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   353
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   354
        */
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   355
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   356
        let base_point = getLinesIntesection([xstart,yvect],[ystart,xvect]);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   357
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   358
        return base_point;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   359
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   360
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   361
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   362
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   363
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   364
class Axis {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   365
    constructor(label, marks, line, format){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   366
        this.lineElement = line;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   367
        this.line = lineFromPath(line);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   368
        this.format = format;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   369
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   370
        this.label = label;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   371
        this.marks = marks;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   372
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   373
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   374
        // add transforms for elements sliding along the axis line
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   375
        for(let [elementname,element] of zip(["minor", "major", "label"],[...marks,label])){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   376
            for(let name of ["base","slide"]){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   377
                let transform = svg_root.createSVGTransform();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   378
                element.transform.baseVal.appendItem(transform);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   379
                this[elementname+"_"+name+"_transform"]=transform;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   380
            };
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   381
        };
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   382
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   383
        // group marks an labels together
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   384
        let parent = line.parentElement;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   385
        let marks_group = move_elements_to_group(marks);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   386
        let marks_and_label_group = move_elements_to_group([marks_group, label]);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   387
        let group = move_elements_to_group([marks_and_label_group,line]);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   388
        parent.appendChild(group);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   389
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   390
        // Add transforms to group
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   391
        for(let name of ["base","origin"]){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   392
            let transform = svg_root.createSVGTransform();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   393
            group.transform.baseVal.appendItem(transform);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   394
            this[name+"_transform"]=transform;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   395
        };
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   396
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   397
        this.group = group;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   398
        this.marks_group = marks_group;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   399
        this.marks_and_label_group = marks_and_label_group;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   400
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   401
        this.mlg_clones = [];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   402
        this.last_mark_count = 0;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   403
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   404
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   405
    setBasePoint(base_point){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   406
        // move Axis to base point
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   407
        let [start, _vect] = this.line;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   408
        let v = vector(start, base_point);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   409
        this.base_transform.setTranslate(v.x, v.y);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   410
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   411
        // Move marks and label to base point.
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   412
        // _|_______          _|________
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   413
        //  |  '  |     ==>    '
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   414
        //  |     0            0
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   415
        //  |                  |
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   416
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   417
        for(let [markname,mark] of zip(["minor", "major"],this.marks)){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   418
            let transform = this[markname+"_base_transform"];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   419
            let pos = vector(
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   420
                // Marks are expected to be paths
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   421
                // paths are expected to be lines
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   422
                // intersection with axis line is taken 
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   423
                // as reference for mark position
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   424
                base_point, getLinesIntesection(
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   425
                    this.line, lineFromPath(mark)));
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   426
            this[markname+"_base_transform"].setTranslate(-pos.x, -pos.x);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   427
            if(markname == "major"){ // label follow major mark
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   428
                this.label_base_transform.setTranslate(-pos.x, -pos.x);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   429
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   430
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   431
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   432
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   433
    applyRange(min, max){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   434
        let range = max - min;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   435
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   436
        // compute how many units for a mark
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   437
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   438
        // - Units are expected to be an order of magnitude smaller than range,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   439
        //   so that marks are not too dense and also not too sparse.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   440
        //   Order of magnitude of range is log10(range)
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   441
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   442
        // - Units are necessarily power of ten, otherwise it is complicated to
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   443
        //   fill the text in labels...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   444
        //   Unit is pow(10, integer_number )
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   445
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   446
        // - To transform order of magnitude to an integer, floor() is used.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   447
        //   This results in a count of mark fluctuating in between 10 and 100.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   448
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   449
        // - To spare resources result is better in between 5 and 50,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   450
        //   and log10(5) is substracted to order of magnitude to obtain this
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   451
        //   log10(5) ~= 0.69897
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   452
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   453
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   454
        let unit = Math.pow(10, Math.floor(Math.log10(range)-0.69897));
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   455
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   456
        // TODO: for time values (ms), units may be :
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   457
        //       1       -> ms
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   458
        //       10      -> s/100
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   459
        //       100     -> s/10
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   460
        //       1000    -> s
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   461
        //       60000   -> min
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   462
        //       3600000 -> hour
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   463
        //       ...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   464
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   465
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   466
        // Compute position of origin along axis [0...range]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   467
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   468
        // min < 0, max > 0, offset = -min
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   469
        // _____________|________________
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   470
        // ... -3 -2 -1 |0  1  2  3  4 ...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   471
        // <--offset---> ^
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   472
        //               |_original
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   473
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   474
        // min > 0, max > 0, offset = 0
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   475
        // |________________
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   476
        // |6  7  8  9  10...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   477
        //  ^
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   478
        //  |_original
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   479
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   480
        // min < 0, max < 0, offset = max-min (range)
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   481
        // _____________|_
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   482
        // ... -5 -4 -3 |-2
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   483
        // <--offset---> ^
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   484
        //               |_original
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   485
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   486
        let offset = (max>=0 && min>=0) ? 0 : (
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   487
                     (max<0 && min<0)   ? range : -min);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   488
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   489
        // compute unit vector
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   490
        let [_start, vect] = this.line;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   491
        let unit_vect = vectorscale(vect, unit/range);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   492
        let [umin, umax, uoffset] = [min,max,offset].map(val => Math.round(val/unit));
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   493
        let mark_count = umax-umin;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   494
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   495
        // apply unit vector to marks and label
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   496
        // offset is a representing position of an 
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   497
        // axis along the opposit axis line, expressed in major marks units
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   498
        // unit_vect is the translation in between to major marks
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   499
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   500
        //              ^
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   501
        //              | unit_vect
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   502
        //              |<--->
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   503
        //     _________|__________>
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   504
        //     ^  |  '  |  '  |  '
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   505
        //     |yoffset |     1 
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   506
        //     |        |
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   507
        //     v xoffset|
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   508
        //     X<------>|
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   509
        // base_point
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   510
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   511
        // move major marks and label to first positive mark position
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   512
        let v = vectorscale(unit_vect, offset+unit);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   513
        this.label_slide_transform.setTranslate(v.x, v.y);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   514
        this.major_slide_transform.setTranslate(v.x, v.y);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   515
        // move minor mark to first half positive mark position
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   516
        let h = vectorscale(unit_vect, offset+(unit/2));
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   517
        this.minor_slide_transform.setTranslate(h.x, h.y);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   518
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   519
        // duplicate marks and labels as needed
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   520
        let current_mark_count = this.mlg_clones.length;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   521
        for(let i = current_mark_count; i <= mark_count; i++){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   522
            // cloneNode() label and add a svg:use of marks in a new group
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   523
            let newgroup = document.createElementNS(xmlns,"g");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   524
            let transform = svg_root.createSVGTransform();
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   525
            let newlabel = this.label.cloneNode(true);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   526
            let newuse = document.createElementNS(xmlns,"use");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   527
            let newuseAttr = document.createAttribute("xlink:href");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   528
            newuseAttr.value = "#"+this.marks_group.id;
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   529
            newuse.setAttributeNode(newuseAttr);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   530
            newgroup.transform.baseVal.appendItem(transform);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   531
            newgroup.appendChild(newlabel);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   532
            newgroup.appendChild(newuse);
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   533
            this.mlg_clones.push([transform,newgroup]);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   534
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   535
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   536
        // move marks and labels, set labels
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   537
        for(let u = 0; u <= mark_count; u++){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   538
            let i = 0;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   539
            let val = (umin + u) * unit;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   540
            let vec = vectorscale(unit_vect, offset + val);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   541
            let text = this.format ? sprintf(this.format, val) : val.toString();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   542
            if(u == uoffset){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   543
                // apply offset to original marks and label groups
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   544
                this.origin_transform.setTranslate(vec.x, vec.y);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   545
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   546
                // update original label text
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   547
                this.label.getElementsByTagName("tspan")[0].textContent = text;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   548
            } else {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   549
                let [transform,element] = this.mlg_clones[i++];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   550
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   551
                // apply unit vector*N to marks and label groups
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   552
                transform.setTranslate(vec.x, vec.y);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   553
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   554
                // update label text
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   555
                element.getElementsByTagName("tspan")[0].textContent = text;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   556
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   557
                // Attach to group if not already
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   558
                if(i >= this.last_mark_count){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   559
                    this.group.appendChild(element);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   560
                }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   561
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   562
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   563
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   564
        // dettach marks and label from group if not anymore visible
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   565
        for(let i = current_mark_count; i < this.last_mark_count; i++){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   566
            let [transform,element] = this.mlg_clones[i];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   567
            this.group.removeChild(element);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   568
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   569
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   570
        this.last_mark_count = current_mark_count;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   571
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   572
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   573
||