Dropped SVGUI, deprecated and replaced by SVGHMI. Transformed traffic_lights exemple so that it uses SVGHMI instead.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/beremiz.xml Fri Oct 01 23:19:04 2021 +0200
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?> +<BeremizRoot URI_location="LOCAL://"> + <Libraries Enable_SVGHMI_Library="true"/> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/plc.xml Fri Oct 01 23:19:04 2021 +0200
@@ -0,0 +1,1428 @@
+<?xml version='1.0' encoding='utf-8'?> +<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201"> + <fileHeader companyName="Beremiz" productName="Unnamed" productVersion="1" creationDateTime="2012-09-04T16:16:33"/> + <contentHeader name="traffic_lights" modificationDateTime="2021-10-01T22:28:55"> + <pou name="traffic_light_sequence" pouType="functionBlock"> + <variable name="SWITCH_BUTTON"> + <variable name="PEDESTRIAN_BUTTON"> + <variable name="RED_LIGHT"> + <variable name="ORANGE_LIGHT"> + <variable name="GREEN_LIGHT"> + <variable name="PEDESTRIAN_RED_LIGHT"> + <variable name="PEDESTRIAN_GREEN_LIGHT"> + <variable name="ALLOW_CARS"> + <variable name="WARN_CARS"> + <variable name="STOP_CARS"> + <variable name="ALLOW_PEDESTRIANS"> + <variable name="STOP_PEDESTRIANS"> + <variable name="R_TRIG0"> + <derived name="R_TRIG"/> + <variable name="R_TRIG1"> + <derived name="R_TRIG"/> + <action name="BLINK_ORANGE_LIGHT"> + <leftPowerRail localId="1" height="40" width="3"> + <position x="54" y="123"/> + <connectionPointOut formalParameter=""> + <relPosition x="3" y="20"/> + <contact localId="2" height="15" width="21" negated="true"> + <position x="121" y="135"/> + <relPosition x="0" y="8"/> + <connection refLocalId="1"> + <position x="121" y="143"/> + <position x="56" y="143"/> + <relPosition x="21" y="8"/> + <variable>ORANGE_LIGHT</variable> + <block localId="3" width="97" height="102" typeName="TON" instanceName="TON1"> + <position x="216" y="103"/> + <variable formalParameter="IN"> + <relPosition x="0" y="40"/> + <connection refLocalId="2"> + <position x="216" y="143"/> + <position x="142" y="143"/> + <variable formalParameter="PT"> + <relPosition x="0" y="81"/> + <connection refLocalId="4"> + <position x="216" y="184"/> + <position x="151" y="184"/> + <variable formalParameter="Q"> + <relPosition x="97" y="40"/> + <variable formalParameter="ET"> + <relPosition x="97" y="81"/> + <inVariable localId="4" height="37" width="76" negated="false"> + <position x="75" y="166"/> + <relPosition x="76" y="18"/> + <expression>T#500ms</expression> + <block localId="5" width="97" height="106" typeName="TON" instanceName="TON2"> + <position x="216" y="251"/> + <variable formalParameter="IN"> + <relPosition x="0" y="41"/> + <connection refLocalId="14"> + <position x="216" y="292"/> + <position x="155" y="292"/> + <variable formalParameter="PT"> + <relPosition x="0" y="84"/> + <connection refLocalId="15"> + <position x="216" y="335"/> + <position x="162" y="335"/> + <variable formalParameter="Q"> + <relPosition x="97" y="41"/> + <variable formalParameter="ET"> + <relPosition x="97" y="84"/> + <coil localId="6" height="15" width="21" storage="reset"> + <position x="517" y="284"/> + <relPosition x="0" y="8"/> + <connection refLocalId="10" formalParameter="Q"> + <position x="517" y="292"/> + <position x="427" y="292"/> + <relPosition x="21" y="8"/> + <variable>ORANGE_LIGHT</variable> + <rightPowerRail localId="7" height="40" width="3"> + <position x="598" y="123"/> + <relPosition x="0" y="20"/> + <connection refLocalId="8"> + <position x="598" y="143"/> + <position x="530" y="143"/> + <coil localId="8" height="15" width="21" storage="set"> + <position x="509" y="135"/> + <relPosition x="0" y="8"/> + <connection refLocalId="11" formalParameter="Q"> + <position x="509" y="143"/> + <position x="428" y="143"/> + <relPosition x="21" y="8"/> + <variable>ORANGE_LIGHT</variable> + <comment localId="9" height="52" width="318"> + <position x="51" y="11"/> + <xhtml:p><![CDATA[This action makes the orange light blink]]></xhtml:p> + <block localId="10" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG0"> + <position x="370" y="262"/> + <variable formalParameter="CLK"> + <relPosition x="0" y="30"/> + <connection refLocalId="5" formalParameter="Q"> + <position x="370" y="292"/> + <position x="313" y="292"/> + <variable formalParameter="Q"> + <relPosition x="58" y="30"/> + <block localId="11" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG1"> + <position x="371" y="113"/> + <variable formalParameter="CLK"> + <relPosition x="0" y="30"/> + <connection refLocalId="3" formalParameter="Q"> + <position x="371" y="143"/> + <position x="313" y="143"/> + <variable formalParameter="Q"> + <relPosition x="58" y="30"/> + <rightPowerRail localId="12" height="40" width="3"> + <position x="597" y="272"/> + <relPosition x="0" y="20"/> + <connection refLocalId="6"> + <position x="597" y="292"/> + <position x="538" y="292"/> + <leftPowerRail localId="13" height="40" width="3"> + <position x="67" y="272"/> + <connectionPointOut formalParameter=""> + <relPosition x="3" y="20"/> + <contact localId="14" height="15" width="21"> + <position x="134" y="284"/> + <relPosition x="0" y="8"/> + <connection refLocalId="13"> + <position x="134" y="292"/> + <position x="69" y="292"/> + <relPosition x="21" y="8"/> + <variable>ORANGE_LIGHT</variable> + <inVariable localId="15" height="36" width="77" negated="false"> + <position x="85" y="317"/> + <relPosition x="77" y="18"/> + <expression>T#500ms</expression> + <transition name="STOP"> + <block localId="42" width="59" height="53" typeName="NOT" executionOrderId="0"> + <position x="237" y="31"/> + <variable formalParameter="IN"> + <relPosition x="0" y="36"/> + <connection refLocalId="43"> + <position x="237" y="67"/> + <position x="202" y="67"/> + <variable formalParameter="OUT"> + <relPosition x="59" y="36"/> + <inVariable localId="43" height="39" width="164" executionOrderId="0" negated="false"> + <position x="38" y="48"/> + <relPosition x="164" y="19"/> + <expression>SWITCH_BUTTON</expression> + <outVariable localId="44" height="40" width="46" executionOrderId="0" negated="false"> + <position x="351" y="47"/> + <relPosition x="0" y="20"/> + <connection refLocalId="42" formalParameter="OUT"> + <position x="351" y="67"/> + <position x="296" y="67"/> + <expression>STOP</expression> + <step localId="1" height="37" width="121" name="Standstill" initialStep="true"> + <position x="509" y="31"/> + <relPosition x="60" y="0"/> + <connection refLocalId="39"> + <position x="569" y="31"/> + <position x="569" y="11"/> + <position x="963" y="11"/> + <position x="963" y="1151"/> + <position x="776" y="1151"/> + <position x="776" y="1097"/> + <connectionPointOut formalParameter=""> + <relPosition x="60" y="37"/> + <connectionPointOutAction formalParameter=""> + <relPosition x="121" y="18"/> + </connectionPointOutAction> + <transition localId="2" height="2" width="20"> + <position x="559" y="222"/> + <relPosition x="10" y="0"/> + <connection refLocalId="1"> + <position x="569" y="222"/> + <position x="569" y="68"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[SWITCH_BUTTON]]></xhtml:p> + <step localId="3" height="30" width="118" name="ORANGE"> + <position x="510" y="250"/> + <relPosition x="59" y="0"/> + <connection refLocalId="2"> + <position x="569" y="250"/> + <position x="569" y="224"/> + <connectionPointOut formalParameter=""> + <relPosition x="59" y="30"/> + <connectionPointOutAction formalParameter=""> + <relPosition x="118" y="15"/> + </connectionPointOutAction> + <transition localId="6" height="2" width="20"> + <position x="559" y="376"/> + <relPosition x="10" y="0"/> + <connection refLocalId="15"> + <position x="569" y="376"/> + <position x="569" y="336"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[STOP_CARS]]></xhtml:p> + <actionBlock localId="8" width="231" height="162"> + <position x="711" y="34"/> + <relPosition x="0" y="15"/> + <connection refLocalId="1"> + <position x="711" y="49"/> + <position x="630" y="49"/> + <action localId="0" qualifier="P"> + <relPosition x="0" y="0"/> + <xhtml:p><![CDATA[ORANGE_LIGHT := 1;]]></xhtml:p> + <relPosition x="0" y="0"/> + <reference name="BLINK_ORANGE_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_RED_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_GREEN_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="RED_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="GREEN_LIGHT"/> + <actionBlock localId="9" width="232" height="125"> + <position x="711" y="250"/> + <relPosition x="0" y="15"/> + <connection refLocalId="3"> + <position x="711" y="265"/> + <position x="628" y="265"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="GREEN_LIGHT"/> + <action localId="0" qualifier="S"> + <relPosition x="0" y="0"/> + <reference name="ORANGE_LIGHT"/> + <action localId="0" qualifier="S"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_RED_LIGHT"/> + <action localId="0" qualifier="D" duration="T#2s"> + <relPosition x="0" y="0"/> + <reference name="STOP_CARS"/> + <step localId="10" height="34" width="92" name="RED"> + <position x="523" y="411"/> + <relPosition x="46" y="0"/> + <connection refLocalId="6"> + <position x="569" y="411"/> + <position x="569" y="378"/> + <connectionPointOut formalParameter=""> + <relPosition x="46" y="34"/> + <connectionPointOutAction formalParameter=""> + <relPosition x="92" y="17"/> + </connectionPointOutAction> + <actionBlock localId="11" width="235" height="103"> + <position x="710" y="413"/> + <relPosition x="0" y="15"/> + <connection refLocalId="10"> + <position x="710" y="428"/> + <position x="615" y="428"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="ORANGE_LIGHT"/> + <action localId="0" qualifier="S"> + <relPosition x="0" y="0"/> + <reference name="RED_LIGHT"/> + <action localId="0" qualifier="D" duration="T#2s"> + <relPosition x="0" y="0"/> + <reference name="ALLOW_PEDESTRIANS"/> + <transition localId="12" height="2" width="20"> + <position x="559" y="533"/> + <relPosition x="10" y="0"/> + <connection refLocalId="7"> + <position x="569" y="533"/> + <position x="569" y="487"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[ALLOW_PEDESTRIANS]]></xhtml:p> + <selectionDivergence localId="15" height="1" width="154"> + <position x="415" y="335"/> + <relPosition x="154" y="0"/> + <connection refLocalId="3"> + <position x="569" y="335"/> + <position x="569" y="280"/> + <connectionPointOut formalParameter=""> + <relPosition x="0" y="1"/> + <connectionPointOut formalParameter=""> + <relPosition x="154" y="1"/> + <transition localId="16" height="2" width="20"> + <position x="405" y="377"/> + <relPosition x="10" y="0"/> + <connection refLocalId="15"> + <position x="415" y="377"/> + <position x="415" y="336"/> + <relPosition x="10" y="2"/> + <reference name="STOP"/> + <jumpStep localId="17" height="13" width="12" targetName="Standstill"> + <position x="409" y="418"/> + <relPosition x="6" y="0"/> + <connection refLocalId="16"> + <position x="415" y="418"/> + <position x="415" y="379"/> + <transition localId="4" height="2" width="20"> + <position x="400" y="528"/> + <relPosition x="10" y="0"/> + <connection refLocalId="7"> + <position x="410" y="528"/> + <position x="410" y="487"/> + <relPosition x="10" y="2"/> + <reference name="STOP"/> + <jumpStep localId="5" height="13" width="12" targetName="Standstill"> + <position x="404" y="553"/> + <relPosition x="6" y="0"/> + <connection refLocalId="4"> + <position x="410" y="553"/> + <position x="410" y="530"/> + <selectionDivergence localId="7" height="1" width="159"> + <position x="410" y="486"/> + <relPosition x="159" y="0"/> + <connection refLocalId="10"> + <position x="569" y="486"/> + <position x="569" y="445"/> + <connectionPointOut formalParameter=""> + <relPosition x="0" y="1"/> + <connectionPointOut formalParameter=""> + <relPosition x="159" y="1"/> + <step localId="18" height="32" width="177" name="PEDESTRIAN_GREEN"> + <position x="481" y="572"/> + <relPosition x="88" y="0"/> + <connection refLocalId="12"> + <position x="569" y="572"/> + <position x="569" y="535"/> + <connectionPointOut formalParameter=""> + <relPosition x="88" y="32"/> + <connectionPointOutAction formalParameter=""> + <relPosition x="177" y="16"/> + </connectionPointOutAction> + <actionBlock localId="19" width="247" height="110"> + <position x="708" y="573"/> + <relPosition x="0" y="15"/> + <connection refLocalId="18"> + <position x="708" y="588"/> + <position x="658" y="588"/> + <action localId="0" qualifier="S"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_GREEN_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_RED_LIGHT"/> + <action localId="0" qualifier="D" duration="T#10s"> + <relPosition x="0" y="0"/> + <reference name="STOP_PEDESTRIANS"/> + <transition localId="20" height="2" width="20"> + <position x="400" y="653"/> + <relPosition x="10" y="0"/> + <connection refLocalId="22"> + <position x="410" y="653"/> + <position x="410" y="626"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p> + <jumpStep localId="21" height="13" width="12" targetName="Standstill"> + <position x="404" y="694"/> + <relPosition x="6" y="0"/> + <connection refLocalId="20"> + <position x="410" y="694"/> + <position x="410" y="655"/> + <selectionDivergence localId="22" height="1" width="159"> + <position x="410" y="625"/> + <relPosition x="159" y="0"/> + <connection refLocalId="18"> + <position x="569" y="625"/> + <position x="569" y="615"/> + <position x="569" y="615"/> + <position x="569" y="604"/> + <connectionPointOut formalParameter=""> + <relPosition x="0" y="1"/> + <connectionPointOut formalParameter=""> + <relPosition x="159" y="1"/> + <transition localId="23" height="2" width="20"> + <position x="559" y="709"/> + <relPosition x="10" y="0"/> + <connection refLocalId="22"> + <position x="569" y="709"/> + <position x="569" y="626"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[STOP_PEDESTRIANS]]></xhtml:p> + <step localId="24" height="30" width="148" name="PEDESTRIAN_RED"> + <position x="495" y="748"/> + <relPosition x="74" y="0"/> + <connection refLocalId="23"> + <position x="569" y="748"/> + <position x="569" y="711"/> + <connectionPointOut formalParameter=""> + <relPosition x="74" y="30"/> + <connectionPointOutAction formalParameter=""> + <relPosition x="148" y="15"/> + </connectionPointOutAction> + <actionBlock localId="25" width="239" height="110"> + <position x="708" y="748"/> + <relPosition x="0" y="15"/> + <connection refLocalId="24"> + <position x="708" y="763"/> + <position x="643" y="763"/> + <action localId="0" qualifier="S"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_RED_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="PEDESTRIAN_GREEN_LIGHT"/> + <action localId="0" qualifier="D" duration="T#2s"> + <relPosition x="0" y="0"/> + <reference name="ALLOW_CARS"/> + <transition localId="26" height="2" width="20"> + <position x="400" y="857"/> + <relPosition x="10" y="0"/> + <connection refLocalId="28"> + <position x="410" y="857"/> + <position x="410" y="816"/> + <relPosition x="10" y="2"/> + <connection refLocalId="48"> + <position x="400" y="858"/> + <position x="290" y="858"/> + <jumpStep localId="27" height="13" width="12" targetName="Standstill"> + <position x="404" y="898"/> + <relPosition x="6" y="0"/> + <connection refLocalId="26"> + <position x="410" y="898"/> + <position x="410" y="859"/> + <selectionDivergence localId="28" height="1" width="159"> + <position x="410" y="815"/> + <relPosition x="159" y="0"/> + <connection refLocalId="24"> + <position x="569" y="815"/> + <position x="569" y="778"/> + <connectionPointOut formalParameter=""> + <relPosition x="0" y="1"/> + <connectionPointOut formalParameter=""> + <relPosition x="159" y="1"/> + <transition localId="29" height="2" width="20"> + <position x="559" y="879"/> + <relPosition x="10" y="0"/> + <connection refLocalId="28"> + <position x="569" y="879"/> + <position x="569" y="816"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[ALLOW_CARS]]></xhtml:p> + <step localId="30" height="33" width="92" name="GREEN"> + <position x="523" y="930"/> + <relPosition x="46" y="0"/> + <connection refLocalId="29"> + <position x="569" y="930"/> + <position x="569" y="881"/> + <connectionPointOut formalParameter=""> + <relPosition x="46" y="33"/> + <connectionPointOutAction formalParameter=""> + <relPosition x="92" y="16"/> + </connectionPointOutAction> + <actionBlock localId="31" width="227" height="110"> + <position x="709" y="931"/> + <relPosition x="0" y="15"/> + <connection refLocalId="30"> + <position x="709" y="946"/> + <position x="615" y="946"/> + <action localId="0" qualifier="S"> + <relPosition x="0" y="0"/> + <reference name="GREEN_LIGHT"/> + <action localId="0" qualifier="R"> + <relPosition x="0" y="0"/> + <reference name="RED_LIGHT"/> + <action localId="0" qualifier="D" duration="T#20s"> + <relPosition x="0" y="0"/> + <reference name="WARN_CARS"/> + <block localId="32" width="89" height="94" typeName="TON" instanceName="TON3"> + <position x="308" y="1053"/> + <variable formalParameter="IN"> + <relPosition x="0" y="38"/> + <connection refLocalId="44" formalParameter="Q1"> + <position x="308" y="1091"/> + <position x="291" y="1091"/> + <position x="291" y="1065"/> + <position x="275" y="1065"/> + <variable formalParameter="PT"> + <relPosition x="0" y="75"/> + <connection refLocalId="34"> + <position x="308" y="1128"/> + <position x="270" y="1128"/> + <variable formalParameter="Q"> + <relPosition x="89" y="38"/> + <variable formalParameter="ET"> + <relPosition x="89" y="75"/> + <inVariable localId="33" height="36" width="168" negated="false"> + <position x="15" y="1047"/> + <relPosition x="168" y="18"/> + <expression>PEDESTRIAN_BUTTON</expression> + <inVariable localId="34" height="33" width="53" negated="false"> + <position x="217" y="1112"/> + <relPosition x="53" y="16"/> + <expression>T#2s</expression> + <block localId="35" width="67" height="60" typeName="OR"> + <position x="459" y="1061"/> + <variable formalParameter="IN1"> + <relPosition x="0" y="30"/> + <connection refLocalId="32" formalParameter="Q"> + <position x="459" y="1091"/> + <position x="397" y="1091"/> + <variable formalParameter="IN2"> + <relPosition x="0" y="50"/> + <connection refLocalId="36"> + <position x="459" y="1111"/> + <position x="427" y="1111"/> + <position x="427" y="1195"/> + <position x="260" y="1195"/> + <variable formalParameter="OUT"> + <relPosition x="67" y="30"/> + <inVariable localId="36" height="30" width="97" negated="false"> + <position x="163" y="1182"/> + <relPosition x="97" y="15"/> + <expression>WARN_CARS</expression> + <transition localId="37" height="2" width="20"> + <position x="559" y="1090"/> + <relPosition x="10" y="0"/> + <connection refLocalId="38"> + <position x="569" y="1090"/> + <position x="569" y="1060"/> + <relPosition x="10" y="2"/> + <connection refLocalId="35" formalParameter="OUT"> + <position x="559" y="1091"/> + <position x="526" y="1091"/> + <selectionDivergence localId="38" height="1" width="207"> + <position x="569" y="1059"/> + <relPosition x="0" y="0"/> + <connection refLocalId="30"> + <position x="569" y="1059"/> + <position x="569" y="963"/> + <connectionPointOut formalParameter=""> + <relPosition x="0" y="1"/> + <connectionPointOut formalParameter=""> + <relPosition x="207" y="1"/> + <transition localId="39" height="2" width="20"> + <position x="766" y="1095"/> + <relPosition x="10" y="0"/> + <connection refLocalId="38"> + <position x="776" y="1095"/> + <position x="776" y="1060"/> + <relPosition x="10" y="2"/> + <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p> + <jumpStep localId="41" height="13" width="12" targetName="ORANGE"> + <position x="563" y="1137"/> + <relPosition x="6" y="0"/> + <connection refLocalId="37"> + <position x="569" y="1137"/> + <position x="569" y="1092"/> + <block localId="44" width="51" height="60" typeName="SR" instanceName="SR0"> + <position x="224" y="1035"/> + <variable formalParameter="S1"> + <relPosition x="0" y="30"/> + <connection refLocalId="33"> + <position x="224" y="1065"/> + <position x="183" y="1065"/> + <variable formalParameter="R"> + <relPosition x="0" y="50"/> + <connection refLocalId="32" formalParameter="Q"> + <position x="224" y="1085"/> + <position x="203" y="1085"/> + <position x="203" y="1167"/> + <position x="416" y="1167"/> + <position x="416" y="1091"/> + <position x="397" y="1091"/> + <variable formalParameter="Q1"> + <relPosition x="51" y="30"/> + <comment localId="45" height="767" width="753"> + <position x="973" y="21"/> + <xhtml:p><![CDATA[*** Description of SFC action qualifiers *** +N : non-stored - The action code body is executed or the Boolean variable is set as +long as the step is active. +R : overriding reset – When the step has previously been executed with the S +(including DS, DS, and SL) qualifier, the R qualifier will stop the execution of the +code or reset the Boolean variable. +S : set (stored) - The action code body is executed or the Boolean variable is set. +This state is stored as soon as the step becomes active. It can only be reset +explicitly by associating the same action to a different step using the qualifier 'R'. +L : time limited - The action code body is executed or the Boolean variable is set as +long as the step is active but maximal for the fixed time interval. +D : time delayed - The action code body is executed or the Boolean variable is set +after the fixed delay time has elapsed. The action remains active as long as the step +is active. If the step is active shorter than the fixed delay time the action does not +P : pulse - As soon as the step is active the action code body is executed or the +Boolean variable is set for one operating cycle. (Note: The code body will then +execute for one additional operating cycle with the Step.X variable FALSE.) +SD : stored and time delayed - the action code body is executed or the Boolean +variable is stored and set when the fixed delay time has elapsed after the step +activation, even if the step becomes inactive. The action remains active until it is +reset. If the step is active shorter than the fixed delay time the action becomes active +DS : delayed and stored - The action code body is executed or the Boolean variable +is set when the fixed delay time has elapsed after the step activation. The action +remains active until it is reset. If the step is active shorter than the fixed delay time +the action does not become active. +SL : stored and time limited - The action code body is executed or the Boolean +variable is set and stored for a fixed time interval as soon as the step is active. If the +step is active shorter than the time interval the action is active for the whole time +interval anyway. If the action is reset during the time interval the action becomes +inactive as soon as the action is reset. + <comment localId="46" height="224" width="375"> + <position x="8" y="326"/> + <xhtml:p><![CDATA[Conditions can be written in any IEC 61131-3 language. +They can be implemented in defferent ways: +- reference to external implementation; +- inline implementation; +- written in FBD or LD on SFC diagram and connected to the condition. +See below examples of all these types.]]></xhtml:p> + <leftPowerRail localId="47" height="40" width="3"> + <position x="189" y="838"/> + <connectionPointOut formalParameter=""> + <relPosition x="3" y="20"/> + <contact localId="48" height="15" width="21" negated="true"> + <position x="269" y="850"/> + <relPosition x="0" y="8"/> + <connection refLocalId="47"> + <position x="269" y="858"/> + <position x="192" y="858"/> + <relPosition x="21" y="8"/> + <variable>SWITCH_BUTTON</variable> + <comment localId="13" height="86" width="379"> + <position x="9" y="28"/> + <xhtml:p><![CDATA[Sequential function chart (SFC) is commonly used to describe state machines.]]></xhtml:p> + <pou name="main_program" pouType="program"> + <variable name="trafic_light_sequence0"> + <derived name="traffic_light_sequence"/> + <variable name="SwitchButton"> + <derived name="HMI_BOOL"/> + <variable name="PedestrianButton"> + <derived name="HMI_BOOL"/> + <variable name="RedLight"> + <derived name="HMI_BOOL"/> + <variable name="OrangeLight"> + <derived name="HMI_BOOL"/> + <variable name="GreenLight"> + <derived name="HMI_BOOL"/> + <variable name="PedestrianRedLight"> + <derived name="HMI_BOOL"/> + <variable name="PedestrianGreenLight"> + <derived name="HMI_BOOL"/> + <block localId="1" width="350" height="836" typeName="traffic_light_sequence" instanceName="trafic_light_sequence0" executionOrderId="0"> + <position x="494" y="462"/> + <variable formalParameter="SWITCH_BUTTON"> + <relPosition x="0" y="101"/> + <connection refLocalId="103"> + <position x="494" y="563"/> + <position x="446" y="563"/> + <variable formalParameter="PEDESTRIAN_BUTTON"> + <relPosition x="0" y="264"/> + <connection refLocalId="104"> + <position x="494" y="726"/> + <position x="438" y="726"/> + <variable formalParameter="RED_LIGHT"> + <relPosition x="350" y="101"/> + <variable formalParameter="ORANGE_LIGHT"> + <relPosition x="350" y="264"/> + <variable formalParameter="GREEN_LIGHT"> + <relPosition x="350" y="427"/> + <variable formalParameter="PEDESTRIAN_RED_LIGHT"> + <relPosition x="350" y="590"/> + <variable formalParameter="PEDESTRIAN_GREEN_LIGHT"> + <relPosition x="350" y="753"/> + <comment localId="24" height="287" width="1008"> + <position x="22" y="13"/> + <xhtml:p><![CDATA[This example implements control of traffic lights. +Basically it shows following features of Beremiz: +- web interface (SCADA) using integrated web server in SVGHMI extension; +- interaction with web UI; +- functional blocks in SFC language. +SVGHMI is extensions to build web interface to PLC. It has *integrated* web-server. So it's NOT necessary to install Apache, lighttpd or nginx for that!!! +As the program is running in PLC, web UI will be available at http://localhost:8009/. +Web interface is build as SVG file in Inkscape. To edit SVG file click 'Inkscape' button in 0x: SVGHMI extension. +Inkscape is a free and open-source vector graphics editor. It's not part of Beremiz and needs to be installed separately. + <comment localId="102" height="134" width="734"> + <position x="21" y="303"/> + <xhtml:p><![CDATA[In this example FB like 'Button', 'Led' and 'Text' are used. +Back_id and sele_id inputs of these blocks are IDs of graphic primitives in SVG file. +This is the way how elements in SVG are bound to elements in PLC program. +You can find out or edit these IDs in Inkscape.]]></xhtml:p> + <inVariable localId="103" executionOrderId="0" height="24" width="106" negated="false"> + <position x="340" y="551"/> + <relPosition x="106" y="12"/> + <expression>SwitchButton</expression> + <inVariable localId="104" executionOrderId="0" height="24" width="138" negated="false"> + <position x="300" y="714"/> + <relPosition x="138" y="12"/> + <expression>PedestrianButton</expression> + <outVariable localId="105" executionOrderId="0" height="24" width="74" negated="false"> + <position x="891" y="551"/> + <relPosition x="0" y="12"/> + <connection refLocalId="1" formalParameter="RED_LIGHT"> + <position x="891" y="563"/> + <position x="844" y="563"/> + <expression>RedLight</expression> + <outVariable localId="106" executionOrderId="0" height="24" width="98" negated="false"> + <position x="880" y="714"/> + <relPosition x="0" y="12"/> + <connection refLocalId="1" formalParameter="ORANGE_LIGHT"> + <position x="880" y="726"/> + <position x="844" y="726"/> + <expression>OrangeLight</expression> + <outVariable localId="107" executionOrderId="0" height="24" width="90" negated="false"> + <position x="881" y="877"/> + <relPosition x="0" y="12"/> + <connection refLocalId="1" formalParameter="GREEN_LIGHT"> + <position x="881" y="889"/> + <position x="844" y="889"/> + <expression>GreenLight</expression> + <outVariable localId="108" executionOrderId="0" height="24" width="154" negated="false"> + <position x="882" y="1040"/> + <relPosition x="0" y="12"/> + <connection refLocalId="1" formalParameter="PEDESTRIAN_RED_LIGHT"> + <position x="882" y="1052"/> + <position x="844" y="1052"/> + <expression>PedestrianRedLight</expression> + <outVariable localId="109" executionOrderId="0" height="24" width="170" negated="false"> + <position x="873" y="1203"/> + <relPosition x="0" y="12"/> + <connection refLocalId="1" formalParameter="PEDESTRIAN_GREEN_LIGHT"> + <position x="873" y="1215"/> + <position x="844" y="1215"/> + <expression>PedestrianGreenLight</expression> + <configuration name="config"> + <resource name="resource1"> + <task name="test_task" interval="T#100ms" priority="0"> + <pouInstance name="main_instance" typeName="main_program"/> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/svghmi_0@svghmi/baseconfnode.xml Fri Oct 01 23:19:04 2021 +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/exemples/svghmi_traffic_light/svghmi_0@svghmi/confnode.xml Fri Oct 01 23:19:04 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?> +<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema" OnWatchdog="echo Watchdog for {name} !" WatchdogInitial="10" WatchdogInterval="5" EnableWatchdog="true" Path="{name}"/> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/svghmi_0@svghmi/svghmi.svg Fri Oct 01 23:19:04 2021 +0200
@@ -0,0 +1,1541 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + 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"> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23716" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23669" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23629" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23580" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23540" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23506" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23466" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23432" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23330" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23257" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23226" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23189" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23118" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23081" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective23044" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22995" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22946" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22891" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22866" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22829" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22795" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22692" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22661" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22630" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22569" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22532" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22501" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22470" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22403" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22318" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22290" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22265" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22090" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective22002" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21911" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21856" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21831" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21776" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21745" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21654" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21626" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21580" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21549" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21518" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21418" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21338" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective21250" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19662" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19613" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19555" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19494" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19325" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19285" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19247" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19201" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19155" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19106" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective19050" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18979" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18945" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18911" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18841" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18807" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18767" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18727" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18693" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18662" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18613" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18555" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18518" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18475" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18429" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18377" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18322" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18273" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18239" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18193" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18150" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18104" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18061" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective18021" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17978" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17950" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17868" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17840" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17812" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17784" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17756" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17728" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17700" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17636" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17605" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17574" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17543" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17512" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17475" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17420" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17386" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17322" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17261" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17212" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17163" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17120" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17074" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective17046" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16994" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16951" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16896" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16856" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16822" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16794" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16766" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16738" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16689" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16640" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16594" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16548" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16493" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16438" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16401" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16370" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16321" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16242" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16187" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16156" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16101" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16061" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective16027" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15972" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15860" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15826" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15789" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15737" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15676" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15627" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15569" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15532" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15477" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15440" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15403" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15360" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15320" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15283" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15207" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15158" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15121" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15084" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective15041" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14998" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14949" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14906" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14863" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14823" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14783" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14743" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14703" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14642" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14572" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14461" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14421" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14365" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14328" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14291" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14254" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14217" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14174" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14137" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14100" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14057" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective14020" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective13983" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective13946" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective13909" /> + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + id="perspective13862" /> + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 526.18109 : 1" + sodipodi:type="inkscape:persp3d" /> + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.979899" + inkscape:cx="205.65994" + inkscape:cy="103.00174" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1600" + inkscape:window-height="836" + inkscape:window-maximized="1" + fit-margin-bottom="0" /> + <dc:format>image/svg+xml</dc:format> + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + inkscape:label="Layer 1" + inkscape:groupmode="layer" + transform="translate(37.474617,-760.93329)"> + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#282828;fill-opacity:1;stroke:none;stroke-width:2.04116011;marker:none;enable-background:accumulate" + d="m 114.28125,14.28125 v 130 h 18.9375 v 93.5625 h 5.71875 V 176.4375 h 8.90625 v 15.71875 h 36.4375 v -32.5 h -36.4375 v 12.125 h -8.90625 v -27.5 h 21.78125 v -130 z" + transform="translate(0,752.36228)" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccc" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffac2c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04116011;marker:none;enable-background:accumulate" + inkscape:label="HMI:Switch@/REDLIGHT"> + transform="translate(61.071429,724.14799)" + style="color:#000000;overflow:visible;visibility:visible;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="false" /> + transform="translate(61.07143,724.14799)" + style="color:#000000;overflow:visible;visibility:visible;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="true" /> + inkscape:label="HMI:Switch@/ORANGELIGHT"> + transform="translate(61.071429,764.14799)" + style="color:#000000;overflow:visible;visibility:visible;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="false" /> + transform="translate(61.07143,764.14799)" + style="color:#000000;overflow:visible;visibility:visible;fill:#f06414;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="true" /> + inkscape:label="HMI:Switch@/GREENLIGHT"> + transform="translate(61.071429,804.14799)" + style="color:#000000;overflow:visible;visibility:visible;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="false" /> + transform="translate(61.07143,804.14799)" + style="color:#000000;overflow:visible;visibility:visible;fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="true" /> + inkscape:label="HMI:Button@/PEDESTRIANBUTTON" + transform="translate(0,-40)"> + transform="matrix(1.3666667,0,0,1.3666667,-51.047621,659.24323)" + style="color:#000000;overflow:visible;visibility:visible;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="inactive" /> + transform="matrix(1.2333334,0,0,1.2333334,-32.809525,692.9099)" + style="color:#000000;overflow:visible;visibility:visible;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate" + inkscape:label="active" /> + inkscape:label="HMI:Switch@/PEDESTRIANREDLIGHT" + transform="translate(0,-20)"> + inkscape:connector-curvature="0" + id="PEDESTRIAN_RED_OFF" + style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206" + inkscape:label="false" /> + inkscape:connector-curvature="0" + style="fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206" + inkscape:label="true" /> + inkscape:label="HMI:Switch@/PEDESTRIANGREENLIGHT" + transform="translate(0,-20)"> + inkscape:connector-curvature="0" + id="PEDESTRIAN_GREEN_OFF" + style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342" + inkscape:label="false" /> + inkscape:connector-curvature="0" + id="PEDESTRIAN_GREEN_ON" + style="fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342" + inkscape:label="true" /> + inkscape:label="HMI:ToggleButton@/SWITCHBUTTON"> + transform="rotate(-90,37.09909,809.86228)" + inkscape:label="inactive"> + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" + transform="translate(0,752.36228)" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" + transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)" /> + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" + sodipodi:cx="52.142857" + sodipodi:cy="89.285713" + sodipodi:r1="2.7027807" + sodipodi:r2="1.4117311" + sodipodi:arg1="-0.0025098425" + sodipodi:arg2="1.0446877" + inkscape:flatsided="false" + inkscape:randomized="0" + d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z" + transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)" + inkscape:transform-center-x="-0.012953186" + inkscape:transform-center-y="-0.16341378" /> + inkscape:label="active"> + transform="translate(0,752.36228)" + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" /> + transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)" + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" /> + inkscape:transform-center-y="-0.16341378" + inkscape:transform-center-x="-0.012953186" + transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)" + d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z" + inkscape:randomized="0" + inkscape:flatsided="false" + sodipodi:arg2="1.0446877" + sodipodi:arg1="-0.0025098425" + sodipodi:r2="1.4117311" + sodipodi:r1="2.7027807" + sodipodi:cy="89.285713" + sodipodi:cx="52.142857" + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" + sodipodi:type="star" /> + style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 37.67857,786.29085 v 3.75" + inkscape:connector-curvature="0" /> + style="font-style:normal;font-weight:bold;font-size:6.32609415px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + d="m 33.828224,780.67935 c -0.362435,10e-6 -0.643526,0.13386 -0.843274,0.40156 -0.199751,0.26771 -0.299626,0.64456 -0.299624,1.13055 -2e-6,0.48393 0.09987,0.85974 0.299624,1.12745 0.199748,0.26771 0.480839,0.40156 0.843274,0.40156 0.364488,0 0.646609,-0.13385 0.846362,-0.40156 0.199746,-0.26771 0.299621,-0.64352 0.299624,-1.12745 -3e-6,-0.48599 -0.09988,-0.86284 -0.299624,-1.13055 -0.199753,-0.2677 -0.481874,-0.40155 -0.846362,-0.40156 m 0,-0.8618 c 0.741335,0 1.32205,0.21211 1.742147,0.63631 0.420087,0.42422 0.630133,1.01008 0.630138,1.7576 -5e-6,0.74545 -0.210051,1.33029 -0.630138,1.7545 -0.420097,0.42421 -1.000812,0.63631 -1.742147,0.63631 -0.739282,0 -1.319997,-0.2121 -1.742147,-0.63631 -0.420093,-0.42421 -0.630139,-1.00905 -0.630139,-1.7545 0,-0.74752 0.210046,-1.33338 0.630139,-1.7576 0.42215,-0.4242 1.002865,-0.63631 1.742147,-0.63631" + inkscape:connector-curvature="0" /> + d="m 37.096294,779.90095 h 3.209381 v 0.89887 h -2.020149 v 0.85872 h 1.899681 v 0.89887 h -1.899681 v 1.95529 h -1.189232 v -4.61175" + inkscape:connector-curvature="0" /> + d="m 41.420773,779.90095 h 3.209381 v 0.89887 h -2.020149 v 0.85872 h 1.899681 v 0.89887 h -1.899681 v 1.95529 h -1.189232 v -4.61175" + inkscape:connector-curvature="0" /> + style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 60.982143,810.04086 h -3.75" + inkscape:connector-curvature="0" /> + style="font-style:normal;font-weight:bold;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + style="font-size:6.17188501px;line-height:1.25;font-family:sans-serif">ON</tspan></text> + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" + inkscape:label="HMI:Page:Home" /> --- a/features.py Fri Oct 01 15:36:09 2021 +0200
+++ b/features.py Fri Oct 01 23:19:04 2021 +0200
@@ -12,7 +12,6 @@
('Native', 'NativeLib.NativeLibrary', True),
('Python', 'py_ext.PythonLibrary', True),
('Etherlab', 'etherlab.EthercatMaster.EtherlabLibrary', False),
- ('SVGUI', 'svgui.SVGUILibrary', False),
('SVGHMI', 'svghmi.SVGHMILibrary', False)]
@@ -23,7 +22,6 @@
('c_ext', _('C extension'), _('Add C code accessing located variables synchronously'), 'c_ext.CFile'),
('py_ext', _('Python file'), _('Add Python code executed asynchronously'), 'py_ext.PythonFile'),
('wxglade_hmi', _('WxGlade GUI'), _('Add a simple WxGlade based GUI.'), 'wxglade_hmi.WxGladeHMI'),
- ('svgui', _('SVGUI'), _('Experimental web based HMI'), 'svgui.SVGUI'),
('svghmi', _('SVGHMI'), _('SVG based HMI'), 'svghmi.SVGHMI')]
--- a/i18n/Beremiz_bn_BD.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_bn_BD.po Fri Oct 01 23:19:04 2021 +0200
@@ -972,10 +972,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1300,10 +1296,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2084,10 +2076,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2154,10 +2142,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2706,11 +2690,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2804,10 +2783,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3400,14 +3375,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4202,12 +4169,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_de_DE.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_de_DE.po Fri Oct 01 23:19:04 2021 +0200
@@ -980,10 +980,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Wählen Sie eine SVG-Datei"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1318,10 +1314,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Konnte SPS nicht anhalten !\n"
#: ../dialogs/PouDialog.py:48
@@ -2109,10 +2101,6 @@
msgstr "Importiere ESI Datei"
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
msgstr "Importiere Datei zu ESI Datenbank"
@@ -2181,10 +2169,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2741,11 +2725,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Kein SVG-File namens: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2840,10 +2819,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3448,14 +3423,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST Dateien (*.st)|*.st|Alle Dateien|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG Dateien (*.svg)|*.svg|Alle Dateien|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4277,14 +4244,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Sie haben keine Schreibberechtigung.\n"
-"soll Inkscape trotzdem geöffnet werden ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_es_ES.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_es_ES.po Fri Oct 01 23:19:04 2021 +0200
@@ -986,10 +986,6 @@
msgstr "Cadena de caracteres"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Elegir un archivo SVG"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1324,10 +1320,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "¡No se pudo detener el PLC!\n"
#: ../dialogs/PouDialog.py:48
msgstr "Crear un nuevo POU"
@@ -2116,10 +2108,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2188,10 +2176,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2754,11 +2738,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "No existe el archivo SVG: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2854,10 +2833,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3464,14 +3439,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "Archivos ST (*.st)|*.st|Todos los archivos|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "Archivos SVG (*.svg)|*.svg|Todos los archivos|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4290,14 +4257,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"No tiene permisos de escritura.\n"
-"¿Desea abrir Inkscape de todos modos?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_eu.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_eu.po Fri Oct 01 23:19:04 2021 +0200
@@ -960,10 +960,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1288,10 +1284,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2072,10 +2064,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2142,10 +2130,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2694,11 +2678,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2792,10 +2771,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3388,14 +3363,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4190,12 +4157,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_fr_FR.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_fr_FR.po Fri Oct 01 23:19:04 2021 +0200
@@ -987,10 +987,6 @@
msgstr "Chaîne de caractères"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Choisissez un fichier SVG"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1324,10 +1320,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Impossible d'arrêter l'automate !\n"
#: ../dialogs/PouDialog.py:48
msgstr "Créer un nouveau POU"
@@ -2117,10 +2109,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgstr "Importer un SVG"
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2189,10 +2177,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2752,11 +2736,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Fichier SVG inconnu : %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2851,10 +2830,6 @@
-#: ../svgui/svgui.py:151
-msgstr "Ouverture de Inkscape"
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3461,14 +3436,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "Fichiers ST (*.st)|*.st|Tous les fichiers|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "Fichiers SVG (*.svg)|*.svg|Tous les fichiers|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4286,14 +4253,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Vous n'avez pas les permissions d'écriture.\n"
-"Ouvrir Inkscape tout de même ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_hr.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_hr.po Fri Oct 01 23:19:04 2021 +0200
@@ -956,10 +956,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1284,10 +1280,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2068,10 +2060,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2138,10 +2126,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2690,11 +2674,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2788,10 +2767,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3384,14 +3359,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4186,12 +4153,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_hu_HU.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_hu_HU.po Fri Oct 01 23:19:04 2021 +0200
@@ -977,10 +977,6 @@
msgstr "Karakter sztring"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Válasszon SVG fájlt"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1305,10 +1301,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "PLC nem állt le!\n"
-msgstr "HMI létrehozása"
#: ../dialogs/PouDialog.py:48
msgstr "Új Program Szervezési Egység (POU) létrehozása"
@@ -2095,10 +2087,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2165,10 +2153,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2721,11 +2705,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Nincs ilyen SVG fájl: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2819,10 +2798,6 @@
-#: ../svgui/svgui.py:151
-msgstr "Inkscape Megnyitás"
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3425,14 +3400,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4236,12 +4203,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_it_IT.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_it_IT.po Fri Oct 01 23:19:04 2021 +0200
@@ -966,10 +966,6 @@
msgstr "Stringa di caratteri"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Scegliere un file SVG"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1300,10 +1296,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Impossibile arrestare il PLC !\n"
#: ../dialogs/PouDialog.py:48
msgstr "Creare un nuovo POU"
@@ -2088,10 +2080,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2158,10 +2146,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2710,11 +2694,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2808,10 +2787,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3404,14 +3379,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4209,14 +4176,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Non il permesso di scrittura.\n"
-"Aprire Inkscape comunque?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_ko_KR.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_ko_KR.po Fri Oct 01 23:19:04 2021 +0200
@@ -977,10 +977,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1313,10 +1309,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "PLC 를 정지 할 수 없습니다!\n"
#: ../dialogs/PouDialog.py:48
@@ -2099,10 +2091,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
msgstr "파일을 ESI 파일 데이터베이스로 불러오기"
@@ -2169,10 +2157,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
msgstr "네트워크 위치 변수의 드래그 앤 드랍 초기화"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2729,11 +2713,6 @@
msgid "No slave defined at position %d!"
msgstr "위치 %d에 정의된 슬레이브가 없습니다!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "선택하신 %s SVG 파일은 없습니다\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2827,10 +2806,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3432,14 +3407,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST 파일 (*.st)|*.st|모든 파일|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG 파일 (*.svg)|*svg|모든 파일|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4247,14 +4214,6 @@
msgid "You cannot SDO download this state"
msgstr "현재 상태에서는 SDO 다운로드를 할 수 없습니다."
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_nl_NL.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_nl_NL.po Fri Oct 01 23:19:04 2021 +0200
@@ -967,10 +967,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Kies een SVG-bestand"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1303,10 +1299,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Kan PLC niet stoppen!\n"
#: ../dialogs/PouDialog.py:48
msgstr "Maak een nieuwe POU"
@@ -2095,10 +2087,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2165,10 +2153,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2717,11 +2701,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2815,10 +2794,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3411,14 +3386,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4213,12 +4180,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_pl.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_pl.po Fri Oct 01 23:19:04 2021 +0200
@@ -974,10 +974,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1302,10 +1298,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2086,10 +2078,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2156,10 +2144,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2708,11 +2692,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2806,10 +2785,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3402,14 +3377,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4204,12 +4171,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_pt.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_pt.po Fri Oct 01 23:19:04 2021 +0200
@@ -969,10 +969,6 @@
msgstr "Cadeia de caracteres"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Escolha um ficheiro SVG"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1304,10 +1300,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Não foi possível parar o PLC!\n"
#: ../dialogs/PouDialog.py:48
msgstr "Criar uma nova POU"
@@ -2090,10 +2082,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2160,10 +2148,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2712,11 +2696,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2810,10 +2789,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3406,14 +3381,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4208,12 +4175,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_pt_BR.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_pt_BR.po Fri Oct 01 23:19:04 2021 +0200
@@ -977,10 +977,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Escolha um arquivo SVG"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1308,10 +1304,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Não foi possível parar o CLP!\n"
#: ../dialogs/PouDialog.py:48
msgstr "Criar um novo POU"
@@ -2096,10 +2088,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2166,10 +2154,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2730,11 +2714,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Nenhum arquivo SVG: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2828,10 +2807,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3434,14 +3409,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4248,14 +4215,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Você não possui permissão de escrita.\n"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_ro_RO.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_ro_RO.po Fri Oct 01 23:19:04 2021 +0200
@@ -960,10 +960,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1288,10 +1284,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2072,10 +2064,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2142,10 +2130,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2694,11 +2678,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2792,10 +2771,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3388,14 +3363,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4190,12 +4157,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_ru_RU.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_ru_RU.po Fri Oct 01 23:19:04 2021 +0200
@@ -981,10 +981,6 @@
msgstr "Строковые операции"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Выберите SVG-файл"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1318,10 +1314,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Невозможно остановить ПЛК!\n"
#: ../dialogs/PouDialog.py:48
msgstr "Создать новый POU"
@@ -2118,10 +2110,6 @@
msgstr "Импортировать файл ESI"
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
msgstr "Импортировать файл в базу данных файлов ESI"
@@ -2191,10 +2179,6 @@
"Инициировать перетаскивание отображаемой переменной сетевого положения"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2756,11 +2740,6 @@
msgid "No slave defined at position %d!"
msgstr "Для позиции %d не определено ведомое устройство!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Нет такого SVG файла: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2855,10 +2834,6 @@
-#: ../svgui/svgui.py:151
-msgstr "Открыть Inkscape"
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3464,14 +3439,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST файлы (*.st)|*.st|Все файлы|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG файлы (*.svg)|*.svg|Все файлы|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4293,14 +4260,6 @@
msgid "You cannot SDO download this state"
msgstr "Вы не можете загрузить это состояние через SDO"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"У вас недостаточно прав для записи.\n"
-"Открыть Inkscape все равно?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_sl_SI.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_sl_SI.po Fri Oct 01 23:19:04 2021 +0200
@@ -978,10 +978,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Izberi SVG datoteko"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1312,10 +1308,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Ne morem ustaviti krmilnika !\n"
#: ../dialogs/PouDialog.py:48
@@ -2101,10 +2093,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2171,10 +2159,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2735,11 +2719,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Ni take SVG datoteke: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2836,10 +2815,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3441,14 +3416,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST datoteke (*.st)|*.st|Vse datoteke|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG datoteke (*.svg)|*.svg|Vse datoteke|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4259,14 +4226,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Nimaš dovoljenja za pisanje.\n"
-"Vseeno odprem Inkscape ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_tr_TR.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_tr_TR.po Fri Oct 01 23:19:04 2021 +0200
@@ -980,10 +980,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "SVG dosyası seç"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1316,10 +1312,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "PLC durduramadı!\n"
#: ../dialogs/PouDialog.py:48
msgstr "Yeni bir POU oluştur"
@@ -2114,10 +2106,6 @@
msgstr "ESI dosyasını içe aktar"
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgstr "SVG'yi içe aktar"
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
msgstr "ESI dosya veritabanına dosya içe aktar"
@@ -2185,10 +2173,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
msgstr "Ağ konumu bulunan değişkenin Drag'n düşüşünü başlat"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2750,11 +2734,6 @@
msgid "No slave defined at position %d!"
msgstr "%d konumunda hiçbir slave tanımlanmamış!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Böyle bir SVG dosyası yok: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2850,10 +2829,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3457,14 +3432,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST dosyaları (* .st) | * .st | Tüm dosyalar | *. *"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG dosyaları (* .svg) | * .svg | Tüm dosyalar | *. *"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4280,14 +4247,6 @@
msgid "You cannot SDO download this state"
msgstr "SDO bu durumu indiremezsiniz"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Yine de Inkscape'i açtın mı?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_vi_VN.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_vi_VN.po Fri Oct 01 23:19:04 2021 +0200
@@ -974,10 +974,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Chọn một tệp SVG"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1306,10 +1302,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Không thể dừng PLC !\n"
#: ../dialogs/PouDialog.py:48
msgstr "Tạo một đơn vị tổ chức chương trình mới"
@@ -2092,10 +2084,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2163,10 +2151,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2721,11 +2705,6 @@
msgid "No slave defined at position %d!"
msgstr "Chưa khai báo trạm tớ tại địa chỉ %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "Không có tệp SVG: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2819,10 +2798,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3424,14 +3399,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST tệp (*.st)|*.st|Tất cả tệp|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "Tệp SVG (*.svg)|*.svg|Tất cả tệp|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4240,14 +4207,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"Bạn không có quyền ghi.\n"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/Beremiz_zh_CN.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/Beremiz_zh_CN.po Fri Oct 01 23:19:04 2021 +0200
@@ -980,10 +980,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:911
#: ../etherlab/EtherCATManagementEditor.py:1306
msgid "Choose a binary file"
@@ -1316,10 +1312,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2102,10 +2094,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2172,10 +2160,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2730,11 +2714,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "没有这样的SVG文件:%s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2828,10 +2807,6 @@
-#: ../svgui/svgui.py:151
"Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3431,14 +3406,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST 文件 (*.st)|*.st|所有文件|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG 文件 (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4247,14 +4214,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/app.fil Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/app.fil Fri Oct 01 23:19:04 2021 +0200
@@ -129,9 +129,6 @@
-../svgui/svgui_server.py
../plcopen/InstancesPathCollector.py
../plcopen/types_enums.py
../plcopen/InstanceTagnameCollector.py
--- a/i18n/messages.po Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/messages.po Fri Oct 01 23:19:04 2021 +0200
@@ -967,10 +967,6 @@
msgstr "Character string"
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:912
#: ../etherlab/EtherCATManagementEditor.py:1307
msgid "Choose a binary file"
@@ -1303,10 +1299,6 @@
msgid "Couldn't stop PLC !\n"
msgstr "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
msgstr "Create a new POU"
@@ -2079,10 +2071,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
msgstr "Import file to ESI files database"
@@ -2149,10 +2137,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
msgstr "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2705,11 +2689,6 @@
msgid "No slave defined at position %d!"
msgstr "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
-msgstr "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2807,10 +2786,6 @@
-#: ../svgui/svgui.py:151
msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
msgstr "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
@@ -3407,14 +3382,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
msgstr "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:246 ../BeremizIDE.py:277 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4215,14 +4182,6 @@
msgid "You cannot SDO download this state"
msgstr "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
--- a/i18n/messages.pot Fri Oct 01 15:36:09 2021 +0200
+++ b/i18n/messages.pot Fri Oct 01 23:19:04 2021 +0200
@@ -952,10 +952,6 @@
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
#: ../etherlab/EtherCATManagementEditor.py:912
#: ../etherlab/EtherCATManagementEditor.py:1307
msgid "Choose a binary file"
@@ -1280,10 +1276,6 @@
msgid "Couldn't stop PLC !\n"
#: ../dialogs/PouDialog.py:48
@@ -2054,10 +2046,6 @@
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
#: ../etherlab/ConfigEditor.py:1352
msgid "Import file to ESI files database"
@@ -2124,10 +2112,6 @@
msgid "Initiate Drag'n drop of Network position located variable"
#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
@@ -2672,11 +2656,6 @@
msgid "No slave defined at position %d!"
-#: ../svgui/svgui.py:142
-msgid "No such SVG file: %s\n"
#: ../etherlab/ConfigEditor.py:1245
msgid "No such XML file: %s\n"
@@ -2774,10 +2753,6 @@
-#: ../svgui/svgui.py:151
msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
@@ -3367,14 +3342,6 @@
msgid "ST files (*.st)|*.st|All files|*.*"
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
#: ../BeremizIDE.py:246 ../BeremizIDE.py:277 ../PLCOpenEditor.py:84
#: ../PLCOpenEditor.py:119
@@ -4161,12 +4128,6 @@
msgid "You cannot SDO download this state"
-#: ../svgui/svgui.py:150
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
#: ../wxglade_hmi/wxglade_hmi.py:175
"You don't have write permissions.\n"
Binary file locale/de_DE/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/es_ES/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/fr_FR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/hu_HU/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/it_IT/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ko_KR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/nl_NL/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pt/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pt_BR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ru_RU/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/sl_SI/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/tr_TR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/vi_VN/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/zh_CN/LC_MESSAGES/Beremiz.mo has changed
--- a/svgui/README Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
\ No newline at end of file
--- a/svgui/__init__.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-# See COPYING file for copyrights details.
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-from __future__ import absolute_import
-from svgui.svgui import *
--- a/svgui/livesvg.js Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-function updateAttr(id, param, value) {
- Nevow.Athena.Widget.fromAthenaID(1).callRemote('HMIexec', 'setattr', id, param, value);
-var svguiWidgets = new Array();
-var currentObject = null;
-function setCurrentObject(obj) {
-function isCurrentObject(obj) {
- return currentObject == obj;
-function getSVGElementById(id) {
- return document.getElementById(id);
-function blockSVGElementDrag(element) {
- element.addEventListener("draggesture", function(event){event.stopPropagation()}, true);
-LiveSVGPage.LiveSVGWidget = Nevow.Athena.Widget.subclass('LiveSVGPage.LiveSVGWidget');
-LiveSVGPage.LiveSVGWidget.methods(
- function handleEvent(self, evt) {
- if (currentObject != null) {
- currentObject.handleEvent(evt);
- function receiveData(self, data){
- dataReceived = json_parse(data);
- gadget = svguiWidgets[dataReceived.id]
- gadget.updateValues(json_parse(dataReceived.kwargs));
- //console.log("OBJET : " + dataReceived.back_id + " STATE : " + newState);
- function init(self, arg1){
- //console.log("Object received : " + arg1);
- gad = json_parse(arg1[ind]);
- args = json_parse(gad.kwargs);
- gadget = new svguilib[gad.__class__](self, gad.id, args);
- svguiWidgets[gadget.id]=gadget;
- //console.log('GADGET :' + gadget);
- var elements = document.getElementsByTagName("svg");
- for (var i = 0; i < elements.length; i++) {
- elements[i].addEventListener("mouseup", self, false);
- //console.log("SVGUIWIDGETS : " + svguiWidgets);
--- a/svgui/pous.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1428 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://www.plcopen.org/xml/tc6.xsd"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd">
- <fileHeader companyName="Beremiz"
- creationDateTime="2008-12-14T16:53:26"/>
- <contentHeader name="Beremiz non-standard POUs library"
- modificationDateTime="2009-08-12T15:35:33">
- <pou name="GetBoolString" pouType="functionBlock">
- <variable name="VALUE">
- <pou name="TextCtrl" pouType="functionBlock">
- <variable name="back_id">
- <variable name="set_text">
- <variable name="SVGUI_TEXTCTRL">
- <derived name="python_eval"/>
- <variable name="setstate_Command">
- <derived name="python_eval"/>
- <block localId="1" width="193" height="160" typeName="CONCAT">
- <position x="626" y="122"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="43"/>
- <connection refLocalId="2">
- <position x="626" y="165"/>
- <position x="535" y="165"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="89"/>
- <connection refLocalId="3">
- <position x="626" y="211"/>
- <position x="535" y="211"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="135"/>
- <connection refLocalId="6">
- <position x="626" y="257"/>
- <position x="532" y="257"/>
- <variable formalParameter="OUT">
- <relPosition x="193" y="43"/>
- <inVariable localId="2" height="30" width="460">
- <position x="75" y="150"/>
- <relPosition x="460" y="15"/>
- <expression>'createSVGUIControl("textControl", back_id="'</expression>
- <inVariable localId="3" height="35" width="85">
- <position x="450" y="196"/>
- <relPosition x="85" y="15"/>
- <expression>back_id</expression>
- <inVariable localId="6" height="30" width="50">
- <position x="482" y="242"/>
- <relPosition x="50" y="15"/>
- <expression>'")'</expression>
- <block localId="7" width="125" height="115" typeName="python_eval" instanceName="SVGUI_TEXTCTRL">
- <position x="909" y="75"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="45"/>
- <connection refLocalId="9">
- <position x="909" y="120"/>
- <position x="886" y="120"/>
- <position x="886" y="85"/>
- <position x="869" y="85"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="90"/>
- <connection refLocalId="1" formalParameter="OUT">
- <position x="909" y="165"/>
- <position x="819" y="165"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="45"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="90"/>
- <inVariable localId="9" height="30" width="70">
- <position x="799" y="70"/>
- <relPosition x="70" y="15"/>
- <expression>BOOL#1</expression>
- <outVariable localId="10" height="30" width="30">
- <position x="1094" y="150"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="7" formalParameter="RESULT">
- <position x="1094" y="165"/>
- <position x="1034" y="165"/>
- <expression>ID</expression>
- <connector name="CREATED" localId="11" height="30" width="110">
- <position x="1096" y="105"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="7" formalParameter="ACK">
- <position x="1096" y="120"/>
- <position x="1034" y="120"/>
- <block localId="4" width="125" height="140" typeName="python_eval" instanceName="setstate_Command">
- <position x="957" y="472"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="50"/>
- <connection refLocalId="31" formalParameter="OUT">
- <position x="957" y="522"/>
- <position x="909" y="522"/>
- <position x="909" y="444"/>
- <position x="857" y="444"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="110"/>
- <connection refLocalId="12" formalParameter="OUT">
- <position x="957" y="582"/>
- <position x="822" y="582"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="50"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="110"/>
- <continuation name="CREATED" localId="5" height="30" width="110">
- <position x="589" y="429"/>
- <relPosition x="110" y="15"/>
- <block localId="12" width="186" height="288" typeName="CONCAT">
- <position x="636" y="536"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="46"/>
- <connection refLocalId="14">
- <position x="636" y="582"/>
- <position x="526" y="582"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="99"/>
- <connection refLocalId="8">
- <position x="636" y="635"/>
- <position x="526" y="635"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="152"/>
- <connection refLocalId="15">
- <position x="636" y="688"/>
- <position x="527" y="688"/>
- <variable formalParameter="IN4">
- <relPosition x="0" y="205"/>
- <connection refLocalId="32">
- <position x="636" y="741"/>
- <position x="528" y="741"/>
- <variable formalParameter="IN5">
- <relPosition x="0" y="258"/>
- <connection refLocalId="16">
- <position x="636" y="794"/>
- <position x="528" y="794"/>
- <variable formalParameter="OUT">
- <relPosition x="186" y="46"/>
- <inVariable localId="8" height="30" width="53">
- <position x="473" y="620"/>
- <relPosition x="53" y="15"/>
- <expression>ID</expression>
- <inVariable localId="13" height="35" width="100">
- <position x="599" y="469"/>
- <relPosition x="100" y="17"/>
- <expression>set_text</expression>
- <inVariable localId="14" height="30" width="120">
- <position x="406" y="567"/>
- <relPosition x="120" y="15"/>
- <expression>'setAttr('</expression>
- <inVariable localId="15" height="30" width="122">
- <position x="405" y="673"/>
- <relPosition x="122" y="15"/>
- <expression>',"text","'</expression>
- <inVariable localId="16" height="30" width="50">
- <position x="478" y="779"/>
- <relPosition x="50" y="15"/>
- <expression>'")'</expression>
- <block localId="31" width="75" height="105" typeName="AND">
- <position x="782" y="403"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="41"/>
- <connection refLocalId="5">
- <position x="782" y="444"/>
- <position x="699" y="444"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="83"/>
- <connection refLocalId="13">
- <position x="782" y="486"/>
- <position x="699" y="486"/>
- <variable formalParameter="OUT">
- <relPosition x="75" y="41"/>
- <inVariable localId="32" height="30" width="90">
- <position x="438" y="726"/>
- <relPosition x="90" y="15"/>
- <expression>text</expression>
- <pou name="Button" pouType="functionBlock">
- <variable name="back_id">
- <variable name="sele_id">
- <variable name="toggle">
- <variable name="set_state">
- <variable name="state_in">
- <variable name="state_out">
- <variable name="init_Command">
- <derived name="python_eval"/>
- <variable name="GetButtonState">
- <derived name="GetBoolString"/>
- <variable name="setstate_Command">
- <derived name="python_eval"/>
- <variable name="getstate_Command">
- <derived name="python_poll"/>
- <variable name="GetButtonToggle">
- <derived name="GetBoolString"/>
- <block localId="1" width="125" height="140" typeName="python_eval" instanceName="init_Command">
- <position x="838" y="32"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="50"/>
- <connection refLocalId="10">
- <position x="838" y="82"/>
- <position x="781" y="82"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="110"/>
- <connection refLocalId="2" formalParameter="OUT">
- <position x="838" y="142"/>
- <position x="641" y="142"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="50"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="110"/>
- <block localId="2" width="150" height="442" typeName="CONCAT">
- <position x="491" y="92"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="50"/>
- <connection refLocalId="3">
- <position x="491" y="142"/>
- <position x="433" y="142"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="110"/>
- <connection refLocalId="11">
- <position x="491" y="202"/>
- <position x="431" y="202"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="170"/>
- <connection refLocalId="5">
- <position x="491" y="262"/>
- <position x="431" y="262"/>
- <variable formalParameter="IN4">
- <relPosition x="0" y="230"/>
- <connection refLocalId="12">
- <position x="491" y="322"/>
- <position x="430" y="322"/>
- <variable formalParameter="IN5">
- <relPosition x="0" y="290"/>
- <connection refLocalId="23">
- <position x="491" y="382"/>
- <position x="463" y="382"/>
- <position x="463" y="370"/>
- <position x="430" y="370"/>
- <variable formalParameter="IN6">
- <relPosition x="0" y="350"/>
- <connection refLocalId="24" formalParameter="CODE">
- <position x="491" y="442"/>
- <position x="429" y="442"/>
- <variable formalParameter="IN7">
- <relPosition x="0" y="410"/>
- <connection refLocalId="9">
- <position x="491" y="502"/>
- <position x="430" y="502"/>
- <variable formalParameter="OUT">
- <relPosition x="150" y="50"/>
- <inVariable localId="3" height="30" width="400">
- <position x="33" y="127"/>
- <relPosition x="400" y="15"/>
- <expression>'createSVGUIControl("button",back_id="'</expression>
- <inVariable localId="5" height="30" width="140">
- <position x="291" y="247"/>
- <relPosition x="140" y="15"/>
- <expression>'",sele_id="'</expression>
- <inVariable localId="9" height="30" width="180">
- <position x="250" y="487"/>
- <relPosition x="180" y="15"/>
- <expression>',active=True)'</expression>
- <inVariable localId="10" height="30" width="70">
- <position x="711" y="67"/>
- <relPosition x="70" y="15"/>
- <expression>BOOL#1</expression>
- <inVariable localId="11" height="35" width="85">
- <position x="346" y="187"/>
- <relPosition x="85" y="15"/>
- <expression>back_id</expression>
- <inVariable localId="12" height="35" width="85">
- <position x="345" y="307"/>
- <relPosition x="85" y="15"/>
- <expression>sele_id</expression>
- <inVariable localId="13" height="35" width="100">
- <position x="452" y="639"/>
- <relPosition x="100" y="15"/>
- <expression>set_state</expression>
- <block localId="28" width="140" height="40" typeName="GetBoolString" instanceName="GetButtonState">
- <position x="239" y="897"/>
- <variable formalParameter="VALUE">
- <relPosition x="0" y="30"/>
- <connection refLocalId="32">
- <position x="239" y="927"/>
- <position x="181" y="927"/>
- <variable formalParameter="CODE">
- <relPosition x="140" y="30"/>
- <outVariable localId="29" height="30" width="53">
- <position x="1015" y="127"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="1" formalParameter="RESULT">
- <position x="1015" y="142"/>
- <position x="963" y="142"/>
- <expression>ID</expression>
- <block localId="4" width="125" height="140" typeName="python_eval" instanceName="setstate_Command">
- <position x="810" y="640"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="50"/>
- <connection refLocalId="31" formalParameter="OUT">
- <position x="810" y="690"/>
- <position x="762" y="690"/>
- <position x="762" y="612"/>
- <position x="710" y="612"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="110"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="810" y="750"/>
- <position x="643" y="750"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="50"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="110"/>
- <connector name="CREATED" localId="30" height="30" width="110">
- <position x="1014" y="67"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="1" formalParameter="ACK">
- <position x="1014" y="82"/>
- <position x="963" y="82"/>
- <continuation name="CREATED" localId="6" height="30" width="110">
- <position x="442" y="597"/>
- <relPosition x="110" y="15"/>
- <block localId="31" width="75" height="105" typeName="AND">
- <position x="635" y="571"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="41"/>
- <connection refLocalId="6">
- <position x="635" y="612"/>
- <position x="552" y="612"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="83"/>
- <connection refLocalId="13">
- <position x="635" y="654"/>
- <position x="552" y="654"/>
- <variable formalParameter="OUT">
- <relPosition x="75" y="41"/>
- <inVariable localId="32" height="30" width="90">
- <position x="91" y="912"/>
- <relPosition x="90" y="15"/>
- <expression>state_in</expression>
- <outVariable localId="33" height="30" width="100">
- <position x="1334" y="1184"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="26" formalParameter="OUT">
- <position x="1334" y="1199"/>
- <position x="1286" y="1199"/>
- <expression>state_out</expression>
- <block localId="7" width="150" height="319" typeName="CONCAT">
- <position x="493" y="701"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="49"/>
- <connection refLocalId="14">
- <position x="493" y="750"/>
- <position x="379" y="750"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="108"/>
- <connection refLocalId="8">
- <position x="493" y="809"/>
- <position x="435" y="809"/>
- <position x="435" y="803"/>
- <position x="379" y="803"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="167"/>
- <connection refLocalId="15">
- <position x="493" y="868"/>
- <position x="435" y="868"/>
- <position x="435" y="855"/>
- <position x="379" y="855"/>
- <variable formalParameter="IN4">
- <relPosition x="0" y="226"/>
- <connection refLocalId="28" formalParameter="CODE">
- <position x="493" y="927"/>
- <position x="379" y="927"/>
- <variable formalParameter="IN5">
- <relPosition x="0" y="285"/>
- <connection refLocalId="16">
- <position x="493" y="986"/>
- <position x="377" y="986"/>
- <variable formalParameter="OUT">
- <relPosition x="150" y="49"/>
- <inVariable localId="8" height="30" width="53">
- <position x="326" y="788"/>
- <relPosition x="53" y="15"/>
- <expression>ID</expression>
- <inVariable localId="14" height="30" width="120">
- <position x="259" y="735"/>
- <relPosition x="120" y="15"/>
- <expression>'setAttr('</expression>
- <inVariable localId="15" height="30" width="122">
- <position x="257" y="840"/>
- <relPosition x="122" y="15"/>
- <expression>',"state",'</expression>
- <inVariable localId="16" height="30" width="41">
- <position x="336" y="971"/>
- <relPosition x="41" y="15"/>
- <expression>')'</expression>
- <block localId="17" width="125" height="140" typeName="python_poll" instanceName="getstate_Command">
- <position x="801" y="1089"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="50"/>
- <connection refLocalId="18">
- <position x="801" y="1139"/>
- <position x="763" y="1139"/>
- <position x="763" y="1099"/>
- <position x="720" y="1099"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="110"/>
- <connection refLocalId="22" formalParameter="OUT">
- <position x="801" y="1199"/>
- <position x="643" y="1199"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="50"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="110"/>
- <block localId="25" width="145" height="45" typeName="STRING_TO_INT">
- <position x="966" y="1169"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
- <connection refLocalId="17" formalParameter="RESULT">
- <position x="966" y="1199"/>
- <position x="926" y="1199"/>
- <variable formalParameter="OUT">
- <relPosition x="145" y="30"/>
- <block localId="26" width="125" height="45" typeName="INT_TO_BOOL">
- <position x="1161" y="1169"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="30"/>
- <connection refLocalId="25" formalParameter="OUT">
- <position x="1161" y="1199"/>
- <position x="1111" y="1199"/>
- <variable formalParameter="OUT">
- <relPosition x="125" y="30"/>
- <continuation name="CREATED" localId="18" height="30" width="110">
- <position x="610" y="1084"/>
- <relPosition x="110" y="15"/>
- <inVariable localId="19" height="30" width="53">
- <position x="383" y="1238"/>
- <relPosition x="53" y="15"/>
- <expression>ID</expression>
- <inVariable localId="20" height="30" width="150">
- <position x="286" y="1184"/>
- <relPosition x="150" y="15"/>
- <expression>'int(getAttr('</expression>
- <inVariable localId="21" height="30" width="190">
- <position x="246" y="1292"/>
- <relPosition x="190" y="15"/>
- <expression>',"state",False))'</expression>
- <block localId="22" width="150" height="183" typeName="CONCAT">
- <position x="493" y="1152"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="47"/>
- <connection refLocalId="20">
- <position x="493" y="1199"/>
- <position x="436" y="1199"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="101"/>
- <connection refLocalId="19">
- <position x="493" y="1253"/>
- <position x="436" y="1253"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="155"/>
- <connection refLocalId="21">
- <position x="493" y="1307"/>
- <position x="483" y="1307"/>
- <position x="483" y="1307"/>
- <position x="436" y="1307"/>
- <variable formalParameter="OUT">
- <relPosition x="150" y="47"/>
- <inVariable localId="23" height="30" width="130">
- <position x="300" y="355"/>
- <relPosition x="130" y="15"/>
- <expression>'",toggle='</expression>
- <block localId="24" width="140" height="40" typeName="GetBoolString" instanceName="GetButtonToggle">
- <position x="289" y="412"/>
- <variable formalParameter="VALUE">
- <relPosition x="0" y="30"/>
- <connection refLocalId="27">
- <position x="289" y="442"/>
- <position x="220" y="442"/>
- <variable formalParameter="CODE">
- <relPosition x="140" y="30"/>
- <inVariable localId="27" height="30" width="90">
- <position x="130" y="427"/>
- <relPosition x="90" y="15"/>
- <expression>toggle</expression>
- <pou name="Led" pouType="functionBlock">
- <variable name="back_id">
- <variable name="sele_id">
- <variable name="state_in">
- <variable name="init_Command">
- <derived name="python_eval"/>
- <variable name="setstate_Command">
- <derived name="python_poll"/>
- <variable name="GetLedState">
- <derived name="GetBoolString"/>
- <block localId="1" width="125" height="140" typeName="python_eval" instanceName="init_Command">
- <position x="810" y="30"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="50"/>
- <connection refLocalId="10">
- <position x="810" y="80"/>
- <position x="753" y="80"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="110"/>
- <connection refLocalId="2" formalParameter="OUT">
- <position x="810" y="140"/>
- <position x="640" y="140"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="50"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="110"/>
- <block localId="2" width="150" height="322" typeName="CONCAT">
- <position x="490" y="90"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="50"/>
- <connection refLocalId="3">
- <position x="490" y="140"/>
- <position x="415" y="140"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="110"/>
- <connection refLocalId="11">
- <position x="490" y="200"/>
- <position x="415" y="200"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="170"/>
- <connection refLocalId="5">
- <position x="490" y="260"/>
- <position x="415" y="260"/>
- <variable formalParameter="IN4">
- <relPosition x="0" y="230"/>
- <connection refLocalId="12">
- <position x="490" y="320"/>
- <position x="414" y="320"/>
- <variable formalParameter="IN5">
- <relPosition x="0" y="290"/>
- <connection refLocalId="9">
- <position x="490" y="380"/>
- <position x="414" y="380"/>
- <variable formalParameter="OUT">
- <relPosition x="150" y="50"/>
- <inVariable localId="3" height="30" width="400">
- <position x="15" y="125"/>
- <relPosition x="400" y="15"/>
- <expression>'createSVGUIControl("button",back_id="'</expression>
- <block localId="4" width="125" height="140" typeName="python_poll" instanceName="setstate_Command">
- <position x="782" y="536"/>
- <variable formalParameter="TRIG">
- <relPosition x="0" y="50"/>
- <connection refLocalId="6">
- <position x="782" y="586"/>
- <position x="653" y="586"/>
- <position x="653" y="552"/>
- <position x="602" y="552"/>
- <variable formalParameter="CODE">
- <relPosition x="0" y="110"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="782" y="646"/>
- <position x="615" y="646"/>
- <variable formalParameter="ACK">
- <relPosition x="125" y="50"/>
- <variable formalParameter="RESULT">
- <relPosition x="125" y="110"/>
- <inVariable localId="5" height="30" width="140">
- <position x="275" y="245"/>
- <relPosition x="140" y="15"/>
- <expression>'",sele_id="'</expression>
- <continuation name="CREATED" localId="6" height="30" width="110">
- <position x="492" y="537"/>
- <relPosition x="110" y="15"/>
- <block localId="7" width="150" height="319" typeName="CONCAT">
- <position x="465" y="597"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="49"/>
- <connection refLocalId="14">
- <position x="465" y="646"/>
- <position x="351" y="646"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="108"/>
- <connection refLocalId="8">
- <position x="465" y="705"/>
- <position x="407" y="705"/>
- <position x="407" y="699"/>
- <position x="351" y="699"/>
- <variable formalParameter="IN3">
- <relPosition x="0" y="167"/>
- <connection refLocalId="15">
- <position x="465" y="764"/>
- <position x="407" y="764"/>
- <position x="407" y="751"/>
- <position x="351" y="751"/>
- <variable formalParameter="IN4">
- <relPosition x="0" y="226"/>
- <connection refLocalId="28" formalParameter="CODE">
- <position x="465" y="823"/>
- <position x="351" y="823"/>
- <variable formalParameter="IN5">
- <relPosition x="0" y="285"/>
- <connection refLocalId="16">
- <position x="465" y="882"/>
- <position x="407" y="882"/>
- <position x="407" y="883"/>
- <position x="351" y="883"/>
- <variable formalParameter="OUT">
- <relPosition x="150" y="49"/>
- <inVariable localId="8" height="30" width="53">
- <position x="298" y="684"/>
- <relPosition x="53" y="15"/>
- <expression>ID</expression>
- <inVariable localId="9" height="30" width="300">
- <position x="124" y="365"/>
- <relPosition x="300" y="15"/>
- <expression>'",toggle=True,active=False)'</expression>
- <inVariable localId="10" height="30" width="70">
- <position x="683" y="65"/>
- <relPosition x="70" y="15"/>
- <expression>BOOL#1</expression>
- <inVariable localId="11" height="35" width="85">
- <position x="330" y="185"/>
- <relPosition x="85" y="15"/>
- <expression>back_id</expression>
- <inVariable localId="12" height="35" width="85">
- <position x="329" y="305"/>
- <relPosition x="85" y="15"/>
- <expression>sele_id</expression>
- <inVariable localId="14" height="30" width="120">
- <position x="231" y="631"/>
- <relPosition x="120" y="15"/>
- <expression>'setAttr('</expression>
- <inVariable localId="15" height="30" width="122">
- <position x="229" y="736"/>
- <relPosition x="122" y="15"/>
- <expression>',"state",'</expression>
- <inVariable localId="16" height="30" width="41">
- <position x="310" y="868"/>
- <relPosition x="41" y="15"/>
- <expression>')'</expression>
- <block localId="28" width="140" height="40" typeName="GetBoolString" instanceName="GetLedState">
- <position x="211" y="793"/>
- <variable formalParameter="VALUE">
- <relPosition x="0" y="30"/>
- <connection refLocalId="32">
- <position x="211" y="823"/>
- <position x="153" y="823"/>
- <variable formalParameter="CODE">
- <relPosition x="140" y="30"/>
- <outVariable localId="29" height="30" width="53">
- <position x="987" y="125"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="1" formalParameter="RESULT">
- <position x="987" y="140"/>
- <position x="935" y="140"/>
- <expression>ID</expression>
- <connector name="CREATED" localId="30" height="30" width="110">
- <position x="986" y="65"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="1" formalParameter="ACK">
- <position x="986" y="80"/>
- <position x="935" y="80"/>
- <inVariable localId="32" height="30" width="90">
- <position x="63" y="808"/>
- <relPosition x="90" y="15"/>
- <expression>state_in</expression>
--- a/svgui/pyjs/__init__.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from svgui.pyjs.pyjs import *
--- a/svgui/pyjs/build.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,774 +0,0 @@
-from __future__ import absolute_import
-from __future__ import print_function
-from os.path import join, basename, abspath, split, isfile, isdir
-from optparse import OptionParser
-from six.moves import cStringIO
-from svgui.pyjs import pyjs
- usage: %prog [options] <application module name or path>
-This is the command line builder for the pyjamas project, which can
-be used to build Ajax applications from Python.
-For more information, see the website at http://pyjs.org/
-# GWT1.2 Impl | GWT1.2 Output | Pyjamas 0.2 Platform | Pyjamas 0.2 Output
-# -------------+-----------------------+----------------------+----------------------
-# Opera | opera | Opera | opera
-# Safari | safari | Safari | safari
-# -- | gecko1_8 | Mozilla | mozilla
-# -- | gecko | OldMoz | oldmoz
-# Standard | all | (default code) | all
-# Mozilla | gecko1_8, gecko | -- | --
-# Old | safari, gecko, opera | -- | --
-version = "%prog pyjamas version 2006-08-19"
-# these names in lowercase need match the strings
-# returned by "provider$user.agent" in order to be selected corretly
-app_platforms = ['IE6', 'Opera', 'OldMoz', 'Safari', 'Mozilla']
-# usually defaults to e.g. /usr/share/pyjamas
-_data_dir = os.path.join(pyjs.prefix, "share/pyjamas")
-# .cache.html files produces look like this
-CACHE_HTML_PAT = re.compile(r'^[a-z]*.[0-9a-f]{32}\.cache\.html$')
-# ok these are the three "default" library directories, containing
-# the builtins (str, List, Dict, ord, round, len, range etc.)
-# the main pyjamas libraries (pyjamas.ui, pyjamas.Window etc.)
-# and the contributed addons
-for p in ["library/builtins",
- p = os.path.join(_data_dir, p)
-def read_boilerplate(data_dir, filename):
- return open(join(data_dir, "builder/boilerplate", filename)).read()
-def copy_boilerplate(data_dir, filename, output_dir):
- filename = join(data_dir, "builder/boilerplate", filename)
- shutil.copy(filename, output_dir)
-# taken and modified from python2.4
-def copytree_exists(src, dst, symlinks=False):
- if not os.path.exists(src):
- names = os.listdir(src)
- if name.startswith('CVS'):
- if name.startswith('.git'):
- if name.startswith('.svn'):
- srcname = os.path.join(src, name)
- dstname = os.path.join(dst, name)
- if symlinks and os.path.islink(srcname):
- linkto = os.readlink(srcname)
- os.symlink(linkto, dstname)
- copytree_exists(srcname, dstname, symlinks)
- shutil.copy2(srcname, dstname)
- except (IOError, os.error) as why:
- errors.append((srcname, dstname, why))
-def check_html_file(source_file, dest_path):
- """ Checks if a base HTML-file is available in the PyJamas
- If the HTML-file isn't available, it will be created.
- If a CSS-file with the same name is available
- in the output directory, a reference to this CSS-file
- If no CSS-file is found, this function will look for a special
- CSS-file in the output directory, with the name
- "pyjamas_default.css", and if found it will be referenced
- in the generated HTML-file.
- [thank you to stef mientki for contributing this function]
- <!-- auto-generated html - you should consider editing and
- adapting this to suit your requirements
- <meta name="pygwt:module" content="%(modulename)s">
- <title>%(title)s</title>
- <script language="javascript" src="pygwt.js"></script>
- filename = os.path.split(source_file)[1]
- mod_name = os.path.splitext(filename)[0]
- file_name = os.path.join(dest_path, mod_name + '.html')
- # if html file in output directory exists, leave it alone.
- if os.path.exists(file_name):
- if os.path.exists(os.path.join(dest_path, mod_name + '.css')):
- css = "<link rel='stylesheet' href='" + mod_name + ".css'>"
- elif os.path.exists(os.path.join(dest_path, 'pyjamas_default.css')):
- css = "<link rel='stylesheet' href='pyjamas_default.css'>"
- title = 'PyJamas Auto-Generated HTML file ' + mod_name
- base_html = base_html % {'modulename': mod_name, 'title': title, 'css': css}
- fh = open(file_name, 'w')
-def build(app_name, output, js_includes=(), debug=False, dynamic=0,
- data_dir=None, cache_buster=False, optimize=False):
- # make sure the output directory is always created in the current working
- # directory or at the place given if it is an absolute path.
- output = os.path.abspath(output)
- msg = "Building '%(app_name)s' to output directory '%(output)s'" % locals()
- msg += " with debugging statements"
- # check the output directory
- if os.path.exists(output) and not os.path.isdir(output):
- print("Output destination %s exists and is not a directory" % output, file=sys.stderr)
- if not os.path.isdir(output):
- print("Creating output directory")
- print("Exception creating output directory %s: %s" % (output, e), file=sys.stderr)
- pub_dir = join(p, 'public')
- print("Copying: public directory of library %r" % p)
- copytree_exists(pub_dir, output)
- # AppName.html - can be in current or public directory
- html_input_filename = app_name + ".html"
- html_output_filename = join(output, basename(html_input_filename))
- if os.path.isfile(html_input_filename):
- if not os.path.isfile(html_output_filename) or \
- os.path.getmtime(html_input_filename) > \
- os.path.getmtime(html_output_filename):
- shutil.copy(html_input_filename, html_output_filename)
- print("Warning: Missing module HTML file %s" % html_input_filename, file=sys.stderr)
- print("Copying: %(html_input_filename)s" % locals())
- if check_html_file(html_input_filename, output):
- print("Warning: Module HTML file %s has been auto-generated" % html_input_filename, file=sys.stderr)
- print("Copying: pygwt.js")
- pygwt_js_template = read_boilerplate(data_dir, "pygwt.js")
- pygwt_js_output = open(join(output, "pygwt.js"), "w")
- print(pygwt_js_template, file=pygwt_js_output)
- pygwt_js_output.close()
- print("Copying: Images and History")
- copy_boilerplate(data_dir, "corner_dialog_topleft_black.png", output)
- copy_boilerplate(data_dir, "corner_dialog_topright_black.png", output)
- copy_boilerplate(data_dir, "corner_dialog_bottomright_black.png", output)
- copy_boilerplate(data_dir, "corner_dialog_bottomleft_black.png", output)
- copy_boilerplate(data_dir, "corner_dialog_edge_black.png", output)
- copy_boilerplate(data_dir, "corner_dialog_topleft.png", output)
- copy_boilerplate(data_dir, "corner_dialog_topright.png", output)
- copy_boilerplate(data_dir, "corner_dialog_bottomright.png", output)
- copy_boilerplate(data_dir, "corner_dialog_bottomleft.png", output)
- copy_boilerplate(data_dir, "corner_dialog_edge.png", output)
- copy_boilerplate(data_dir, "tree_closed.gif", output)
- copy_boilerplate(data_dir, "tree_open.gif", output)
- copy_boilerplate(data_dir, "tree_white.gif", output)
- copy_boilerplate(data_dir, "history.html", output)
- app_files = generateAppFiles(data_dir, js_includes, app_name, debug,
- output, dynamic, cache_buster, optimize)
- print("Creating: %(app_name)s.nocache.html" % locals())
- home_nocache_html_template = read_boilerplate(data_dir, "home.nocache.html")
- home_nocache_html_output = open(join(output, app_name + ".nocache.html"),
- # the selector templ is added to the selectScript function
- select_tmpl = """O(["true","%s"],"%s");"""
- script_selectors = cStringIO()
- for platform, file_prefix in app_files:
- print(select_tmpl % (platform, file_prefix), file=script_selectors)
- home_nocache_html_template % dict(
- script_selectors=script_selectors.getvalue(),
- ), file=home_nocache_html_output)
- home_nocache_html_output.close()
- print("Done. You can run your app by opening '%(html_output_filename)s' in a browser" % locals())
-def generateAppFiles(data_dir, js_includes, app_name, debug, output, dynamic,
- cache_buster, optimize):
- all_cache_html_template = read_boilerplate(data_dir, "all.cache.html")
- mod_cache_html_template = read_boilerplate(data_dir, "mod.cache.html")
- # clean out the old ones first
- for name in os.listdir(output):
- if CACHE_HTML_PAT.match(name):
- print("Deleting existing app file %s" % p)
- parser = pyjs.PlatformParser("platform")
- scripts = ['<script type="text/javascript" src="%s"></script>' %
- script for script in js_includes]
- app_body = '\n'.join(scripts)
- # First, generate all the code.
- # Second, (dynamic only), post-analyse the places where modules
- # Third, write everything out.
- for platform in app_platforms:
- mod_code[platform] = {}
- mod_libs[platform] = {}
- app_libs[platform] = ''
- early_app_libs[platform] = ''
- app_code[platform] = {}
- app_modnames[platform] = {}
- # Application.Platform.cache.html
- parser.setPlatform(platform)
- app_translator = pyjs.AppTranslator(
- parser=parser, dynamic=dynamic, optimize=optimize)
- early_app_libs[platform], appcode = \
- app_translator.translate(None, is_app=False,
- library_modules=['dynamicajax.js',
- pover[platform].update(app_translator.overrides.items())
- for mname, name in app_translator.overrides.items():
- pd = overrides.setdefault(mname, {})
- # mod_code[platform][app_name] = appcode
- # platform.Module.cache.js
- modules_done = ['pyjslib', 'sys', '_pyjs.js']
- # modules_to_do = [app_name] + app_translator.library_modules
- modules_to_do = [app_name] + app_translator.library_modules
- deps = map(pyjs.strip_py, modules_to_do)
- sublist = add_subdeps(dependencies, d)
- modules_to_do += sublist
- # dependencies[app_name] = deps
- modules[platform] = modules_done + modules_to_do
- # print "modules to do", modules_to_do
- mn = modules_to_do.pop()
- mod_name = pyjs.strip_py(mn)
- if mod_name in modules_done:
- modules_done.append(mod_name)
- mod_cache_name = "%s.%s.cache.js" % (platform.lower(), mod_name)
- parser.setPlatform(platform)
- mod_translator = pyjs.AppTranslator(parser=parser, optimize=optimize)
- mod_libs[platform][mod_name], mod_code[platform][mod_name] = \
- mod_translator.translate(mod_name,
- pover[platform].update(mod_translator.overrides.items())
- for mname, name in mod_translator.overrides.items():
- pd = overrides.setdefault(mname, {})
- mods = mod_translator.library_modules
- modules[platform] += mods
- deps = map(pyjs.strip_py, mods)
- while mod_name in deps:
- # print "modname preadd:", mod_name, deps
- sublist = add_subdeps(dependencies, d)
- modules_to_do += sublist
- modules_to_do += add_subdeps(dependencies, mod_name)
- # print "modname:", mod_name, deps
- # print "modname:", mod_name, deps
- dependencies[mod_name] = deps
- # work out the dependency ordering of the modules
- mod_levels[platform] = make_deps(None, dependencies, modules_done)
- # now write everything out
- for platform in app_platforms:
- early_app_libs_ = early_app_libs[platform]
- app_libs_ = app_libs[platform]
- app_code_ = app_code[platform]
- # modules_ = filter_mods(app_name, modules[platform])
- mods = flattenlist(mod_levels[platform])
- modules_ = filter_mods(None, mods)
- for mod_name in modules_:
- mod_code_ = mod_code[platform][mod_name]
- mod_name = pyjs.strip_py(mod_name)
- override_name = "%s.%s" % (platform.lower(), mod_name)
- if override_name in pover[platform]:
- mod_cache_name = "%s.cache.js" % (override_name)
- mod_cache_name = "%s.cache.js" % (mod_name)
- print("Creating: " + mod_cache_name)
- modlevels = make_deps(None, dependencies, dependencies[mod_name])
- mnames = map(lambda x: "'%s'" % x, md)
- mnames = "new pyjslib.List([\n\t\t\t%s])" % ',\n\t\t\t'.join(mnames)
- modnames.append(mnames)
- modnames = "new pyjslib.List([\n\t\t%s\n\t])" % ',\n\t\t'.join(modnames)
- # convert the overrides
- overnames = map(lambda x: "'%s': '%s'" % x, pover[platform].items())
- overnames = "new pyjslib.Dict({\n\t\t%s\n\t})" % ',\n\t\t'.join(overnames)
- mod_cache_html_output = open(join(output, mod_cache_name), "w")
- mod_cache_html_output = cStringIO()
- print(mod_cache_html_template % dict(
- mod_libs=mod_libs[platform][mod_name],
- ), file=mod_cache_html_output)
- mod_cache_html_output.close()
- mod_cache_html_output.seek(0)
- app_libs_ += mod_cache_html_output.read()
- # write out the dependency ordering of the modules
- for md in mod_levels[platform]:
- mnames = map(lambda x: "'%s'" % x, md)
- mnames = "new pyjslib.List([\n\t\t\t%s])" % ',\n\t\t\t'.join(mnames)
- app_modnames.append(mnames)
- app_modnames = "new pyjslib.List([\n\t\t%s\n\t])" % ',\n\t\t'.join(app_modnames)
- # convert the overrides
- overnames = map(lambda x: "'%s': '%s'" % x, pover[platform].items())
- overnames = "new pyjslib.Dict({\n\t\t%s\n\t})" % ',\n\t\t'.join(overnames)
- # print "platform names", platform, overnames
- # now write app.allcache including dependency-ordered list of
- file_contents = all_cache_html_template % dict(
- early_app_libs=early_app_libs_,
- platform=platform.lower(),
- app_modnames=app_modnames,
- app_headers=app_headers
- digest = md5.new(file_contents).hexdigest()
- file_name = "%s.%s.%s" % (platform.lower(), app_name, digest)
- file_name = "%s.%s" % (platform.lower(), app_name)
- file_name += ".cache.html"
- out_path = join(output, file_name)
- out_file = open(out_path, 'w')
- out_file.write(file_contents)
- app_files.append((platform.lower(), file_name))
- print("Created app file %s:%s: %s" % (
- app_name, platform, out_path))
- creates sub-dependencies e.g. pyjamas.ui.Widget
- creates pyjamas.ui.Widget, pyjamas.ui and pyjamas.
- for i in range(0, len(m)):
- d.append('.'.join(m[:i+1]))
-def add_subdeps(deps, mod_name):
- # print "subdeps", mod_name, sd
- for i in range(0, len(sd)-1):
- k = deps.get(child, [])
- makes unique and preserves list order
-def filter_mods(app_name, md):
- md = filter(lambda x: not x.endswith('.js'), md)
- md = map(pyjs.strip_py, md)
-def filter_deps(app_name, deps):
- for (k, l) in deps.items():
- mods = filter_mods(k, l)
-def has_nodeps(mod, deps):
- if mod not in deps or not deps[mod]:
-def nodeps_list(mod_list, deps):
- if has_nodeps(mod, deps):
-# this function takes a dictionary of dependent modules and
-# creates a list of lists. the first list will be modules
-# that have no dependencies; the second list will be those
-# modules that have the first list as dependencies; the
-# third will be those modules that have the first and second...
-def make_deps(app_name, deps, mod_list):
- print("Calculating Dependencies ...")
- mod_list = filter_mods(app_name, mod_list)
- deps = filter_deps(app_name, deps)
- for m, dl in deps.items():
- if m in deps.get(d, []):
- raise Exception('Circular Imports found: \n%s %s -> %s %s'
- # raise Exception('Could not calculate dependencies: \n%s' % deps)
- # print "modlist", mod_list
- nodeps = nodeps_list(mod_list, deps)
- # print "nodeps", nodeps
- mod_list = filter(lambda x: x not in nodeps, mod_list)
- depslist = filter(lambda x: x not in nodeps, depslist)
- # print "newdeps", newdeps
- ordered_deps.append(nodeps)
- ordered_deps.append(mod_list) # last dependencies - usually the app(s)
- parser = OptionParser(usage=usage, version=version)
- help="directory to which the webapp should be written"
- help="javascripts to load into the same frame as the rest of the script"
- help="additional paths appended to PYJSPATH"
- help="path for data directory"
- help="Split output into separate dynamically-loaded modules (experimental)"
- help="platforms to build for, comma-separated"
- help="Optimize generated code (removes all print statements)",
- help="Enable browser cache-busting (MD5 hash added to output filenames)"
- parser.set_defaults(output="output", js_includes=[], library_dirs=[],
- platforms=(','.join(app_platforms)),
- data_dir=os.path.join(sys.prefix, "share/pyjamas"),
- (options, args) = parser.parse_args()
- parser.error("incorrect number of arguments")
- data_dir = abspath(options.data_dir)
- if app_path.endswith('.py'):
- app_path = abspath(app_path)
- if not isfile(app_path):
- parser.error("Application file not found %r" % app_path)
- app_path, app_name = split(app_path)
- app_name = app_name[:-3]
- pyjs.path.append(app_path)
- elif os.path.sep in app_path:
- parser.error("Not a valid module declaration %r" % app_path)
- for d in options.library_dirs:
- pyjs.path.append(abspath(d))
- app_platforms = options.platforms.split(',')
- # this is mostly for getting boilerplate stuff
- data_dir = os.path.abspath(options.data_dir)
- build(app_name, options.output, options.js_includes,
- options.debug, options.dynamic and 1 or 0, data_dir,
- options.cache_buster, options.optimize)
-if __name__ == "__main__":
--- a/svgui/pyjs/jsonrpc/README.txt Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-These classes are intended for use server-side.
-e.g. in a django view.py :
- from pyjs.jsonrpc.django import JSONService, jsonremote
- jsonservice = JSONRPCService()
- @jsonremote(jsonservice)
- def test(request, echo_param):
- return "echoing the param back: %s" % echo_param
--- a/svgui/pyjs/jsonrpc/__init__.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
--- a/svgui/pyjs/jsonrpc/django/jsonrpc.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-# original code: http://trac.pyworks.org/pyjamas/wiki/DjangoWithPyJamas
-# also from: http://www.pimentech.fr/technologies/outils
-from __future__ import absolute_import
-from builtins import str as text
-from django.core.serializers import serialize
-from svgui.pyjs.jsonrpc.jsonrpc import JSONRPCServiceBase
-# JSONRPCService and jsonremote are used in combination to drastically
-# simplify the provision of JSONRPC services. use as follows:
-# jsonservice = JSONRPCService()
-# @jsonremote(jsonservice)
-# def test(request, echo_param):
-# return "echoing the param back: %s" % echo_param
-# dump jsonservice into urlpatterns:
-# (r'^service1/$', 'djangoapp.views.jsonservice'),
-class JSONRPCService(JSONRPCServiceBase):
- def __call__(self, request, extra=None):
- return self.process(request.raw_post_data)
-def jsonremote(service):
- """Make JSONRPCService a decorator so that you can write :
- from jsonrpc import JSONRPCService
- chatservice = JSONRPCService()
- @jsonremote(chatservice)
- def login(request, user_name):
- if isinstance(service, JSONRPCService):
- service.add_method(func.__name__, func)
- emsg = 'Service "%s" not found' % str(service.__name__)
- raise NotImplementedError(emsg)
-# FormProcessor provides a mechanism for turning Django Forms into JSONRPC
-# Services. If you have an existing Django app which makes prevalent
-# use of Django Forms it will save you rewriting the app.
-# use as follows. in djangoapp/views.py :
-# class SimpleForm(forms.Form):
-# testfield = forms.CharField(max_length=100)
-# class SimpleForm2(forms.Form):
-# testfield = forms.CharField(max_length=20)
-# processor = FormProcessor({'processsimpleform': SimpleForm,
-# 'processsimpleform2': SimpleForm2})
-# this will result in a JSONRPC service being created with two
-# RPC functions. dump "processor" into urlpatterns to make it
-# (r'^formsservice/$', 'djangoapp.views.processor'),
- for error in form.errors.keys():
- for errorval in form.errors[error]:
- d[error].append(text(errorval))
-# contains the list of arguments in each field
- 'CharField': ['max_length', 'min_length'],
- 'IntegerField': ['max_value', 'min_value'],
- 'FloatField': ['max_value', 'min_value'],
- 'DecimalField': ['max_value', 'min_value', 'max_digits', 'decimal_places'],
- 'DateField': ['input_formats'],
- 'DateTimeField': ['input_formats'],
- 'TimeField': ['input_formats'],
- 'RegexField': ['max_length', 'min_length'], # sadly we can't get the expr
- 'EmailField': ['max_length', 'min_length'],
- 'URLField': ['max_length', 'min_length', 'verify_exists', 'user_agent'],
- 'ChoiceField': ['choices'],
- 'FilePathField': ['path', 'match', 'recursive', 'choices'],
- 'IPAddressField': ['max_length', 'min_length'],
-def describe_field_errors(field):
- field_type = field.__class__.__name__
- for n, m in field.error_messages.items():
- res['error_messages'] = msgs
- if field_type in ['ComboField', 'MultiValueField', 'SplitDateTimeField']:
- res['fields'] = map(describe_field, field.fields)
-def describe_fields_errors(fields, field_names):
- field_names = fields.keys()
- for name in field_names:
- res[name] = describe_field_errors(field)
-def describe_field(field):
- field_type = field.__class__.__name__
- for fname in (field_names.get(field_type, []) +
- ['help_text', 'label', 'initial', 'required']):
- res[fname] = getattr(field, fname)
- if field_type in ['ComboField', 'MultiValueField', 'SplitDateTimeField']:
- res['fields'] = map(describe_field, field.fields)
-def describe_fields(fields, field_names):
- field_names = fields.keys()
- for name in field_names:
- res[name] = describe_field(field)
-class FormProcessor(JSONRPCService):
- def __init__(self, forms, _formcls=None):
- JSONRPCService.__init__(self)
- s = FormProcessor({}, forms[k])
- self.add_method(k, s.__process)
- JSONRPCService.__init__(self, forms)
- self.formcls = _formcls
- def __process(self, request, params, command=None):
- f = self.formcls(params)
- if command is None: # just validate
- return {'success': False, 'errors': builderrors(f)}
- return {'success': True}
- elif 'describe_errors' in command:
- field_names = command['describe_errors']
- return describe_fields_errors(f.fields, field_names)
- elif 'describe' in command:
- field_names = command['describe']
- return describe_fields(f.fields, field_names)
- elif 'save' in command:
- return {'success': False, 'errors': builderrors(f)}
- instance = f.save() # XXX: if you want more, over-ride save.
- return {'success': True, 'instance': json_convert(instance)}
- elif 'html' in command:
- return {'success': True, 'html': f.as_table()}
- return "unrecognised command"
-# The following is incredibly convenient for saving vast amounts of
-# coding, avoiding doing silly things like this:
-# jsonresult = {'field1': djangoobject.field1,
-# 'field2': djangoobject.date.strftime('%Y.%M'),
-# The date/time flatten function is there because JSONRPC doesn't
-# support date/time objects or formats, so conversion to a string
-# is the most logical choice. pyjamas, being python, can easily
-# be used to parse the string result at the other end.
-# jsonservice = JSONRPCService()
-# @jsonremote(jsonservice)
-# def list_some_model(request, start=0, count=10):
-# l = SomeDjangoModelClass.objects.filter()
-# res = json_convert(l[start:end])
-# @jsonremote(jsonservice)
-# def list_another_model(request, start=0, count=10):
-# l = AnotherDjangoModelClass.objects.filter()
-# res = json_convert(l[start:end])
-# dump jsonservice into urlpatterns to make the two RPC functions,
-# list_some_model and list_another_model part of the django app:
-# (r'^service1/$', 'djangoapp.views.jsonservice'),
-def dict_datetimeflatten(item):
- for k, v in item.items():
- if isinstance(v, datetime.date):
- elif isinstance(v, dict):
- d[k] = dict_datetimeflatten(v)
-def json_convert(l, fields=None):
- for item in serialize('python', l, fields=fields):
- res.append(dict_datetimeflatten(item))
--- a/svgui/pyjs/jsonrpc/jsonrpc.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-from __future__ import absolute_import
-import gluon.contrib.simplejson as simplejson
-class JSONRPCServiceBase(object):
- def response(self, id, result):
- return simplejson.dumps({'version': '1.1', 'id': id,
- 'result': result, 'error': None})
- def error(self, id, code, message):
- return simplejson.dumps({
- 'error': {'name': 'JSONRPCError',
- def add_method(self, name, method):
- self.methods[name] = method
- def process(self, data):
- data = simplejson.loads(data)
- id, method, params = data["id"], data["method"], data["params"]
- if method in self.methods:
- result = self.methods[method](*params)
- return self.response(id, result)
- etype, eval, _etb = sys.exc_info()
- return self.error(id, 100, 'Exception %s: %s' % (etype, eval))
- etype, eval, _etb = sys.exc_info()
- return self.error(id, 100, '%s: %s' % (etype.__name__, eval))
- return self.error(id, 100, 'method "%s" does not exist' % method)
- return self.methods.keys()
--- a/svgui/pyjs/jsonrpc/web2py/jsonrpc.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-# pylint: disable=undefined-variable
-from __future__ import absolute_import
-from svgui.pyjs.jsonrpc.jsonrpc import JSONRPCServiceBase
-class JSONRPCService(JSONRPCServiceBase):
- return self.process(request.body.read())
- def __call__(self, func):
- self.methods[func.__name__] = func
--- a/svgui/pyjs/lib/_pyjs.js Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-function pyjs_extend(klass, base) {
- function klass_object_inherit() {}
- klass_object_inherit.prototype = base.prototype;
- klass_object = new klass_object_inherit();
- for (var i in base.prototype.__class__) {
- v = base.prototype.__class__[i];
- if (typeof v == "function" && (v.class_method || v.static_method || v.unbound_method))
- function klass_inherit() {}
- klass_inherit.prototype = klass_object;
- klass.prototype = new klass_inherit();
- klass_object.constructor = klass;
- klass.prototype.__class__ = klass_object;
- for (var i in base.prototype) {
- if (typeof v == "function" && v.instance_method)
- klass.prototype[i] = v;
-/* creates a class, derived from bases, with methods and variables */
-function pyjs_type(clsname, bases, methods)
- var fn_cls = function() {};
- fn_cls.__name__ = clsname;
- var instance = new fn_cls();
- if(instance.__init__) instance.__init__.apply(instance, arguments);
- fn_cls.__initialize__ = function() {
- if (fn_cls.__was_initialized__) return;
- fn_cls.__was_initialized__ = true;
- fn_cls.__extend_baseclasses();
- fn_cls.prototype.__class__.__new__ = fn;
- fn_cls.prototype.__class__.__name__ = clsname;
- fn_cls.__extend_baseclasses = function() {
- for (bi in fn_cls.__baseclasses)
- var b = fn_cls.__baseclasses[bi];
- if (b.__was_initialized__)
- for (bi in fn_cls.__baseclasses)
- var b = fn_cls.__baseclasses[bi];
- pyjs_extend(fn_cls, b);
- bases = [pyjslib.__Object];
- fn_cls.__baseclasses = bases;
- fn_cls.__initialize__();
- var mtype = typeof mth;
- if (mtype == "function" ) {
- fn_cls.prototype[k] = mth;
- fn_cls.prototype.__class__[k] = function () {
- return fn_cls.prototype[k].call.apply(
- fn_cls.prototype[k], arguments);
- fn_cls.prototype.__class__[k].unbound_method = true;
- fn_cls.prototype.instance_method = true;
- fn_cls.prototype.__class__[k].__name__ = k;
- fn_cls.prototype[k].__name__ = k;
- fn_cls.prototype.__class__[k] = mth;
-function pyjs_kwargs_call(obj, func, star_args, args)
- if (!pyjslib.isIteratable(star_args))
- throw (pyjslib.TypeError(func.__name__ + "() arguments after * must be a sequence" + pyjslib.repr(star_args)));
- var __i = star_args.__iter__();
- call_args[i]=__i.next();
- if (e != pyjslib.StopIteration) {
- var n = star_args.length;
- for (var i=0; i < args.length; i++) {
- call_args[n+i]=args[i];
- return func.apply(obj, call_args);
-function pyjs_kwargs_function_call(func, star_args, args)
- return pyjs_kwargs_call(null, func, star_args, args);
-function pyjs_kwargs_method_call(obj, method_name, star_args, args)
- var method = obj[method_name];
- if (method.parse_kwargs)
- args = method.parse_kwargs.apply(null, args);
- return pyjs_kwargs_call(obj, method, star_args, args);
-//String.prototype.__getitem__ = String.prototype.charAt;
-//String.prototype.upper = String.prototype.toUpperCase;
-//String.prototype.lower = String.prototype.toLowerCase;
-//String.prototype.find=pyjslib.String_find;
-//String.prototype.join=pyjslib.String_join;
-//String.prototype.isdigit=pyjslib.String_isdigit;
-//String.prototype.__iter__=pyjslib.String___iter__;
-//String.prototype.__replace=String.prototype.replace;
-//String.prototype.replace=pyjslib.String_replace;
-//String.prototype.split=pyjslib.String_split;
-//String.prototype.strip=pyjslib.String_strip;
-//String.prototype.lstrip=pyjslib.String_lstrip;
-//String.prototype.rstrip=pyjslib.String_rstrip;
-//String.prototype.startswith=pyjslib.String_startswith;
--- a/svgui/pyjs/lib/json.js Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,293 +0,0 @@
-json_parse = (function () {
-// This is a function that can parse a JSON text, producing a JavaScript
-// data structure. It is a simple, recursive descent parser. It does not use
-// eval or regular expressions, so it can be used as a model for implementing
-// a JSON parser in other languages.
-// We are defining the function inside of another function to avoid creating
- var at, // The index of the current character
- ch, // The current character
-// Call error when something is wrong.
-// If a c parameter is provided, verify that it matches the current character.
- error("Expected '" + c + "' instead of '" + ch + "'");
-// Get the next character. When there are no more characters,
-// return the empty string.
-// Parse a number value.
- while (ch >= '0' && ch <= '9') {
- while (next() && ch >= '0' && ch <= '9') {
- if (ch === 'e' || ch === 'E') {
- if (ch === '-' || ch === '+') {
- while (ch >= '0' && ch <= '9') {
-// Parse a string value.
-// When parsing for string values, we must look for " and \ characters.
- } else if (ch === '\\') {
- for (i = 0; i < 4; i += 1) {
- hex = parseInt(next(), 16);
- uffff = uffff * 16 + hex;
- string += String.fromCharCode(uffff);
- } else if (typeof escapee[ch] === 'string') {
- while (ch && ch <= ' ') {
-// true, false, or null.
- error("Unexpected '" + ch + "'");
- value, // Place holder for the value function.
-// Parse an array value.
- return array; // empty array
-// Parse an object value.
- return object; // empty object
- if (Object.hasOwnProperty.call(object, key)) {
- error('Duplicate key "' + key + '"');
-// Parse a JSON value. It could be an object, an array, a string, a number,
- return ch >= '0' && ch <= '9' ? number() : word();
-// Return the json_parse function. It will have access to all of the above
-// functions and variables.
- return function (source, reviver) {
-// If there is a reviver function, we recursively walk the new structure,
-// passing each name/value pair to the reviver function for possible
-// transformation, starting with a temporary root object that holds the result
-// in an empty key. If there is not a reviver function, we simply return the
- return typeof reviver === 'function' ? (function walk(holder, key) {
- var k, v, value = holder[key];
- if (value && typeof value === 'object') {
- if (Object.hasOwnProperty.call(value, k)) {
- return reviver.call(holder, key, value);
- }({'': result}, '')) : result;
--- a/svgui/pyjs/lib/pyjslib.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1418 +0,0 @@
-# Copyright 2006 James Tauber and contributors
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# http://www.apache.org/licenses/LICENSE-2.0
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# pylint: disable=too-many-function-args,undefined-variable,no-absolute-import,assign-to-new-keyword,nonzero-method,next-method-called,next-method-defined
-# iteration from Bob Ippolito's Iteration in JavaScript
-from __pyjamas__ import JS
-# must declare import _before_ importing sys
-def import_module(path, parent_module, module_name, dynamic=1, async=False):
- if (module_name == "sys" || module_name == 'pyjslib')
- /*module_load_request[module_name] = 1;*/
- var override_name = sys.platform + "." + module_name;
- if (((sys.overrides != null) &&
- (sys.overrides.has_key(override_name))))
- cache_file = sys.overrides.__getitem__(override_name) ;
- cache_file = module_name ;
- cache_file = (path + cache_file + '.cache.js' ) ;
- //alert("cache " + cache_file + " " + module_name + " " + parent_module);
- if (module_load_request[module_name])
- if (module_load_request[module_name] >= 3 && parent_module != null)
- //onload_fn = parent_module + '.' + module_name + ' = ' + module_name + ';';
- //pyjs_eval(onload_fn); /* set up the parent-module namespace */
- if (typeof (module_load_request[module_name]) == 'undefined')
- module_load_request[module_name] = 1;
- /* following a load, this first executes the script
- * "preparation" function MODULENAME_loaded_fn()
- * and then sets up the loaded module in the namespace
- onload_fn = ''; // module_name + "_loaded_fn();"
- if (parent_module != null)
- //onload_fn += parent_module + '.' + module_name + ' = ' + module_name + ';';
- /*pmod = parent_module + '.' + module_name;
- onload_fn += 'alert("' + pmod + '"+' + pmod+');';*/
- /* this one tacks the script onto the end of the DOM
- pyjs_load_script(cache_file, onload_fn, async);
- /* this one actually RUNS the script (eval) into the page.
- my feeling is that this would be better for non-async
- but i can't get it to work entirely yet.
- /*pyjs_ajax_eval(cache_file, onload_fn, async);*/
- if (module_name != "pyjslib" &&
-function import_wait(proceed_fn, parent_mod, dynamic) {
- var element = $doc.createElement("div");
- $doc.body.appendChild(element);
- function write_dom(txt) {
- element.innerHTML = txt + '<br />';
- var wait = function() {
- for (l in module_load_request)
- var m = module_load_request[l];
- if (l == "sys" || l == 'pyjslib')
- //write_dom( " import wait " + wait_count + " " + status + " parent_mod " + parent_mod);
- setTimeout(wait, timeoutperiod);
- for (l in module_load_request)
- var m = module_load_request[l];
- if (l == "sys" || l == 'pyjslib')
- module_load_request[l] = 4;
- if ((parent_mod != null) && (l == parent_mod))
- setTimeout(wait, timeoutperiod);
- /* cheat and move app on to next stage */
- module_load_request[l] = 3;
- setTimeout(wait, timeoutperiod);
- //alert("waited for module " + l + ": loaded");
- module_load_request[l] = 4;
- //alert("module wait done");
- if (proceed_fn.importDone)
- proceed_fn.importDone(proceed_fn);
-# pylint: disable=old-style-class
- def __init__(self, path, app_modlist, app_imported_fn, dynamic,
- self.app_modlist = app_modlist
- self.app_imported_fn = app_imported_fn
- self.parent_mod = parent_mod
- for i in range(len(self.app_modlist[self.idx])):
- app = self.app_modlist[self.idx][i]
- import_module(self.path, self.parent_mod, app, self.dynamic, True)
- if self.idx >= len(self.app_modlist):
- import_wait(self.app_imported_fn, self.parent_mod, self.dynamic)
- import_wait(getattr(self, "next"), self.parent_mod, self.dynamic)
-def get_module(module_name):
- _ev = "__mod = %s;" % module_name
-def preload_app_modules(path, app_modnames, app_imported_fn, dynamic,
- loader = Modload(path, app_modnames, app_imported_fn, dynamic, parent_mod)
-# as comment on line 20 says
-# import sys should be below
-import sys # noqa # pylint: disable=wrong-import-order,unused-import,wrong-import-position
- def __init__(self, *args):
- if len(self.args) is 0:
- elif len(self.args) is 1:
- return repr(self.args[0])
-class Exception(BaseException):
-class TypeError(BaseException):
-class StandardError(Exception):
-class LookupError(StandardError):
- return self.name + ": " + self.args[0]
-class KeyError(LookupError):
-class AttributeError(StandardError):
- name = "AttributeError"
- return "AttributeError: %s of %s" % (self.args[1], self.args[0])
-pyjslib.StopIteration = function () { };
-pyjslib.StopIteration.prototype = new Error();
-pyjslib.StopIteration.name = 'StopIteration';
-pyjslib.StopIteration.message = 'StopIteration';
-pyjslib.String_find = function(sub, start, end) {
- var pos=this.indexOf(sub, start);
- if (pyjslib.isUndefined(end)) return pos;
- if (pos + sub.length>end) return -1;
-pyjslib.String_join = function(data) {
- if (pyjslib.isArray(data)) {
- return data.join(this);
- else if (pyjslib.isIteratable(data)) {
- var iter=data.__iter__();
- if (e != pyjslib.StopIteration) throw e;
-pyjslib.String_isdigit = function() {
- return (this.match(/^\d+$/g) != null);
-pyjslib.String_replace = function(old, replace, count) {
- if (!pyjslib.isString(old)) return this.__replace(old, replace);
- if (!pyjslib.isUndefined(count)) do_max=true;
- while (start<this.length) {
- if (do_max && !count--) break;
- pos=this.indexOf(old, start);
- new_str+=this.substring(start, pos) + replace;
- if (start<this.length) new_str+=this.substring(start);
-pyjslib.String_split = function(sep, maxsplit) {
- var items=new pyjslib.List();
- if (pyjslib.isUndefined(sep) || pyjslib.isNull(sep)) {
- subject=subject.strip();
- subject=subject.replace(/\s+/g, sep);
- else if (!pyjslib.isUndefined(maxsplit)) do_max=true;
- if (subject.length == 0) {
- while (start<subject.length) {
- if (do_max && !maxsplit--) break;
- pos=subject.indexOf(sep, start);
- items.append(subject.substring(start, pos));
- if (start<=subject.length) items.append(subject.substring(start));
-pyjslib.String___iter__ = function() {
- throw pyjslib.StopIteration;
- return s.substring(i++, i, 1);
- '__iter__': function() {
-pyjslib.String_strip = function(chars) {
- return this.lstrip(chars).rstrip(chars);
-pyjslib.String_lstrip = function(chars) {
- if (pyjslib.isUndefined(chars)) return this.replace(/^\s+/, "");
- return this.replace(new RegExp("^[" + chars + "]+"), "");
-pyjslib.String_rstrip = function(chars) {
- if (pyjslib.isUndefined(chars)) return this.replace(/\s+$/, "");
- return this.replace(new RegExp("[" + chars + "]+$"), "");
-pyjslib.String_startswith = function(prefix, start) {
- if (pyjslib.isUndefined(start)) start = 0;
- if (this.substring(start, prefix.length) == prefix) return true;
- def __init__(self, name):
- if (pyjslib.hasattr(a, "__cmp__")) {
- return a.__cmp__(b) == 0;
- } else if (pyjslib.hasattr(b, "__cmp__")) {
- return b.__cmp__(a) == 0;
- if hasattr(a, "__cmp__"):
- elif hasattr(b, "__cmp__"):
- # this needs to stay in native code without any dependencies here,
- # because this is used by if and while, we need to prevent
- return v.__nonzero__();
- def __init__(self, data=None):
- def append(self, item):
- JS(""" this.l[this.l.length] = item;""")
- def extend(self, data):
- if (pyjslib.isArray(data)) {
- for (var i=0; i < data.length; i++) {
- else if (pyjslib.isIteratable(data)) {
- var iter=data.__iter__();
- if (e != pyjslib.StopIteration) throw e;
- def remove(self, value):
- var index=this.index(value);
- if (index<0) return false;
- this.l.splice(index, 1);
- def index(self, value, start=0):
- var length=this.l.length;
- for (var i=start; i<length; i++) {
- if (this.l[i]==value) {
- def insert(self, index, value):
- JS(""" var a = this.l; this.l=a.slice(0, index).concat(value, a.slice(index));""")
- def pop(self, index=-1):
- if (index<0) index = this.l.length + index;
- this.l.splice(index, 1);
- if not isinstance(l, List):
- ll = len(self) - len(l)
- for x in range(len(l)):
- ll = cmp(self.__getitem__(x), l[x])
- def slice(self, lower, upper):
- if (upper==null) return pyjslib.List(this.l.slice(lower));
- return pyjslib.List(this.l.slice(lower, upper));
- def __getitem__(self, index):
- if (index<0) index = this.l.length + index;
- def __setitem__(self, index, value):
- JS(""" this.l[index]=value;""")
- def __delitem__(self, index):
- JS(""" this.l.splice(index, 1);""")
- JS(""" return this.l.length;""")
- def __contains__(self, value):
- return self.index(value) >= 0
- throw pyjslib.StopIteration;
- '__iter__': function() {
- JS(""" this.l.reverse();""")
- def sort(self, compareFunc=None, keyFunc=None, reverse=False):
- if keyFunc and reverse:
- return -compareFunc(keyFunc(a), keyFunc(b))
- return compareFunc(keyFunc(a), keyFunc(b))
- return -compareFunc(a, b)
- self.l.sort(compareFunc)
- Access the javascript Array that is used internally by this list
- def __init__(self, data=None):
- def append(self, item):
- JS(""" this.l[this.l.length] = item;""")
- def extend(self, data):
- if (pyjslib.isArray(data)) {
- for (var i=0; i < data.length; i++) {
- else if (pyjslib.isIteratable(data)) {
- var iter=data.__iter__();
- if (e != pyjslib.StopIteration) throw e;
- def remove(self, value):
- var index=this.index(value);
- if (index<0) return false;
- this.l.splice(index, 1);
- def index(self, value, start=0):
- var length=this.l.length;
- for (var i=start; i<length; i++) {
- if (this.l[i]==value) {
- def insert(self, index, value):
- JS(""" var a = this.l; this.l=a.slice(0, index).concat(value, a.slice(index));""")
- def pop(self, index=-1):
- if (index<0) index = this.l.length + index;
- this.l.splice(index, 1);
- if not isinstance(l, Tuple):
- ll = len(self) - len(l)
- for x in range(len(l)):
- ll = cmp(self.__getitem__(x), l[x])
- def slice(self, lower, upper):
- if (upper==null) return pyjslib.Tuple(this.l.slice(lower));
- return pyjslib.Tuple(this.l.slice(lower, upper));
- def __getitem__(self, index):
- if (index<0) index = this.l.length + index;
- def __setitem__(self, index, value):
- JS(""" this.l[index]=value;""")
- def __delitem__(self, index):
- JS(""" this.l.splice(index, 1);""")
- JS(""" return this.l.length;""")
- def __contains__(self, value):
- return self.index(value) >= 0
- throw pyjslib.StopIteration;
- '__iter__': function() {
- JS(""" this.l.reverse();""")
- def sort(self, compareFunc=None, keyFunc=None, reverse=False):
- if keyFunc and reverse:
- return -compareFunc(keyFunc(a), keyFunc(b))
- return compareFunc(keyFunc(a), keyFunc(b))
- return -compareFunc(a, b)
- self.l.sort(compareFunc)
- Access the javascript Array that is used internally by this list
- def __init__(self, data=None):
- if (pyjslib.isArray(data)) {
- this.__setitem__(item[0], item[1]);
- //var sKey=pyjslib.hash(item[0]);
- //this.d[sKey]=item[1];
- else if (pyjslib.isIteratable(data)) {
- var iter=data.__iter__();
- this.__setitem__(item.__getitem__(0), item.__getitem__(1));
- if (e != pyjslib.StopIteration) throw e;
- else if (pyjslib.isObject(data)) {
- for (var key in data) {
- this.__setitem__(key, data[key]);
- def __setitem__(self, key, value):
- var sKey = pyjslib.hash(key);
- this.d[sKey]=[key, value];
- def __getitem__(self, key):
- var sKey = pyjslib.hash(key);
- var value=this.d[sKey];
- if (pyjslib.isUndefined(value)){
- throw pyjslib.KeyError(key);
- for (var i in this.d) size++;
- def has_key(self, key):
- return self.__contains__(key)
- def __delitem__(self, key):
- var sKey = pyjslib.hash(key);
- def __contains__(self, key):
- var sKey = pyjslib.hash(key);
- return (pyjslib.isUndefined(this.d[sKey])) ? false : true;
- var keys=new pyjslib.List();
- for (var key in this.d) {
- keys.append(this.d[key][0]);
- var values=new pyjslib.List();
- for (var key in this.d) values.append(this.d[key][1]);
- var items = new pyjslib.List();
- for (var key in this.d) {
- items.append(new pyjslib.List(kv))
- return self.keys().__iter__()
- return self.values().__iter__()
- return self.items().__iter__()
- def setdefault(self, key, default_value):
- self[key] = default_value
- def get(self, key, default_=None):
- for k, v in d.iteritems():
- Return the javascript Object which this class uses to store
- dictionary keys and values
- return Dict(self.items())
-# taken from mochikit: range( [start,] stop[, step] )
- if (arguments.length == 2) {
- else if (arguments.length == 3) {
- else if (arguments.length>0) stop = arguments[0];
- if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) throw pyjslib.StopIteration;
- '__iter__': function() {
-def slice(object, lower, upper):
- if (pyjslib.isString(object)) {
- lower = object.length + lower;
- upper = object.length + upper;
- if (pyjslib.isNull(upper)) upper=object.length;
- return object.substring(lower, upper);
- if (pyjslib.isObject(object) && object.slice)
- return object.slice(lower, upper);
- if (pyjslib.hasattr(text,"__str__")) {
- if isString(x) and len(x) is 1:
- return x.charCodeAt(0);
- throw pyjslib.TypeError();
- return String.fromCharCode(x)
- return t == 'boolean' ||
-def get_pyjs_classtype(x):
- if (pyjslib.hasattr(x, "__class__"))
- if (pyjslib.hasattr(x.__class__, "__new__"))
- var src = x.__class__.__name__;
- """ Return the string representation of 'x'.
- //alert("repr typeof " + t + " : " + x);
- return "<function " + x.toString() + ">";
- if (x.indexOf("'") == -1)
- if (x.indexOf('"') == -1)
- var s = x.replace(new RegExp('"', "g"), '\\\\"');
- // If we get here, x is an object. See if it's a Pyjamas class.
- if (!pyjslib.hasattr(x, "__init__"))
- return "<" + x.toString() + ">";
- // Handle the common Pyjamas data types.
- var constructor = "UNKNOWN";
- constructor = pyjslib.get_pyjs_classtype(x);
- //alert("repr constructor: " + constructor);
- if (constructor == "Tuple") {
- var contents = x.getArray();
- for (var i=0; i < contents.length; i++) {
- s += pyjslib.repr(contents[i]);
- if (i < contents.length - 1)
- if (constructor == "List") {
- var contents = x.getArray();
- for (var i=0; i < contents.length; i++) {
- s += pyjslib.repr(contents[i]);
- if (i < contents.length - 1)
- if (constructor == "Dict") {
- var keys = new Array();
- for (var i=0; i<keys.length; i++) {
- s += pyjslib.repr(key) + ": " + pyjslib.repr(x.d[key]);
- // If we get here, the class isn't one we know -> return the class name.
- // Note that we replace underscores with dots so that the name will
- // (hopefully!) look like the original Python name.
- //var s = constructor.replace(new RegExp('_', "g"), '.');
- return "<" + constructor + " object>";
- return parseFloat(text);
- return parseInt(text, radix);
- if (object==null) return 0;
- if (pyjslib.isObject(object) && object.__len__) return object.__len__();
-def isinstance(object_, classinfo):
- if pyjslib.isUndefined(object_):
- if not pyjslib.isObject(object_):
- if _isinstance(classinfo, Tuple):
- if isinstance(object_, ci):
- return _isinstance(object_, classinfo)
-def _isinstance(object_, classinfo):
- if not pyjslib.isObject(object_):
- if (object_.__class__){
- var res = object_ instanceof classinfo.constructor;
-def getattr(obj, name, default_=None):
- if ((!pyjslib.isObject(obj))||(pyjslib.isUndefined(obj[name]))){
- if (pyjslib.isUndefined(default_)){
- throw pyjslib.AttributeError(obj, name);
- if (!pyjslib.isFunction(obj[name])) return obj[name];
- var fnwrap = function() {
- for (var i = 0; i < arguments.length; i++) {
- args.push(arguments[i]);
- return obj[name].apply(obj,args);
- fnwrap.__name__ = name;
-def setattr(obj, name, value):
- if (!pyjslib.isObject(obj)) return null;
- if (!pyjslib.isObject(obj)) return false;
- if (pyjslib.isUndefined(obj[name])) return false;
- var properties=new pyjslib.List();
- for (property in obj) properties.append(property);
-def filter(obj, method, sequence=None):
- # object context is LOST when a method is passed, hence object must be passed separately
- # to emulate python behaviour, should generate this code inline rather than as a function call
- if method.call(obj, item):
-def map(obj, method, sequence=None):
- items.append(method(item))
- items.append(method.call(obj, item))
-def enumerate(sequence):
- enumeration.append([nextIndex, item])
- nextIndex = nextIndex + 1
- if (obj == null) return null;
- if (obj.$H) return obj.$H;
- if (obj.__hash__) return obj.__hash__();
- if (obj.constructor == String || obj.constructor == Number || obj.constructor == Date) return obj;
- obj.$H = ++pyjslib.next_hash_id;
-# type functions from Douglas Crockford's Remedial Javascript: http://www.crockford.com/javascript/remedial.html
- return (a != null && (typeof a == 'object')) || pyjslib.isFunction(a);
- return typeof a == 'function';
- return typeof a == 'string';
- return typeof a == 'object' && !a;
- return pyjslib.isObject(a) && a.constructor == Array;
- return typeof a == 'undefined';
- return pyjslib.isString(a) || (pyjslib.isObject(a) && a.__iter__);
- return typeof a == 'number' && isFinite(a);
- Convert the pyjs pythonic List and Dict objects into javascript Object and Array
- for(var k=0; k < x.length; k++) {
- var tv = pyjslib.toJSObjects(v);
- if isinstance(x, Dict):
- result[o[i][0].toString()] = o[i][1];
- return pyjslib.toJSObjects(result)
- elif isinstance(x, List):
- return toJSObjects(x.l)
- elif hasattr(x, '__class__'):
- # we do not have a special implementation for custom
- # classes, just pass it on
- var tv = pyjslib.toJSObjects(v)
- if ($wnd.console==undefined) return;
- for(var i=0; i < objs.length; i++) {
-def type(clsname, bases=None, methods=None):
- """ creates a class, derived from bases, with methods and variables
- for k in methods.keys():
- JS(" mths[k] = _mth; ")
- JS(" var bss = null; ")
- JS(" return pyjs_type(clsname, bss, mths); ")
--- a/svgui/pyjs/lib/sys.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-# the platform name (PyV8, smjs, Mozilla, IE6, Opera, Safari etc.)
-platform = '' # to be updated by app, on compile
-# a dictionary of module override names (platform-specific)
-overrides = {} # to be updated by app, on compile
-# the remote path for loading modules
-def addoverride(module_name, path):
- overrides[module_name] = path
-def addstack(linedebug):
- if (pyjslib.bool((sys.stacktrace === null))) {
- sys.stacktrace = new pyjslib.List([]);
- sys.stacktrace.append(linedebug);
- var __l = sys.stacktrace.__iter__();
- if (e != pyjslib.StopIteration) {
--- a/svgui/pyjs/pyjs.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1780 +0,0 @@
-# Copyright 2006 James Tauber and contributors
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# http://www.apache.org/licenses/LICENSE-2.0
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# pylint: disable=no-absolute-import,bad-python3-import
-from __future__ import print_function
-from compiler import ast
-from builtins import str as text
-from past.builtins import basestring
-from six.moves import cStringIO
-# the standard location for builtins (e.g. pyjslib) can be
-# over-ridden by changing this. it defaults to sys.prefix
-# so that on a system-wide install of pyjamas the builtins
-# can be found in e.g. {sys.prefix}/share/pyjamas
-# over-rides can be done by either explicitly modifying
-# pyjs.prefix or by setting an environment variable, PYJSPREFIX.
-if 'PYJSPREFIX' in os.environ:
- prefix = os.environ['PYJSPREFIX']
-# pyjs.path is the list of paths, just like sys.path, from which
-# library modules will be searched for, for compile purposes.
-# obviously we don't want to use sys.path because that would result
-# in compiling standard python modules into javascript!
-path = [os.path.abspath('')]
-if 'PYJSPATH' in os.environ:
- for p in os.environ['PYJSPATH'].split(os.pathsep):
-# this is the python function used to wrap native javascript
-NATIVE_JS_FUNC_NAME = "JS"
-PYJSLIB_BUILTIN_FUNCTIONS = ("cmp",
-PYJSLIB_BUILTIN_CLASSES = ("BaseException",
-def pyjs_builtin_remap(name):
-# XXX: this is a hack: these should be dealt with another way
-# however, console is currently the only global name which is causing
-PYJS_GLOBAL_VARS = ("console")
-# This is taken from the django project.
-# Escape every ASCII character with a value less than 32.
- ) + tuple([('%c' % z, '\\x%02X' % z) for z in range(32)])
- """Hex encodes characters for use in JavaScript strings."""
- for bad, good in JS_ESCAPES:
- value = value.replace(bad, good)
-def uuprefix(name, leave_alone=0):
- name = name[:leave_alone] + map(lambda x: "__%s" % x, name[leave_alone:])
- def __init__(self, name, name_):
- self.klasses[name] = self
- def set_base(self, base_name):
- self.base = self.klasses.get(base_name)
- def add_function(self, function_name):
- self.functions.add(function_name)
-class TranslationError(Exception):
- def __init__(self, message, node):
- Exception.__init__(self)
- self.message = "line %s:\n%s\n%s" % (node.lineno, message, node)
-def mod_var_name_decl(raw_module_name):
- """ function to get the last component of the module e.g.
- pyjamas.ui.DOM into the "namespace". i.e. doing
- "import pyjamas.ui.DOM" actually ends up with _two_
- variables - one pyjamas.ui.DOM, the other just "DOM".
- but "DOM" is actually local, hence the "var" prefix.
- for PyV8, this might end up causing problems - we'll have
- to see: gen_mod_import and mod_var_name_decl might have
- to end up in a library-specific module, somewhere.
- name = raw_module_name.split(".")
- return "var %s = %s;\n" % (child_name, raw_module_name)
-def gen_mod_import(parentName, importName, dynamic=1):
- # pyjs_ajax_eval("%(n)s.cache.js", null, true);
- pyjslib.import_module(sys.loadpath, '%(p)s', '%(n)s', %(d)d, false);
- """ % ({'p': parentName, 'd': dynamic, 'n': importName}) + \
- mod_var_name_decl(importName)
-class Translator(object):
- def __init__(self, mn, module_name, raw_module_name, src, debug, mod, output,
- dynamic=0, optimize=False,
- self.module_prefix = module_name + "."
- self.module_prefix = ""
- self.raw_module_name = raw_module_name
- src = src.replace("\r\n", "\n")
- src = src.replace("\n\r", "\n")
- src = src.replace("\r", "\n")
- self.src = src.split("\n")
- self.imported_modules = []
- self.imported_modules_as = []
- self.imported_js = set()
- self.top_level_functions = set()
- self.top_level_classes = set()
- self.top_level_vars = set()
- self.local_arg_stack = [[]]
- self.imported_classes = {}
- self.method_imported_globals = set()
- self.method_self = None
- self.nextTupleAssignID = 1
- self.optimize = optimize
- self.findFile = findFile
- if module_name.find(".") >= 0:
- self.printo(UU+"%s%s = function (__mod_name__) {" % (vdec, module_name))
- self.printo(" if("+module_name+".__was_initialized__) return;")
- self.printo(" "+UU+module_name+".__was_initialized__ = true;")
- self.printo(UU+"if (__mod_name__ == null) __mod_name__ = '%s';" % (mn))
- self.printo(UU+"%s.__name__ = __mod_name__;" % (raw_module_name))
- decl = mod_var_name_decl(raw_module_name)
- haltException = self.module_prefix + "HaltException"
- self.printo(haltException + ' = function () {')
- self.printo(' this.message = "Program Halted";')
- self.printo(' this.name = "' + haltException + '";')
- self.printo(haltException + ".prototype.__str__ = function()")
- self.printo('return this.message ;')
- self.printo(haltException + ".prototype.toString = function()")
- self.printo('return this.name + ": \\"" + this.message + "\\"";')
- isHaltFunction = self.module_prefix + "IsHaltException"
- var suffix="HaltException";
- if (s.length < suffix.length) {
- //alert(s + " " + suffix);
- var ss = s.substring(s.length, (s.length - suffix.length));
- //alert(s + " " + suffix + " " + ss);
- if isinstance(child, ast.Function):
- self.top_level_functions.add(child.name)
- elif isinstance(child, ast.Class):
- self.top_level_classes.add(child.name)
- if isinstance(child, ast.Function):
- self._function(child, False)
- elif isinstance(child, ast.Class):
- elif isinstance(child, ast.Import):
- importName = child.names[0][0]
- if importName == '__pyjamas__': # special module to help make pyjamas modules loadable in the python interpreter
- elif importName.endswith('.js'):
- self.imported_js.add(importName)
- self.add_imported_module(strip_py(importName))
- elif isinstance(child, ast.From):
- if child.modname == '__pyjamas__': # special module to help make pyjamas modules loadable in the python interpreter
- self.add_imported_module(child.modname)
- elif isinstance(child, ast.Discard):
- self._discard(child, None)
- elif isinstance(child, ast.Assign):
- self._assign(child, None, True)
- elif isinstance(child, ast.AugAssign):
- self._augassign(child, None)
- elif isinstance(child, ast.If):
- elif isinstance(child, ast.For):
- elif isinstance(child, ast.While):
- self._while(child, None)
- elif isinstance(child, ast.Subscript):
- self._subscript_stmt(child, None)
- elif isinstance(child, ast.Global):
- self._global(child, None)
- elif isinstance(child, ast.Printnl):
- self._print(child, None)
- elif isinstance(child, ast.Print):
- self._print(child, None)
- elif isinstance(child, ast.TryExcept):
- self._tryExcept(child, None)
- elif isinstance(child, ast.Raise):
- self._raise(child, None)
- elif isinstance(child, ast.Stmt):
- self._stmt(child, None)
- raise TranslationError("unsupported type (in __init__)", child)
- # Initialize all classes for this module
- # self.printo("__"+self.modpfx()+\
- # "classes_initialize = function() {\n")
- # for className in self.top_level_classes:
- # self.printo("\t"+UU+self.modpfx()+"__"+className+"_initialize();")
- self.printo("return this;\n")
- self.printo("}; /* end %s */ \n" % module_name)
- def printo(self, *args):
- print(*args, file=self.output)
- def module_imports(self):
- return self.imported_modules + self.imported_modules_as
- def add_local_arg(self, varname):
- local_vars = self.local_arg_stack[-1]
- if varname not in local_vars:
- local_vars.append(varname)
- def add_imported_module(self, importName):
- if importName in self.imported_modules:
- self.imported_modules.append(importName)
- name = importName.split(".")
- # add the name of the module to the namespace,
- # but don't add the short name to imported_modules
- # because then the short name would be attempted to be
- # added to the dependencies, and it's half way up the
- # module import directory structure!
- self.imported_modules_as.append(child_name)
- self.printo(gen_mod_import(self.raw_module_name,
- def _default_args_handler(self, node, arg_names, current_klass,
- output = output or self.output
- default_pos = len(arg_names) - len(node.defaults)
- if arg_names and arg_names[0] == self.method_self:
- for default_node in node.defaults:
- if isinstance(default_node, ast.Const):
- default_value = self._const(default_node)
- elif isinstance(default_node, ast.Name):
- default_value = self._name(default_node, current_klass)
- elif isinstance(default_node, ast.UnarySub):
- default_value = self._unarysub(default_node, current_klass)
- raise TranslationError("unsupported type (in _method)", default_node)
- default_name = arg_names[default_pos]
- self.printo(" if (typeof %s == 'undefined') %s=%s;" % (default_name, default_name, default_value))
- def _varargs_handler(self, node, varargname, arg_names, current_klass):
- self.printo(" var", varargname, '= new pyjslib.Tuple();')
- self.printo(" for(var __va_arg="+str(len(arg_names))+"; __va_arg < arguments.length; __va_arg++) {")
- self.printo(" var __arg = arguments[__va_arg];")
- self.printo(" "+varargname+".append(__arg);")
- def _kwargs_parser(self, node, function_name, arg_names, current_klass):
- if len(node.defaults) or node.kwargs:
- default_pos = len(arg_names) - len(node.defaults)
- if arg_names and arg_names[0] == self.method_self:
- self.printo(function_name+'.parse_kwargs = function (', ", ".join(["__kwargs"]+arg_names), ") {")
- for _default_node in node.defaults:
- # default_value = self.expr(default_node, current_klass)
- # if isinstance(default_node, ast.Const):
- # default_value = self._const(default_node)
- # elif isinstance(default_node, ast.Name):
- # default_value = self._name(default_node)
- # elif isinstance(default_node, ast.UnarySub):
- # default_value = self._unarysub(default_node, current_klass)
- # raise TranslationError("unsupported type (in _method)", default_node)
- default_name = arg_names[default_pos]
- self.printo(" if (typeof %s == 'undefined')" % (default_name))
- self.printo(" %s=__kwargs.%s;" % (default_name, default_name))
- # self._default_args_handler(node, arg_names, current_klass)
- arg_names += ["pyjslib.Dict(__kwargs)"]
- self.printo(" var __r = "+"".join(["[", ", ".join(arg_names), "]"])+";")
- self._varargs_handler(node, "__args", arg_names, current_klass)
- self.printo(" __r.push.apply(__r, __args.getArray())")
- self.printo(" return __r;")
- def _function(self, node, local=False):
- function_name = node.name
- self.add_local_arg(function_name)
- function_name = UU + self.modpfx() + node.name
- arg_names = list(node.argnames)
- normal_arg_names = list(arg_names)
- kwargname = normal_arg_names.pop()
- varargname = normal_arg_names.pop()
- declared_arg_names = list(normal_arg_names)
- declared_arg_names.append(kwargname)
- function_args = "(" + ", ".join(declared_arg_names) + ")"
- self.printo("%s = function%s {" % (function_name, function_args))
- self._default_args_handler(node, normal_arg_names, None)
- local_arg_names = normal_arg_names + declared_arg_names
- self._varargs_handler(node, varargname, declared_arg_names, None)
- local_arg_names.append(varargname)
- # stack of local variable names for this function call
- self.local_arg_stack.append(local_arg_names)
- for child in node.code:
- self._stmt(child, None)
- # remove the top local arg names
- self.local_arg_stack.pop()
- # we need to return null always, so it is not undefined
- lastStmt = [p for p in node.code][-1]
- if not isinstance(lastStmt, ast.Return):
- if not self._isNativeFunc(lastStmt):
- self.printo(" return null;")
- self.printo("%s.__name__ = '%s';\n" % (function_name, node.name))
- self._kwargs_parser(node, function_name, normal_arg_names, None)
- def _return(self, node, current_klass):
- expr = self.expr(node.value, current_klass)
- # in python a function call always returns None, so we do it
- self.printo(" return " + expr + ";")
- def _break(self, node, current_klass):
- def _continue(self, node, current_klass):
- self.printo(" continue;")
- def _callfunc(self, v, current_klass):
- if isinstance(v.node, ast.Name):
- if v.node.name in self.top_level_functions:
- call_name = self.modpfx() + v.node.name
- elif v.node.name in self.top_level_classes:
- call_name = self.modpfx() + v.node.name
- elif v.node.name in self.imported_classes:
- call_name = self.imported_classes[v.node.name] + '.' + v.node.name
- elif v.node.name in PYJSLIB_BUILTIN_FUNCTIONS:
- call_name = 'pyjslib.' + v.node.name
- elif v.node.name in PYJSLIB_BUILTIN_CLASSES:
- name = pyjs_builtin_remap(v.node.name)
- call_name = 'pyjslib.' + name
- elif v.node.name == "callable":
- call_name = "pyjslib.isFunction"
- call_name = v.node.name
- elif isinstance(v.node, ast.Getattr):
- attr_name = v.node.attrname
- if isinstance(v.node.expr, ast.Name):
- call_name = self._name2(v.node.expr, current_klass, attr_name)
- elif isinstance(v.node.expr, ast.Getattr):
- call_name = self._getattr2(v.node.expr, current_klass, attr_name)
- elif isinstance(v.node.expr, ast.CallFunc):
- call_name = self._callfunc(v.node.expr, current_klass) + "." + v.node.attrname
- elif isinstance(v.node.expr, ast.Subscript):
- call_name = self._subscript(v.node.expr, current_klass) + "." + v.node.attrname
- elif isinstance(v.node.expr, ast.Const):
- call_name = self.expr(v.node.expr, current_klass) + "." + v.node.attrname
- raise TranslationError("unsupported type (in _callfunc)", v.node.expr)
- raise TranslationError("unsupported type (in _callfunc)", v.node)
- call_name = strip_py(call_name)
- star_arg_name = self.expr(v.star_args, current_klass)
- if isinstance(ch4, ast.Keyword):
- kwarg = ch4.name + ":" + self.expr(ch4.expr, current_klass)
- arg = self.expr(ch4, current_klass)
- fn_args = ", ".join(['{' + ', '.join(kwargs) + '}']+call_args)
- fn_args = ", ".join(call_args)
- if kwargs or star_arg_name:
- call_this, method_name = call_name.rsplit(".", 1)
- # Must be a function call ...
- return ("pyjs_kwargs_function_call("+call_name+", " +
- star_arg_name + ", ["+fn_args+"]" + ")")
- return ("pyjs_kwargs_method_call("+call_this+", '"+method_name+"', " +
- star_arg_name + ", ["+fn_args+"]" + ")")
- return call_name + "(" + ", ".join(call_args) + ")"
- def _print(self, node, current_klass):
- arg = self.expr(ch4, current_klass)
- self.printo("pyjslib.printFunc([", ', '.join(call_args), "],", int(isinstance(node, ast.Printnl)), ");")
- def _tryExcept(self, node, current_klass):
- if len(node.handlers) != 1:
- raise TranslationError("except statements in this form are" +
- " not supported", node)
- expr = node.handlers[0][0]
- as_ = node.handlers[0][1]
- # XXX TODO: check that this should instead be added as a _separate_
- # local scope, temporary to the function. oh dearie me.
- self.add_local_arg(errName)
- for stmt in node.body.nodes:
- self._stmt(stmt, current_klass)
- self.printo(" } catch(%s) {" % errName)
- if isinstance(expr, ast.Tuple):
- k.append("(%(err)s.__name__ == %(expr)s.__name__)" % dict(err=errName, expr=self.expr(x, current_klass)))
- k = [" (%(err)s.__name__ == %(expr)s.__name__) " % dict(err=errName, expr=self.expr(expr, current_klass))]
- self.printo(" if(%s) {" % '||\n\t\t'.join(k))
- for stmt in node.handlers[0][2]:
- self._stmt(stmt, current_klass)
- # self.printo("} else { throw(%s); } " % errName)
- if node.else_ is not None:
- self.printo(" } finally {")
- for stmt in node.else_:
- self._stmt(stmt, current_klass)
- # XXX: change use_getattr to True to enable "strict" compilation
- # but incurring a 100% performance penalty. oops.
- def _getattr(self, v, current_klass, use_getattr=False):
- if isinstance(v.expr, ast.Name):
- obj = self._name(v.expr, current_klass, return_none_for_module=True)
- if obj is None and v.expr.name in self.module_imports():
- # XXX TODO: distinguish between module import classes
- # and variables. right now, this is a hack to get
- # the sys module working.
- # if v.expr.name == 'sys':
- return v.expr.name+'.'+attr_name
- # return v.expr.name+'.__'+attr_name+'.prototype.__class__'
- if not use_getattr or attr_name == '__class__' or \
- attr_name == '__name__':
- return obj + "." + attr_name
- return "pyjslib.getattr(%s, '%s')" % (obj, attr_name)
- elif isinstance(v.expr, ast.Getattr):
- return self._getattr(v.expr, current_klass) + "." + attr_name
- elif isinstance(v.expr, ast.Subscript):
- return self._subscript(v.expr, self.modpfx()) + "." + attr_name
- elif isinstance(v.expr, ast.CallFunc):
- return self._callfunc(v.expr, self.modpfx()) + "." + attr_name
- raise TranslationError("unsupported type (in _getattr)", v.expr)
- return strip_py(self.module_prefix)
- def _name(self, v, current_klass, top_level=False,
- return_none_for_module=False):
- if v.name == 'ilikesillynamesfornicedebugcode':
- print(top_level, current_klass, repr(v))
- print(self.top_level_vars)
- print(self.top_level_functions)
- print(self.local_arg_stack)
- las = len(self.local_arg_stack)
- local_var_names = self.local_arg_stack[-1]
- elif v.name == "False":
- elif v.name == '__name__' and current_klass is None:
- return self.modpfx() + v.name
- elif v.name == self.method_self:
- elif v.name in self.top_level_functions:
- return UU+self.modpfx() + v.name
- elif v.name in self.method_imported_globals:
- return UU+self.modpfx() + v.name
- elif not current_klass and las == 1 and v.name in self.top_level_vars:
- return UU+self.modpfx() + v.name
- elif v.name in local_var_names:
- elif v.name in self.imported_classes:
- return UU+self.imported_classes[v.name] + '.__' + v.name + ".prototype.__class__"
- elif v.name in self.top_level_classes:
- return UU+self.modpfx() + "__" + v.name + ".prototype.__class__"
- elif v.name in self.module_imports() and return_none_for_module:
- elif v.name in PYJSLIB_BUILTIN_CLASSES:
- return "pyjslib." + pyjs_builtin_remap(v.name)
- if v.name not in local_var_names and \
- v.name not in self.top_level_vars and \
- v.name not in PYJS_GLOBAL_VARS and \
- v.name not in self.top_level_functions:
- cls_name = current_klass
- if hasattr(cls_name, "name"):
- cls_name_ = cls_name.name_
- cls_name = cls_name.name
- cls_name_ = current_klass + "_" # XXX ???
- name = UU+cls_name_ + ".prototype.__class__." + v.name
- if v.name == 'listener':
- name = 'listener+' + name
- def _name2(self, v, current_klass, attr_name):
- if obj in self.method_imported_globals:
- call_name = UU+self.modpfx() + obj + "." + attr_name
- elif obj in self.imported_classes:
- # if attr_name != "__init__":
- attr_str = ".prototype.__class__." + attr_name
- call_name = UU+self.imported_classes[obj] + '.__' + obj + attr_str
- elif obj in self.module_imports():
- call_name = obj + "." + attr_name
- elif obj[0] == obj[0].upper(): # XXX HACK ALERT
- call_name = UU + self.modpfx() + "__" + obj + ".prototype.__class__." + attr_name
- call_name = UU+self._name(v, current_klass) + "." + attr_name
- def _getattr2(self, v, current_klass, attr_name):
- if isinstance(v.expr, ast.Getattr):
- call_name = self._getattr2(v.expr, current_klass, v.attrname + "." + attr_name)
- elif isinstance(v.expr, ast.Name) and v.expr.name in self.module_imports():
- call_name = UU+v.expr.name + '.__' + v.attrname+".prototype.__class__."+attr_name
- obj = self.expr(v.expr, current_klass)
- call_name = obj + "." + v.attrname + "." + attr_name
- def _class(self, node):
- Handle a class definition.
- In order to translate python semantics reasonably well, the following
- A special object is created for the class, which inherits attributes
- from the superclass, or Object if there's no superclass. This is the
- class object; the object which you refer to when specifying the
- class by name. Static, class, and unbound methods are copied
- from the superclass object.
- A special constructor function is created with the same name as the
- class, which is used to create instances of that class.
- A javascript class (e.g. a function with a prototype attribute) is
- created which is the javascript class of created instances, and
- which inherits attributes from the class object. Bound methods are
- copied from the superclass into this class rather than inherited,
- because the class object contains unbound, class, and static methods
- that we don't necessarily want to inherit.
- The type of a method can now be determined by inspecting its
- static_method, unbound_method, class_method, or instance_method
- attribute; only one of these should be true.
- Much of this work is done in pyjs_extend, is pyjslib.py
- class_name = self.modpfx() + uuprefix(node.name, 1)
- class_name_ = self.modpfx() + uuprefix(node.name)
- current_klass = Klass(class_name, class_name_)
- for child in node.code:
- if isinstance(child, ast.Function):
- current_klass.add_function(child.name)
- if child.name == "__init__":
- if len(node.bases) == 0:
- base_class = "pyjslib.__Object"
- elif len(node.bases) == 1:
- if isinstance(node.bases[0], ast.Name):
- if node.bases[0].name in self.imported_classes:
- base_class_ = self.imported_classes[node.bases[0].name] + '.__' + node.bases[0].name
- base_class = self.imported_classes[node.bases[0].name] + '.' + node.bases[0].name
- base_class_ = self.modpfx() + "__" + node.bases[0].name
- base_class = self.modpfx() + node.bases[0].name
- elif isinstance(node.bases[0], ast.Getattr):
- # the bases are not in scope of the class so do not
- # pass our class to self._name
- base_class_ = self._name(node.bases[0].expr, None) + \
- ".__" + node.bases[0].attrname
- self._name(node.bases[0].expr, None) + \
- "." + node.bases[0].attrname
- raise TranslationError("unsupported type (in _class)", node.bases[0])
- current_klass.set_base(base_class)
- raise TranslationError("more than one base (in _class)", node)
- self.printo(UU+class_name_ + " = function () {")
- # call superconstructor
- # self.printo(" __" + base_class + ".call(this);")
- init_method = ast.Function([], "__init__", ["self"], [], 0, None, [])
- # self._method(init_method, current_klass, class_name)
- # Generate a function which constructs the object
- clsfunc = ast.Function(
- init_method.argnames[1:],
- [ast.Discard(ast.CallFunc(ast.Name("JS"), [ast.Const(
- # I attempted lazy initialization, but then you can't access static class members
- # " if(!__"+base_class+".__was_initialized__)"+
- # " __" + class_name + "_initialize();\n" +
- " var instance = new " + UU + class_name_ + "();\n" +
- " if(instance.__init__) instance.__init__.apply(instance, arguments);\n" +
- self._function(clsfunc, False)
- self.printo(UU+class_name_ + ".__initialize__ = function () {")
- self.printo(" if("+UU+class_name_+".__was_initialized__) return;")
- self.printo(" "+UU+class_name_+".__was_initialized__ = true;")
- cls_obj = UU+class_name_ + '.prototype.__class__'
- if class_name == "pyjslib.__Object":
- self.printo(" "+cls_obj+" = {};")
- if base_class and base_class not in ("object", "pyjslib.__Object"):
- self.printo(" if(!"+UU+base_class_+".__was_initialized__)")
- self.printo(" "+UU+base_class_+".__initialize__();")
- self.printo(" pyjs_extend(" + UU+class_name_ + ", "+UU+base_class_+");")
- self.printo(" pyjs_extend(" + UU+class_name_ + ", "+UU+"pyjslib.__Object);")
- self.printo(" "+cls_obj+".__new__ = "+UU+class_name+";")
- self.printo(" "+cls_obj+".__name__ = '"+UU+node.name+"';")
- for child in node.code:
- if isinstance(child, ast.Pass):
- elif isinstance(child, ast.Function):
- self._method(child, current_klass, class_name, class_name_)
- elif isinstance(child, ast.Assign):
- self.classattr(child, current_klass)
- elif isinstance(child, ast.Discard) and isinstance(child.expr, ast.Const):
- # Probably a docstring, turf it
- raise TranslationError("unsupported type (in _class)", child)
- self.printo(class_name_+".__initialize__();")
- def classattr(self, node, current_klass):
- self._assign(node, current_klass, True)
- def _raise(self, node, current_klass):
- raise TranslationError("More than one expression unsupported",
- self.printo("throw (%s);" % self.expr(
- node.expr1, current_klass))
- def _method(self, node, current_klass, class_name, class_name_):
- # reset global var scope
- self.method_imported_globals = set()
- arg_names = list(node.argnames)
- for d in node.decorators:
- if d.name == "classmethod":
- elif d.name == "staticmethod":
- staticfunc = ast.Function([], class_name_+"."+node.name, node.argnames, node.defaults, node.flags, node.doc, node.code, node.lineno)
- self._function(staticfunc, True)
- self.printo(" " + UU+class_name_ + ".prototype.__class__." + node.name + " = " + class_name_+"."+node.name+";")
- self.printo(" " + UU+class_name_ + ".prototype.__class__." + node.name + ".static_method = true;")
- if len(arg_names) == 0:
- raise TranslationError("methods must take an argument 'self' (in _method)", node)
- self.method_self = arg_names[0]
- # if not classmethod and arg_names[0] != "self":
- # raise TranslationError("first arg not 'self' (in _method)", node)
- normal_arg_names = arg_names[1:]
- kwargname = normal_arg_names.pop()
- varargname = normal_arg_names.pop()
- declared_arg_names = list(normal_arg_names)
- declared_arg_names.append(kwargname)
- function_args = "(" + ", ".join(declared_arg_names) + ")"
- fexpr = UU + class_name_ + ".prototype.__class__." + node.name
- fexpr = UU + class_name_ + ".prototype." + node.name
- self.printo(" "+fexpr + " = function" + function_args + " {")
- self._default_args_handler(node, normal_arg_names, current_klass)
- local_arg_names = normal_arg_names + declared_arg_names
- self._varargs_handler(node, varargname, declared_arg_names, current_klass)
- local_arg_names.append(varargname)
- # stack of local variable names for this function call
- self.local_arg_stack.append(local_arg_names)
- for child in node.code:
- self._stmt(child, current_klass)
- # remove the top local arg names
- self.local_arg_stack.pop()
- self._kwargs_parser(node, fexpr, normal_arg_names, current_klass)
- # Have to create a version on the instances which automatically passes the
- altexpr = UU + class_name_ + ".prototype." + node.name
- self.printo(" "+altexpr + " = function() {")
- self.printo(" return " + fexpr + ".apply(this.__class__, arguments);")
- self.printo(" "+fexpr+".class_method = true;")
- self.printo(" "+altexpr+".instance_method = true;")
- # For instance methods, we need an unbound version in the class object
- altexpr = UU + class_name_ + ".prototype.__class__." + node.name
- self.printo(" "+altexpr + " = function() {")
- self.printo(" return " + fexpr + ".call.apply("+fexpr+", arguments);")
- self.printo(" "+altexpr+".unbound_method = true;")
- self.printo(" "+fexpr+".instance_method = true;")
- self.printo(" "+altexpr+".__name__ = '%s';" % node.name)
- self.printo(UU + class_name_ + ".prototype.%s.__name__ = '%s';" %
- (node.name, node.name))
- if node.kwargs or len(node.defaults):
- self.printo(" "+altexpr + ".parse_kwargs = " + fexpr + ".parse_kwargs;")
- self.method_self = None
- self.method_imported_globals = set()
- def _isNativeFunc(self, node):
- if isinstance(node, ast.Discard):
- if isinstance(node.expr, ast.CallFunc):
- if isinstance(node.expr.node, ast.Name) and \
- node.expr.node.name == NATIVE_JS_FUNC_NAME:
- def _stmt(self, node, current_klass):
- debugStmt = self.debug and not self._isNativeFunc(node)
- if isinstance(node, ast.Return):
- self._return(node, current_klass)
- elif isinstance(node, ast.Break):
- self._break(node, current_klass)
- elif isinstance(node, ast.Continue):
- self._continue(node, current_klass)
- elif isinstance(node, ast.Assign):
- self._assign(node, current_klass)
- elif isinstance(node, ast.AugAssign):
- self._augassign(node, current_klass)
- elif isinstance(node, ast.Discard):
- self._discard(node, current_klass)
- elif isinstance(node, ast.If):
- self._if(node, current_klass)
- elif isinstance(node, ast.For):
- self._for(node, current_klass)
- elif isinstance(node, ast.While):
- self._while(node, current_klass)
- elif isinstance(node, ast.Subscript):
- self._subscript_stmt(node, current_klass)
- elif isinstance(node, ast.Global):
- self._global(node, current_klass)
- elif isinstance(node, ast.Pass):
- elif isinstance(node, ast.Function):
- self._function(node, True)
- elif isinstance(node, ast.Printnl):
- self._print(node, current_klass)
- elif isinstance(node, ast.Print):
- self._print(node, current_klass)
- elif isinstance(node, ast.TryExcept):
- self._tryExcept(node, current_klass)
- elif isinstance(node, ast.Raise):
- self._raise(node, current_klass)
- raise TranslationError("unsupported type (in _stmt)", node)
- lt = self.get_line_trace(node)
- isHaltFunction = self.module_prefix + "IsHaltException"
- ' if (' + isHaltFunction + '(__err.name)) {',
- ' st = sys.printstack() + ' + '"%s"' % lt + "+ '\\n' ;"
- ' alert("' + 'Error in ' + lt + '"' +
- '+"\\n"+__err.name+": "+__err.message' +
- '+"\\n\\nStack trace:\\n"' + '+st' + ');',
- ' throw new ' + self.module_prefix + 'HaltException();',
- def get_line_trace(self, node):
- if hasattr(node, "lineno"):
- if node.lineno is not None:
- srcLine = self.src[min(lineNum, len(self.src))-1]
- srcLine = srcLine.replace('\\', '\\\\')
- srcLine = srcLine.replace('"', '\\"')
- srcLine = srcLine.replace("'", "\\'")
- return self.raw_module_name + ".py, line " \
- def _augassign(self, node, current_klass):
- if isinstance(v, ast.Getattr):
- # XXX HACK! don't allow += on return result of getattr.
- # TODO: create a temporary variable or something.
- lhs = self._getattr(v, current_klass, False)
- lhs = self._name(node.node, current_klass)
- rhs = self.expr(node.expr, current_klass)
- self.printo(" " + lhs + " " + op + " " + rhs + ";")
- def _assign(self, node, current_klass, top_level=False):
- if len(node.nodes) != 1:
- tempvar = '__temp'+str(node.lineno)
- tnode = ast.Assign([ast.AssName(tempvar, "OP_ASSIGN", node.lineno)], node.expr, node.lineno)
- self._assign(tnode, current_klass, top_level)
- tnode2 = ast.Assign([v], ast.Name(tempvar, node.lineno), node.lineno)
- self._assign(tnode2, current_klass, top_level)
- if len(self.local_arg_stack) > 0:
- local_var_names = self.local_arg_stack[-1]
- def _lhsFromAttr(v, current_klass):
- if isinstance(v.expr, ast.Name):
- lhs = self._name(v.expr, current_klass) + "." + attr_name
- elif isinstance(v.expr, ast.Getattr):
- lhs = self._getattr(v, current_klass)
- elif isinstance(v.expr, ast.Subscript):
- lhs = self._subscript(v.expr, current_klass) + "." + attr_name
- raise TranslationError("unsupported type (in _assign)", v.expr)
- def _lhsFromName(v, top_level, current_klass):
- lhs = UU+current_klass.name_ + ".prototype.__class__." \
- self.top_level_vars.add(v.name)
- vname = self.modpfx() + v.name
- if not self.modpfx() and v.name not in\
- self.method_imported_globals:
- self.add_local_arg(v.name)
- if v.name in local_var_names:
- elif v.name in self.method_imported_globals:
- lhs = self.modpfx() + v.name
- self.add_local_arg(v.name)
- if isinstance(v, ast.AssAttr):
- lhs = _lhsFromAttr(v, current_klass)
- if v.flags == "OP_ASSIGN":
- raise TranslationError("unsupported flag (in _assign)", v)
- elif isinstance(v, ast.AssName):
- lhs = _lhsFromName(v, top_level, current_klass)
- if v.flags == "OP_ASSIGN":
- raise TranslationError("unsupported flag (in _assign)", v)
- elif isinstance(v, ast.Subscript):
- if v.flags == "OP_ASSIGN":
- obj = self.expr(v.expr, current_klass)
- raise TranslationError("must have one sub (in _assign)", v)
- idx = self.expr(v.subs[0], current_klass)
- value = self.expr(node.expr, current_klass)
- self.printo(" " + obj + ".__setitem__(" + idx + ", " + value + ");")
- raise TranslationError("unsupported flag (in _assign)", v)
- elif isinstance(v, (ast.AssList, ast.AssTuple)):
- uniqueID = self.nextTupleAssignID
- self.nextTupleAssignID += 1
- tempName = "__tupleassign" + str(uniqueID) + "__"
- self.printo(" var " + tempName + " = " + self.expr(node.expr, current_klass) + ";")
- for index, child in enumerate(v.getChildNodes()):
- rhs = tempName + ".__getitem__(" + str(index) + ")"
- if isinstance(child, ast.AssAttr):
- lhs = _lhsFromAttr(child, current_klass)
- elif isinstance(child, ast.AssName):
- lhs = _lhsFromName(child, top_level, current_klass)
- elif isinstance(child, ast.Subscript):
- if child.flags == "OP_ASSIGN":
- obj = self.expr(child.expr, current_klass)
- if len(child.subs) != 1:
- raise TranslationError("must have one sub " +
- idx = self.expr(child.subs[0], current_klass)
- value = self.expr(node.expr, current_klass)
- self.printo(" " + obj + ".__setitem__(" + idx + ", " + rhs + ");")
- self.printo(" " + lhs + " = " + rhs + ";")
- raise TranslationError("unsupported type (in _assign)", v)
- rhs = self.expr(node.expr, current_klass)
- print("b", repr(node.expr), rhs)
- self.printo(" " + lhs + " " + op + " " + rhs + ";")
- def _discard(self, node, current_klass):
- if isinstance(node.expr, ast.CallFunc):
- debugStmt = self.debug and not self._isNativeFunc(node)
- if debugStmt and isinstance(node.expr.node, ast.Name) and \
- node.expr.node.name == 'import_wait':
- st = self.get_line_trace(node)
- self.printo("sys.addstack('%s');\n" % st)
- if isinstance(node.expr.node, ast.Name) and node.expr.node.name == NATIVE_JS_FUNC_NAME:
- if len(node.expr.args) != 1:
- raise TranslationError("native javascript function %s must have one arg" % NATIVE_JS_FUNC_NAME, node.expr)
- if not isinstance(node.expr.args[0], ast.Const):
- raise TranslationError("native javascript function %s must have constant arg" % NATIVE_JS_FUNC_NAME, node.expr)
- raw_js = node.expr.args[0].value
- expr = self._callfunc(node.expr, current_klass)
- self.printo(" " + expr + ";")
- self.printo("sys.popstack();\n")
- elif isinstance(node.expr, ast.Const):
- if node.expr.value is not None: # Empty statements generate ignore None
- self.printo(self._const(node.expr))
- raise TranslationError("unsupported type (in _discard)", node.expr)
- def _if(self, node, current_klass):
- for i in range(len(node.tests)):
- test, consequence = node.tests[i]
- self._if_test(keyword, test, consequence, current_klass)
- consequence = node.else_
- self._if_test(keyword, test, consequence, current_klass)
- def _if_test(self, keyword, test, consequence, current_klass):
- expr = self.expr(test, current_klass)
- self.printo(" " + keyword + " (pyjslib.bool(" + expr + ")) {")
- self.printo(" " + keyword + " {")
- if isinstance(consequence, ast.Stmt):
- for child in consequence.nodes:
- self._stmt(child, current_klass)
- raise TranslationError("unsupported type (in _if_test)", consequence)
- for name in node.names:
- # look up "hack" in AppTranslator as to how findFile gets here
- module_name = node.modname + "." + name[0]
- ff = self.findFile(module_name + ".py")
- self.add_imported_module(module_name)
- self.imported_classes[name[0]] = node.modname
- def _compare(self, node, current_klass):
- lhs = self.expr(node.expr, current_klass)
- raise TranslationError("only one ops supported (in _compare)", node)
- rhs_node = node.ops[0][1]
- rhs = self.expr(rhs_node, current_klass)
- return "pyjslib.eq(%s, %s)" % (lhs, rhs)
- return rhs + ".__contains__(" + lhs + ")"
- return "!" + rhs + ".__contains__(" + lhs + ")"
- return "(" + lhs + " " + op + " " + rhs + ")"
- def _not(self, node, current_klass):
- expr = self.expr(node.expr, current_klass)
- return "!(" + expr + ")"
- def _or(self, node, current_klass):
- expr = "("+(") || (".join([self.expr(child, current_klass) for child in node.nodes]))+')'
- def _and(self, node, current_klass):
- expr = "("+(") && (".join([self.expr(child, current_klass) for child in node.nodes]))+")"
- def _for(self, node, current_klass):
- # based on Bob Ippolito's Iteration in Javascript code
- if isinstance(node.assign, ast.AssName):
- assign_name = node.assign.name
- self.add_local_arg(assign_name)
- if node.assign.flags == "OP_ASSIGN":
- elif isinstance(node.assign, ast.AssTuple):
- for child in node.assign:
- child_name = child.name
- assign_name = "temp_" + child_name
- self.add_local_arg(child_name)
- var %(child_name)s %(op)s %(assign_name)s.__getitem__(%(i)i);
- raise TranslationError("unsupported type (in _for)", node.assign)
- if isinstance(node.list, ast.Name):
- list_expr = self._name(node.list, current_klass)
- elif isinstance(node.list, ast.Getattr):
- list_expr = self._getattr(node.list, current_klass)
- elif isinstance(node.list, ast.CallFunc):
- list_expr = self._callfunc(node.list, current_klass)
- raise TranslationError("unsupported type (in _for)", node.list)
- lhs = "var " + assign_name
- iterator_name = "__" + assign_name
- "iterator_name": iterator_name,
- "list_expr": list_expr,
- "assign_tuple": assign_tuple,
- var %(iterator_name)s = %(list_expr)s.__iter__();
- %(lhs)s %(op)s %(iterator_name)s.next();
- for n in node.body.nodes:
- self._stmt(n, current_klass)
- if (e.__name__ != pyjslib.StopIteration.__name__) {
- def _while(self, node, current_klass):
- test = self.expr(node.test, current_klass)
- self.printo(" while (pyjslib.bool(" + test + ")) {")
- if isinstance(node.body, ast.Stmt):
- for child in node.body.nodes:
- self._stmt(child, current_klass)
- raise TranslationError("unsupported type (in _while)", node.body)
- def _const(self, node):
- if isinstance(node.value, int):
- elif isinstance(node.value, float):
- elif isinstance(node.value, basestring):
- if isinstance(node.value, text):
- return "String('%s')" % escapejs(v)
- elif node.value is None:
- raise TranslationError("unsupported type (in _const)", node)
- def _unaryadd(self, node, current_klass):
- return self.expr(node.expr, current_klass)
- def _unarysub(self, node, current_klass):
- return "-" + self.expr(node.expr, current_klass)
- def _add(self, node, current_klass):
- return self.expr(node.left, current_klass) + " + " + self.expr(node.right, current_klass)
- def _sub(self, node, current_klass):
- return self.expr(node.left, current_klass) + " - " + self.expr(node.right, current_klass)
- def _div(self, node, current_klass):
- return self.expr(node.left, current_klass) + " / " + self.expr(node.right, current_klass)
- def _mul(self, node, current_klass):
- return self.expr(node.left, current_klass) + " * " + self.expr(node.right, current_klass)
- def _mod(self, node, current_klass):
- if isinstance(node.left, ast.Const) and isinstance(node.left.value, str):
- self.imported_js.add("sprintf.js") # Include the sprintf functionality if it is used
- return "sprintf("+self.expr(node.left, current_klass) + ", " + self.expr(node.right, current_klass)+")"
- return self.expr(node.left, current_klass) + " % " + self.expr(node.right, current_klass)
- def _invert(self, node, current_klass):
- return "~" + self.expr(node.expr, current_klass)
- def _bitand(self, node, current_klass):
- return " & ".join([self.expr(child, current_klass) for child in node.nodes])
- def _bitshiftleft(self, node, current_klass):
- return self.expr(node.left, current_klass) + " << " + self.expr(node.right, current_klass)
- def _bitshiftright(self, node, current_klass):
- return self.expr(node.left, current_klass) + " >>> " + self.expr(node.right, current_klass)
- def _bitxor(self, node, current_klass):
- return " ^ ".join([self.expr(child, current_klass) for child in node.nodes])
- def _bitor(self, node, current_klass):
- return " | ".join([self.expr(child, current_klass) for child in node.nodes])
- def _subscript(self, node, current_klass):
- if node.flags == "OP_APPLY":
- if len(node.subs) == 1:
- return self.expr(node.expr, current_klass) + ".__getitem__(" + self.expr(node.subs[0], current_klass) + ")"
- raise TranslationError("must have one sub (in _subscript)", node)
- raise TranslationError("unsupported flag (in _subscript)", node)
- def _subscript_stmt(self, node, current_klass):
- if node.flags == "OP_DELETE":
- self.printo(" " + self.expr(node.expr, current_klass) + ".__delitem__(" + self.expr(node.subs[0], current_klass) + ");")
- raise TranslationError("unsupported flag (in _subscript)", node)
- def _list(self, node, current_klass):
- return "new pyjslib.List([" + ", ".join([self.expr(x, current_klass) for x in node.nodes]) + "])"
- def _dict(self, node, current_klass):
- key = self.expr(x[0], current_klass)
- value = self.expr(x[1], current_klass)
- items.append("[" + key + ", " + value + "]")
- return "new pyjslib.Dict([" + ", ".join(items) + "])"
- def _tuple(self, node, current_klass):
- return "new pyjslib.Tuple([" + ", ".join([self.expr(x, current_klass) for x in node.nodes]) + "])"
- def _lambda(self, node, current_klass):
- raise TranslationError("varargs are not supported in Lambdas", node)
- raise TranslationError("kwargs are not supported in Lambdas", node)
- arg_names = list(node.argnames)
- function_args = ", ".join(arg_names)
- for child in node.getChildNodes():
- expr = self.expr(child, None)
- print("function (%s){" % function_args, file=res)
- self._default_args_handler(node, arg_names, None,
- print('return %s;}' % expr, file=res)
- def _slice(self, node, current_klass):
- if node.flags == "OP_APPLY":
- if node.lower is not None:
- lower = self.expr(node.lower, current_klass)
- if node.upper is not None:
- upper = self.expr(node.upper, current_klass)
- return "pyjslib.slice(" + self.expr(node.expr, current_klass) + ", " + lower + ", " + upper + ")"
- raise TranslationError("unsupported flag (in _slice)", node)
- def _global(self, node, current_klass):
- for name in node.names:
- self.method_imported_globals.add(name)
- def expr(self, node, current_klass):
- if isinstance(node, ast.Const):
- return self._const(node)
- # @@@ not sure if the parentheses should be here or in individual operator functions - JKT
- elif isinstance(node, ast.Mul):
- return " ( " + self._mul(node, current_klass) + " ) "
- elif isinstance(node, ast.Add):
- return " ( " + self._add(node, current_klass) + " ) "
- elif isinstance(node, ast.Sub):
- return " ( " + self._sub(node, current_klass) + " ) "
- elif isinstance(node, ast.Div):
- return " ( " + self._div(node, current_klass) + " ) "
- elif isinstance(node, ast.Mod):
- return self._mod(node, current_klass)
- elif isinstance(node, ast.UnaryAdd):
- return self._unaryadd(node, current_klass)
- elif isinstance(node, ast.UnarySub):
- return self._unarysub(node, current_klass)
- elif isinstance(node, ast.Not):
- return self._not(node, current_klass)
- elif isinstance(node, ast.Or):
- return self._or(node, current_klass)
- elif isinstance(node, ast.And):
- return self._and(node, current_klass)
- elif isinstance(node, ast.Invert):
- return self._invert(node, current_klass)
- elif isinstance(node, ast.Bitand):
- return "("+self._bitand(node, current_klass)+")"
- elif isinstance(node, ast.LeftShift):
- return self._bitshiftleft(node, current_klass)
- elif isinstance(node, ast.RightShift):
- return self._bitshiftright(node, current_klass)
- elif isinstance(node, ast.Bitxor):
- return "("+self._bitxor(node, current_klass)+")"
- elif isinstance(node, ast.Bitor):
- return "("+self._bitor(node, current_klass)+")"
- elif isinstance(node, ast.Compare):
- return self._compare(node, current_klass)
- elif isinstance(node, ast.CallFunc):
- return self._callfunc(node, current_klass)
- elif isinstance(node, ast.Name):
- return self._name(node, current_klass)
- elif isinstance(node, ast.Subscript):
- return self._subscript(node, current_klass)
- elif isinstance(node, ast.Getattr):
- return self._getattr(node, current_klass)
- elif isinstance(node, ast.List):
- return self._list(node, current_klass)
- elif isinstance(node, ast.Dict):
- return self._dict(node, current_klass)
- elif isinstance(node, ast.Tuple):
- return self._tuple(node, current_klass)
- elif isinstance(node, ast.Slice):
- return self._slice(node, current_klass)
- elif isinstance(node, ast.Lambda):
- return self._lambda(node, current_klass)
- raise TranslationError("unsupported type (in expr)", node)
-def translate(file_name, module_name, debug=False):
- f = open(file_name, "r")
- mod = compiler.parseFile(file_name)
- Translator(module_name, module_name, module_name, src, debug, mod, output)
- return output.getvalue()
-class PlatformParser(object):
- def __init__(self, platform_dir="", verbose=True):
- self.platform_dir = platform_dir
- def setPlatform(self, platform):
- self.platform = platform
- def parseModule(self, module_name, file_name):
- if file_name not in self.parse_cache:
- mod = compiler.parseFile(file_name)
- self.parse_cache[file_name] = mod
- mod = self.parse_cache[file_name]
- platform_file_name = self.generatePlatformFilename(file_name)
- if self.platform and os.path.isfile(platform_file_name):
- mod = copy.deepcopy(mod)
- mod_override = compiler.parseFile(platform_file_name)
- self.merge(mod, mod_override)
- print("Importing %s (Platform %s)" % (module_name, self.platform))
- print("Importing %s" % (module_name))
- def generatePlatformFilename(self, file_name):
- (module_name, extension) = os.path.splitext(os.path.basename(file_name))
- platform_file_name = module_name + self.platform + extension
- return os.path.join(os.path.dirname(file_name), self.platform_dir, platform_file_name)
- def merge(self, tree1, tree2):
- for child in tree2.node:
- if isinstance(child, ast.Function):
- self.replaceFunction(tree1, child.name, child)
- elif isinstance(child, ast.Class):
- self.replaceClassMethods(tree1, child.name, child)
- def replaceFunction(self, tree, function_name, function_node):
- # find function to replace
- for child in tree.node:
- if isinstance(child, ast.Function) and child.name == function_name:
- self.copyFunction(child, function_node)
- raise TranslationError("function not found: " + function_name, function_node)
- def replaceClassMethods(self, tree, class_name, class_node):
- # find class to replace
- for child in tree.node:
- if isinstance(child, ast.Class) and child.name == class_name:
- raise TranslationError("class not found: " + class_name, class_node)
- for function_node in class_node.code:
- if isinstance(function_node, ast.Function):
- for child in old_class_node.code:
- if isinstance(child, ast.Function) and child.name == function_node.name:
- self.copyFunction(child, function_node)
- raise TranslationError("class method not found: " + class_name + "." + function_node.name, function_node)
- def copyFunction(self, target, source):
- target.code = source.code
- target.argnames = source.argnames
- target.defaults = source.defaults
- target.doc = source.doc # @@@ not sure we need to do this any more
- path, ext = os.path.splitext(fname)
- return path.replace(".", "/") + ext
-class AppTranslator(object):
- def __init__(self, library_dirs=None, parser=None, dynamic=False,
- optimize=False, verbose=True):
- self.optimize = optimize
- self.library_modules = []
- library_dirs = [] if library_dirs is None else library_dirs
- self.library_dirs = path + library_dirs
- self.parser = PlatformParser()
- self.parser.dynamic = dynamic
- def findFile(self, file_name):
- if os.path.isfile(file_name):
- for library_dir in self.library_dirs:
- file_name = dotreplace(file_name)
- full_file_name = os.path.join(
- os.path.abspath(os.path.dirname(__file__)), library_dir, file_name)
- if os.path.isfile(full_file_name):
- fnameinit, _ext = os.path.splitext(file_name)
- fnameinit = fnameinit + "/__init__.py"
- full_file_name = os.path.join(
- os.path.abspath(os.path.dirname(__file__)), library_dir, fnameinit)
- if os.path.isfile(full_file_name):
- raise Exception("file not found: " + file_name)
- def _translate(self, module_name, is_app=True, debug=False,
- if module_name not in self.library_modules:
- self.library_modules.append(module_name)
- file_name = self.findFile(module_name + self.extension)
- f = open(file_name, "r")
- mod, override = self.parser.parseModule(module_name, file_name)
- override_name = "%s.%s" % (self.parser.platform.lower(),
- self.overrides[override_name] = override_name
- t = Translator(mn, module_name, module_name,
- src, debug, mod, output, self.dynamic, self.optimize,
- module_str = output.getvalue()
- if imported_js is None:
- imported_js.update(set(t.imported_js))
- imported_modules_str = ""
- for module in t.imported_modules:
- if module not in self.library_modules:
- self.library_modules.append(module)
- # imported_js.update(set(t.imported_js))
- # imported_modules_str += self._translate(
- # module, False, debug=debug, imported_js=imported_js)
- return imported_modules_str + module_str
- def translate(self, module_name, is_app=True, debug=False,
- self.library_modules = []
- if library_modules is not None:
- for library in library_modules:
- if library.endswith(".js"):
- imported_js.add(library)
- self.library_modules.append(library)
- print('Including LIB', library)
- print('\n//\n// BEGIN LIB '+library+'\n//\n', file=lib_code)
- print(self._translate(library, False, debug=debug, imported_js=imported_js),
- print("/* initialize static library */", file=lib_code)
- print("%s%s();\n" % (UU, library), file=lib_code)
- print('\n//\n// END LIB '+library+'\n//\n', file=lib_code)
- print(self._translate(module_name, is_app, debug=debug, imported_js=imported_js),
- path = self.findFile(js)
- if os.path.isfile(path):
- print('Including JS', js)
- print('\n//\n// BEGIN JS '+js+'\n//\n', file=lib_code)
- print(open(path).read(), file=lib_code)
- print('\n//\n// END JS '+js+'\n//\n', file=lib_code)
- print('Warning: Unable to find imported javascript:', js, file=sys.stderr)
- return lib_code.getvalue(), app_code.getvalue()
- usage: %s file_name [module_name]
- print(usage % sys.argv[0], file=sys.stderr)
- file_name = os.path.abspath(sys.argv[1])
- if not os.path.isfile(file_name):
- print("File not found %s" % file_name, file=sys.stderr)
- module_name = sys.argv[2]
- print(translate(file_name, module_name), end="")
-if __name__ == "__main__":
--- a/svgui/svgui.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-# Copyright (C) 2017: Andrey Skvortsov
-# See COPYING file for copyrights details.
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-from __future__ import absolute_import
-from svgui.pyjs import translate
-import util.paths as paths
-from POULibrary import POULibrary
-from docutil import open_svg
-from py_ext import PythonFileCTNMixin
-class SVGUILibrary(POULibrary):
- def GetLibraryPath(self):
- return paths.AbsNeighbourFile(__file__, "pous.xml")
-class SVGUI(PythonFileCTNMixin):
- "name": _("Import SVG"),
- "tooltip": _("Import SVG"),
- "bitmap": "ImportSVG", # should be something different
- "tooltip": _("Create HMI"),
- "method": "_StartInkscape"
- def _getSVGpath(self, project_path=None):
- if project_path is None:
- project_path = self.CTNPath()
- # define name for SVG file containing gui layout
- return os.path.join(project_path, "gui.svg")
- def _getSVGUIserverpath(self):
- return paths.AbsNeighbourFile(__file__, "svgui_server.py")
- def OnCTNSave(self, from_project_path=None):
- if from_project_path is not None:
- shutil.copyfile(self._getSVGpath(from_project_path),
- return PythonFileCTNMixin.OnCTNSave(self, from_project_path)
- def CTNGenerate_C(self, buildpath, locations):
- Return C code generated by iec2c compiler
- when _generate_softPLC have been called
- @param locations: ignored
- @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
- current_location = self.GetCurrentLocation()
- # define a unique name for the generated C file
- location_str = "_".join(map(str, current_location))
- svgfile = self._getSVGpath()
- if os.path.exists(svgfile):
- res += (("gui.svg", open(svgfile, "rb")),)
- svguiserverfile = open(self._getSVGUIserverpath(), 'r')
- svguiservercode = svguiserverfile.read()
- svguiserverfile.close()
- svguilibpath = os.path.join(self._getBuildPath(), "svguilib.js")
- svguilibfile = open(svguilibpath, 'w')
- fpath = paths.AbsDir(__file__)
- svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "sys.py"), "sys"))
- svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "_pyjs.js"), 'r').read())
- svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "pyjslib.py"), "pyjslib"))
- svguilibfile.write(translate(os.path.join(fpath, "svguilib.py"), "svguilib"))
- svguilibfile.write("pyjslib();\nsvguilib();\n")
- svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "json.js"), 'r').read())
- svguilibfile.write(open(os.path.join(fpath, "livesvg.js"), 'r').read())
- jsmodules = {"LiveSVGPage": "svguilib.js"}
- res += (("svguilib.js", open(svguilibpath, "rb")),)
- runtimefile_path = os.path.join(buildpath, "runtime_%s.py" % location_str)
- runtimefile = open(runtimefile_path, 'w')
- runtimefile.write(svguiservercode % {"svgfile": "gui.svg"})
-def _runtime_%(location)s_start():
- website.LoadHMI(%(svgui_class)s, %(jsmodules)s)
-def _runtime_%(location)s_stop():
- """ % {"location": location_str,
- "svgui_class": "SVGUI_HMI",
- "jsmodules": str(jsmodules)})
- res += (("runtime_%s.py" % location_str, open(runtimefile_path, "rb")),)
- dialog = wx.FileDialog(self.GetCTRoot().AppFrame, _("Choose a SVG file"), os.getcwd(), "", _("SVG files (*.svg)|*.svg|All files|*.*"), wx.OPEN)
- if dialog.ShowModal() == wx.ID_OK:
- svgpath = dialog.GetPath()
- if os.path.isfile(svgpath):
- shutil.copy(svgpath, self._getSVGpath())
- self.GetCTRoot().logger.write_error(_("No such SVG file: %s\n") % svgpath)
- def _StartInkscape(self):
- svgfile = self._getSVGpath()
- if not self.GetCTRoot().CheckProjectPathPerm():
- dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
- _("You don't have write permissions.\nOpen Inkscape anyway ?"),
- wx.YES_NO | wx.ICON_QUESTION)
- open_inkscape = dialog.ShowModal() == wx.ID_YES
- if not os.path.isfile(svgfile):
--- a/svgui/svgui_server.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-# See COPYING file for copyrights details.
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-from __future__ import absolute_import
-from builtins import str as text
-from nevow import tags, loaders
-import simplejson as json # pylint: disable=import-error
-import runtime.NevowServer as NS
-class SvguiWidget(object):
- def __init__(self, classname, id, **kwargs):
- self.classname = classname
- self.attrs = kwargs.copy()
- def setinput(self, attrname, value):
- self.inputs[attrname] = value
- def getinput(self, attrname, default=None):
- if attrname not in self.inputs:
- self.inputs[attrname] = default
- return self.inputs[attrname]
- def setoutput(self, attrname, value):
- if self.outputs.get(attrname) != value:
- self.outputs[attrname] = value
- self.RefreshInterface()
- def updateoutputs(self, **kwargs):
- for attrname, value in kwargs.iteritems():
- if self.outputs.get(attrname) != value:
- self.outputs[attrname] = value
- self.RefreshInterface()
- def RefreshInterface(self):
- interface = website.getHMI()
- if isinstance(interface, SVGUI_HMI) and self.changed and not self.inhibit:
- d = interface.sendData(self)
- d.addCallback(self.InterfaceRefreshed)
- def InterfaceRefreshed(self, result):
- self.RefreshInterface()
-def get_object_init_state(obj):
- # Convert objects to a dictionary of their representation
- attrs = obj.attrs.copy()
- attrs.update(obj.inputs)
- '__class__': obj.classname,
- 'kwargs': json.dumps(attrs),
-def get_object_current_state(obj):
- # Convert objects to a dictionary of their representation
- '__class__': obj.classname,
- 'kwargs': json.dumps(obj.outputs),
-class SVGUI_HMI(website.PLCHMI):
- jsClass = u"LiveSVGPage.LiveSVGWidget"
- docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[
- tags.xml(loaders.xmlfile(os.path.join(NS.WorkingDir, svgfile))),
- def HMIinitialisation(self):
- for gadget in svguiWidgets.values():
- gadgets.append(text(json.dumps(gadget, default=get_object_init_state, indent=2), 'ascii'))
- d = self.callRemote('init', gadgets)
- d.addCallback(self.HMIinitialised)
- def sendData(self, data):
- return self.callRemote('receiveData', text(json.dumps(data, default=get_object_current_state, indent=2), 'ascii'))
- def setattr(self, id, attrname, value):
- svguiWidgets[id].setinput(attrname, value)
-def createSVGUIControl(*args, **kwargs):
- gad = SvguiWidget(args[0], id, **kwargs)
- gadget = [text(json.dumps(gad, default=get_object_init_state, indent=2), 'ascii')]
- interface = website.getHMI()
- if isinstance(interface, SVGUI_HMI) and interface.initialised:
- interface.callRemote('init', gadget)
-def setAttr(id, attrname, value):
- gad = svguiWidgets.get(id, None)
- gad.setoutput(attrname, value)
-def updateAttr(id, **kwargs):
- gad = svguiWidgets.get(id, None)
- gad.updateoutput(**kwargs)
-def getAttr(id, attrname, default=None):
- gad = svguiWidgets.get(id, None)
- return gad.getinput(attrname, default)
--- a/svgui/svguilib.py Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-# See COPYING file for copyrights details.
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# pylint: disable=old-style-class,undefined-variable
- def __init__(self, parent, id, args):
- self.back_elt = getSVGElementById(args.back_id)
- self.sele_elt = getSVGElementById(args.sele_id)
- self.toggle = args.toggle
- self.active = args.active
- if args.state != undefined:
- self.state = args.state
- self.up = not self.state
- # Add event on each element of the button
- self.back_elt.addEventListener("mouseup", self, False)
- self.back_elt.addEventListener("mousedown", self, False)
- self.back_elt.addEventListener("mouseover", self, False)
- self.back_elt.addEventListener("mouseout", self, False)
- self.sele_elt.addEventListener("mouseup", self, False)
- self.sele_elt.addEventListener("mousedown", self, False)
- self.sele_elt.addEventListener("mouseover", self, False)
- self.sele_elt.addEventListener("mouseout", self, False)
- blockSVGElementDrag(self.back_elt)
- blockSVGElementDrag(self.sele_elt)
- # method to display the current state of interface
- def updateElements(self):
- self.sele_elt.setAttribute("display", "none")
- self.back_elt.removeAttribute("display")
- self.sele_elt.removeAttribute("display")
- self.back_elt.setAttribute("display", "none")
- def updateValues(self, values):
- if values.state != self.state:
- self.state = values.state
- self.up = not self.state
- updateAttr(self.id, 'state', self.state)
- def handleEvent(self, evt):
- # Quand le bouton de la souris est presse
- if evt.type == "mousedown":
- updateAttr(self.id, 'state', self.state)
- if isCurrentObject(self) and self.dragging:
- # Quand le bouton est survole
- if evt.type == "mouseover" and self.toggle:
- # Quand le curseur quitte la zone du bouton
- elif evt.type == "mouseout" and self.toggle:
- self.up = not self.state
- # Quand le bouton de la souris est relache
- elif evt.type == "mouseup":
- if self.toggle and self.up == self.state:
- self.state = not self.state
- updateAttr(self.id, 'state', self.state)
- updateAttr(self.id, 'state', self.state)
- def __init__(self, parent, id, args):
- self.back_elt = getSVGElementById(args.back_id)
- if args.text != undefined:
- def updateValues(self, values):
- if values.text != self.value:
- self.text = values.text
- updateAttr(self.id, 'text', self.text)
- def updateElements(self):
- self.back_elt.firstChild.firstChild.textContent = self.text
- def handleEvent(self, evt):
--- a/tests/genericmake/beremiz.xml Fri Oct 01 15:36:09 2021 +0200
+++ b/tests/genericmake/beremiz.xml Fri Oct 01 23:19:04 2021 +0200
@@ -3,5 +3,5 @@
<Generic Command="make -C %(buildpath)s -f ../project_files/Makefile all BEREMIZSRC=%(src)s BEREMIZCFLAGS=%(cflags)s MD5=%(md5)s USE_BEREMIZ=1 FROM_BEREMIZ=1"/>
- <Libraries Enable_Native_Library="false" Enable_Python_Library="false" Enable_SVGUI_Library="false"/>
+ <Libraries Enable_Native_Library="false" Enable_Python_Library="false"/> --- a/tests/svgui/beremiz.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
- <Libraries Enable_SVGUI_Library="true" Enable_Python_Library="true"/>
--- a/tests/svgui/plc.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,485 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
- <fileHeader companyName="beremiz" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19"/>
- <contentHeader name="Beremiz SVGUI Test" modificationDateTime="2018-09-26T13:18:53">
- <pageSize x="1024" y="1024"/>
- <pou name="main_pytest" pouType="program">
- <variable name="counter">
- <variable name="Start_Stop">
- <derived name="Button"/>
- <variable name="Counter_TextCtrl">
- <derived name="TextCtrl"/>
- <variable name="State_LedCtrl">
- <block localId="32" width="80" height="110" typeName="ADD" executionOrderId="0">
- <position x="649" y="285"/>
- <variable formalParameter="EN">
- <relPosition x="0" y="35"/>
- <connection refLocalId="5">
- <position x="649" y="320"/>
- <position x="594" y="320"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="65"/>
- <connection refLocalId="100" formalParameter="OUT">
- <position x="649" y="350"/>
- <position x="474" y="350"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="95"/>
- <connection refLocalId="33">
- <position x="649" y="380"/>
- <position x="629" y="380"/>
- <position x="629" y="418"/>
- <position x="854" y="418"/>
- <position x="854" y="350"/>
- <position x="839" y="350"/>
- <variable formalParameter="ENO">
- <relPosition x="80" y="35"/>
- <variable formalParameter="OUT">
- <relPosition x="80" y="65"/>
- <inOutVariable localId="33" height="35" width="85" executionOrderId="0" negatedOut="false" negatedIn="false">
- <position x="754" y="333"/>
- <relPosition x="0" y="17"/>
- <connection refLocalId="32" formalParameter="OUT">
- <position x="754" y="350"/>
- <position x="729" y="350"/>
- <relPosition x="85" y="17"/>
- <expression>counter</expression>
- <inVariable localId="39" height="35" width="89" executionOrderId="0" negated="false">
- <position x="55" y="333"/>
- <relPosition x="89" y="17"/>
- <expression>BOOL#1</expression>
- <inVariable localId="41" height="30" width="120" executionOrderId="0" negated="false">
- <position x="21" y="619"/>
- <relPosition x="120" y="15"/>
- <expression>'stop_back'</expression>
- <inVariable localId="42" height="30" width="120" executionOrderId="0" negated="false">
- <position x="21" y="661"/>
- <relPosition x="120" y="15"/>
- <expression>'stop_sele'</expression>
- <inVariable localId="46" height="30" width="122" executionOrderId="0" negated="false">
- <position x="694" y="799"/>
- <relPosition x="122" y="15"/>
- <expression>'text_counter'</expression>
- <inVariable localId="51" height="30" width="119" executionOrderId="0" negated="false">
- <position x="692" y="612"/>
- <relPosition x="119" y="15"/>
- <expression>'led_stop'</expression>
- <inVariable localId="52" height="30" width="120" executionOrderId="0" negated="false">
- <position x="691" y="648"/>
- <relPosition x="120" y="15"/>
- <expression>'led_start'</expression>
- <block localId="83" width="145" height="60" typeName="INT_TO_STRING" executionOrderId="0">
- <position x="537" y="856"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="40"/>
- <connection refLocalId="4">
- <position x="537" y="896"/>
- <position x="504" y="896"/>
- <variable formalParameter="OUT">
- <relPosition x="145" y="40"/>
- <block localId="92" width="187" height="230" typeName="Button" instanceName="Start_Stop" executionOrderId="0">
- <position x="201" y="593"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="41"/>
- <connection refLocalId="41">
- <position x="201" y="634"/>
- <position x="141" y="634"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="83"/>
- <connection refLocalId="42">
- <position x="201" y="676"/>
- <position x="141" y="676"/>
- <variable formalParameter="toggle">
- <relPosition x="0" y="125"/>
- <connection refLocalId="93">
- <position x="201" y="718"/>
- <position x="141" y="718"/>
- <variable formalParameter="set_state">
- <relPosition x="0" y="167"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="209"/>
- <variable formalParameter="state_out">
- <relPosition x="187" y="41"/>
- <inVariable localId="93" height="30" width="120" executionOrderId="0" negated="false">
- <position x="21" y="703"/>
- <relPosition x="120" y="15"/>
- <expression>BOOL#1</expression>
- <block localId="94" width="100" height="145" typeName="TextCtrl" instanceName="Counter_TextCtrl" executionOrderId="0">
- <position x="876" y="774"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="40"/>
- <connection refLocalId="46">
- <position x="876" y="814"/>
- <position x="816" y="814"/>
- <variable formalParameter="set_text">
- <relPosition x="0" y="81"/>
- <connection refLocalId="3">
- <position x="876" y="855"/>
- <position x="815" y="855"/>
- <variable formalParameter="text">
- <relPosition x="0" y="122"/>
- <connection refLocalId="83" formalParameter="OUT">
- <position x="876" y="896"/>
- <position x="682" y="896"/>
- <inVariable localId="1" height="30" width="88" executionOrderId="0" negated="false">
- <position x="59" y="272"/>
- <relPosition x="88" y="15"/>
- <expression>BOOL#1</expression>
- <block localId="95" width="100" height="130" typeName="Led" instanceName="State_LedCtrl" executionOrderId="0">
- <position x="876" y="589"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="38"/>
- <connection refLocalId="51">
- <position x="876" y="627"/>
- <position x="811" y="627"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="74"/>
- <connection refLocalId="52">
- <position x="876" y="663"/>
- <position x="811" y="663"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="110"/>
- <connection refLocalId="2">
- <position x="876" y="699"/>
- <position x="811" y="699"/>
- <block localId="96" width="80" height="65" typeName="AND" executionOrderId="0">
- <position x="200" y="234"/>
- <variable formalParameter="IN1" negated="true">
- <relPosition x="0" y="31"/>
- <connection refLocalId="96" formalParameter="OUT">
- <position x="200" y="265"/>
- <position x="175" y="265"/>
- <position x="175" y="219"/>
- <position x="305" y="219"/>
- <position x="305" y="265"/>
- <position x="280" y="265"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="53"/>
- <connection refLocalId="1">
- <position x="200" y="287"/>
- <position x="147" y="287"/>
- <variable formalParameter="OUT">
- <relPosition x="80" y="31"/>
- <connector name="CLOCK" localId="97" height="30" width="90">
- <position x="345" y="250"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="96" formalParameter="OUT">
- <position x="345" y="265"/>
- <position x="280" y="265"/>
- <connector name="COUNT" localId="98" height="30" width="90">
- <position x="461" y="619"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="92" formalParameter="state_out">
- <position x="461" y="634"/>
- <position x="388" y="634"/>
- <continuation name="COUNT" localId="2" height="30" width="120">
- <position x="691" y="684"/>
- <relPosition x="120" y="15"/>
- <inVariable localId="4" height="35" width="85" executionOrderId="0" negated="false">
- <position x="419" y="879"/>
- <relPosition x="85" y="17"/>
- <expression>counter</expression>
- <continuation name="COUNT" localId="5" height="30" width="90">
- <position x="504" y="305"/>
- <relPosition x="90" y="15"/>
- <block localId="99" width="80" height="110" typeName="AND" executionOrderId="0">
- <position x="199" y="308"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="42"/>
- <connection refLocalId="39">
- <position x="199" y="350"/>
- <position x="144" y="350"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="87"/>
- <connection refLocalId="6">
- <position x="199" y="395"/>
- <position x="144" y="395"/>
- <variable formalParameter="OUT">
- <relPosition x="80" y="42"/>
- <continuation name="CLOCK" localId="6" height="30" width="90">
- <position x="54" y="380"/>
- <relPosition x="90" y="15"/>
- <block localId="100" width="125" height="45" typeName="BOOL_TO_INT" executionOrderId="0">
- <position x="349" y="318"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="32"/>
- <connection refLocalId="99" formalParameter="OUT">
- <position x="349" y="350"/>
- <position x="279" y="350"/>
- <variable formalParameter="OUT">
- <relPosition x="125" y="32"/>
- <continuation name="CLOCK" localId="3" height="30" width="122">
- <position x="693" y="840"/>
- <relPosition x="122" y="15"/>
- <comment localId="101" height="197" width="1001">
- <position x="11" y="12"/>
- <xhtml:p><![CDATA[This example shows how IEC program in PLC can interact with web interface.
-svgui is extensions to build web interface to PLC. It has *integrated* web-server. So it's NOT necessary to install Apache, lighttpd or nginx for that!!!
-As the program is running in PLC, web UI will be available at http://localhost:8009/.
-Web interface is build as SVG file in Inkscape. To edit SVG file click 'Inkscape' button in 0x: svgui extension.
-Inkscape is a free and open-source vector graphics editor. It's not part of Beremiz and needs to be installed separately.
- <comment localId="102" height="126" width="641">
- <position x="17" y="441"/>
- <xhtml:p><![CDATA[In this example basic elements like 'Button', 'Led' and 'Text' are used.
-Back_id and sele_id inputs of these blocks are IDs of graphic primitives in SVG file.
-This is the way how elements in SVG are bound to elements in PLC program.
-You can find out or edit these IDs in Inkscape.]]></xhtml:p>
- <configuration name="config">
- <resource name="res_pytest">
- <task name="pytest_task" interval="t#100ms" priority="0"/>
- <pouInstance name="pytest_instance" typeName="main_pytest"/>
--- a/tests/svgui/svgui@svgui/baseconfnode.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="svgui" IEC_Channel="0"/>
--- a/tests/svgui/svgui@svgui/gui.svg Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,723 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
- 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:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- sodipodi:version="0.32"
- inkscape:version="0.47pre4 "
- sodipodi:docname="gui.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:cx="200.66323"
- inkscape:cy="178.08292"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- inkscape:window-width="1071"
- inkscape:window-height="805"
- inkscape:window-x="106"
- inkscape:window-maximized="0" />
- id="linearGradient3770">
- style="stop-color:#008000;stop-opacity:1;"
- style="stop-color:#00fb00;stop-opacity:1;"
- id="linearGradient3708">
- style="stop-color:#d40000;stop-opacity:1;"
- style="stop-color:#ff5c5c;stop-opacity:1;"
- id="linearGradient4202">
- style="stop-color:#f6edda;stop-opacity:1;" />
- style="stop-color:#e6e6e6;stop-opacity:1;" />
- id="linearGradient4192">
- style="stop-color:#faf4e9;stop-opacity:1;"
- style="stop-color:#f1f1f1;stop-opacity:1;"
- id="linearGradient3302">
- style="stop-color:#ff0000;stop-opacity:0;"
- style="stop-color:#ff0000;stop-opacity:0.49803922;" />
- style="stop-color:#ff0000;stop-opacity:1;"
- style="stop-color:#ff0000;stop-opacity:0;"
- id="linearGradient3687">
- style="stop-color:#23d5ff;stop-opacity:1;" />
- style="stop-color:#b1ffff;stop-opacity:1;" />
- id="linearGradient3679">
- style="stop-color:#00b5ff;stop-opacity:1;" />
- style="stop-color:#005bff;stop-opacity:1;" />
- id="linearGradient3659">
- style="stop-color:#ff0030;stop-opacity:1;" />
- style="stop-color:#e20000;stop-opacity:0.83211678;"
- style="stop-color:#ffffff;stop-opacity:0;" />
- id="linearGradient3639">
- style="stop-color:#ffff00;stop-opacity:1;" />
- style="stop-color:#8fff00;stop-opacity:0.49803922;"
- style="stop-color:#ffffff;stop-opacity:0;" />
- id="linearGradient3621">
- style="stop-color:#ff8080;stop-opacity:1;" />
- style="stop-color:#aa0000;stop-opacity:1;" />
- id="linearGradient3613"
- inkscape:collect="always">
- style="stop-color:#000000;stop-opacity:1;" />
- style="stop-color:#000000;stop-opacity:0;" />
- id="linearGradient3497">
- style="stop-color:#00cd00;stop-opacity:1;" />
- style="stop-color:#007900;stop-opacity:1;" />
- id="linearGradient3453">
- style="stop-color:#000000;stop-opacity:1;" />
- style="stop-color:#ffffff;stop-opacity:0;" />
- id="linearGradient3173">
- style="stop-color:#ffffff;stop-opacity:1;"
- style="stop-color:#ffffff;stop-opacity:0;" />
- style="stop-color:#ff0000;stop-opacity:0;"
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- id="perspective2619" />
- gradientUnits="userSpaceOnUse"
- id="linearGradient3503"
- xlink:href="#linearGradient3497"
- inkscape:collect="always" />
- gradientUnits="userSpaceOnUse"
- id="linearGradient3619"
- xlink:href="#linearGradient3613"
- inkscape:collect="always" />
- gradientUnits="userSpaceOnUse"
- id="linearGradient3627"
- xlink:href="#linearGradient3621"
- inkscape:collect="always" />
- gradientTransform="translate(-18,26)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3633"
- xlink:href="#linearGradient3621"
- inkscape:collect="always" />
- gradientUnits="userSpaceOnUse"
- id="radialGradient3667"
- xlink:href="#linearGradient3639"
- inkscape:collect="always" />
- gradientUnits="userSpaceOnUse"
- id="radialGradient3675"
- xlink:href="#linearGradient3659"
- inkscape:collect="always" />
- gradientTransform="translate(-1.3119965,1.110878)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3693"
- xlink:href="#linearGradient3687"
- inkscape:collect="always" />
- gradientUnits="userSpaceOnUse"
- id="linearGradient3702"
- xlink:href="#linearGradient4202"
- inkscape:collect="always" />
- gradientTransform="translate(-1.3119965,1.110878)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3704"
- xlink:href="#linearGradient3613"
- inkscape:collect="always" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- id="perspective3767" />
- inkscape:collect="always"
- xlink:href="#linearGradient3302"
- id="linearGradient3308"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-25.178571,-3.0357143)" />
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3536"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3538"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3540"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3542"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3544"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3546"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3548"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3550"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.555838,16.162441)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3694"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3696"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3698"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3700"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3703"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3705"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3707"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient3613"
- id="linearGradient3709"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-381.09403,-544.64978)"
- inkscape:collect="always"
- xlink:href="#linearGradient4192"
- id="linearGradient4200"
- gradientUnits="userSpaceOnUse" />
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- inkscape:collect="always"
- xlink:href="#linearGradient3708"
- id="linearGradient3714"
- gradientUnits="userSpaceOnUse" />
- inkscape:collect="always"
- xlink:href="#linearGradient3708"
- id="linearGradient3722"
- gradientUnits="userSpaceOnUse" />
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- inkscape:collect="always"
- xlink:href="#linearGradient3770"
- id="linearGradient3776"
- gradientUnits="userSpaceOnUse" />
- inkscape:collect="always"
- xlink:href="#linearGradient3770"
- id="linearGradient3784"
- gradientUnits="userSpaceOnUse" />
- inkscape:collect="always"
- xlink:href="#linearGradient3621"
- id="radialGradient3792"
- gradientUnits="userSpaceOnUse" />
- inkscape:collect="always"
- xlink:href="#linearGradient3497"
- id="radialGradient3800"
- gradientUnits="userSpaceOnUse" />
- <dc:format>image/svg+xml</dc:format>
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- inkscape:label="Calque 1"
- inkscape:groupmode="layer"
- style="display:inline">
- style="fill:url(#linearGradient4200);fill-opacity:1;stroke:#000000;stroke-width:1.46953177;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- transform="translate(-127.27923,-40.406102)"
- style="fill:url(#linearGradient3702);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0"
- sodipodi:linespacing="125%"
- style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#655fdb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
- xml:space="preserve"><tspan
- style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#655fdb;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">Default</tspan></text>
- transform="translate(-33.11078,95.2077)">
- style="color:#000000;fill:url(#linearGradient3776);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3784);stroke-width:3.80890393;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:cx="103.21429"
- sodipodi:cy="127.14286"
- sodipodi:r1="91.508057"
- sodipodi:r2="45.754028"
- sodipodi:arg2="1.0471976"
- inkscape:flatsided="true"
- inkscape:randomized="0"
- d="m 194.72234,127.14286 -137.262082,79.2483 0,-158.496601 137.262082,79.248301 z"
- transform="matrix(0.78762818,0,0,0.78762818,26.492161,-44.168468)" />
- sodipodi:linespacing="100%"
- style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:inherit;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
- xml:space="preserve"><tspan
- style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:inherit;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
- sodipodi:role="line">Start</tspan></text>
- transform="translate(-18.07106,94.06456)"
- style="color:#000000;fill:url(#linearGradient3714);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3722);stroke-width:3.94511151;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:cx="83.571426"
- sodipodi:cy="224.28571"
- sodipodi:r1="94.724358"
- sodipodi:r2="87.513893"
- sodipodi:arg2="0.39269908"
- inkscape:flatsided="true"
- inkscape:randomized="0"
- d="m 178.29578,224.28571 -27.74412,66.98023 -66.980234,27.74412 -66.980235,-27.74412 -27.744122,-66.98023 27.744122,-66.98024 66.980235,-27.74412 66.980234,27.74412 27.74412,66.98024 z"
- transform="matrix(0.70255013,-0.29100577,0.29100577,0.70255013,-13.216048,-76.13621)" />
- sodipodi:linespacing="100%"
- style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:inherit;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
- xml:space="preserve"><tspan
- style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;line-height:100%;writing-mode:lr-tb;text-anchor:end;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
- sodipodi:role="line">Stop</tspan></text>
- transform="matrix(2.0899173,0,0,2.0899173,-577.84265,-204.88668)"
- transform="translate(42.282829,64.376725)"
- d="m 369.71585,101.69787 a 17.67767,17.67767 0 1 1 -35.35534,0 17.67767,17.67767 0 1 1 35.35534,0 z"
- sodipodi:cy="101.69787"
- sodipodi:cx="352.03818"
- style="fill:url(#radialGradient3800);fill-opacity:1;stroke:#000000;stroke-width:0.47848782;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(2.0899173,0,0,2.0899173,-637.08625,-59.866062)"
- style="fill:url(#radialGradient3792);fill-opacity:1;stroke:#000000;stroke-width:0.47848782;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:cx="352.03818"
- sodipodi:cy="101.69787"
- d="m 369.71585,101.69787 a 17.67767,17.67767 0 1 1 -35.35534,0 17.67767,17.67767 0 1 1 35.35534,0 z"
- transform="translate(70.630181,-5.0138784)" />
--- a/tests/svgui/svgui@svgui/pyfile.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- Web interface is build as SVG file in Inkscape.
- To edit SVG file click 'Inkscape' button on the toolbar above.
- Inkscape is a free and open-source vector graphics editor.
- It's not part of Beremiz and needs to be installed separately.
--- a/tests/tools/test_application.py Fri Oct 01 15:36:09 2021 +0200
+++ b/tests/tools/test_application.py Fri Oct 01 23:19:04 2021 +0200
@@ -172,7 +172,6 @@
--- a/tests/traffic_lights/beremiz.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
- <Libraries Enable_SVGUI_Library="true" Enable_Python_Library="true"/>
--- a/tests/traffic_lights/plc.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1732 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
- <fileHeader companyName="Beremiz" productName="Unnamed" productVersion="1" creationDateTime="2012-09-04T16:16:33"/>
- <contentHeader name="traffic_lights" modificationDateTime="2018-09-26T17:49:02">
- <pou name="traffic_light_sequence" pouType="functionBlock">
- <variable name="SWITCH_BUTTON">
- <variable name="PEDESTRIAN_BUTTON">
- <variable name="RED_LIGHT">
- <variable name="ORANGE_LIGHT">
- <variable name="GREEN_LIGHT">
- <variable name="PEDESTRIAN_RED_LIGHT">
- <variable name="PEDESTRIAN_GREEN_LIGHT">
- <variable name="ALLOW_CARS">
- <variable name="WARN_CARS">
- <variable name="STOP_CARS">
- <variable name="ALLOW_PEDESTRIANS">
- <variable name="STOP_PEDESTRIANS">
- <variable name="R_TRIG0">
- <derived name="R_TRIG"/>
- <variable name="R_TRIG1">
- <derived name="R_TRIG"/>
- <action name="BLINK_ORANGE_LIGHT">
- <leftPowerRail localId="1" height="40" width="3">
- <position x="54" y="123"/>
- <connectionPointOut formalParameter="">
- <relPosition x="3" y="20"/>
- <contact localId="2" height="15" width="21" negated="true">
- <position x="121" y="135"/>
- <relPosition x="0" y="8"/>
- <connection refLocalId="1">
- <position x="121" y="143"/>
- <position x="56" y="143"/>
- <relPosition x="21" y="8"/>
- <variable>ORANGE_LIGHT</variable>
- <block localId="3" width="97" height="102" typeName="TON" instanceName="TON1">
- <position x="216" y="103"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="40"/>
- <connection refLocalId="2">
- <position x="216" y="143"/>
- <position x="142" y="143"/>
- <variable formalParameter="PT">
- <relPosition x="0" y="81"/>
- <connection refLocalId="4">
- <position x="216" y="184"/>
- <position x="151" y="184"/>
- <variable formalParameter="Q">
- <relPosition x="97" y="40"/>
- <variable formalParameter="ET">
- <relPosition x="97" y="81"/>
- <inVariable localId="4" height="37" width="76" negated="false">
- <position x="75" y="166"/>
- <relPosition x="76" y="18"/>
- <expression>T#500ms</expression>
- <block localId="5" width="97" height="106" typeName="TON" instanceName="TON2">
- <position x="216" y="251"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="41"/>
- <connection refLocalId="14">
- <position x="216" y="292"/>
- <position x="155" y="292"/>
- <variable formalParameter="PT">
- <relPosition x="0" y="84"/>
- <connection refLocalId="15">
- <position x="216" y="335"/>
- <position x="162" y="335"/>
- <variable formalParameter="Q">
- <relPosition x="97" y="41"/>
- <variable formalParameter="ET">
- <relPosition x="97" y="84"/>
- <coil localId="6" height="15" width="21" storage="reset">
- <position x="517" y="284"/>
- <relPosition x="0" y="8"/>
- <connection refLocalId="10" formalParameter="Q">
- <position x="517" y="292"/>
- <position x="427" y="292"/>
- <relPosition x="21" y="8"/>
- <variable>ORANGE_LIGHT</variable>
- <rightPowerRail localId="7" height="40" width="3">
- <position x="598" y="123"/>
- <relPosition x="0" y="20"/>
- <connection refLocalId="8">
- <position x="598" y="143"/>
- <position x="530" y="143"/>
- <coil localId="8" height="15" width="21" storage="set">
- <position x="509" y="135"/>
- <relPosition x="0" y="8"/>
- <connection refLocalId="11" formalParameter="Q">
- <position x="509" y="143"/>
- <position x="428" y="143"/>
- <relPosition x="21" y="8"/>
- <variable>ORANGE_LIGHT</variable>
- <comment localId="9" height="52" width="318">
- <position x="51" y="11"/>
- <xhtml:p><![CDATA[This action makes the orange light blink]]></xhtml:p>
- <block localId="10" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG0">
- <position x="370" y="262"/>
- <variable formalParameter="CLK">
- <relPosition x="0" y="30"/>
- <connection refLocalId="5" formalParameter="Q">
- <position x="370" y="292"/>
- <position x="313" y="292"/>
- <variable formalParameter="Q">
- <relPosition x="58" y="30"/>
- <block localId="11" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG1">
- <position x="371" y="113"/>
- <variable formalParameter="CLK">
- <relPosition x="0" y="30"/>
- <connection refLocalId="3" formalParameter="Q">
- <position x="371" y="143"/>
- <position x="313" y="143"/>
- <variable formalParameter="Q">
- <relPosition x="58" y="30"/>
- <rightPowerRail localId="12" height="40" width="3">
- <position x="597" y="272"/>
- <relPosition x="0" y="20"/>
- <connection refLocalId="6">
- <position x="597" y="292"/>
- <position x="538" y="292"/>
- <leftPowerRail localId="13" height="40" width="3">
- <position x="67" y="272"/>
- <connectionPointOut formalParameter="">
- <relPosition x="3" y="20"/>
- <contact localId="14" height="15" width="21">
- <position x="134" y="284"/>
- <relPosition x="0" y="8"/>
- <connection refLocalId="13">
- <position x="134" y="292"/>
- <position x="69" y="292"/>
- <relPosition x="21" y="8"/>
- <variable>ORANGE_LIGHT</variable>
- <inVariable localId="15" height="36" width="77" negated="false">
- <position x="85" y="317"/>
- <relPosition x="77" y="18"/>
- <expression>T#500ms</expression>
- <transition name="STOP">
- <block localId="42" width="59" height="53" typeName="NOT" executionOrderId="0">
- <position x="237" y="31"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="36"/>
- <connection refLocalId="43">
- <position x="237" y="67"/>
- <position x="202" y="67"/>
- <variable formalParameter="OUT">
- <relPosition x="59" y="36"/>
- <inVariable localId="43" height="39" width="164" executionOrderId="0" negated="false">
- <position x="38" y="48"/>
- <relPosition x="164" y="19"/>
- <expression>SWITCH_BUTTON</expression>
- <outVariable localId="44" height="40" width="46" executionOrderId="0" negated="false">
- <position x="351" y="47"/>
- <relPosition x="0" y="20"/>
- <connection refLocalId="42" formalParameter="OUT">
- <position x="351" y="67"/>
- <position x="296" y="67"/>
- <expression>STOP</expression>
- <step localId="1" height="37" width="121" name="Standstill" initialStep="true">
- <position x="509" y="31"/>
- <relPosition x="60" y="0"/>
- <connection refLocalId="39">
- <position x="569" y="31"/>
- <position x="569" y="11"/>
- <position x="963" y="11"/>
- <position x="963" y="1151"/>
- <position x="776" y="1151"/>
- <position x="776" y="1097"/>
- <connectionPointOut formalParameter="">
- <relPosition x="60" y="37"/>
- <connectionPointOutAction formalParameter="">
- <relPosition x="121" y="18"/>
- </connectionPointOutAction>
- <transition localId="2" height="2" width="20">
- <position x="559" y="222"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="1">
- <position x="569" y="222"/>
- <position x="569" y="68"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[SWITCH_BUTTON]]></xhtml:p>
- <step localId="3" height="30" width="118" name="ORANGE">
- <position x="510" y="250"/>
- <relPosition x="59" y="0"/>
- <connection refLocalId="2">
- <position x="569" y="250"/>
- <position x="569" y="224"/>
- <connectionPointOut formalParameter="">
- <relPosition x="59" y="30"/>
- <connectionPointOutAction formalParameter="">
- <relPosition x="118" y="15"/>
- </connectionPointOutAction>
- <transition localId="6" height="2" width="20">
- <position x="559" y="376"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="15">
- <position x="569" y="376"/>
- <position x="569" y="336"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[STOP_CARS]]></xhtml:p>
- <actionBlock localId="8" width="231" height="162">
- <position x="711" y="34"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="1">
- <position x="711" y="49"/>
- <position x="630" y="49"/>
- <action localId="0" qualifier="P">
- <relPosition x="0" y="0"/>
- <xhtml:p><![CDATA[ORANGE_LIGHT := 1;]]></xhtml:p>
- <relPosition x="0" y="0"/>
- <reference name="BLINK_ORANGE_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_RED_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_GREEN_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="RED_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="GREEN_LIGHT"/>
- <actionBlock localId="9" width="232" height="125">
- <position x="711" y="250"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="3">
- <position x="711" y="265"/>
- <position x="628" y="265"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="GREEN_LIGHT"/>
- <action localId="0" qualifier="S">
- <relPosition x="0" y="0"/>
- <reference name="ORANGE_LIGHT"/>
- <action localId="0" qualifier="S">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_RED_LIGHT"/>
- <action localId="0" qualifier="D" duration="T#2s">
- <relPosition x="0" y="0"/>
- <reference name="STOP_CARS"/>
- <step localId="10" height="34" width="92" name="RED">
- <position x="523" y="411"/>
- <relPosition x="46" y="0"/>
- <connection refLocalId="6">
- <position x="569" y="411"/>
- <position x="569" y="378"/>
- <connectionPointOut formalParameter="">
- <relPosition x="46" y="34"/>
- <connectionPointOutAction formalParameter="">
- <relPosition x="92" y="17"/>
- </connectionPointOutAction>
- <actionBlock localId="11" width="235" height="103">
- <position x="710" y="413"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="10">
- <position x="710" y="428"/>
- <position x="615" y="428"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="ORANGE_LIGHT"/>
- <action localId="0" qualifier="S">
- <relPosition x="0" y="0"/>
- <reference name="RED_LIGHT"/>
- <action localId="0" qualifier="D" duration="T#2s">
- <relPosition x="0" y="0"/>
- <reference name="ALLOW_PEDESTRIANS"/>
- <transition localId="12" height="2" width="20">
- <position x="559" y="533"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="7">
- <position x="569" y="533"/>
- <position x="569" y="487"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[ALLOW_PEDESTRIANS]]></xhtml:p>
- <selectionDivergence localId="15" height="1" width="154">
- <position x="415" y="335"/>
- <relPosition x="154" y="0"/>
- <connection refLocalId="3">
- <position x="569" y="335"/>
- <position x="569" y="280"/>
- <connectionPointOut formalParameter="">
- <relPosition x="0" y="1"/>
- <connectionPointOut formalParameter="">
- <relPosition x="154" y="1"/>
- <transition localId="16" height="2" width="20">
- <position x="405" y="377"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="15">
- <position x="415" y="377"/>
- <position x="415" y="336"/>
- <relPosition x="10" y="2"/>
- <reference name="STOP"/>
- <jumpStep localId="17" height="13" width="12" targetName="Standstill">
- <position x="409" y="418"/>
- <relPosition x="6" y="0"/>
- <connection refLocalId="16">
- <position x="415" y="418"/>
- <position x="415" y="379"/>
- <transition localId="4" height="2" width="20">
- <position x="400" y="528"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="7">
- <position x="410" y="528"/>
- <position x="410" y="487"/>
- <relPosition x="10" y="2"/>
- <reference name="STOP"/>
- <jumpStep localId="5" height="13" width="12" targetName="Standstill">
- <position x="404" y="553"/>
- <relPosition x="6" y="0"/>
- <connection refLocalId="4">
- <position x="410" y="553"/>
- <position x="410" y="530"/>
- <selectionDivergence localId="7" height="1" width="159">
- <position x="410" y="486"/>
- <relPosition x="159" y="0"/>
- <connection refLocalId="10">
- <position x="569" y="486"/>
- <position x="569" y="445"/>
- <connectionPointOut formalParameter="">
- <relPosition x="0" y="1"/>
- <connectionPointOut formalParameter="">
- <relPosition x="159" y="1"/>
- <step localId="18" height="32" width="177" name="PEDESTRIAN_GREEN">
- <position x="481" y="572"/>
- <relPosition x="88" y="0"/>
- <connection refLocalId="12">
- <position x="569" y="572"/>
- <position x="569" y="535"/>
- <connectionPointOut formalParameter="">
- <relPosition x="88" y="32"/>
- <connectionPointOutAction formalParameter="">
- <relPosition x="177" y="16"/>
- </connectionPointOutAction>
- <actionBlock localId="19" width="247" height="110">
- <position x="708" y="573"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="18">
- <position x="708" y="588"/>
- <position x="658" y="588"/>
- <action localId="0" qualifier="S">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_GREEN_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_RED_LIGHT"/>
- <action localId="0" qualifier="D" duration="T#10s">
- <relPosition x="0" y="0"/>
- <reference name="STOP_PEDESTRIANS"/>
- <transition localId="20" height="2" width="20">
- <position x="400" y="653"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="22">
- <position x="410" y="653"/>
- <position x="410" y="626"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p>
- <jumpStep localId="21" height="13" width="12" targetName="Standstill">
- <position x="404" y="694"/>
- <relPosition x="6" y="0"/>
- <connection refLocalId="20">
- <position x="410" y="694"/>
- <position x="410" y="655"/>
- <selectionDivergence localId="22" height="1" width="159">
- <position x="410" y="625"/>
- <relPosition x="159" y="0"/>
- <connection refLocalId="18">
- <position x="569" y="625"/>
- <position x="569" y="615"/>
- <position x="569" y="615"/>
- <position x="569" y="604"/>
- <connectionPointOut formalParameter="">
- <relPosition x="0" y="1"/>
- <connectionPointOut formalParameter="">
- <relPosition x="159" y="1"/>
- <transition localId="23" height="2" width="20">
- <position x="559" y="709"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="22">
- <position x="569" y="709"/>
- <position x="569" y="626"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[STOP_PEDESTRIANS]]></xhtml:p>
- <step localId="24" height="30" width="148" name="PEDESTRIAN_RED">
- <position x="495" y="748"/>
- <relPosition x="74" y="0"/>
- <connection refLocalId="23">
- <position x="569" y="748"/>
- <position x="569" y="711"/>
- <connectionPointOut formalParameter="">
- <relPosition x="74" y="30"/>
- <connectionPointOutAction formalParameter="">
- <relPosition x="148" y="15"/>
- </connectionPointOutAction>
- <actionBlock localId="25" width="239" height="110">
- <position x="708" y="748"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="24">
- <position x="708" y="763"/>
- <position x="643" y="763"/>
- <action localId="0" qualifier="S">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_RED_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="PEDESTRIAN_GREEN_LIGHT"/>
- <action localId="0" qualifier="D" duration="T#2s">
- <relPosition x="0" y="0"/>
- <reference name="ALLOW_CARS"/>
- <transition localId="26" height="2" width="20">
- <position x="400" y="857"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="28">
- <position x="410" y="857"/>
- <position x="410" y="816"/>
- <relPosition x="10" y="2"/>
- <connection refLocalId="48">
- <position x="400" y="858"/>
- <position x="290" y="858"/>
- <jumpStep localId="27" height="13" width="12" targetName="Standstill">
- <position x="404" y="898"/>
- <relPosition x="6" y="0"/>
- <connection refLocalId="26">
- <position x="410" y="898"/>
- <position x="410" y="859"/>
- <selectionDivergence localId="28" height="1" width="159">
- <position x="410" y="815"/>
- <relPosition x="159" y="0"/>
- <connection refLocalId="24">
- <position x="569" y="815"/>
- <position x="569" y="778"/>
- <connectionPointOut formalParameter="">
- <relPosition x="0" y="1"/>
- <connectionPointOut formalParameter="">
- <relPosition x="159" y="1"/>
- <transition localId="29" height="2" width="20">
- <position x="559" y="879"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="28">
- <position x="569" y="879"/>
- <position x="569" y="816"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[ALLOW_CARS]]></xhtml:p>
- <step localId="30" height="33" width="92" name="GREEN">
- <position x="523" y="930"/>
- <relPosition x="46" y="0"/>
- <connection refLocalId="29">
- <position x="569" y="930"/>
- <position x="569" y="881"/>
- <connectionPointOut formalParameter="">
- <relPosition x="46" y="33"/>
- <connectionPointOutAction formalParameter="">
- <relPosition x="92" y="16"/>
- </connectionPointOutAction>
- <actionBlock localId="31" width="227" height="110">
- <position x="709" y="931"/>
- <relPosition x="0" y="15"/>
- <connection refLocalId="30">
- <position x="709" y="946"/>
- <position x="615" y="946"/>
- <action localId="0" qualifier="S">
- <relPosition x="0" y="0"/>
- <reference name="GREEN_LIGHT"/>
- <action localId="0" qualifier="R">
- <relPosition x="0" y="0"/>
- <reference name="RED_LIGHT"/>
- <action localId="0" qualifier="D" duration="T#20s">
- <relPosition x="0" y="0"/>
- <reference name="WARN_CARS"/>
- <block localId="32" width="89" height="94" typeName="TON" instanceName="TON3">
- <position x="308" y="1053"/>
- <variable formalParameter="IN">
- <relPosition x="0" y="38"/>
- <connection refLocalId="44" formalParameter="Q1">
- <position x="308" y="1091"/>
- <position x="291" y="1091"/>
- <position x="291" y="1065"/>
- <position x="275" y="1065"/>
- <variable formalParameter="PT">
- <relPosition x="0" y="75"/>
- <connection refLocalId="34">
- <position x="308" y="1128"/>
- <position x="270" y="1128"/>
- <variable formalParameter="Q">
- <relPosition x="89" y="38"/>
- <variable formalParameter="ET">
- <relPosition x="89" y="75"/>
- <inVariable localId="33" height="36" width="168" negated="false">
- <position x="15" y="1047"/>
- <relPosition x="168" y="18"/>
- <expression>PEDESTRIAN_BUTTON</expression>
- <inVariable localId="34" height="33" width="53" negated="false">
- <position x="217" y="1112"/>
- <relPosition x="53" y="16"/>
- <expression>T#2s</expression>
- <block localId="35" width="67" height="60" typeName="OR">
- <position x="459" y="1061"/>
- <variable formalParameter="IN1">
- <relPosition x="0" y="30"/>
- <connection refLocalId="32" formalParameter="Q">
- <position x="459" y="1091"/>
- <position x="397" y="1091"/>
- <variable formalParameter="IN2">
- <relPosition x="0" y="50"/>
- <connection refLocalId="36">
- <position x="459" y="1111"/>
- <position x="427" y="1111"/>
- <position x="427" y="1195"/>
- <position x="260" y="1195"/>
- <variable formalParameter="OUT">
- <relPosition x="67" y="30"/>
- <inVariable localId="36" height="30" width="97" negated="false">
- <position x="163" y="1182"/>
- <relPosition x="97" y="15"/>
- <expression>WARN_CARS</expression>
- <transition localId="37" height="2" width="20">
- <position x="559" y="1090"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="38">
- <position x="569" y="1090"/>
- <position x="569" y="1060"/>
- <relPosition x="10" y="2"/>
- <connection refLocalId="35" formalParameter="OUT">
- <position x="559" y="1091"/>
- <position x="526" y="1091"/>
- <selectionDivergence localId="38" height="1" width="207">
- <position x="569" y="1059"/>
- <relPosition x="0" y="0"/>
- <connection refLocalId="30">
- <position x="569" y="1059"/>
- <position x="569" y="963"/>
- <connectionPointOut formalParameter="">
- <relPosition x="0" y="1"/>
- <connectionPointOut formalParameter="">
- <relPosition x="207" y="1"/>
- <transition localId="39" height="2" width="20">
- <position x="766" y="1095"/>
- <relPosition x="10" y="0"/>
- <connection refLocalId="38">
- <position x="776" y="1095"/>
- <position x="776" y="1060"/>
- <relPosition x="10" y="2"/>
- <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p>
- <jumpStep localId="41" height="13" width="12" targetName="ORANGE">
- <position x="563" y="1137"/>
- <relPosition x="6" y="0"/>
- <connection refLocalId="37">
- <position x="569" y="1137"/>
- <position x="569" y="1092"/>
- <block localId="44" width="51" height="60" typeName="SR" instanceName="SR0">
- <position x="224" y="1035"/>
- <variable formalParameter="S1">
- <relPosition x="0" y="30"/>
- <connection refLocalId="33">
- <position x="224" y="1065"/>
- <position x="183" y="1065"/>
- <variable formalParameter="R">
- <relPosition x="0" y="50"/>
- <connection refLocalId="32" formalParameter="Q">
- <position x="224" y="1085"/>
- <position x="203" y="1085"/>
- <position x="203" y="1167"/>
- <position x="416" y="1167"/>
- <position x="416" y="1091"/>
- <position x="397" y="1091"/>
- <variable formalParameter="Q1">
- <relPosition x="51" y="30"/>
- <comment localId="45" height="767" width="753">
- <position x="973" y="21"/>
- <xhtml:p><![CDATA[*** Description of SFC action qualifiers ***
-N : non-stored - The action code body is executed or the Boolean variable is set as
-long as the step is active.
-R : overriding reset – When the step has previously been executed with the S
-(including DS, DS, and SL) qualifier, the R qualifier will stop the execution of the
-code or reset the Boolean variable.
-S : set (stored) - The action code body is executed or the Boolean variable is set.
-This state is stored as soon as the step becomes active. It can only be reset
-explicitly by associating the same action to a different step using the qualifier 'R'.
-L : time limited - The action code body is executed or the Boolean variable is set as
-long as the step is active but maximal for the fixed time interval.
-D : time delayed - The action code body is executed or the Boolean variable is set
-after the fixed delay time has elapsed. The action remains active as long as the step
-is active. If the step is active shorter than the fixed delay time the action does not
-P : pulse - As soon as the step is active the action code body is executed or the
-Boolean variable is set for one operating cycle. (Note: The code body will then
-execute for one additional operating cycle with the Step.X variable FALSE.)
-SD : stored and time delayed - the action code body is executed or the Boolean
-variable is stored and set when the fixed delay time has elapsed after the step
-activation, even if the step becomes inactive. The action remains active until it is
-reset. If the step is active shorter than the fixed delay time the action becomes active
-DS : delayed and stored - The action code body is executed or the Boolean variable
-is set when the fixed delay time has elapsed after the step activation. The action
-remains active until it is reset. If the step is active shorter than the fixed delay time
-the action does not become active.
-SL : stored and time limited - The action code body is executed or the Boolean
-variable is set and stored for a fixed time interval as soon as the step is active. If the
-step is active shorter than the time interval the action is active for the whole time
-interval anyway. If the action is reset during the time interval the action becomes
-inactive as soon as the action is reset.
- <comment localId="46" height="224" width="375">
- <position x="8" y="326"/>
- <xhtml:p><![CDATA[Conditions can be written in any IEC 61131-3 language.
-They can be implemented in defferent ways:
-- reference to external implementation;
-- inline implementation;
-- written in FBD or LD on SFC diagram and connected to the condition.
-See below examples of all these types.]]></xhtml:p>
- <leftPowerRail localId="47" height="40" width="3">
- <position x="189" y="838"/>
- <connectionPointOut formalParameter="">
- <relPosition x="3" y="20"/>
- <contact localId="48" height="15" width="21" negated="true">
- <position x="269" y="850"/>
- <relPosition x="0" y="8"/>
- <connection refLocalId="47">
- <position x="269" y="858"/>
- <position x="192" y="858"/>
- <relPosition x="21" y="8"/>
- <variable>SWITCH_BUTTON</variable>
- <comment localId="13" height="86" width="379">
- <position x="9" y="28"/>
- <xhtml:p><![CDATA[Sequential function chart (SFC) is commonly used to describe state machines.]]></xhtml:p>
- <pou name="main_program" pouType="program">
- <variable name="trafic_light_sequence0">
- <derived name="traffic_light_sequence"/>
- <variable name="SwitchButton">
- <derived name="Button"/>
- <variable name="PedestrianButton">
- <derived name="Button"/>
- <variable name="RedLight">
- <variable name="OrangeLight">
- <variable name="GreenLight">
- <variable name="PedestrianRedLight">
- <variable name="PedestrianGreenLight">
- <block localId="1" width="350" height="836" typeName="traffic_light_sequence" instanceName="trafic_light_sequence0" executionOrderId="0">
- <position x="494" y="462"/>
- <variable formalParameter="SWITCH_BUTTON">
- <relPosition x="0" y="101"/>
- <connection refLocalId="2" formalParameter="state_out">
- <position x="494" y="563"/>
- <position x="349" y="563"/>
- <variable formalParameter="PEDESTRIAN_BUTTON">
- <relPosition x="0" y="264"/>
- <connection refLocalId="3" formalParameter="state_out">
- <position x="494" y="726"/>
- <position x="402" y="726"/>
- <position x="402" y="777"/>
- <position x="351" y="777"/>
- <variable formalParameter="RED_LIGHT">
- <relPosition x="350" y="101"/>
- <variable formalParameter="ORANGE_LIGHT">
- <relPosition x="350" y="264"/>
- <variable formalParameter="GREEN_LIGHT">
- <relPosition x="350" y="427"/>
- <variable formalParameter="PEDESTRIAN_RED_LIGHT">
- <relPosition x="350" y="590"/>
- <variable formalParameter="PEDESTRIAN_GREEN_LIGHT">
- <relPosition x="350" y="753"/>
- <block localId="2" width="159" height="183" typeName="Button" instanceName="SwitchButton" executionOrderId="0">
- <position x="190" y="527"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="36"/>
- <connection refLocalId="5">
- <position x="190" y="563"/>
- <position x="137" y="563"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="68"/>
- <connection refLocalId="6">
- <position x="190" y="595"/>
- <position x="136" y="595"/>
- <variable formalParameter="toggle">
- <relPosition x="0" y="100"/>
- <connection refLocalId="4">
- <position x="190" y="627"/>
- <position x="136" y="627"/>
- <variable formalParameter="set_state">
- <relPosition x="0" y="132"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="164"/>
- <variable formalParameter="state_out">
- <relPosition x="159" y="36"/>
- <block localId="3" width="159" height="198" typeName="Button" instanceName="PedestrianButton" executionOrderId="0">
- <position x="192" y="740"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="37"/>
- <connection refLocalId="7">
- <position x="192" y="777"/>
- <position x="160" y="777"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="72"/>
- <connection refLocalId="8">
- <position x="192" y="812"/>
- <position x="159" y="812"/>
- <variable formalParameter="toggle">
- <relPosition x="0" y="107"/>
- <variable formalParameter="set_state">
- <relPosition x="0" y="142"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="177"/>
- <variable formalParameter="state_out">
- <relPosition x="159" y="37"/>
- <inVariable localId="4" height="30" width="18" executionOrderId="0" negated="false">
- <position x="118" y="612"/>
- <relPosition x="18" y="15"/>
- <expression>1</expression>
- <inVariable localId="5" height="30" width="106" executionOrderId="0" negated="false">
- <position x="31" y="548"/>
- <relPosition x="106" y="15"/>
- <expression>'SWITCH_OFF'</expression>
- <inVariable localId="6" height="30" width="105" executionOrderId="0" negated="false">
- <position x="31" y="580"/>
- <relPosition x="105" y="15"/>
- <expression>'SWITCH_ON'</expression>
- <inVariable localId="7" height="30" width="138" executionOrderId="0" negated="false">
- <position x="22" y="762"/>
- <relPosition x="138" y="15"/>
- <expression>'PEDESTRIAN_OFF'</expression>
- <inVariable localId="8" height="30" width="137" executionOrderId="0" negated="false">
- <position x="22" y="797"/>
- <relPosition x="137" y="15"/>
- <expression>'PEDESTRIAN_ON'</expression>
- <block localId="9" width="115" height="133" typeName="Led" instanceName="RedLight" executionOrderId="0">
- <position x="1057" y="451"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="38"/>
- <connection refLocalId="10">
- <position x="1057" y="489"/>
- <position x="1013" y="489"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="75"/>
- <connection refLocalId="11">
- <position x="1057" y="526"/>
- <position x="1010" y="526"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="112"/>
- <connection refLocalId="1" formalParameter="RED_LIGHT">
- <position x="1057" y="563"/>
- <position x="844" y="563"/>
- <inVariable localId="10" height="30" width="82" executionOrderId="0" negated="false">
- <position x="931" y="474"/>
- <relPosition x="82" y="15"/>
- <expression>'RED_OFF'</expression>
- <inVariable localId="11" height="30" width="79" executionOrderId="0" negated="false">
- <position x="931" y="511"/>
- <relPosition x="79" y="15"/>
- <expression>'RED_ON'</expression>
- <block localId="12" width="115" height="133" typeName="Led" instanceName="OrangeLight" executionOrderId="0">
- <position x="1058" y="614"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="38"/>
- <connection refLocalId="13">
- <position x="1058" y="652"/>
- <position x="1010" y="652"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="75"/>
- <connection refLocalId="14">
- <position x="1058" y="689"/>
- <position x="1010" y="689"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="112"/>
- <connection refLocalId="1" formalParameter="ORANGE_LIGHT">
- <position x="1058" y="726"/>
- <position x="844" y="726"/>
- <inVariable localId="13" height="30" width="111" executionOrderId="0" negated="false">
- <position x="899" y="637"/>
- <relPosition x="111" y="15"/>
- <expression>'ORANGE_OFF'</expression>
- <inVariable localId="14" height="30" width="106" executionOrderId="0" negated="false">
- <position x="904" y="674"/>
- <relPosition x="106" y="15"/>
- <expression>'ORANGE_ON'</expression>
- <block localId="15" width="115" height="133" typeName="Led" instanceName="GreenLight" executionOrderId="0">
- <position x="1058" y="777"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="38"/>
- <connection refLocalId="16">
- <position x="1058" y="815"/>
- <position x="1010" y="815"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="75"/>
- <connection refLocalId="17">
- <position x="1058" y="852"/>
- <position x="1010" y="852"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="112"/>
- <connection refLocalId="1" formalParameter="GREEN_LIGHT">
- <position x="1058" y="889"/>
- <position x="844" y="889"/>
- <inVariable localId="16" height="30" width="111" executionOrderId="0" negated="false">
- <position x="899" y="800"/>
- <relPosition x="111" y="15"/>
- <expression>'GREEN_OFF'</expression>
- <inVariable localId="17" height="30" width="106" executionOrderId="0" negated="false">
- <position x="904" y="837"/>
- <relPosition x="106" y="15"/>
- <expression>'GREEN_ON'</expression>
- <block localId="18" width="115" height="133" typeName="Led" instanceName="PedestrianRedLight" executionOrderId="0">
- <position x="1059" y="940"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="38"/>
- <connection refLocalId="19">
- <position x="1059" y="978"/>
- <position x="1020" y="978"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="75"/>
- <connection refLocalId="20">
- <position x="1059" y="1015"/>
- <position x="1020" y="1015"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="112"/>
- <connection refLocalId="1" formalParameter="PEDESTRIAN_RED_LIGHT">
- <position x="1059" y="1052"/>
- <position x="844" y="1052"/>
- <inVariable localId="19" height="30" width="171" executionOrderId="0" negated="false">
- <position x="849" y="963"/>
- <relPosition x="171" y="15"/>
- <expression>'PEDESTRIAN_RED_OFF'</expression>
- <inVariable localId="20" height="30" width="166" executionOrderId="0" negated="false">
- <position x="854" y="1000"/>
- <relPosition x="166" y="15"/>
- <expression>'PEDESTRIAN_RED_ON'</expression>
- <block localId="21" width="115" height="133" typeName="Led" instanceName="PedestrianGreenLight" executionOrderId="0">
- <position x="1059" y="1103"/>
- <variable formalParameter="back_id">
- <relPosition x="0" y="38"/>
- <connection refLocalId="22">
- <position x="1059" y="1141"/>
- <position x="1035" y="1141"/>
- <variable formalParameter="sele_id">
- <relPosition x="0" y="75"/>
- <connection refLocalId="23">
- <position x="1059" y="1178"/>
- <position x="1035" y="1178"/>
- <variable formalParameter="state_in">
- <relPosition x="0" y="112"/>
- <connection refLocalId="1" formalParameter="PEDESTRIAN_GREEN_LIGHT">
- <position x="1059" y="1215"/>
- <position x="844" y="1215"/>
- <inVariable localId="22" height="30" width="190" executionOrderId="0" negated="false">
- <position x="845" y="1126"/>
- <relPosition x="190" y="15"/>
- <expression>'PEDESTRIAN_GREEN_OFF'</expression>
- <inVariable localId="23" height="30" width="185" executionOrderId="0" negated="false">
- <position x="850" y="1163"/>
- <relPosition x="185" y="15"/>
- <expression>'PEDESTRIAN_GREEN_ON'</expression>
- <comment localId="24" height="287" width="1008">
- <position x="22" y="13"/>
- <xhtml:p><![CDATA[This example implements control of traffic lights.
-Basically it shows following features of Beremiz:
-- web interface (SCADA) using integrated web server in svgui extension;
-- interaction with web UI;
-- functional blocks in SFC language.
-SVGUI is extensions to build web interface to PLC. It has *integrated* web-server. So it's NOT necessary to install Apache, lighttpd or nginx for that!!!
-As the program is running in PLC, web UI will be available at http://localhost:8009/.
-Web interface is build as SVG file in Inkscape. To edit SVG file click 'Inkscape' button in 0x: svgui extension.
-Inkscape is a free and open-source vector graphics editor. It's not part of Beremiz and needs to be installed separately.
- <comment localId="102" height="134" width="734">
- <position x="21" y="303"/>
- <xhtml:p><![CDATA[In this example FB like 'Button', 'Led' and 'Text' are used.
-Back_id and sele_id inputs of these blocks are IDs of graphic primitives in SVG file.
-This is the way how elements in SVG are bound to elements in PLC program.
-You can find out or edit these IDs in Inkscape.]]></xhtml:p>
- <configuration name="config">
- <resource name="resource1">
- <task name="test_task" interval="T#100ms" priority="0">
- <pouInstance name="main_instance" typeName="main_program"/>
--- a/tests/traffic_lights/svgui-0@svgui/baseconfnode.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams Name="svgui-0" IEC_Channel="0"/>
--- a/tests/traffic_lights/svgui-0@svgui/gui.svg Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1516 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
- 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.48.2 r9819"
- sodipodi:docname="gui.svg">
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23716" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23669" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23629" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23580" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23540" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23506" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23466" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23432" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23330" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23257" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23226" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23189" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23118" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23081" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective23044" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22995" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22946" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22891" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22866" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22829" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22795" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22692" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22661" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22630" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22569" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22532" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22501" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22470" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22403" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22318" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22290" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22265" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22090" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective22002" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21911" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21856" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21831" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21776" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21745" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21654" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21626" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21580" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21549" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21518" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21418" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21338" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective21250" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19662" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19613" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19555" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19494" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19325" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19285" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19247" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19201" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19155" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19106" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective19050" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18979" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18945" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18911" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18841" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18807" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18767" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18727" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18693" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18662" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18613" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18555" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18518" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18475" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18429" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18377" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18322" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18273" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18239" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18193" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18150" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18104" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18061" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective18021" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17978" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17950" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17868" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17840" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17812" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17784" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17756" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17728" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17700" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17636" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17605" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17574" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17543" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17512" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17475" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17420" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17386" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17322" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17261" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17212" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17163" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17120" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17074" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective17046" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16994" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16951" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16896" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16856" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16822" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16794" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16766" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16738" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16689" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16640" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16594" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16548" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16493" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16438" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16401" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16370" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16321" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16242" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16187" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16156" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16101" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16061" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective16027" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15972" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15860" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15826" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15789" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15737" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15676" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15627" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15569" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15532" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15477" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15440" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15403" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15360" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15320" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15283" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15207" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15158" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15121" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15084" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective15041" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14998" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14949" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14906" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14863" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14823" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14783" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14743" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14703" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14642" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14572" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14461" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14421" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14365" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14328" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14291" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14254" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14217" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14174" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14137" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14100" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14057" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective14020" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective13983" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective13946" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective13909" />
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective13862" />
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1.979899"
- inkscape:cx="-27.771849"
- inkscape:cy="198.87744"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- inkscape:window-width="1920"
- inkscape:window-height="1056"
- inkscape:window-maximized="1" />
- <dc:format>image/svg+xml</dc:format>
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- transform="translate(0,-752.36228)">
- style="color:#000000;fill:#282828;fill-opacity:1;stroke:none;stroke-width:2.04116011;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="M 114.28125 14.28125 L 114.28125 144.28125 L 133.21875 144.28125 L 133.21875 277.84375 L 138.9375 277.84375 L 138.9375 196.4375 L 147.84375 196.4375 L 147.84375 212.15625 L 184.28125 212.15625 L 184.28125 179.65625 L 147.84375 179.65625 L 147.84375 191.78125 L 138.9375 191.78125 L 138.9375 144.28125 L 160.71875 144.28125 L 160.71875 14.28125 L 114.28125 14.28125 z "
- transform="translate(0,752.36228)"
- style="color:#000000;fill:#ffac2c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04116011;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- style="color:#000000;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="76.071426"
- sodipodi:rx="13.214286"
- sodipodi:ry="13.214286"
- d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
- transform="translate(61.071429,724.14799)" />
- style="color:#000000;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="76.071426"
- sodipodi:rx="13.214286"
- sodipodi:ry="13.214286"
- d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
- transform="translate(61.071429,764.14799)" />
- style="color:#000000;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="76.071426"
- sodipodi:rx="13.214286"
- sodipodi:ry="13.214286"
- d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
- transform="translate(61.071429,804.14799)" />
- style="color:#000000;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="76.071426"
- sodipodi:rx="13.214286"
- sodipodi:ry="13.214286"
- d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
- transform="translate(61.07143,724.14799)" />
- style="color:#000000;fill:#f06414;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="76.071426"
- sodipodi:rx="13.214286"
- sodipodi:ry="13.214286"
- d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
- transform="translate(61.07143,764.14799)" />
- style="color:#000000;fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="76.071426"
- sodipodi:rx="13.214286"
- sodipodi:ry="13.214286"
- d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
- transform="translate(61.07143,804.14799)" />
- style="color:#000000;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="136.78572"
- sodipodi:rx="5.3571429"
- sodipodi:ry="5.3571429"
- d="m 142.14286,252.5 a 5.3571429,5.3571429 0 1 1 -10.71428,0 5.3571429,5.3571429 0 1 1 10.71428,0 z"
- transform="matrix(1.3666667,0,0,1.3666667,-51.047621,659.24323)" />
- style="color:#000000;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- sodipodi:cx="136.78572"
- sodipodi:rx="5.3571429"
- sodipodi:ry="5.3571429"
- d="m 142.14286,252.5 a 5.3571429,5.3571429 0 1 1 -10.71428,0 5.3571429,5.3571429 0 1 1 10.71428,0 z"
- transform="matrix(1.2333334,0,0,1.2333334,-32.809525,692.9099)" />
- d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206"
- style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="PEDESTRIAN_RED_OFF"
- inkscape:connector-curvature="0" />
- d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206"
- style="fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342"
- style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="PEDESTRIAN_GREEN_OFF"
- inkscape:connector-curvature="0" />
- d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342"
- style="fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="PEDESTRIAN_GREEN_ON"
- inkscape:connector-curvature="0" />
- transform="matrix(0,-1,1,0,-772.76319,846.96137)">
- transform="translate(0,752.36228)"
- d="m 53.928572,57.5 c 0,9.270494 -7.515221,16.785715 -16.785715,16.785715 -9.270495,0 -16.785716,-7.515221 -16.785716,-16.785715 0,-9.270494 7.515221,-16.785715 16.785716,-16.785715 9.270494,0 16.785715,7.515221 16.785715,16.785715 z"
- sodipodi:ry="16.785715"
- sodipodi:rx="16.785715"
- sodipodi:cx="37.142857"
- style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)"
- d="m 55.178574,57.857143 c 0,2.071068 -7.59517,3.75 -16.964287,3.75 -9.369117,0 -16.964287,-1.678932 -16.964287,-3.75 0,-2.071067 7.59517,-3.75 16.964287,-3.75 9.369117,0 16.964287,1.678933 16.964287,3.75 z"
- sodipodi:rx="16.964287"
- sodipodi:cy="57.857143"
- sodipodi:cx="38.214287"
- style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:transform-center-y="-0.16341378"
- inkscape:transform-center-x="-0.012953186"
- transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)"
- d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z"
- inkscape:randomized="0"
- inkscape:flatsided="false"
- sodipodi:arg2="1.0446877"
- sodipodi:arg1="-0.0025098425"
- sodipodi:r2="1.4117311"
- sodipodi:r1="2.7027807"
- sodipodi:cy="89.285713"
- sodipodi:cx="52.142857"
- style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:type="star" />
- style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:cx="37.142857"
- sodipodi:rx="16.785715"
- sodipodi:ry="16.785715"
- d="m 53.928572,57.5 c 0,9.270494 -7.515221,16.785715 -16.785715,16.785715 -9.270495,0 -16.785716,-7.515221 -16.785716,-16.785715 0,-9.270494 7.515221,-16.785715 16.785716,-16.785715 9.270494,0 16.785715,7.515221 16.785715,16.785715 z"
- transform="translate(0,752.36228)" />
- style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:cx="38.214287"
- sodipodi:cy="57.857143"
- sodipodi:rx="16.964287"
- d="m 55.178574,57.857143 c 0,2.071068 -7.59517,3.75 -16.964287,3.75 -9.369117,0 -16.964287,-1.678932 -16.964287,-3.75 0,-2.071067 7.59517,-3.75 16.964287,-3.75 9.369117,0 16.964287,1.678933 16.964287,3.75 z"
- transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)" />
- style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:cx="52.142857"
- sodipodi:cy="89.285713"
- sodipodi:r1="2.7027807"
- sodipodi:r2="1.4117311"
- sodipodi:arg1="-0.0025098425"
- sodipodi:arg2="1.0446877"
- inkscape:flatsided="false"
- inkscape:randomized="0"
- d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z"
- transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)"
- inkscape:transform-center-x="-0.012953186"
- inkscape:transform-center-y="-0.16341378" />
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 37.67857,786.29085 0,3.75"
- inkscape:connector-curvature="0" />
- style="font-size:6.32609415px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
- d="m 33.828224,780.67935 c -0.362435,10e-6 -0.643526,0.13386 -0.843274,0.40156 -0.199751,0.26771 -0.299626,0.64456 -0.299624,1.13055 -2e-6,0.48393 0.09987,0.85974 0.299624,1.12745 0.199748,0.26771 0.480839,0.40156 0.843274,0.40156 0.364488,0 0.646609,-0.13385 0.846362,-0.40156 0.199746,-0.26771 0.299621,-0.64352 0.299624,-1.12745 -3e-6,-0.48599 -0.09988,-0.86284 -0.299624,-1.13055 -0.199753,-0.2677 -0.481874,-0.40155 -0.846362,-0.40156 m 0,-0.8618 c 0.741335,0 1.32205,0.21211 1.742147,0.63631 0.420087,0.42422 0.630133,1.01008 0.630138,1.7576 -5e-6,0.74545 -0.210051,1.33029 -0.630138,1.7545 -0.420097,0.42421 -1.000812,0.63631 -1.742147,0.63631 -0.739282,0 -1.319997,-0.2121 -1.742147,-0.63631 -0.420093,-0.42421 -0.630139,-1.00905 -0.630139,-1.7545 0,-0.74752 0.210046,-1.33338 0.630139,-1.7576 0.42215,-0.4242 1.002865,-0.63631 1.742147,-0.63631"
- d="m 37.096294,779.90095 3.209381,0 0,0.89887 -2.020149,0 0,0.85872 1.899681,0 0,0.89887 -1.899681,0 0,1.95529 -1.189232,0 0,-4.61175"
- d="m 41.420773,779.90095 3.209381,0 0,0.89887 -2.020149,0 0,0.85872 1.899681,0 0,0.89887 -1.899681,0 0,1.95529 -1.189232,0 0,-4.61175"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 60.982143,810.04086 -3.75,0"
- inkscape:connector-curvature="0" />
- style="font-size:6.17188454px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
- sodipodi:linespacing="125%"><tspan
- y="812.17749">ON</tspan></text>
--- a/tests/traffic_lights/svgui-0@svgui/pyfile.xml Fri Oct 01 15:36:09 2021 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- Web interface is build as SVG file in Inkscape.
- To edit SVG file click 'Inkscape' button on the toolbar above.
- Inkscape is a free and open-source vector graphics editor.
- It's not part of Beremiz and needs to be installed separately.