svghmi/widget_xygraph.ysl2
author Edouard Tisserant
Wed, 25 May 2022 10:00:24 +0200
changeset 3488 6ef4ffcf9761
parent 3484 32eaba9cf30e
child 3490 4f252e8d6759
permissions -rw-r--r--
SVGHMI: multiple fixes in XY graph widget. 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) {
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
    94
            // TODO: get PLC time instead of browser time
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
    95
            let time = Date.now();
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
    96
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    97
            // naive local buffer impl. 
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    98
            // data is updated only when graph is visible
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
    99
            // TODO: replace with separate recording
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   100
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   101
            this.curves_data[index].push([time, value]);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   102
            let data_length = this.curves_data[index].length;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   103
            let ymin_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   104
            let ymax_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   105
            let overflow;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   106
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   107
            if(data_length > this.max_data_length){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   108
                // remove first item
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   109
                [this.xmin, overflow] = this.curves_data[index].shift();
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   110
                data_length = data_length - 1;
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   111
            } else {
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   112
                if(this.xmin == undefined){
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   113
                    this.xmin = time;
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   114
                }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   115
            }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   116
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   117
            this.xmax = time;
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   118
            let Xlength = this.xmax - this.xmin;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   119
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   120
            if(!this.fixed_y_range){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   121
                ymin_damaged = overflow <= this.ymin;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   122
                ymax_damaged = overflow >= this.ymax;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   123
                if(value > this.ymax){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   124
                    ymax_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   125
                    this.ymax = value;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   126
                }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   127
                if(value < this.ymin){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   128
                    ymin_damaged = false;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   129
                    this.ymin = value;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   130
                }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   131
            }
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   132
            let Ylength = this.ymax - this.ymin;
3470
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]) => {
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   142
                    let new_d = data.map(([x,y], i) => {
3484
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 xv = vectorscale(xvect, (x - this.xmin) / Xlength);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   145
                        let yv = vectorscale(yvect, (y - this.ymin) / Ylength);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   146
                        let px = base_point.x + xv.x + yv.x;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   147
                        let py = base_point.y + xv.y + yv.y;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   148
                        if(!this.fixed_y_range){
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   149
                            if(ymin_damaged && y < this.ymin) this.ymin = y;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   150
                            if(ymax_damaged && y > this.ymax) this.ymax = y;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   151
                        }
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
                        return " " + px + "," + py;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   154
                    });
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
                    new_d.unshift("M ");
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   157
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   158
                    return new_d.join('');
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   159
                });
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
            // computed curves "d" attr is applied to svg curve during animate();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   162
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   163
            this.request_animate();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   164
        }
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
        animate(){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   167
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   168
            // move elements only if enough data
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   169
            if(this.curves_data.some(data => data.length > 1)){
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   170
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   171
                // move marks and update labels
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   172
                this.reference.applyRanges([[this.xmin, this.xmax],
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   173
                                            [this.ymin, this.ymax]]);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   174
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   175
                // apply computed curves "d" attributes
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   176
                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
   177
                    curve.setAttribute("d", d_attr);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   178
                }
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   179
            }
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
widget_defs("XYGraph") {
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   186
    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
   187
    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
   188
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   189
    |     init_specific() {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   190
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   191
    // collect all curve_n labelled children
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   192
    foreach "$hmi_element/*[regexp:test(@inkscape:label,'^curve_[0-9]+$')]" {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   193
        const "label","@inkscape:label";
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   194
        const "id","@id";
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   195
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   196
        // detect non-unique names
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   197
        if "$hmi_element/*[not($id = @id) and @inkscape:label=$label]"{
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   198
            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
   199
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   200
    |         this.curves[«substring(@inkscape:label, 7)»] = id("«@id»"); /* «@inkscape:label» */
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   201
    }
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
emit "declarations:XYGraph"
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   208
||
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   209
function lineFromPath(path_elt) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   210
    let start = path_elt.getPointAtLength(0);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   211
    let end = path_elt.getPointAtLength(path_elt.getTotalLength());
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   212
    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
   213
};
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
function vector(p1, p2) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   216
    return new DOMPoint(p2.x - p1.x , p2.y - p1.y);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   217
};
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
function vectorscale(p1, p2) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   220
    return new DOMPoint(p2 * p1.x , p2 * p1.y);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   221
};
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
function move_elements_to_group(elements) {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   224
    let newgroup = document.createElementNS(xmlns,"g");
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   225
    newgroup.id = Date.now().toString(36) + Math.random().toString(36).substr(2);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   226
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   227
    for(let element of elements){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   228
        let parent = element.parentElement;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   229
        if(parent !== null)
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   230
            parent.removeChild(element);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   231
        newgroup.appendChild(element);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   232
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   233
    return newgroup;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   234
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   235
function getLinesIntesection(l1, l2) {
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   236
    let [l1start, l1vect] = l1;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   237
    let [l2start, l2vect] = l2;
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   238
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   239
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   240
    /*
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   241
    Compute intersection of two lines
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
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   244
                          ^ l2vect
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
                       /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   248
    l1start ----------X--------------> l1vect
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   249
                     / intersection
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
                   /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   252
                   l2start
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   253
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   254
	*/
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   255
    let [x1, y1, x3, y3] = [l1start.x, l1start.y, l2start.x, l2start.y];
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   256
	let [x2, y2, x4, y4] = [x1+l1vect.x, y1+l1vect.y, x3+l2vect.x, y3+l2vect.y];
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   257
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   258
	// line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   259
	// Determine the intersection point of two line segments
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   260
	// Return FALSE if the lines don't intersect
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   261
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   262
    // Check if none of the lines are of length 0
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   263
    if ((x1 === x2 && y1 === y2) || (x3 === x4 && y3 === y4)) {
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   264
        return false
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   265
    }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   266
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   267
    denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1))
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   268
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   269
    // Lines are parallel
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   270
    if (denominator === 0) {
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   271
        return false
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   272
    }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   273
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   274
    let ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   275
    let ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   276
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   277
    // Return a object with the x and y coordinates of the intersection
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   278
    let x = x1 + ua * (x2 - x1)
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   279
    let y = y1 + ua * (y2 - y1)
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   280
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   281
    return new DOMPoint(x,y);
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
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   284
class ReferenceFrame {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   285
    constructor(
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   286
        // [[Xminor,Xmajor], [Yminor,Ymajor]]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   287
        marks,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   288
        // [Xlabel, Ylabel]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   289
        labels,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   290
        // [Xline, Yline]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   291
        lines,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   292
        // [Xformat, Yformat] printf-like formating strings
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   293
        formats
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   294
    ){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   295
        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
   296
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   297
        let [lx,ly] = this.axes.map(axis => axis.line);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   298
        let [[xstart, xvect], [ystart, yvect]] = [lx,ly];
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   299
        let base_point = this.getBasePoint();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   300
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   301
        // setup clipping for curves
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   302
        this.clipPathPathDattr =
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   303
            "m " + base_point.x + "," + base_point.y + " "
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   304
                 + xvect.x + "," + xvect.y + " "
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   305
                 + yvect.x + "," + yvect.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 + " z";
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   308
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   309
        this.base_ref = [base_point, xvect, yvect];
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
        for(let axis of this.axes){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   312
            axis.setBasePoint(base_point);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   313
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   314
    }
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
	getBaseRef(){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   317
        return this.base_ref;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   318
	}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   319
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   320
    getClipPathPathDattr(){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   321
        return this.clipPathPathDattr;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   322
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   323
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   324
    applyRanges(ranges){
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   325
        let origin_moves = zip(ranges,this.axes).map(([range,axis]) => axis.applyRange(...range));
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   326
		zip(origin_moves.reverse(),this.axes).forEach(([vect,axis]) => axis.moveOrigin(vect));
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   327
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   328
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   329
    getBasePoint() {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   330
        let [[xstart, xvect], [ystart, yvect]] = this.axes.map(axis => axis.line);
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
        /*
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   333
        Compute graph clipping region base point
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
        Clipping region is a parallelogram containing axes lines,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   337
        and whose sides are parallel to axes line respectively.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   338
        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
   339
        calculus of parallelogram base point.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   340
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   341
                              ^ given Y axis (yvect)
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   342
                   /         /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   343
                  /         /
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   344
                 /         /
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   345
         xstart *---------*--------------> given X axis (xvect)
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   346
               /         /origin
3470
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
             *---------*--------------
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   349
        base_point   ystart
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   350
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   351
        */
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   352
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   353
        let base_point = getLinesIntesection([xstart,yvect],[ystart,xvect]);
3470
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
        return base_point;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   356
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
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
class Axis {
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   362
    constructor(label, marks, line, format){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   363
        this.lineElement = line;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   364
        this.line = lineFromPath(line);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   365
        this.format = format;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   366
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   367
        this.label = label;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   368
        this.marks = marks;
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
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   371
        // add transforms for elements sliding along the axis line
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   372
        for(let [elementname,element] of zip(["minor", "major", "label"],[...marks,label])){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   373
            for(let name of ["base","slide"]){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   374
                let transform = svg_root.createSVGTransform();
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   375
                element.transform.baseVal.appendItem(transform);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   376
                this[elementname+"_"+name+"_transform"]=transform;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   377
            };
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   378
        };
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   379
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   380
        // group marks an labels together
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   381
        let parent = line.parentElement;
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   382
        this.marks_group = move_elements_to_group(marks);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   383
        this.marks_and_label_group = move_elements_to_group([this.marks_group, label]);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   384
        this.group = move_elements_to_group([this.marks_and_label_group,line]);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   385
        parent.appendChild(this.group);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   386
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   387
        // Add transforms to group
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   388
        for(let name of ["base","origin"]){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   389
            let transform = svg_root.createSVGTransform();
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   390
            this.group.transform.baseVal.appendItem(transform);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   391
            this[name+"_transform"]=transform;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   392
        };
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   393
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   394
        this.marks_and_label_group_transform = svg_root.createSVGTransform();
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   395
        this.marks_and_label_group.transform.baseVal.appendItem(this.marks_and_label_group_transform);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   396
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   397
        this.duplicates = [];
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   398
        this.last_mark_count = 0;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   399
    }
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
    setBasePoint(base_point){
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   402
        // move Axis to base point
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   403
        let [start, _vect] = this.line;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   404
        let v = vector(start, base_point);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   405
        this.base_transform.setTranslate(v.x, v.y);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   406
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   407
        // Move marks and label to base point.
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   408
        // _|_______          _|________
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   409
        //  |  '  |     ==>    '
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   410
        //  |     0            0
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   411
        //  |                  |
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   412
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   413
        for(let [markname,mark] of zip(["minor", "major"],this.marks)){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   414
            let pos = vector(
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   415
                // Marks are expected to be paths
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   416
                // paths are expected to be lines
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   417
                // intersection with axis line is taken 
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   418
                // as reference for mark position
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   419
                getLinesIntesection(
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   420
                    this.line, lineFromPath(mark)),base_point);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   421
            this[markname+"_base_transform"].setTranslate(pos.x - v.x, pos.y - v.y);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   422
            if(markname == "major"){ // label follow major mark
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   423
                this.label_base_transform.setTranslate(pos.x - v.x, pos.y - v.y);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   424
            }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   425
        }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   426
    }
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   427
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   428
	moveOrigin(vect){
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   429
		this.origin_transform.setTranslate(vect.x, vect.y);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   430
	}
3470
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
    applyRange(min, max){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   433
        let range = max - min;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   434
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   435
        // compute how many units for a mark
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   436
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   437
        // - 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
   438
        //   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
   439
        //   Order of magnitude of range is log10(range)
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   440
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   441
        // - Units are necessarily power of ten, otherwise it is complicated to
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   442
        //   fill the text in labels...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   443
        //   Unit is pow(10, integer_number )
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   444
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   445
        // - To transform order of magnitude to an integer, floor() is used.
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   446
        //   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
   447
        //
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   448
        // - To spare resources result is better in between 5 and 50,
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   449
        //   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
   450
        //   log10(5) ~= 0.69897
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   451
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
        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
   454
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   455
        // TODO: for time values (ms), units may be :
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   456
        //       1       -> ms
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   457
        //       10      -> s/100
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   458
        //       100     -> s/10
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   459
        //       1000    -> s
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   460
        //       60000   -> min
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   461
        //       3600000 -> hour
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   462
        //       ...
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
        // Compute position of origin along axis [0...range]
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   466
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   467
        // min < 0, max > 0, offset = -min
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   468
        // _____________|________________
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   469
        // ... -3 -2 -1 |0  1  2  3  4 ...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   470
        // <--offset---> ^
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   471
        //               |_original
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   472
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   473
        // min > 0, max > 0, offset = 0
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   474
        // |________________
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   475
        // |6  7  8  9  10...
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   476
        //  ^
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   477
        //  |_original
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   478
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   479
        // min < 0, max < 0, offset = max-min (range)
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   480
        // _____________|_
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   481
        // ... -5 -4 -3 |-2
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   482
        // <--offset---> ^
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   483
        //               |_original
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   484
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   485
        let offset = (max>=0 && min>=0) ? 0 : (
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   486
                     (max<0 && min<0)   ? range : -min);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   487
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   488
        // compute unit vector
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   489
        let [_start, vect] = this.line;
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   490
        let unit_vect = vectorscale(vect, 1/range);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   491
        let [mark_min, mark_max, mark_offset] = [min,max,offset].map(val => Math.round(val/unit));
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   492
        let mark_count = mark_max-mark_min;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   493
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   494
        // apply unit vector to marks and label
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   495
        // offset is a representing position of an 
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   496
        // axis along the opposit axis line, expressed in major marks units
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   497
        // unit_vect is unit vector
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   498
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
        //              | unit_vect
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   501
        //              |<--->
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
        //     |yoffset |     1 
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   505
        //     |        |
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   506
        //     v xoffset|
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   507
        //     X<------>|
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   508
        // base_point
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   509
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   510
        // move major marks and label to first positive mark position
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   511
        let v = vectorscale(unit_vect, unit);
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   512
        this.label_slide_transform.setTranslate(v.x, v.y);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   513
        this.major_slide_transform.setTranslate(v.x, v.y);
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   514
        // move minor mark to first half positive mark position
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   515
        v = vectorscale(unit_vect, unit/2);
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   516
        this.minor_slide_transform.setTranslate(v.x, v.y);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   517
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   518
        // duplicate marks and labels as needed
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   519
        let current_mark_count = this.duplicates.length;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   520
        for(let i = current_mark_count; i <= mark_count; i++){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   521
            // 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
   522
            let newgroup = document.createElementNS(xmlns,"g");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   523
            let transform = svg_root.createSVGTransform();
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   524
            let newlabel = this.label.cloneNode(true);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   525
            let newuse = document.createElementNS(xmlns,"use");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   526
            let newuseAttr = document.createAttribute("xlink:href");
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   527
            newuseAttr.value = "#"+this.marks_group.id;
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   528
            newuse.setAttributeNode(newuseAttr);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   529
            newgroup.transform.baseVal.appendItem(transform);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   530
            newgroup.appendChild(newlabel);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   531
            newgroup.appendChild(newuse);
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   532
            this.duplicates.push([transform,newgroup]);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   533
        }
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
        // move marks and labels, set labels
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   536
        // 
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   537
        // min > 0, max > 0, offset = 0
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   538
        //         ^
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   539
        //         |________>
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   540
        //        '| |  '  |
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   541
        //         | 6     7
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   542
        //         X
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   543
        //     base_point
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   544
        //
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   545
        // min < 0, max > 0, offset = -min
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   546
        //              ^
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   547
        //     _________|__________>
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   548
        //     '  |  '  |  '  |  '
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   549
        //       -1     |     1 
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   550
        //       offset |
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   551
        //     X<------>|
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   552
        // base_point
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   553
        //
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   554
        // min < 0, max < 0, offset = range
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   555
        //                 ^
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   556
        //     ____________|    
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   557
        //      '  |  '  | |'
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   558
        //        -5    -4 |
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   559
        //         offset  |
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   560
        //     X<--------->|
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   561
        // base_point
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   562
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   563
        for(let mark_index = 0; mark_index <= mark_count; mark_index++){
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   564
            let i = 0;
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   565
            let val = (mark_min + mark_index) * unit;
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   566
            let vec = vectorscale(unit_vect, offset + val - min);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   567
            let text = this.format ? sprintf(this.format, val) : val.toString();
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   568
            if(mark_index == mark_offset){
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   569
                // apply offset to original marks and label groups
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   570
                this.marks_and_label_group_transform.setTranslate(vec.x, vec.y);
3470
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
                // update original label text
3484
32eaba9cf30e SVGHMI: many fixes on xy trend graph. WIP.
Edouard Tisserant
parents: 3474
diff changeset
   573
                this.label.getElementsByTagName("tspan")[0].textContent = text;
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   574
            } else {
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   575
                let [transform,element] = this.duplicates[i++];
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   576
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   577
                // 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
   578
                transform.setTranslate(vec.x, vec.y);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   579
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   580
                // update label text
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   581
                element.getElementsByTagName("tspan")[0].textContent = text;
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   582
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   583
                // Attach to group if not already
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   584
                if(i >= this.last_mark_count){
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   585
                    this.group.appendChild(element);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   586
                }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   587
            }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   588
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   589
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   590
        // dettach marks and label from group if not anymore visible
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   591
        for(let i = current_mark_count; i < this.last_mark_count; i++){
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   592
            let [transform,element] = this.duplicates[i];
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   593
            this.group.removeChild(element);
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   594
        }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   595
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   596
        this.last_mark_count = current_mark_count;
3488
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   597
6ef4ffcf9761 SVGHMI: multiple fixes in XY graph widget. WIP.
Edouard Tisserant
parents: 3484
diff changeset
   598
		return vectorscale(unit_vect, offset);
3470
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   599
    }
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   600
}
b36754171535 SVGHMI: Add premature implementation of XY chart.
Edouard Tisserant
parents:
diff changeset
   601
||