Table of Contents
Lokomotiven aktivieren/de-aktivieren
Userpages - Hermann (hermannk)
vorab gibt es hier den Rocrail-Arbeitsbereich-Download Version 3 |
Vorwort 1:
Damit wurde diese Dokumentation erstellt: Stand 27.01.2022
Attribut | Wert | Bemerkung |
---|---|---|
Steuerung | Rocrail | Version 2.1.2060+ (macOS "Catalina" on Intel CPU) |
Computer | MacBook Pro (Intel) | macOS 12.1 (Monterey) |
Update Version 3 (MODEL wurde ersetzt durch SET): Stand 17.12.2023
Attribut | Wert | Bemerkung |
---|---|---|
Steuerung | Rocrail | Version 2.1.3933+ (macOS "Sonoma" on Apple CPU) |
Computer | MacBook Pro (M2) | macOS 13.5.2 (Ventura) |
Vorwort 2:
- die Nutzung dieser Lösung erfolgt auf eigenes Risiko;
- regelmäßige Datensicherungen des Rocrail-Arbeitsbereichs werden empfohlen;
Vorwort 3:
- eine Mehrfach-Traktion wird berücksichtigt!
- max. 5 Lokomotiven in einer Mehrfach-Traktion
Aufgabenstellung
Im Rocrail-Forum wurde die Anfrage gestellt, nur die Lokomotiven, die sich in einem Block befinden, in der Lok-Liste "sichtbar" und "aktiv" anzuzeigen.
Ferner sollten alternativ auch wieder alle Lokomotiven "sichtbar" und "aktiv" angezeigt werden.
Das XML-Script "ac_locos_activate.xml" erfüllt diese Aufgabe.
-
Lösung-Details
a) der aufrufende Ausgang ist "on":
- alle Loks anzeigen/aktivieren;
sonst
b) wegen der Mehrfach-Traktion werden zwei Durchläuft benötigt:
b1) alle Loks, die nicht in einem Block sind, verbergen/deaktivieren;
b2) alle Mehrfach-Traktionen korrigieren.
Lösung-Vorbereitung
In der Vergangenheit wurde die MODEL-Anweisung verwendet, um Datenstrukturen zu verändern. Das kann seit einiger Zeit durch die SET-Anweisung abgelöst werden. Wegen Fragen im Forum soll das hier einmal vollständig dokumentiert werden.
SET benötigt eine Variable, deren Text-Inhalt bzw. Wert-Inhalt auf ein Attribute übertragen werden soll: siehe https://wiki.rocrail.net/doku.php?id=xmlscripting-de#set
Hier sollen die Variablen "vr_ala_true" und "vr_ala_false" benutzt werden, um TRUE bzw. FALSE auf ein BOOL-Attribute übertragen zu können.
<vr id="vr_ala_true" text="true" value="1"/> <vr id="vr_ala_false" text="false" value="0"/>
Lok aktivieren
Eine Lokomotive (hier "lc11") kann aktiviert bzw. de-aktiviert werden durch Anwendung der Text-Inhalte der Variablen auf das Lokomotiv-Attribut "active";
- aktivieren:
<set vr="vr_ala_true" table="lclist" id="lc11" set="active" setint="false"/>
- de-aktivieren:
<set vr="vr_ala_false" table="lclist" id="lc11" set="active" setint="false"/>
Lok anzeigen
Eine Lokomotive (hier "lc11") kann angezeigt bzw. verborgen werden durch Anwendung der Text-Inhalte der Variablen auf das Lokomotiv-Attribut "show";
- anzeigen:
<set vr="vr_ala_true" table="lclist" id="lc11" set="show" setint="false"/>
- verbergen:
<set vr="vr_ala_false" table="lclist" id="lc11" set="show" setint="false"/>
der Aufbau des XML-Scripts
Es sollen alle Lokomotiven in dem Rocrail-Plan untersucht werden;
das geschieht mit einer Programm-Schleife ("foreach") über die Elemente in der Lokomotiv-Liste ("lclist"):
<foreach table="lclist" > ... </foreach>
a) im Zustand "on" des XML-Script-aufrufenden Rocrail-Ausganges ("co %callerid%") werden die Lokomotiven angezeigt/aktiviert:
<if state="co %callerid% = on"> <then> <!-- show and activate all locos --> <exit/> <!-- das Script wird beendet --> </then> </if>
sonst
b1) alle Loks, die nicht in einem Block sind, verbergen/deaktivieren:
Ob sich die Lok "lc11" in einem Block befindet, erfährt man mit der Abfrage (query):
<query vr="vr_ala_tmp" table="lclist" id="lc11" get="blockid"/>
… und anschließender Abfrage ("(null)" steht für "kein Block"):
<if condition="@vr_ala_tmp = (null)">
Die festen Lokomotiv-Kennungen werden in der Programmschleife durch die Lauf-Variable "%oid%" ersetzt.
b2) alle Mehrfach-Traktionen korrigieren:
Eine Liste der Lokomotiven, die zu einer Mehrfach-Traktion gehören, erhält man durch die Abfrage:
<query vr="vr_ala_consist" table="lclist" id="%oid%" get="consist"/>
Da mehr als eine Lok zu einer Mehrfach-Traktion gehören können, wird die Liste Element für Element abgearbeitet:
im Test-Arbeitsbereich ist das für die Lok "lc15a" die Komma-separierte Liste "lc15b,lc15c":
<vr id="vr_ala_tmp" text="@@0vr_ala_consist"/> <while condition="@vr_ala_tmp ! (null)"> ... </while>
das XML-Script
Die Trace-Zeilen können mit "<xmlscript trace="false">" deaktiviert werden:
<?xml version="1.0" encoding="UTF-8"?> <xmlscript trace="false"> <!-- 17.12.2023 Version 3 MODEL replaced by SET <!-- 26.01.2022 ac_locos_activate Version 2 en: make backups before usage; use at your own risk; de: vorher immer eine Datensicherung machen; anwenden auf eigene Gefahr; en: consist is handeled de: Mehrfach-Traktion wird behandelt --> <trace text="ac_locos_activate: begin %callerid% %state% "/> <vr id="vr_ala_true" text="true" value="1"/> <vr id="vr_ala_false" text="false" value="0"/> <if state="co %callerid% = on"> <then> <foreach table="lclist" > <trace text="- ala: %oid% activate; status %state% "/> <set vr="vr_ala_true" table="lclist" id="%oid%" set="show" setint="false"/> <set vr="vr_ala_true" table="lclist" id="%oid%" set="active" setint="false"/> </foreach> <trace text="ac_locos_activate: exit"/> <exit/> </then> </if> <vr id="vr_ala_tmp" text="" value="0" generated="true"/> <vr id="vr_ala_consist" text="" value="0" generated="true"/> <!-- first run: for all locos (wrong settings will be corrected in second run) --> <foreach table="lclist" > <query vr="vr_ala_tmp" table="lclist" id="%oid%" get="blockid"/> <trace text="- ala1: %oid% @vr_ala_tmp "/> <if condition="@vr_ala_tmp = (null)"> <then> <trace text="- ala1: %oid% @vr_ala_tmp kein Block; deactivate"/> <set vr="vr_ala_false" table="lclist" id="%oid%" set="show" setint="false"/> <set vr="vr_ala_false" table="lclist" id="%oid%" set="active" setint="false"/> </then> <else> <trace text="- ala1: %oid% im Block @vr_ala_tmp ; activate"/> <set vr="vr_ala_true" table="lclist" id="%oid%" set="show" setint="false"/> <set vr="vr_ala_true" table="lclist" id="%oid%" set="active" setint="false"/> </else> </if> </foreach> <!-- second run: for consist locos only (correct wrong settings) --> <foreach table="lclist" > <query vr="vr_ala_tmp" table="lclist" id="%oid%" get="blockid"/> <query vr="vr_ala_consist" table="lclist" id="%oid%" get="consist"/> <trace text="- ala2: bk= %oid% lc= @vr_ala_tmp consist= @vr_ala_consist "/> <if condition="@vr_ala_tmp = (null)"> <then> <!-- consist loco is OK; everything is already done --> <trace text="- ala2: %oid% @vr_ala_tmp @vr_ala_consist consist loco is OK;"/> </then> <else> <!-- correct consist loco --> <vr id="vr_ala_idx" text="" value="0" generated="true"/> <vr id="vr_ala_tmp" text="@@0vr_ala_consist"/> <while condition="@vr_ala_tmp ! (null)"> <trace text="-- ala2: while %oid% @vr_ala_tmp "/> <set vr="vr_ala_true" table="lclist" id="@vr_ala_tmp" set="show" setint="false"/> <set vr="vr_ala_true" table="lclist" id="@vr_ala_tmp" set="active" setint="false"/> <!-- get next slave loco --> <vr id="vr_ala_idx" text="" value="#vr_ala_idx + 1"/> <switch var="#vr_ala_idx"> <case val="1"> <vr id="vr_ala_tmp" text="@@1vr_ala_consist"/> </case> <case val="2"> <vr id="vr_ala_tmp" text="@@2vr_ala_consist"/> </case> <case val="3"> <vr id="vr_ala_tmp" text="@@3vr_ala_consist"/> </case> <case val="4"> <vr id="vr_ala_tmp" text="@@4vr_ala_consist"/> </case> <default> <vr id="vr_ala_tmp" text="@@9vr_ala_consist"/> </default> </switch> <trace text="-- ala2: while next %oid% #vr_ala_idx @vr_ala_tmp "/> </while> </else> </if> </foreach> <trace text="ac_locos_activate: end"/> </xmlscript>
die Aktion
das XML-Script anwenden
Ein Rocrail-Ausgang ruft das XML-Script auf im Status "on" und im Status "off":
Je nach Status werden
- alle Lokomotiven angezeigt und aktiviert oder
- es werden nur die angezeigt und aktiviert, die sich in einem Block oder Aufstellung-Block befinden:
-
Fazit
Um diese Lösung im eigenen Rocrail-Plan zu nutzen,
- kopiert man die XML-Script-Datei "ac_locos_activate.xml" in seinen Arbeitsbereich (genauer: in seinen Script-Ordner);
- erzeugt im Plan eine neue Aktion, die dieses XML-Script anwendet;
- erzeugt im Plan einen Ausgang, der die Aktion im Status "on" und im Status "off" aufruft.
starke Hinweise:
- vorher immer eine Datensicherung machen!
- anwenden auf eigene Gefahr!
Der Arbeitsbereich locos_activate3