diff -r ea4a61b4a325 -r 2db69e2c5673 svghmi/detachable_pages.ysl2 --- a/svghmi/detachable_pages.ysl2 Thu Feb 25 11:22:10 2021 +0100 +++ b/svghmi/detachable_pages.ysl2 Fri Feb 26 10:00:14 2021 +0100 @@ -44,14 +44,40 @@ } } +// variable "overlapping_geometry" was added for optimization. +// It avoids calling func:overlapping_geometry 3 times for each page +// (apparently libxml doesn't cache exslt function results) +// in order to optimize further, func:overlapping_geometry +// should be implemented in python or even C, +// as this is still the main bottleneck here +const "_overlapping_geometry" { + const "k", "'overlapping'"; + const "m", "'computing belonging of widgets to pages'"; + value "ns:ProgressStart($k, $m)"; + foreach "$hmi_pages | $keypads" { + const "k2", "concat('overlapping:', @id)"; + const "m2", "concat('collecting membership of ', @inkscape:label)"; + value "ns:ProgressStart($k2, $m2)"; + elt { + attrib "id" > «@id» + copy "func:overlapping_geometry(.)"; + } + value "ns:ProgressEnd($k2, $m2)"; + } + value "ns:ProgressEnd($k, $m)"; +} + +const "overlapping_geometry", "exsl:node-set($_overlapping_geometry)"; + def "func:all_related_elements" { param "page"; - const "page_overlapping_geometry", "func:overlapping_geometry($page)"; + const "page_overlapping_geometry", "$overlapping_geometry/elt[@id = $page/@id]/*"; const "page_overlapping_elements", "//svg:*[@id = $page_overlapping_geometry/@Id]"; const "page_sub_elements", "func:refered_elements($page | $page_overlapping_elements)"; result "$page_sub_elements"; } + def "func:required_elements" { param "pages"; choose{ @@ -114,7 +140,10 @@ template "svg:*", mode="page_desc" { if "ancestor::*[@id = $hmi_pages/@id]" error > HMI:Page «@id» is nested in another HMI:Page + const "desc", "func:widget(@id)"; + const "msg", "concat('generating page description ', $desc/arg[1]/@value)"; + value "ns:ProgressStart($msg)"; const "page", "."; const "p", "$geometry[@Id = $page/@id]"; @@ -127,8 +156,11 @@ // Take closest ancestor in detachable_elements // since nested detachable elements are filtered out + const "sumarized_page", + """func:sumarized_elements($page_all_elements)"""; + const "required_detachables", - """func:sumarized_elements($page_all_elements)/ + """$sumarized_page/ ancestor-or-self::*[@id = $detachable_elements/@id]"""; | "«$desc/arg[1]/@value»": { @@ -164,6 +196,7 @@ with "page_desc", "$desc"; } | }`if "position()!=last()" > ,` + value "ns:ProgressEnd($msg)"; } emit "definitions:page-desc" { @@ -186,4 +219,6 @@ foreach "$in_forEach_widget_ids"{ | «.» } -} + | Overlapping + apply "$overlapping_geometry", mode="testtree"; +}