# HG changeset patch # User Edouard Tisserant <edouard.tisserant@gmail.com> # Date 1603902072 -7200 # Node ID a9b03c2634c56c0d9fa73ac72a1457ecb2101108 # Parent 81758c94f3dfda6a2255d76df92a395b0c36083d Arbitrary variables added to JsonTable subscription are now passed as 'extra' field in json query. As an example added JsonTable filtering in tests/svghmi diff -r 81758c94f3df -r a9b03c2634c5 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Thu Oct 22 22:44:29 2020 +0200 +++ b/svghmi/gen_index_xhtml.xslt Wed Oct 28 18:21:12 2020 +0200 @@ -3826,7 +3826,9 @@ <xsl:template mode="widget_class" match="widget[@type='JsonTable']"> <xsl:text>class JsonTableWidget extends Widget{ </xsl:text> - <xsl:text> cache = [100,50]; + <xsl:text> // arbitrary defaults to avoid missing entries in query +</xsl:text> + <xsl:text> cache = [0,100,50]; </xsl:text> <xsl:text> do_http_request(...opt) { </xsl:text> @@ -3840,6 +3842,8 @@ </xsl:text> <xsl:text> visible: this.visible, </xsl:text> + <xsl:text> extra: this.cache.slice(4), +</xsl:text> <xsl:text> options: opt </xsl:text> <xsl:text> }; @@ -4177,8 +4181,6 @@ </xsl:text> <xsl:text> this.apply_hmi_value(3, this.visible); </xsl:text> - <xsl:text> console.log(range,position,jdata); -</xsl:text> <xsl:apply-templates mode="json_table_render_except_comments" select="$data_elt"> <xsl:with-param name="expressions" select="$initexpr_ns"/> <xsl:with-param name="widget_elts" select="$hmi_element/*[@inkscape:label = 'data']/descendant::svg:*"/> diff -r 81758c94f3df -r a9b03c2634c5 svghmi/widget_jsontable.ysl2 --- a/svghmi/widget_jsontable.ysl2 Thu Oct 22 22:44:29 2020 +0200 +++ b/svghmi/widget_jsontable.ysl2 Wed Oct 28 18:21:12 2020 +0200 @@ -3,13 +3,15 @@ template "widget[@type='JsonTable']", mode="widget_class" || class JsonTableWidget extends Widget{ - cache = [100,50]; + // arbitrary defaults to avoid missing entries in query + cache = [0,100,50]; do_http_request(...opt) { const query = { args: this.args, range: this.cache[1], position: this.cache[2], visible: this.visible, + extra: this.cache.slice(4), options: opt }; @@ -220,7 +222,6 @@ | this.apply_hmi_value(1, range); | this.apply_hmi_value(2, position); | this.apply_hmi_value(3, this.visible); - | console.log(range,position,jdata); apply "$data_elt", mode="json_table_render_except_comments" { with "expressions","$initexpr_ns"; with "widget_elts","$hmi_element/*[@inkscape:label = 'data']/descendant::svg:*"; diff -r 81758c94f3df -r a9b03c2634c5 tests/svghmi/plc.xml --- a/tests/svghmi/plc.xml Thu Oct 22 22:44:29 2020 +0200 +++ b/tests/svghmi/plc.xml Wed Oct 28 18:21:12 2020 +0200 @@ -1,7 +1,7 @@ <?xml version='1.0' encoding='utf-8'?> <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" 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="2019-08-06T14:23:42"/> - <contentHeader name="Unnamed" modificationDateTime="2020-10-22T08:43:10"> + <contentHeader name="Unnamed" modificationDateTime="2020-10-30T20:07:00"> <coordinateInfo> <fbd> <scaling x="5" y="5"/> diff -r 81758c94f3df -r a9b03c2634c5 tests/svghmi/py_ext_0@py_ext/pyfile.xml --- a/tests/svghmi/py_ext_0@py_ext/pyfile.xml Thu Oct 22 22:44:29 2020 +0200 +++ b/tests/svghmi/py_ext_0@py_ext/pyfile.xml Wed Oct 28 18:21:12 2020 +0200 @@ -34,6 +34,7 @@ range_feedback = newdata[u'range'] slider_position = newdata[u'position'] visible = newdata[u'visible'] + extra = newdata[u'extra'] options = newdata[u'options'] if len(options) == 2 : @@ -41,18 +42,22 @@ if action == "onClick[acknowledge]": AlarmIndex[int(alarmid)][2] = "ack" - answer = self.renderTable(range_feedback, slider_position, visible) + answer = self.renderTable(range_feedback, slider_position, visible, extra) janswer = json.dumps(answer) return janswer - def renderTable(self, old_range, old_position, visible): - new_range = len(Alarms) + def renderTable(self, old_range, old_position, visible, extra): + if len(extra) > 0 and extra[0] != "": + fAlarms = [alrm for alrm in Alarms if alrm[1].find(extra[0])!=-1] + else: + fAlarms = Alarms + new_range = len(fAlarms) delta = new_range - visible new_position = 0 if delta <= 0 else delta if old_position > delta else old_position new_visible = new_range if delta <= 0 else visible visible_alarms = [] - for ts, text, status, alarmid in Alarms[new_position:new_position + new_visible]: + for ts, text, status, alarmid in fAlarms[new_position:new_position + new_visible]: visible_alarms.append({ "time": time.ctime(ts), "text": text, # TODO translate text diff -r 81758c94f3df -r a9b03c2634c5 tests/svghmi/svghmi_0@svghmi/svghmi.svg --- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg Thu Oct 22 22:44:29 2020 +0200 +++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg Wed Oct 28 18:21:12 2020 +0200 @@ -200,12 +200,12 @@ inkscape:current-layer="hmi0" showgrid="false" units="px" - inkscape:zoom="0.38583842" - inkscape:cx="-56.535477" - inkscape:cy="77.476632" - inkscape:window-width="1920" - inkscape:window-height="1043" - inkscape:window-x="0" + inkscape:zoom="1.5433537" + inkscape:cx="-705.74041" + inkscape:cy="175.04058" + inkscape:window-width="3840" + inkscape:window-height="2123" + inkscape:window-x="1600" inkscape:window-y="0" inkscape:window-maximized="1" showguides="true" @@ -5248,7 +5248,7 @@ style="fill:#ffffff;stroke-width:1px">Alarm Page</tspan></text> <g id="g1289" - inkscape:label="HMI:JsonTable:/alarms@/ALARMNOTIFY@.range@.position" + inkscape:label="HMI:JsonTable:/alarms@/ALARMNOTIFY@.range@.position@.visibleAlarms@.filter" transform="matrix(0.5,0,0,0.5,-1757.3465,454.4367)"> <g id="g5231" @@ -5490,7 +5490,7 @@ inkscape:label="disabled" /> </g> <g - transform="matrix(0.33436432,0,0,0.33436432,-664.21063,278.8185)" + transform="matrix(0.33436432,0,0,0.33436432,-584.21063,278.8185)" inkscape:label="HMI:Input@/ALARMNOTIFY" id="g5222" style="stroke-width:0.75594342"> @@ -5695,7 +5695,7 @@ inkscape:label="disabled" /> </g> <g - transform="matrix(0.33436432,0,0,0.33436432,-1128.7703,278.8185)" + transform="matrix(0.33436432,0,0,0.33436432,-1048.7703,278.8185)" inkscape:label="HMI:Input@.range" id="g5222-3" style="stroke-width:0.75594342"> @@ -5757,7 +5757,7 @@ sodipodi:type="star" /> </g> <g - transform="matrix(0.33436432,0,0,0.33436432,-896.49047,278.8185)" + transform="matrix(0.33436432,0,0,0.33436432,-816.49047,278.8185)" inkscape:label="HMI:Input@.position" id="g5222-6" style="stroke-width:0.75594342"> @@ -5821,34 +5821,34 @@ <text xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.45700645px;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:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="-1015.5838" + x="-935.5838" y="291.8042" id="text887"><tspan sodipodi:role="line" id="tspan885" - x="-1015.5838" + x="-935.5838" y="291.8042" style="fill:#ffffff;stroke-width:1px">range</tspan></text> <text id="text891" y="291.8042" - x="-782.87115" + x="-702.87115" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.45700645px;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:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" xml:space="preserve"><tspan style="fill:#ffffff;stroke-width:1px" y="291.8042" - x="-782.87115" + x="-702.87115" id="tspan889" sodipodi:role="line">position</tspan></text> <text xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.45700645px;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:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="-551.33417" + x="-471.33417" y="291.8042" id="text895"><tspan sodipodi:role="line" id="tspan893" - x="-551.33417" + x="-471.33417" y="291.8042" style="fill:#ffffff;stroke-width:1px">notify</tspan></text> <g @@ -6100,4 +6100,45 @@ x="668.18188" y="242.50345" style="fill:#ffffff;fill-opacity:1;stroke-width:0.28590268px">8888</tspan></text> + <g + style="stroke-width:0.75594342" + id="g900" + inkscape:label="HMI:Input@.filter" + transform="matrix(0.33436432,0,0,0.33436432,-1288.7703,278.8185)"> + <text + inkscape:label="value" + id="text892" + 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:0.75594342px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:0.75594342px" + y="218.24219" + x="136.32812" + id="tspan890" + 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:3.77971721;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="rect896" + width="615.05096" + height="128" + x="139.85185" + y="95.40741" + onclick="" + inkscape:label="edit" /> + </g> + <text + id="text904" + y="291.8042" + x="-1175.5837" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.45700645px;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:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="fill:#ffffff;stroke-width:1px" + y="291.8042" + x="-1175.5837" + id="tspan902" + sodipodi:role="line">filter</tspan></text> + <g + id="g909" + inkscape:label="HMI:VarInit:""@.filter" /> </svg>