User Tools

Site Tools


userpages:hermannk:locos_activate3-de

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

Es wird jetzt noch eine Aktion benötigt, die das XML-Script aufruft:

-

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

userpages/hermannk/locos_activate3-de.txt · Last modified: 2023/12/17 09:31 by hermannk