merge svghmi
authorEdouard Tisserant
Thu, 14 May 2020 09:24:09 +0200
branchsvghmi
changeset 2966 7349063b19d8
parent 2965 8f928cee01e5 (current diff)
parent 2963 113e2f2e324d (diff)
child 2967 fc5fbf087b93
merge
--- a/svghmi/gen_index_xhtml.xslt	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/gen_index_xhtml.xslt	Thu May 14 09:24:09 2020 +0200
@@ -866,20 +866,26 @@
 </xsl:text>
     <xsl:text>class Widget {
 </xsl:text>
+    <xsl:text>    offset = 0;
+</xsl:text>
+    <xsl:text>    frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */
+</xsl:text>
     <xsl:text>    constructor(elt_id,args,indexes,members){
 </xsl:text>
+    <xsl:text>        this.element_id = elt_id;
+</xsl:text>
     <xsl:text>        this.element = id(elt_id);
 </xsl:text>
     <xsl:text>        this.args = args;
 </xsl:text>
     <xsl:text>        this.indexes = indexes;
 </xsl:text>
-    <xsl:text>        this.offset = 0;
-</xsl:text>
     <xsl:text>        Object.keys(members).forEach(prop =&gt; this[prop]=members[prop]);
 </xsl:text>
     <xsl:text>    }
 </xsl:text>
+    <xsl:text>
+</xsl:text>
     <xsl:text>    unsub(){
 </xsl:text>
     <xsl:text>        /* remove subsribers */
@@ -1078,9 +1084,10 @@
       </xsl:otherwise>
     </xsl:choose>
   </func:function>
-  <xsl:template mode="widget_defs" match="widget[@type='Back']">
-    <xsl:param name="hmi_element"/>
-    <xsl:text>    on_click: function(evt) {
+  <xsl:template mode="widget_class" match="widget[@type='Back']">
+    <xsl:text>class BackWidget extends Widget{
+</xsl:text>
+    <xsl:text>    on_click(evt) {
 </xsl:text>
     <xsl:text>        if(jump_history.length &gt; 1){
 </xsl:text>
@@ -1092,44 +1099,51 @@
 </xsl:text>
     <xsl:text>        }
 </xsl:text>
-    <xsl:text>    },
-</xsl:text>
-    <xsl:text>    init: function() {
-</xsl:text>
-    <xsl:text>        this.element.setAttribute("onclick", "hmi_widgets['</xsl:text>
-    <xsl:value-of select="$hmi_element/@id"/>
-    <xsl:text>'].on_click(evt)");
-</xsl:text>
-    <xsl:text>    },
-</xsl:text>
-  </xsl:template>
-  <xsl:template mode="widget_defs" match="widget[@type='Button']">
-    <xsl:param name="hmi_element"/>
-    <xsl:text>frequency: 5,
-</xsl:text>
-    <xsl:text>init: function() {
-</xsl:text>
-    <xsl:text>    this.element.addEventListener(
-</xsl:text>
-    <xsl:text>      "mousedown",
-</xsl:text>
-    <xsl:text>      evt =&gt; {
-</xsl:text>
-    <xsl:text>          change_hmi_value(this.indexes[0], "=1");
-</xsl:text>
-    <xsl:text>      });
-</xsl:text>
-    <xsl:text>    this.element.addEventListener(
-</xsl:text>
-    <xsl:text>      "mouseup",
-</xsl:text>
-    <xsl:text>      evt =&gt; {
-</xsl:text>
-    <xsl:text>          change_hmi_value(this.indexes[0], "=0");
-</xsl:text>
-    <xsl:text>      });
-</xsl:text>
-    <xsl:text>},
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    init() {
+</xsl:text>
+    <xsl:text>        this.element.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_click(evt)");
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>}
+</xsl:text>
+  </xsl:template>
+  <xsl:template mode="widget_class" match="widget[@type='Button']">
+    <xsl:text>class ButtonWidget extends Widget{
+</xsl:text>
+    <xsl:text>    frequency = 5;
+</xsl:text>
+    <xsl:text>    init() {
+</xsl:text>
+    <xsl:text>        // TODO : use attributes to allow interaction through svg:use
+</xsl:text>
+    <xsl:text>        // TODO : deal with dragging
+</xsl:text>
+    <xsl:text>        this.element.addEventListener(
+</xsl:text>
+    <xsl:text>          "mousedown",
+</xsl:text>
+    <xsl:text>          evt =&gt; {
+</xsl:text>
+    <xsl:text>              change_hmi_value(this.indexes[0], "=1");
+</xsl:text>
+    <xsl:text>          });
+</xsl:text>
+    <xsl:text>        this.element.addEventListener(
+</xsl:text>
+    <xsl:text>          "mouseup",
+</xsl:text>
+    <xsl:text>          evt =&gt; {
+</xsl:text>
+    <xsl:text>              change_hmi_value(this.indexes[0], "=0");
+</xsl:text>
+    <xsl:text>          });
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>}
 </xsl:text>
   </xsl:template>
   <xsl:template mode="widget_defs" match="widget[@type='CircularBar']">
@@ -1767,7 +1781,6 @@
   </xsl:template>
   <xsl:template mode="widget_defs" match="widget[@type='ForEach']">
     <xsl:param name="hmi_element"/>
-    <xsl:variable name="widgets" select="func:refered_elements($forEach_widgets)[not(@id = $forEach_widgets_ids)]"/>
     <xsl:variable name="class" select="arg[1]/@value"/>
     <xsl:variable name="base_path" select="path/@value"/>
     <xsl:variable name="hmi_index_base" select="$indexed_hmitree/*[@hmipath = $base_path]"/>
@@ -2585,34 +2598,34 @@
     <xsl:text>    },
 </xsl:text>
   </xsl:template>
+  <xsl:template mode="widget_class" match="widget[@type='Switch']">
+    <xsl:text>class SwitchWidget extends Widget{
+</xsl:text>
+    <xsl:text>    frequency = 5;
+</xsl:text>
+    <xsl:text>    dispatch(value) {
+</xsl:text>
+    <xsl:text>        for(let choice of this.choices){
+</xsl:text>
+    <xsl:text>            if(value != choice.value){
+</xsl:text>
+    <xsl:text>                choice.elt.setAttribute("style", "display:none");
+</xsl:text>
+    <xsl:text>            } else {
+</xsl:text>
+    <xsl:text>                choice.elt.setAttribute("style", choice.style);
+</xsl:text>
+    <xsl:text>            }
+</xsl:text>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>}
+</xsl:text>
+  </xsl:template>
   <xsl:template mode="widget_defs" match="widget[@type='Switch']">
     <xsl:param name="hmi_element"/>
-    <xsl:text>    frequency: 5,
-</xsl:text>
-    <xsl:text>    dispatch: function(value) {
-</xsl:text>
-    <xsl:text>        for(let choice of this.choices){
-</xsl:text>
-    <xsl:text>            if(value != choice.value){
-</xsl:text>
-    <xsl:text>                choice.elt.setAttribute("style", "display:none");
-</xsl:text>
-    <xsl:text>            } else {
-</xsl:text>
-    <xsl:text>                choice.elt.setAttribute("style", choice.style);
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>    },
-</xsl:text>
-    <xsl:text>    init: function() {
-</xsl:text>
-    <xsl:text>        // Hello Switch
-</xsl:text>
-    <xsl:text>    },
-</xsl:text>
     <xsl:text>    choices: [
 </xsl:text>
     <xsl:variable name="regex" select="'^(&quot;[^&quot;].*&quot;|\-?[0-9]+|false|true)(#.*)?$'"/>
@@ -3104,11 +3117,15 @@
 </xsl:text>
           <xsl:text>            let maxfreq = 0;
 </xsl:text>
-          <xsl:text>            for(let widget of widgets)
-</xsl:text>
-          <xsl:text>                if(maxfreq &lt; widget.frequency)
-</xsl:text>
-          <xsl:text>                    maxfreq = widget.frequency;
+          <xsl:text>            for(let widget of widgets){
+</xsl:text>
+          <xsl:text>                let wf = widget.frequency;
+</xsl:text>
+          <xsl:text>                if(wf != undefined &amp;&amp; maxfreq &lt; wf)
+</xsl:text>
+          <xsl:text>                    maxfreq = wf;
+</xsl:text>
+          <xsl:text>            }
 </xsl:text>
           <xsl:text>
 </xsl:text>
--- a/svghmi/svghmi.js	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/svghmi.js	Thu May 14 09:24:09 2020 +0200
@@ -207,9 +207,11 @@
         let new_period = 0;
         if(widgets.size > 0) {
             let maxfreq = 0;
-            for(let widget of widgets)
-                if(maxfreq < widget.frequency)
-                    maxfreq = widget.frequency;
+            for(let widget of widgets){
+                let wf = widget.frequency;
+                if(wf != undefined && maxfreq < wf)
+                    maxfreq = wf;
+            }
 
             if(maxfreq != 0)
                 new_period = 1000/maxfreq;
--- a/svghmi/widget_back.ysl2	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/widget_back.ysl2	Thu May 14 09:24:09 2020 +0200
@@ -1,17 +1,17 @@
 // widget_back.ysl2
 
-template "widget[@type='Back']", mode="widget_defs" {
-    param "hmi_element";
-
-    |     on_click: function(evt) {
-    |         if(jump_history.length > 1){
-    |            jump_history.pop();
-    |            let [page_name, index] = jump_history.pop();
-    |            switch_page(page_name, index);
-    |         }
-    |     },
-    |     init: function() {
-    |         this.element.setAttribute("onclick", "hmi_widgets['«$hmi_element/@id»'].on_click(evt)");
-    |     },
-}
-
+template "widget[@type='Back']", mode="widget_class"
+    ||
+    class BackWidget extends Widget{
+        on_click(evt) {
+            if(jump_history.length > 1){
+               jump_history.pop();
+               let [page_name, index] = jump_history.pop();
+               switch_page(page_name, index);
+            }
+        }
+        init() {
+            this.element.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_click(evt)");
+        }
+    }
+    ||
--- a/svghmi/widget_button.ysl2	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/widget_button.ysl2	Thu May 14 09:24:09 2020 +0200
@@ -1,18 +1,20 @@
 // widget_button.ysl2
 
-template "widget[@type='Button']", mode="widget_defs" {
-    param "hmi_element";
-    | frequency: 5,
-    | init: function() {
-    |     this.element.addEventListener(
-    |       "mousedown",
-    |       evt => {
-    |           change_hmi_value(this.indexes[0], "=1");
-    |       });
-    |     this.element.addEventListener(
-    |       "mouseup",
-    |       evt => {
-    |           change_hmi_value(this.indexes[0], "=0");
-    |       });
-    | },
-}
\ No newline at end of file
+template "widget[@type='Button']", mode="widget_class"
+    ||
+    class ButtonWidget extends Widget{
+        frequency = 5;
+        init() {
+            this.element.addEventListener(
+              "mousedown",
+              evt => {
+                  change_hmi_value(this.indexes[0], "=1");
+              });
+            this.element.addEventListener(
+              "mouseup",
+              evt => {
+                  change_hmi_value(this.indexes[0], "=0");
+              });
+        }
+    }
+    ||
--- a/svghmi/widget_foreach.ysl2	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/widget_foreach.ysl2	Thu May 14 09:24:09 2020 +0200
@@ -1,7 +1,6 @@
 
 template "widget[@type='ForEach']", mode="widget_defs" {
     param "hmi_element";
-    const "widgets", "func:refered_elements($forEach_widgets)[not(@id = $forEach_widgets_ids)]";
 
     const "class","arg[1]/@value";
 
--- a/svghmi/widget_switch.ysl2	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/widget_switch.ysl2	Thu May 14 09:24:09 2020 +0200
@@ -1,20 +1,23 @@
 // widget_switch.ysl2
 
+template "widget[@type='Switch']", mode="widget_class"
+    ||
+    class SwitchWidget extends Widget{
+        frequency = 5;
+        dispatch(value) {
+            for(let choice of this.choices){
+                if(value != choice.value){
+                    choice.elt.setAttribute("style", "display:none");
+                } else {
+                    choice.elt.setAttribute("style", choice.style);
+                }
+            }
+        }
+    }
+    ||
+
 template "widget[@type='Switch']", mode="widget_defs" {
     param "hmi_element";
-    |     frequency: 5,
-    |     dispatch: function(value) {
-    |         for(let choice of this.choices){
-    |             if(value != choice.value){
-    |                 choice.elt.setAttribute("style", "display:none");
-    |             } else {
-    |                 choice.elt.setAttribute("style", choice.style);
-    |             }
-    |         }
-    |     },
-    |     init: function() {
-    |         // Hello Switch
-    |     },
     |     choices: [
     const "regex",!"'^(\"[^\"].*\"|\-?[0-9]+|false|true)(#.*)?$'"!;
     foreach "$hmi_element/*[regexp:test(@inkscape:label,$regex)]" {
--- a/svghmi/widgets_common.ysl2	Wed May 13 14:48:52 2020 +0200
+++ b/svghmi/widgets_common.ysl2	Thu May 14 09:24:09 2020 +0200
@@ -65,13 +65,16 @@
 emit "preamble:widget-base-class" {
     ||    
     class Widget {
+        offset = 0;
+        frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */
         constructor(elt_id,args,indexes,members){
+            this.element_id = elt_id;
             this.element = id(elt_id);
             this.args = args;
             this.indexes = indexes;
-            this.offset = 0;
             Object.keys(members).forEach(prop => this[prop]=members[prop]);
         }
+
         unsub(){
             /* remove subsribers */
             for(let index of this.indexes){
--- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg	Wed May 13 14:48:52 2020 +0200
+++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg	Thu May 14 09:24:09 2020 +0200
@@ -16,7 +16,7 @@
    version="1.1"
    id="hmi0"
    sodipodi:docname="svghmi.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
   <metadata
      id="metadata4542">
     <rdf:RDF>
@@ -31,6 +31,20 @@
   </metadata>
   <defs
      id="defs2">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="30 : 418 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1358 : 3.9999991 : 1"
+       inkscape:persp3d-origin="670 : 298 : 1"
+       id="perspective503" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 360 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1376 : 388 : 1"
+       inkscape:persp3d-origin="640 : 240 : 1"
+       id="perspective445" />
     <inkscape:tag
        id="Set 1"
        inkscape:label="HMI:AccessList@Admin"
@@ -127,13 +141,13 @@
      inkscape:current-layer="hmi0"
      showgrid="false"
      units="px"
-     inkscape:zoom="0.35355339"
-     inkscape:cx="-418.67433"
-     inkscape:cy="-1206.7258"
+     inkscape:zoom="0.5"
+     inkscape:cx="523.16321"
+     inkscape:cy="-1.5475559"
      inkscape:window-width="1920"
-     inkscape:window-height="1080"
+     inkscape:window-height="1348"
      inkscape:window-x="3815"
-     inkscape:window-y="968"
+     inkscape:window-y="700"
      inkscape:window-maximized="0"
      showguides="true"
      inkscape:guide-bbox="true" />
@@ -912,29 +926,29 @@
   <text
      xml:space="preserve"
      style="font-style:normal;font-weight:normal;font-size:80px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="98.164062"
-     y="469.12109"
+     x="38.164062"
+     y="449.12109"
      id="text134"
      inkscape:label="HMI:Display@/PUMP0/STROUT"><tspan
        sodipodi:role="line"
        id="tspan132"
-       x="98.164062"
-       y="469.12109"
+       x="38.164062"
+       y="449.12109"
        style="fill:#ffffff;fill-opacity:1;stroke-width:0.5px">8888</tspan></text>
   <text
      inkscape:label="HMI:Display@/PUMP0/BOOLOUT"
      id="text138"
-     y="569.12109"
-     x="98.164062"
+     y="549.12109"
+     x="38.164062"
      style="font-style:normal;font-weight:normal;font-size:80px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
      xml:space="preserve"><tspan
        style="fill:#ffffff;fill-opacity:1;stroke-width:0.5px"
-       y="569.12109"
-       x="98.164062"
+       y="549.12109"
+       x="38.164062"
        id="tspan136"
        sodipodi:role="line">8888</tspan></text>
   <g
-     transform="matrix(0.5,0,0,0.5,90.110264,225.71623)"
+     transform="matrix(0.5,0,0,0.5,-9.889736,205.71623)"
      id="g208-1"
      inkscape:label="HMI:Input@/PUMP0/STRIN"
      style="stroke-width:2">
@@ -1124,196 +1138,6 @@
     </g>
   </g>
   <g
-     transform="matrix(0.5,0,0,0.5,126.87458,546.40152)"
-     id="g208-1-8"
-     inkscape:label="HMI:Input@/PUMP0/STRIN"
-     style="stroke-width:2">
-    <text
-       inkscape:label="value"
-       id="text164-3"
-       y="218.24219"
-       x="136.32812"
-       style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         style="stroke-width:2px"
-         y="218.24219"
-         x="136.32812"
-         id="tspan162-1"
-         sodipodi:role="line">8888</tspan></text>
-    <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;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="rect166-8"
-       width="407.7037"
-       height="128"
-       x="139.85185"
-       y="95.40741"
-       onclick=""
-       inkscape:label="edit" />
-    <g
-       transform="translate(-416.52022,170.47452)"
-       inkscape:label="+&quot;dhu&quot;"
-       id="g174-9"
-       style="stroke-width:2">
-      <path
-         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:none;stroke-width:10;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"
-         inkscape:transform-center-y="-14.956361"
-         d="m 797.19546,145.18619 -80.62929,0.60214 -0.60215,-80.629288 80.6293,-0.60214 z"
-         id="path168-6"
-         inkscape:connector-curvature="0" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         x="733.58197"
-         y="111.05016"
-         id="text172-4"><tspan
-           sodipodi:role="line"
-           id="tspan170-3"
-           x="733.58197"
-           y="111.05016"
-           style="stroke-width:1px">dhu</tspan></text>
-    </g>
-    <g
-       transform="translate(-416.52022,170.47452)"
-       inkscape:label="=&quot;plop&quot;"
-       id="g182-3"
-       style="stroke-width:2">
-      <path
-         transform="matrix(0,-2.0000001,1.9999999,0,1034.195,1298.6541)"
-         sodipodi:type="star"
-         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:none;stroke-width:10;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="path176-3"
-         sodipodi:sides="3"
-         sodipodi:cx="596.74072"
-         sodipodi:cy="-184.98808"
-         sodipodi:r1="29.912722"
-         sodipodi:r2="14.956361"
-         sodipodi:arg1="0.52359878"
-         sodipodi:arg2="1.5707963"
-         inkscape:flatsided="true"
-         inkscape:rounded="0"
-         inkscape:randomized="0"
-         d="m 622.6459,-170.03172 -51.81035,0 25.90517,-44.86908 z"
-         inkscape:transform-center-y="-3.6154501e-05"
-         inkscape:transform-center-x="14.956371" />
-      <text
-         id="text180-8"
-         y="111.05016"
-         x="633.09552"
-         style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="stroke-width:1px"
-           y="111.05016"
-           x="633.09552"
-           id="tspan178-6"
-           sodipodi:role="line">plop</tspan></text>
-    </g>
-    <g
-       transform="translate(-416.52022,170.47452)"
-       inkscape:label="=&quot;mhoo&quot;"
-       id="g190-0"
-       style="stroke-width:2">
-      <path
-         inkscape:transform-center-y="-5.9989963e-06"
-         d="m 648.55108,-186.34718 -103.62071,0 51.81035,-89.73817 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0"
-         inkscape:flatsided="true"
-         sodipodi:arg2="1.5707963"
-         sodipodi:arg1="0.52359878"
-         sodipodi:r2="29.912722"
-         sodipodi:r1="59.825443"
-         sodipodi:cy="-216.2599"
-         sodipodi:cx="596.74072"
-         sodipodi:sides="3"
-         id="path184-4"
-         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:none;stroke-width:10;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"
-         sodipodi:type="star"
-         transform="rotate(-90,746.45698,-44.543641)"
-         inkscape:transform-center-x="14.956364" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         x="537.25018"
-         y="111.05016"
-         id="text188-8"><tspan
-           sodipodi:role="line"
-           id="tspan186-8"
-           x="537.25018"
-           y="111.05016"
-           style="stroke-width:1px">mhoo</tspan></text>
-    </g>
-    <g
-       transform="translate(-416.52022,170.47452)"
-       inkscape:label="=&quot;yodl&quot;"
-       id="g198-8"
-       style="stroke-width:2">
-      <path
-         sodipodi:type="star"
-         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:none;stroke-width:10;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="path192-9"
-         sodipodi:sides="3"
-         sodipodi:cx="596.74072"
-         sodipodi:cy="105.17262"
-         sodipodi:r1="59.825443"
-         sodipodi:r2="29.912722"
-         sodipodi:arg1="0.52359878"
-         sodipodi:arg2="1.5707963"
-         inkscape:flatsided="true"
-         inkscape:rounded="0"
-         inkscape:randomized="0"
-         d="m 648.55108,135.08534 -103.62071,0 51.81035,-89.738161 z"
-         inkscape:transform-center-y="-5.5023185e-06"
-         transform="matrix(0,-1,-1,0,1043.9134,701.91334)"
-         inkscape:transform-center-x="-14.956365" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         x="925.82605"
-         y="111.05016"
-         id="text196-7"><tspan
-           sodipodi:role="line"
-           id="tspan194-7"
-           x="925.82605"
-           y="111.05016"
-           style="stroke-width:1px">yodl</tspan></text>
-    </g>
-    <g
-       transform="translate(-416.52022,170.47452)"
-       inkscape:label="=&quot;mhe&quot;"
-       id="g206-1-6"
-       style="stroke-width:2">
-      <path
-         inkscape:transform-center-y="-3.3040441e-05"
-         d="m 622.6459,151.4008 -51.81035,0 25.90517,-44.86908 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0"
-         inkscape:flatsided="true"
-         sodipodi:arg2="1.5707963"
-         sodipodi:arg1="0.52359878"
-         sodipodi:r2="14.956361"
-         sodipodi:r1="29.912722"
-         sodipodi:cy="136.44444"
-         sodipodi:cx="596.74072"
-         sodipodi:sides="3"
-         id="path200-4"
-         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:none;stroke-width:10;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"
-         sodipodi:type="star"
-         transform="matrix(0,-2.0000001,-1.9999999,0,1122.1514,1298.6541)"
-         inkscape:transform-center-x="-14.956349" />
-      <text
-         id="text204-3"
-         y="111.05016"
-         x="842.71497"
-         style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="stroke-width:1px"
-           y="111.05016"
-           x="842.71497"
-           id="tspan202-0"
-           sodipodi:role="line">mhe</tspan></text>
-    </g>
-  </g>
-  <g
      inkscape:label="HMI:Keypad:HMI_INT:HMI_REAL"
      id="g2432"
      style="fill-rule:evenodd;stroke-width:0.47631353"
@@ -2692,4 +2516,144 @@
        sodipodi:type="star"
        inkscape:transform-center-x="1.0089177e-06" />
   </g>
+  <g
+     transform="translate(-867.71696,-14.163562)"
+     id="g443"
+     inkscape:label="HMI:Button@/SELECTION">
+    <g
+       id="g435"
+       inkscape:label="bg">
+      <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:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;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="rect433"
+         width="245.44583"
+         height="95.723877"
+         x="971.96545"
+         y="594.82263"
+         ry="35.579063"
+         inkscape:label="button" />
+    </g>
+    <g
+       id="g441"
+       inkscape:label="text">
+      <text
+         inkscape:label="setting_jmp"
+         id="text439"
+         y="656.98151"
+         x="1090.7626"
+         style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px"
+           y="656.98151"
+           x="1090.7626"
+           id="tspan437"
+           sodipodi:role="line">up</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g5053"
+     inkscape:label="HMI:Switch@/PUMP0/BOOLOUT">
+    <g
+       sodipodi:type="inkscape:box3d"
+       id="g473"
+       style="fill:#ff0000;stroke:#ff00ff"
+       inkscape:perspectiveID="#perspective445"
+       inkscape:corner0="-0.22508846 : -0.3474613 : 0 : 1"
+       inkscape:corner7="-0.30162293 : -0.45734167 : 0.25 : 1"
+       inkscape:label="true">
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path461"
+         style="fill:#353564;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="6"
+         d="M 825.90072,963.24473 V 1105.042 L 960.08286,916.47892 V 809.26931 Z"
+         points="825.90072,1105.042 960.08286,916.47892 960.08286,809.26931 825.90072,963.24473 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path463"
+         style="fill:#afafde;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="13"
+         d="m 825.90072,1105.042 90.50967,81.6485 121.15161,-225.30347 -77.47914,-44.90811 z"
+         points="916.41039,1186.6905 1037.562,961.38703 960.08286,916.47892 825.90072,1105.042 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path465"
+         style="fill:#e9e9ff;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="11"
+         d="m 960.08286,809.26931 77.47914,36.25624 v 115.86148 l -77.47914,-44.90811 z"
+         points="1037.562,845.52555 1037.562,961.38703 960.08286,916.47892 960.08286,809.26931 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path467"
+         style="fill:#4d4d9f;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="5"
+         d="M 825.90072,963.24473 916.41039,1029.3537 1037.562,845.52555 960.08286,809.26931 Z"
+         points="916.41039,1029.3537 1037.562,845.52555 960.08286,809.26931 825.90072,963.24473 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path469"
+         style="fill:#d7d7ff;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="14"
+         d="m 916.41039,1029.3537 v 157.3368 L 1037.562,961.38703 V 845.52555 Z"
+         points="916.41039,1186.6905 1037.562,961.38703 1037.562,845.52555 916.41039,1029.3537 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path471"
+         style="fill:#8686bf;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="3"
+         d="m 825.90072,963.24473 90.50967,66.10897 v 157.3368 l -90.50967,-81.6485 z"
+         points="916.41039,1029.3537 916.41039,1186.6905 825.90072,1105.042 825.90072,963.24473 " />
+    </g>
+    <g
+       sodipodi:type="inkscape:box3d"
+       id="g501"
+       style="fill:#ff0000;stroke:#ff00ff"
+       inkscape:perspectiveID="#perspective503"
+       inkscape:corner0="-0.22508846 : -0.3474613 : 0 : 1"
+       inkscape:corner7="-0.30162293 : -0.45734167 : 0.25 : 1"
+       inkscape:label="false">
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path489"
+         style="fill:#353564;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="6"
+         d="M 855.90072,905.24473 V 1047.042 L 978.37453,966.29311 V 859.08349 Z"
+         points="855.90072,1047.042 978.37453,966.29311 978.37453,859.08349 855.90072,905.24473 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path491"
+         style="fill:#afafde;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="13"
+         d="m 855.90072,1047.042 90.50967,81.6485 108.49841,-108.7886 -76.53427,-53.60879 z"
+         points="946.41039,1128.6905 1054.9088,1019.9019 978.37453,966.29311 855.90072,1047.042 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path493"
+         style="fill:#e9e9ff;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="11"
+         d="m 978.37453,859.08349 76.53427,44.9569 v 115.86151 l -76.53427,-53.60879 z"
+         points="1054.9088,904.04039 1054.9088,1019.9019 978.37453,966.29311 978.37453,859.08349 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path495"
+         style="fill:#4d389f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="5"
+         d="m 855.90072,905.24473 90.50967,66.109 108.49841,-67.31334 -76.53427,-44.9569 z"
+         points="946.41039,971.35373 1054.9088,904.04039 978.37453,859.08349 855.90072,905.24473 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path497"
+         style="fill:#d78bff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="14"
+         d="M 946.41039,971.35373 V 1128.6905 L 1054.9088,1019.9019 V 904.04039 Z"
+         points="946.41039,1128.6905 1054.9088,1019.9019 1054.9088,904.04039 946.41039,971.35373 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path499"
+         style="fill:#8667bf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-linejoin:round"
+         inkscape:box3dsidetype="3"
+         d="m 855.90072,905.24473 90.50967,66.109 v 157.33677 l -90.50967,-81.6485 z"
+         points="946.41039,971.35373 946.41039,1128.6905 855.90072,1047.042 855.90072,905.24473 " />
+    </g>
+  </g>
 </svg>