--- 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> frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */ <xsl:text> constructor(elt_id,args,indexes,members){
+ <xsl:text> this.element_id = elt_id; <xsl:text> this.element = id(elt_id);
<xsl:text> this.args = args;
<xsl:text> this.indexes = indexes;
- <xsl:text> this.offset = 0;
<xsl:text> Object.keys(members).forEach(prop => this[prop]=members[prop]);
<xsl:text> /* remove subsribers */
@@ -1078,9 +1084,10 @@
- <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> on_click(evt) { <xsl:text> if(jump_history.length > 1){
@@ -1092,44 +1099,51 @@
- <xsl:text> init: function() {
- <xsl:text> this.element.setAttribute("onclick", "hmi_widgets['</xsl:text>
- <xsl:value-of select="$hmi_element/@id"/>
- <xsl:text>'].on_click(evt)");
+ <xsl:text> this.element.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_click(evt)"); - <xsl:template mode="widget_defs" match="widget[@type='Button']">
- <xsl:param name="hmi_element"/>
- <xsl:text>frequency: 5,
- <xsl:text>init: function() {
- <xsl:text> this.element.addEventListener(
- <xsl:text> "mousedown",
- <xsl:text> change_hmi_value(this.indexes[0], "=1");
- <xsl:text> this.element.addEventListener(
- <xsl:text> change_hmi_value(this.indexes[0], "=0");
+ <xsl:template mode="widget_class" match="widget[@type='Button']"> + <xsl:text>class ButtonWidget extends Widget{ + <xsl:text> frequency = 5; + <xsl:text> // TODO : use attributes to allow interaction through svg:use + <xsl:text> // TODO : deal with dragging + <xsl:text> this.element.addEventListener( + <xsl:text> "mousedown", + <xsl:text> change_hmi_value(this.indexes[0], "=1"); + <xsl:text> this.element.addEventListener( + <xsl:text> change_hmi_value(this.indexes[0], "=0"); <xsl:template mode="widget_defs" match="widget[@type='CircularBar']">
@@ -1767,7 +1781,6 @@
<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,11 +2598,12 @@
- <xsl:template mode="widget_defs" match="widget[@type='Switch']">
- <xsl:param name="hmi_element"/>
- <xsl:text> frequency: 5,
- <xsl:text> dispatch: function(value) {
+ <xsl:template mode="widget_class" match="widget[@type='Switch']"> + <xsl:text>class SwitchWidget extends Widget{ + <xsl:text> frequency = 5; + <xsl:text> dispatch(value) { <xsl:text> for(let choice of this.choices){
@@ -2605,14 +2619,13 @@
- <xsl:text> init: function() {
- <xsl:text> // Hello Switch
+ <xsl:template mode="widget_defs" match="widget[@type='Switch']"> + <xsl:param name="hmi_element"/> <xsl:variable name="regex" select="'^("[^"].*"|\-?[0-9]+|false|true)(#.*)?$'"/>
@@ -3104,11 +3117,15 @@
<xsl:text> let maxfreq = 0;
- <xsl:text> for(let widget of widgets)
- <xsl:text> if(maxfreq < widget.frequency)
- <xsl:text> maxfreq = widget.frequency;
+ <xsl:text> for(let widget of widgets){ + <xsl:text> let wf = widget.frequency; + <xsl:text> if(wf != undefined && maxfreq < wf) + <xsl:text> maxfreq = wf; --- 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 @@
- 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) 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 @@
-template "widget[@type='Back']", mode="widget_defs" {
- | on_click: function(evt) {
- | if(jump_history.length > 1){
- | let [page_name, index] = jump_history.pop();
- | switch_page(page_name, index);
- | this.element.setAttribute("onclick", "hmi_widgets['«$hmi_element/@id»'].on_click(evt)");
+template "widget[@type='Back']", mode="widget_class" + class BackWidget extends Widget{ + if(jump_history.length > 1){ + let [page_name, index] = jump_history.pop(); + switch_page(page_name, index); + 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 @@
-template "widget[@type='Button']", mode="widget_defs" {
- | this.element.addEventListener(
- | change_hmi_value(this.indexes[0], "=1");
- | this.element.addEventListener(
- | change_hmi_value(this.indexes[0], "=0");
\ No newline at end of file
+template "widget[@type='Button']", mode="widget_class" + class ButtonWidget extends Widget{ + this.element.addEventListener( + change_hmi_value(this.indexes[0], "=1"); + this.element.addEventListener( + 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" {
- 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 @@
+template "widget[@type='Switch']", mode="widget_class" + class SwitchWidget extends Widget{ + for(let choice of this.choices){ + if(value != choice.value){ + choice.elt.setAttribute("style", "display:none"); + choice.elt.setAttribute("style", choice.style); template "widget[@type='Switch']", mode="widget_defs" {
- | dispatch: function(value) {
- | for(let choice of this.choices){
- | if(value != choice.value){
- | choice.elt.setAttribute("style", "display:none");
- | choice.elt.setAttribute("style", choice.style);
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" {
+ 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);
Object.keys(members).forEach(prop => this[prop]=members[prop]);
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 @@
sodipodi:docname="svghmi.svg"
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> @@ -31,6 +31,20 @@
+ 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" + 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" inkscape:label="HMI:AccessList@Admin"
@@ -127,13 +141,13 @@
inkscape:current-layer="hmi0"
- inkscape:zoom="0.35355339"
- inkscape:cx="-418.67433"
- inkscape:cy="-1206.7258"
+ inkscape:cx="523.16321" + inkscape:cy="-1.5475559" inkscape:window-width="1920"
- inkscape:window-height="1080"
+ inkscape:window-height="1348" - inkscape:window-y="968"
+ inkscape:window-y="700" inkscape:window-maximized="0"
inkscape:guide-bbox="true" />
@@ -912,29 +926,29 @@
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"
inkscape:label="HMI:Display@/PUMP0/STROUT"><tspan
style="fill:#ffffff;fill-opacity:1;stroke-width:0.5px">8888</tspan></text>
inkscape:label="HMI:Display@/PUMP0/BOOLOUT"
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"
sodipodi:role="line">8888</tspan></text>
- transform="matrix(0.5,0,0,0.5,90.110264,225.71623)"
+ transform="matrix(0.5,0,0,0.5,-9.889736,205.71623)" inkscape:label="HMI:Input@/PUMP0/STRIN"
@@ -1124,196 +1138,6 @@
- transform="matrix(0.5,0,0,0.5,126.87458,546.40152)"
- inkscape:label="HMI:Input@/PUMP0/STRIN"
- style="stroke-width:2">
- 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"
- sodipodi:role="line">8888</tspan></text>
- 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"
- inkscape:label="edit" />
- transform="translate(-416.52022,170.47452)"
- inkscape:label="+"dhu""
- style="stroke-width: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;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"
- inkscape:connector-curvature="0" />
- 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"
- style="stroke-width:1px">dhu</tspan></text>
- transform="translate(-416.52022,170.47452)"
- inkscape:label="="plop""
- style="stroke-width:2">
- transform="matrix(0,-2.0000001,1.9999999,0,1034.195,1298.6541)"
- 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: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: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" />
- 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"
- sodipodi:role="line">plop</tspan></text>
- transform="translate(-416.52022,170.47452)"
- inkscape:label="="mhoo""
- style="stroke-width:2">
- 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: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"
- 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"
- transform="rotate(-90,746.45698,-44.543641)"
- inkscape:transform-center-x="14.956364" />
- 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"
- style="stroke-width:1px">mhoo</tspan></text>
- transform="translate(-416.52022,170.47452)"
- inkscape:label="="yodl""
- style="stroke-width: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;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: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: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" />
- 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"
- style="stroke-width:1px">yodl</tspan></text>
- transform="translate(-416.52022,170.47452)"
- inkscape:label="="mhe""
- style="stroke-width:2">
- 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: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"
- 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"
- transform="matrix(0,-2.0000001,-1.9999999,0,1122.1514,1298.6541)"
- inkscape:transform-center-x="-14.956349" />
- 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"
- sodipodi:role="line">mhe</tspan></text>
inkscape:label="HMI:Keypad:HMI_INT:HMI_REAL"
style="fill-rule:evenodd;stroke-width:0.47631353"
@@ -2692,4 +2516,144 @@
inkscape:transform-center-x="1.0089177e-06" />
+ transform="translate(-867.71696,-14.163562)" + inkscape:label="HMI:Button@/SELECTION"> + 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" + inkscape:label="button" /> + inkscape:label="setting_jmp" + 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" + sodipodi:role="line">up</tspan></text> + inkscape:label="HMI:Switch@/PUMP0/BOOLOUT"> + sodipodi:type="inkscape:box3d" + 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" + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3d" + 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"> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " /> + sodipodi:type="inkscape:box3dside" + 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 " />