--- a/svghmi/widget_xygraph.ysl2 Thu May 26 12:11:42 2022 +0200
+++ b/svghmi/widget_xygraph.ysl2 Mon May 30 12:44:04 2022 +0200
@@ -72,6 +72,15 @@
[this.x_axis_line_elt, this.y_axis_line_elt],
[this.x_format, this.y_format]);
+ let max_stroke_width = 0;
+ for(let curve of this.curves){
+ if(curve.style.strokeWidth > max_stroke_width){
+ max_stroke_width = curve.style.strokeWidth;
+ }
+ }
+
+ this.Margins=this.reference.getLengths().map(length => max_stroke_width/length);
+
// create <clipPath> path and attach it to widget
let clipPath = document.createElementNS(xmlns,"clipPath");
let clipPathPath = document.createElementNS(xmlns,"path");
@@ -79,6 +88,7 @@
clipPathPathDattr.value = this.reference.getClipPathPathDattr();
clipPathPath.setAttributeNode(clipPathPathDattr);
clipPath.appendChild(clipPathPath);
+ clipPath.id = randomId();
this.element.appendChild(clipPath);
// assign created clipPath to clip-path property of curves
@@ -115,7 +125,7 @@
}
this.xmax = time;
- let Xlength = this.xmax - this.xmin;
+ let Xrange = this.xmax - this.xmin;
if(!this.fixed_y_range){
ymin_damaged = overflow <= this.ymin;
@@ -129,7 +139,14 @@
this.ymin = value;
}
}
- let Ylength = this.ymax - this.ymin;
+ let Yrange = this.ymax - this.ymin;
+
+ let [xMargin,yMargin] = zip(this.Margins, [Xrange, Yrange]).map(([m,l]) => m*l);
+ [[this.dxmin, this.dxmax],[this.dymin,this.dymax]] =
+ [[this.xmin-xMargin, this.xmax+xMargin],
+ [this.ymin-yMargin, this.ymax+yMargin]];
+ Xrange += 2*xMargin;
+ Yrange += 2*yMargin;
// recompute curves "d" attribute
// FIXME: use SVG getPathData and setPathData when available.
@@ -141,8 +158,8 @@
zip(this.curves_data, this.curves).map(([data,curve]) => {
let new_d = data.map(([x,y], i) => {
// compute curve point from data, ranges, and base_ref
- let xv = vectorscale(xvect, (x - this.xmin) / Xlength);
- let yv = vectorscale(yvect, (y - this.ymin) / Ylength);
+ let xv = vectorscale(xvect, (x - this.dxmin) / Xrange);
+ let yv = vectorscale(yvect, (y - this.dymin) / Yrange);
let px = base_point.x + xv.x + yv.x;
let py = base_point.y + xv.y + yv.y;
if(!this.fixed_y_range){
@@ -169,8 +186,8 @@
if(this.curves_data.some(data => data.length > 1)){
// move marks and update labels
- this.reference.applyRanges([[this.xmin, this.xmax],
- [this.ymin, this.ymax]]);
+ this.reference.applyRanges([[this.dxmin, this.dxmax],
+ [this.dymin, this.dymax]]);
// apply computed curves "d" attributes
for(let [curve, d_attr] of zip(this.curves, this.curves_d_attr)){
@@ -220,9 +237,17 @@
return new DOMPoint(p2 * p1.x , p2 * p1.y);
};
+function vectorLength(p1) {
+ return Math.sqrt(p1.x*p1.x + p1.y*p1.y);
+};
+
+function randomId(){
+ return Date.now().toString(36) + Math.random().toString(36).substr(2);
+}
+
function move_elements_to_group(elements) {
let newgroup = document.createElementNS(xmlns,"g");
- newgroup.id = Date.now().toString(36) + Math.random().toString(36).substr(2);
+ newgroup.id = randomId();
for(let element of elements){
let parent = element.parentElement;
@@ -308,11 +333,17 @@
this.base_ref = [base_point, xvect, yvect];
+ this.lengths = [xvect,yvect].map(v => vectorLength(v));
+
for(let axis of this.axes){
axis.setBasePoint(base_point);
}
}
+ getLengths(){
+ return this.lengths;
+ }
+
getBaseRef(){
return this.base_ref;
}
@@ -372,7 +403,7 @@
for(let [elementname,element] of zip(["minor", "major", "label"],[...marks,label])){
for(let name of ["base","slide"]){
let transform = svg_root.createSVGTransform();
- element.transform.baseVal.appendItem(transform);
+ element.transform.baseVal.insertItemBefore(transform,0);
this[elementname+"_"+name+"_transform"]=transform;
};
};
@@ -395,7 +426,7 @@
this.marks_and_label_group.transform.baseVal.appendItem(this.marks_and_label_group_transform);
this.duplicates = [];
- this.last_mark_count = 0;
+ this.last_duplicate_index = 0;
}
setBasePoint(base_point){
@@ -445,12 +476,9 @@
// - To transform order of magnitude to an integer, floor() is used.
// This results in a count of mark fluctuating in between 10 and 100.
//
- // - To spare resources result is better in between 5 and 50,
- // and log10(5) is substracted to order of magnitude to obtain this
- // log10(5) ~= 0.69897
-
-
- let unit = Math.pow(10, Math.floor(Math.log10(range)-0.69897));
+ // - To spare resources result is better in between 3 and 30,
+ // and log10(3) is substracted to order of magnitude to obtain this
+ let unit = Math.pow(10, Math.floor(Math.log10(range)-Math.log10(3)));
// TODO: for time values (ms), units may be :
// 1 -> ms
@@ -508,11 +536,11 @@
// base_point
// move major marks and label to first positive mark position
- let v = vectorscale(unit_vect, unit);
- this.label_slide_transform.setTranslate(v.x, v.y);
- this.major_slide_transform.setTranslate(v.x, v.y);
+ // let v = vectorscale(unit_vect, unit);
+ // this.label_slide_transform.setTranslate(v.x, v.y);
+ // this.major_slide_transform.setTranslate(v.x, v.y);
// move minor mark to first half positive mark position
- v = vectorscale(unit_vect, unit/2);
+ let v = vectorscale(unit_vect, unit/2);
this.minor_slide_transform.setTranslate(v.x, v.y);
// duplicate marks and labels as needed
@@ -523,7 +551,7 @@
let transform = svg_root.createSVGTransform();
let newlabel = this.label.cloneNode(true);
let newuse = document.createElementNS(xmlns,"use");
- let newuseAttr = document.createAttribute("xlink:href");
+ let newuseAttr = document.createAttribute("href");
newuseAttr.value = "#"+this.marks_group.id;
newuse.setAttributeNode(newuseAttr);
newgroup.transform.baseVal.appendItem(transform);
@@ -560,10 +588,10 @@
// X<--------->|
// base_point
+ let duplicate_index = 0;
for(let mark_index = 0; mark_index <= mark_count; mark_index++){
- let i = 0;
let val = (mark_min + mark_index) * unit;
- let vec = vectorscale(unit_vect, offset + val - min);
+ let vec = vectorscale(unit_vect, val - min);
let text = this.format ? sprintf(this.format, val) : val.toString();
if(mark_index == mark_offset){
// apply offset to original marks and label groups
@@ -572,7 +600,7 @@
// update original label text
this.label.getElementsByTagName("tspan")[0].textContent = text;
} else {
- let [transform,element] = this.duplicates[i++];
+ let [transform,element] = this.duplicates[duplicate_index++];
// apply unit vector*N to marks and label groups
transform.setTranslate(vec.x, vec.y);
@@ -581,19 +609,20 @@
element.getElementsByTagName("tspan")[0].textContent = text;
// Attach to group if not already
- if(i >= this.last_mark_count){
+ if(element.parentElement == null){
this.group.appendChild(element);
}
}
}
+ let save_duplicate_index = duplicate_index;
// dettach marks and label from group if not anymore visible
- for(let i = current_mark_count; i < this.last_mark_count; i++){
- let [transform,element] = this.duplicates[i];
+ for(;duplicate_index < this.last_duplicate_index; duplicate_index++){
+ let [transform,element] = this.duplicates[duplicate_index];
this.group.removeChild(element);
}
- this.last_mark_count = current_mark_count;
+ this.last_duplicate_index = save_duplicate_index;
return vectorscale(unit_vect, offset);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/svghmi_0@svghmi/svghmi.svg Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,585 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+ sodipodi:docname="svghmi.svg"
+ id="hmi0"
+ version="1.1"
+ viewBox="0 0 1280 720"
+ height="720"
+ width="1280">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1993"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1991"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#00aad4;fill-opacity:1;fill-rule:evenodd;stroke:#00aad4;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1887"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#00aad4;fill-opacity:1;fill-rule:evenodd;stroke:#00aad4;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1885" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1721"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1719"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1621"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1619" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1527"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1525"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1439"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1437" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1357"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1355"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1275"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1273"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1199"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1197"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6249"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6247"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker6185"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6183" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="DotM"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotM">
+ <path
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ style="fill:#ff6600;fill-opacity:1;fill-rule:evenodd;stroke:#ff6600;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path8269"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker26099"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#ff6600;fill-opacity:1;fill-rule:evenodd;stroke:#ff6600;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path26097"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker19820-3"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path19818-6"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#3ee800;fill-opacity:1;fill-rule:evenodd;stroke:#3ee800;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker25117-7"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#3ee800;fill-opacity:1;fill-rule:evenodd;stroke:#3ee800;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path25115-5"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="DotM-3"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotM">
+ <path
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ style="fill:#ff6600;fill-opacity:1;fill-rule:evenodd;stroke:#ff6600;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path8269-5"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:collect="always"
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker26099-6"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#ff6600;fill-opacity:1;fill-rule:evenodd;stroke:#ff6600;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path26097-2"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1600"
+ inkscape:window-height="836"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="2.6222222"
+ inkscape:cx="138.92196"
+ inkscape:cy="243.43713"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g2776" />
+ <rect
+ inkscape:label="HMI:Page:Home"
+ y="0"
+ x="0"
+ height="720"
+ width="1280"
+ id="rect1016"
+ style="color:#000000;opacity:1;fill:#d6d6d6;fill-opacity:1" />
+ <g
+ transform="matrix(3.7795276,0,0,3.7795276,-24.745762,-208.06827)"
+ id="g2776"
+ inkscape:label="HMI:XYGraph|10:100:%.2D:%.4f@/TRENDVAL0@/TRENDVAL1">
+ <rect
+ inkscape:label="background"
+ ry="1.8520833"
+ rx="1.8520833"
+ y="87.995224"
+ x="22.985178"
+ height="114.9259"
+ width="167.31071"
+ id="rect2746"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.66866732;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 155.83129,160.76911 c -6.48118,-0.65276 -10.17779,-21.29836 -15.40662,-31.02314 -3.53004,-8.41808 -7.5877,-1.29208 -10.4198,6.97869 -4.61524,10.2233 -10.32507,20.13252 -15.96731,14.06607 -7.74352,-19.32213 -18.607099,-4.75161 -26.390159,-23.86108 -4.63396,-13.32693 -11.88412,-10.90822 -16.09527,3.29105 -2.36066,8.20528 -4.35835,18.89169 -7.94811,21.41954 -2.80281,2.74222 -5.9827,1.11526 -8.29837,-5.00354"
+ id="path2748"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:label="curve_1" />
+ <path
+ inkscape:label="curve_0"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ id="path2750"
+ d="m 55.011564,133.09949 c 6.481177,0.19426 10.177788,6.33834 15.406617,9.23241 3.530037,2.5052 7.587703,0.38452 10.419795,-2.07684 4.615243,-3.04243 10.325074,-5.99139 15.967312,-4.18603 7.743522,5.75022 18.607102,1.41407 26.390162,7.101 4.63396,3.96606 11.88412,3.24626 16.09527,-0.97941 2.36066,-2.44187 4.35835,-5.62212 7.94811,-6.3744 2.80281,-0.81608 5.9827,-0.3319 8.29837,1.48904"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#00b4cf;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:label="y_interval_minor_mark"
+ inkscape:connector-curvature="0"
+ id="path2752"
+ d="m 43.637172,172.91226 h -1.35783"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:label="y_axis_line"
+ inkscape:connector-curvature="0"
+ id="path2754"
+ d="M 44.123362,185.11382 V 98.607125"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6249)"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:label="y_interval_major_mark"
+ inkscape:connector-curvature="0"
+ id="path2756"
+ d="m 43.637172,167.88501 h -3.4745"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ inkscape:label="y_axis_label"
+ id="text2760"
+ y="169.42703"
+ x="38.401363"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:4.23333311px;text-align:end;text-anchor:end;stroke-width:0.26458332px"
+ y="169.42703"
+ x="38.401363"
+ id="tspan2758"
+ sodipodi:role="line">10</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 63.393748,179.65255 v 1.35783"
+ id="path2764"
+ inkscape:connector-curvature="0"
+ inkscape:label="x_interval_minor_mark" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6185)"
+ d="M 39.02135,179.37991 H 169.44888"
+ id="path2766"
+ inkscape:connector-curvature="0"
+ inkscape:label="x_axis_line" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 68.420998,179.65255 v 3.4745"
+ id="path2768"
+ inkscape:connector-curvature="0"
+ inkscape:label="x_interval_major_mark" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ x="-184.6293"
+ y="70.044762"
+ id="text2772"
+ inkscape:label="x_axis_label"
+ transform="rotate(-90)"><tspan
+ sodipodi:role="line"
+ id="tspan2770"
+ x="-186.94957"
+ y="70.044762"
+ style="font-size:4.23333311px;stroke-width:0.26458332px;text-anchor:end;text-align:end;">10</tspan></text>
+ </g>
+ <g
+ transform="matrix(2.1611542,0,0,2.1611542,616.6367,256.27681)"
+ id="g7998"
+ inkscape:label="HMI:Meter@/TRENDVAL0">
+ <desc
+ id="desc3869">A sophisticated meter looking like real</desc>
+ <path
+ inkscape:label="range"
+ sodipodi:open="true"
+ d="M 63.610123,2.2017068 A 64.411957,64.411957 0 0 1 128.02208,-62.210247"
+ sodipodi:end="4.712389"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="64.411957"
+ sodipodi:rx="64.411957"
+ sodipodi:cy="2.2017097"
+ sodipodi:cx="128.02208"
+ sodipodi:type="arc"
+ id="path7978"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#00b4cf;stroke-width:1.74884677;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:url(#marker19820-3);marker-end:url(#marker25117-7);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal;vector-effect:none;stroke-linecap:butt;stroke-linejoin:miter" />
+ <path
+ inkscape:label="needle"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path7980"
+ d="M 130.96206,4.0725977 79.111776,-41.363223"
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff6600;stroke-width:0.92543143;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:29.63333321;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#marker26099)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="49.132977"
+ y="4.9187088"
+ id="text7984"
+ inkscape:label="min"><tspan
+ sodipodi:role="line"
+ id="tspan7982"
+ x="49.132977"
+ y="4.9187088"
+ style="text-align:end;text-anchor:end;fill:#ff6600;stroke-width:0.26458332px">-1</tspan></text>
+ <text
+ id="text7988"
+ y="-68.889908"
+ x="127.48073"
+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ inkscape:label="max"><tspan
+ style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px"
+ y="-68.889908"
+ x="127.48073"
+ id="tspan7986"
+ sodipodi:role="line">1</tspan></text>
+ </g>
+ <g
+ transform="matrix(2.1611542,0,0,2.1611542,630.36551,530.09036)"
+ id="g7998-9"
+ inkscape:label="HMI:Meter@/TRENDVAL1">
+ <desc
+ id="desc3869-1">A sophisticated meter looking like real</desc>
+ <path
+ inkscape:label="range"
+ sodipodi:open="true"
+ d="M 63.610123,2.2017068 A 64.411957,64.411957 0 0 1 128.02208,-62.210247"
+ sodipodi:end="4.712389"
+ sodipodi:start="3.1415927"
+ sodipodi:ry="64.411957"
+ sodipodi:rx="64.411957"
+ sodipodi:cy="2.2017097"
+ sodipodi:cx="128.02208"
+ sodipodi:type="arc"
+ id="path7978-2"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:1.7488468;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:url(#marker19820-3);marker-end:url(#marker25117-7);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal;vector-effect:none;stroke-linecap:butt;stroke-linejoin:miter" />
+ <path
+ inkscape:label="needle"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path7980-7"
+ d="M 130.96206,4.0725977 79.111776,-41.363223"
+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff6600;stroke-width:0.92543143;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:29.63333321;stroke-opacity:1;marker-start:url(#DotM-3);marker-end:url(#marker26099-6)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="49.132977"
+ y="4.9187088"
+ id="text7984-0"
+ inkscape:label="min"><tspan
+ sodipodi:role="line"
+ id="tspan7982-9"
+ x="49.132977"
+ y="4.9187088"
+ style="text-align:end;text-anchor:end;fill:#ff6600;stroke-width:0.26458332px">-1</tspan></text>
+ <text
+ id="text7988-3"
+ y="-68.889908"
+ x="127.48073"
+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ inkscape:label="max"><tspan
+ style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px"
+ y="-68.889908"
+ x="127.48073"
+ id="tspan7986-6"
+ sodipodi:role="line">1</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="1003.7288"
+ y="83.8983"
+ id="text73"
+ inkscape:label="_blup"><tspan
+ sodipodi:role="line"
+ id="tspan71"
+ x="1003.7288"
+ y="83.8983">blup</tspan></text>
+ <g
+ id="g14237"
+ inkscape:label="HMI:DropDown:#langs@lang"
+ transform="matrix(0.81491208,0,0,0.81491208,42.49804,-160.06995)"
+ style="stroke-width:0.35083869">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#53676c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.75419343;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect14212"
+ width="574.92957"
+ height="84.312515"
+ x="864.00842"
+ y="946.07819"
+ rx="2.4558709"
+ ry="2.4558709"
+ inkscape:label="box" />
+ <rect
+ inkscape:label="highlight"
+ ry="2.4558709"
+ rx="2.4558709"
+ y="968.2616"
+ x="864.00842"
+ height="39.945667"
+ width="574.92957"
+ id="rect5497"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.75419331;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <text
+ id="text14183"
+ y="998.13739"
+ x="890.70056"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35.95956421px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d42aff;fill-opacity:1;stroke:none;stroke-width:0.35083869px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ inkscape:label="text"><tspan
+ style="text-align:start;text-anchor:start;fill:#d42aff;stroke-width:0.35083869px"
+ y="998.13739"
+ x="890.70056"
+ sodipodi:role="line"
+ id="tspan421">Language (Country)</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="opacity:1;vector-effect:none;fill:#a7a5a6;fill-opacity:1;stroke:none;stroke-width:0.12376806;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path424"
+ sodipodi:sides="3"
+ sodipodi:cx="1387.0236"
+ sodipodi:cy="977.31354"
+ sodipodi:r1="43.683521"
+ sodipodi:r2="21.841761"
+ sodipodi:arg1="1.5707963"
+ sodipodi:arg2="2.6179939"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 1387.0236,1020.9971 -18.9156,-32.76268 -18.9155,-32.76264 37.8311,0 37.831,0 -18.9155,32.76264 z"
+ inkscape:transform-center-y="10.92088"
+ inkscape:label="button" />
+ </g>
+</svg>