SVGHMI: more fixes for XY graph + add XY graph test.
authorEdouard Tisserant
Mon, 30 May 2022 12:44:04 +0200
changeset 3490 4f252e8d6759
parent 3489 5335895ce526
child 3491 88c4b18453d5
child 3492 cf6d6e033c86
child 3503 49fcd5d62139
SVGHMI: more fixes for XY graph + add XY graph test.
svghmi/widget_xygraph.ysl2
tests/projects/svghmi_i18n/svghmi_0@svghmi/messages.pot
tests/projects/svghmi_xy/beremiz.xml
tests/projects/svghmi_xy/plc.xml
tests/projects/svghmi_xy/svghmi_0@svghmi/baseconfnode.xml
tests/projects/svghmi_xy/svghmi_0@svghmi/confnode.xml
tests/projects/svghmi_xy/svghmi_0@svghmi/fr-FR.mo
tests/projects/svghmi_xy/svghmi_0@svghmi/fr-FR.po
tests/projects/svghmi_xy/svghmi_0@svghmi/messages.pot
tests/projects/svghmi_xy/svghmi_0@svghmi/svghmi.svg
--- 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);
     }
--- a/tests/projects/svghmi_i18n/svghmi_0@svghmi/messages.pot	Thu May 26 12:11:42 2022 +0200
+++ b/tests/projects/svghmi_i18n/svghmi_0@svghmi/messages.pot	Mon May 30 12:44:04 2022 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2021-02-15 14:45+CET\n"
+"POT-Creation-Date: 2022-05-26 11:39+CEST\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/beremiz.xml	Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="PYRO://127.0.0.1:61427">
+  <TargetType/>
+  <Libraries Enable_SVGHMI_Library="true"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/plc.xml	Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,337 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6.xsd" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2022-05-06T11:12:02"/>
+  <contentHeader name="Unnamed" modificationDateTime="2022-05-09T09:09:01">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="5" y="5"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="trendval0">
+              <type>
+                <derived name="HMI_REAL"/>
+              </type>
+            </variable>
+            <variable name="trendval1">
+              <type>
+                <derived name="HMI_REAL"/>
+              </type>
+            </variable>
+            <variable name="counter">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <outVariable localId="2" executionOrderId="0" height="25" width="95" negated="false">
+              <position x="910" y="195"/>
+              <connectionPointIn>
+                <relPosition x="0" y="10"/>
+                <connection refLocalId="10" formalParameter="OUT">
+                  <position x="910" y="205"/>
+                  <position x="885" y="205"/>
+                </connection>
+              </connectionPointIn>
+              <expression>trendval0</expression>
+            </outVariable>
+            <outVariable localId="3" executionOrderId="0" height="25" width="95" negated="false">
+              <position x="910" y="255"/>
+              <connectionPointIn>
+                <relPosition x="0" y="10"/>
+                <connection refLocalId="12" formalParameter="OUT">
+                  <position x="910" y="265"/>
+                  <position x="885" y="265"/>
+                </connection>
+              </connectionPointIn>
+              <expression>trendval1</expression>
+            </outVariable>
+            <block localId="4" typeName="ADD" executionOrderId="0" height="75" width="63">
+              <position x="210" y="190"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="1">
+                      <position x="210" y="225"/>
+                      <position x="140" y="225"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="60"/>
+                    <connection refLocalId="7">
+                      <position x="210" y="250"/>
+                      <position x="170" y="250"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="63" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="5" typeName="SEL" executionOrderId="0" height="80" width="65">
+              <position x="485" y="175"/>
+              <inputVariables>
+                <variable formalParameter="G">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="6" formalParameter="OUT">
+                      <position x="485" y="205"/>
+                      <position x="460" y="205"/>
+                      <position x="460" y="185"/>
+                      <position x="435" y="185"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="4" formalParameter="OUT">
+                      <position x="485" y="225"/>
+                      <position x="273" y="225"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="8">
+                      <position x="485" y="245"/>
+                      <position x="445" y="245"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="6" typeName="GE" executionOrderId="0" height="60" width="65">
+              <position x="370" y="155"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="4" formalParameter="OUT">
+                      <position x="370" y="185"/>
+                      <position x="306" y="185"/>
+                      <position x="306" y="225"/>
+                      <position x="273" y="225"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="9">
+                      <position x="370" y="205"/>
+                      <position x="350" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="7" executionOrderId="0" height="25" width="20" negated="false">
+              <position x="150" y="240"/>
+              <connectionPointOut>
+                <relPosition x="20" y="10"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <inVariable localId="8" executionOrderId="0" height="25" width="20" negated="false">
+              <position x="425" y="235"/>
+              <connectionPointOut>
+                <relPosition x="20" y="10"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inVariable localId="9" executionOrderId="0" height="25" width="35" negated="false">
+              <position x="315" y="195"/>
+              <connectionPointOut>
+                <relPosition x="35" y="10"/>
+              </connectionPointOut>
+              <expression>360</expression>
+            </inVariable>
+            <block localId="10" typeName="COS" executionOrderId="0" height="40" width="60">
+              <position x="825" y="175"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="14" formalParameter="OUT">
+                      <position x="825" y="205"/>
+                      <position x="785" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="60" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="11" typeName="INT_TO_REAL" executionOrderId="0" height="40" width="100">
+              <position x="585" y="175"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="5" formalParameter="OUT">
+                      <position x="585" y="205"/>
+                      <position x="550" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="100" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="12" typeName="SIN" executionOrderId="0" height="40" width="60">
+              <position x="825" y="235"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="14" formalParameter="OUT">
+                      <position x="825" y="265"/>
+                      <position x="805" y="265"/>
+                      <position x="805" y="205"/>
+                      <position x="785" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="60" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inOutVariable localId="1" executionOrderId="0" height="25" width="70" negatedOut="false" negatedIn="false">
+              <position x="70" y="215"/>
+              <connectionPointIn>
+                <relPosition x="0" y="10"/>
+                <connection refLocalId="5" formalParameter="OUT">
+                  <position x="70" y="225"/>
+                  <position x="60" y="225"/>
+                  <position x="60" y="285"/>
+                  <position x="560" y="285"/>
+                  <position x="560" y="205"/>
+                  <position x="550" y="205"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="70" y="10"/>
+              </connectionPointOut>
+              <expression>counter</expression>
+            </inOutVariable>
+            <comment localId="13" height="110" width="285">
+              <position x="40" y="25"/>
+              <content>
+                <xhtml:p><![CDATA[Generate values for curves]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="14" typeName="DIV" executionOrderId="0" height="60" width="65">
+              <position x="720" y="175"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="11" formalParameter="OUT">
+                      <position x="720" y="205"/>
+                      <position x="685" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="15">
+                      <position x="720" y="225"/>
+                      <position x="685" y="225"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="15" executionOrderId="0" height="25" width="70" negated="false">
+              <position x="615" y="215"/>
+              <connectionPointOut>
+                <relPosition x="70" y="10"/>
+              </connectionPointOut>
+              <expression>57.2958</expression>
+            </inVariable>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#20ms">
+            <pouInstance name="instance0" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/svghmi_0@svghmi/baseconfnode.xml	Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="svghmi_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/svghmi_0@svghmi/confnode.xml	Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
Binary file tests/projects/svghmi_xy/svghmi_0@svghmi/fr-FR.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/svghmi_0@svghmi/fr-FR.po	Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,21 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2022-05-13 11:27+CEST\n"
+"PO-Revision-Date: 2022-05-13 11:29+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: SVGHMI 1.0\n"
+"X-Generator: Poedit 2.3\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: fr\n"
+
+msgid "blup"
+msgstr "bloup"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi_xy/svghmi_0@svghmi/messages.pot	Mon May 30 12:44:04 2022 +0200
@@ -0,0 +1,21 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2022-05-30 12:35+CEST\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: SVGHMI 1.0\n"
+
+
+#:svghmi.svg: blup:text73
+msgid "blup"
+msgstr ""
+
--- /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>