9.0 Grundlagen zu Lua in EEP

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • 1 Die Programmiersprache Lua

    Lua (portugiesisch für Mond) ist eine imperative und erweiterbare Skriptsprache, also eine Programmiersprache, die während der Ausführung des Programms in Computerbefehle übersetzt wird.

    Lua wurde 1993 von Roberto Ierusalimschy, Luiz Henrique de Figueiredo und Waldemar Celes in der Computer Graphics Technology Grou der Päpstlichen Katholischen Universität von Rio de Janeiro in Brasilien entwickelt. Lua ist freie Software und wurde bis zur Version 4 unter einer eigenen BSD-Lizenz veröffentlicht, ab Version 5 unter der MIT-Lizenz.

    Lua kann sowohl zum Verfassen eigenständiger Programme verwendet werden als auch als eingebettete Sprache dienen. Die Vorteile von Lua sind die geringe Größe von 120 kB, die Erweiterbarkeit und die hohe Geschwindigkeit, verglichen mit anderen Skriptsprachen.

    Um einzelne Komponenten eines Computerspiels wie z.B. Konfigurationsdateien oder die künstliche Intelligenz von computergesteuerten Charakteren oder Gegnern von der Spiel-Engine zu trennen, kommt Lua bei der Entwicklung von Computerspielen oft zum Einsatz. Dies macht die meist teuer entwickelte Spiel-Engine flexibler und ermöglicht eine mit geringerem Aufwand verbundene Wiederverwendbarkeit, weshalb Lua im Bereich proprietärer Spiele verwendet wird. (Quelle: Wikipedia)

    Lua wurde in EEP mit dem Plug-in 2 zu "Eisenbahn-X" (EEP10.2) eingeführt.


    Logo der Skriptsprache Lua: Autor Alexandre Nakonechnyj (Grafik-Design) und Lua-Team (PostScript-Code)

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 2 Lua-Sprachreferenz

    Lua ist eine lebende Programmiersprache, d.h. sie wird laufend erweitert. Zu jeder Version wird ein Referenzhandbuch veröffentlicht, das die Syntax der Sprache beschreibt.

    In EEP 16 ist die Lua-Version 5.3 enthalten. Refenzhandbücher sind für diese Version nur in Englisch und Russisch verfügbar. Für die Lua-Version 5.2 gibt es neben einem englischen Referenzhandbuch noch welche in Polnisch und Portugiesisch. Ein Referenzhandbuch in deutscher Sprache ist bislang "nur" für die Lua-Version 5.1 unter

    https://www.lua.org/manual/5.1/de/

    verfügbar. Der Umfang dieses Referenzhandbuch dürfte aber - vielleicht mit Ausnahme für einige wenige Lua-Experten - durchaus mehr als ausreichend sein, um Lua-Skripte für EEP zu schreiben.

    Diese Handbücher sind sehr umfangreich. Thomas Lauer hat auf seiner Webseite eine Kurzreferenz veröffentlicht - zwar auch nur in Englisch -

    http://thomaslauer.com/download/luarefv51.pdf

    jedoch stellt er Links zu deutschen Online-Google-Übersetzungen in zweispaltiger und einspaltiger Form zur Verfügung.

    Für Lua-Anfänger sind sicher deutschsprachige Tutorials mit Beispielen erklärender, wie zum Beispiel:

    Probieren geht über Studieren. Die schnellste und einfachste Art Lua-Code auszuprobieren, geht über die Testseite der Lua-Entwickler:

    http://www.lua.org/demo.html

    Code eingeben, auf "run" klicken und schon erscheint das Ergebnis oder eine Fehlerbeschreibung.

    Neben dem in Lua enthaltenen Sprachumfang stehen in EEP zusätzlich noch eine Anzahl spezifischer Variablen und Funktionen zur Verfügung, die eine Verbindung zu EEP-Anlagen herstellen und diese beeinflussen können. Sie beginnen alle mit EEP (siehe im Lua-Handbuch bzw. hier online ab Kapitel 1).

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 3 Lua-Einbindung in EEP

    3.1 Der (interne) Lua-Skript-Editor

    Zur Eingabe von Lua-Code enthält EEP einen Skript-Editor (Bild 3.1). Diesen Editor öffnet man mit einem Klick mit der linken Maustaste auf das in Bild 3.2 gekennzeichnete Symbol in der Menüleiste.

    Der in EEP installierte Lua Skript-Editor ist ein sehr einfacher Editor. Er bietet u. a. keine farbliche Lua-Unterstützung, der Tabulator ist fest auf 4 Zeichen eingestellt und er bietet keine Erweiterungsmöglichkeiten z. B. für Vorschläge zur Lua-Syntax und spezifischen EEP-Funktionen.

    Wichtig: Ein erstelltes Skript muss immer an EEP übertragen werden.

    Nachdem ein Skript erstellt oder Änderungen daran vorgenommen wurden, muss stets die Schaltfläche "Skript neu laden" (Bild 3.3 und Bild 3.1 unten rechts) angeklickt werden! Ansonsten geht das Skript oder die daran vorgenommenen Änderungen verloren, wenn der Skript-Editor geschlossen wird.

    Wurde der Skript-Editor zur Bearbeitung aus dem 2D-Fenster aufgerufen, startet das neu geladene Lua-Skript immer erst nach der Umschaltung ins 3D-Fenster. Wurde der Skript-Editor aus dem 3D-Editor zur Bearbeitung aufgerufen, startet das Script direkt nach dem Anklicken der "Skript neu laden"-Schaltfläche.

    Ein erstelltes Skript wird automatisch gemeinsam mit der Anlage gespeichert und geladen.

    Eine Speicherung des Skripts unabhängig von der Anlage - zum Beispiel als Backup -, erfolgt über die Schalfläche "Lua Skript speichern" (rechts im Bild 3.4). Umgekehrt kann man ein extern gespeichertes Skript über die Schaltfläche "Lua Skript laden" (links im Bild 3.4) in den Skript-Editor holen. Aber Achtung, auch hier muss das neu geladene Skript mit der Schaltfläche "Skript neu laden" (Bild 3.3) nach EEP übertragen werden.

    Lua-Skripte in EEP sind auf maximal 67634 Zeichen begrenzt. Sollte es notwendig sein, diese Kapazitätsgrenze zu überschreiten, so muss ein Teil des Codes in andere .lua-Dateien ausgelagert werden. Dies sollte möglichst für zusammenhängende Blöcke/Module erfolgen, z.B. Code für Bahnübergänge, Ampelsteuerungen, Fahrstraßenschaltungen, um nur einige Möglichkeiten zu nennen. Diese "Auslagerungsdateien" sollten bevorzugt im LUA-Ordner der EEP-Version oder in einem Unterordner darunter gespeichert werden. Dann sind sie leicht über die allgemeine Lua-Funktion require() in das Hauptskript MeineAnlage.lua einzubinden:

    require("Ampelsteuerung") oder

    require("MeineAnlage/BUe") oder

    require("MeineAnlage\\Fahrstrassen").

    Die Pfadangabe hat relativ zum Ordner LUA im EEP-Verzeichnis und ohne die Dateiendung .lua zu erfolgen. Trennzeichen zwischen Ordner- und Dateinamen ist entweder ein einfacher Schrägstrich oder ein doppelter Backslash.

    Wenn man den Lua-Skript-Editor über das "Fenster schließen"-Kreuz im Fenster oben rechts abbricht/schließt, wurde bis einschließlich EEP 17.1 Plug-in 1 das Lua-Skript danach trotzdem einmal ausgeführt. Dies geschieht mit dem Plug-in 2 zu EEP 17.2 sowie EEP 18 und höher nicht mehr.

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 3.2 Nutzung eines externen Editors

    Bei der Nutzung eines externen Editors zur Erstellung von Lua-Code für eine EEP-Anlage muss man unbedingt darauf achten, dass als Kodierung ANSI (und nicht UTF-8) eingestellt ist.

    Bis einschließlich EEP 16 kann man bei geschlossenem EEP nur den Data-Slot-Teil am Ende der MeineAnlage.lua bearbeiten, der im internen Lua-Skript-Editor nicht sichtbar ist. Wird auch der Code geändert, ignoriert EEP ihn vollständig und zeigt stattdessen den Standard-Eröffnungscode an. Dies kann man umgehen, indem man den Code im externen Editor nach der Bearbeitung in die Zwischenablage kopiert und ihn daraus dann in den internen EEP-Lua-Editor einfügt.

    Ab EEP 17 gibt es zwei Methoden wie man Lua-Code mit einem externen Editor bearbeiten kann.

    a) Bei geschlossenem EEP:

    Ab EEP 17 kann man den kompletten Code bei geschlossenem EEP mit einem externen Editor bearbeiten. Und man muss nach dem Start von EEP noch nicht einmal das Skript neu laden. Dies ist eine sehr sichere Methode einer Codebearbeitung mit einem externen Editor, da bei geschlossenem EEP immer ein definierter Anlagenzustand gewährleistet ist. Außerdem kann die Codebearbeitung mit beliebigen Editoren erfolgen, solange sie in ANSI kodieren.

    b) Bei geöffnetem EEP:

    Ab EEP 17 kann man auch einen externen Editor aus dem internen Lua-Skript-Editor heraus aufrufen. Dies funktioniert allerdings nur mit 64bit-Editoren.

    Den Data-Slot-Teil des Skripts kann man weiterhin nicht bei geöffnetem EEP bearbeiten. Das gilt sowohl für den internen Skript-Editor als auch für den daraus aufgerufenen externen Editor.

    Der Windows eigene Editor "Notepad" ist als externer Editor in EEP 17 voreingestellt (Bild 3.1). Da er in Windows integriert ist, genügt hier der Name "notepad" ohne Suffix und ohne weitere Pfadangabe im entsprechenden Feld des internen Editors. "Notepad" bietet aber keine Vorteile gegenüber dem internen Lua-Skript-Editor.

    Bei jedem anderen Editor muss man den vollständigen Installationspfad des Editors inklusive Suffix in das entsprechende Feld im internen Editor eintragen (Bild 3.5).

    Man kann den Pfadeintrag jederzeit gegen den eines anderen Editors ändern oder den bestehenden Eintrag löschen, wenn man keinen externen Editor nutzen möchte. Der interne Lua-Skript-Editor ist weiterhin wie gehabt nutzbar.

    Empfehlenswert als externer Editor ist "Notepad++". Er kann auf Lua als Sprache eingestellt werden. Die Tabulatorsprünge lassen sich individuell einstellen. Man kann EEP-Funktionen farblich und/oder im Schriftstil hervorheben und sogar mit einem Plug-in automatisch ergänzen lassen (siehe auch Bild 3.6).

    Wenn man Notepad++ an dem von ihm vorgeschlagenem Ort installiert hat, gibt es 3 mögliche Pfadeingaben im Eingabefeld des EEP-Lua-Skript-Editors:

    · "C:\Program Files\Notepad++\notepad++.exe" (mit Anführungszeichen)

    · C:\Program Files\Notepad++\notepad++.exe (ohne Anführungszeichen)

    · C:\Programme\Notepad++\notepad++.exe

    "Programme" ist ein windowsinterner Hardlink auf den eigentlichen Speicherort "Program Files". Dieser Ordner kann aber bei einigen Benutzern als unsichtbar eingestellt sein.

    Man kann aber auch im Windows Explorer sich den vollständigen Pfad in die Zwischenablage kopieren, in dem man die Datei notepad++.exe bei gedrückter Shift-Taste mit der rechten Maustaste anklickt (Die Shift-Taste ist wichtig, sonst erscheint "als Pfad kopieren" nicht!) und ihn dann ihn dann aus der Zwischenablage in das Eingabefeld einfügen.

    Und noch etwas ist WICHTIG: Nach der Pfad-Eintragung des externen Editors muss man einmal die Schaltfläche Skript neu laden anklicken. Nur dann bleibt der Pfad in EEP gespeichert.

    Nach dem Klick auf die Schaltfläche Externer Lua-Editorwird dieser mit der temporären Lua-Datei TempEdit.LUA geöffnet. Während der Codebearbeitung kann man externe Programme (z.B. Browser, PDF-Reader, Windows Explorer etc.) öffnen, um etwas nachzusehen, daraus zu kopieren oder sonst was tun. Man kann sie aber muss sie nicht anschließend schließen. Man kann zwischendurch auch andere Dateien mit dem externen Editor bearbeiten. Hat man den Lua-Code fertig bearbeitet, muss man im externen Editor die temporäre Lua-Datei abspeichern. Dies erfolgt automatisch im LUA-Ordner von EEP. Man sollte sie daher nie unter einem anderen Namen und/oder einem anderen Pfad speichern.

    Abschließend muss man immer den externen Editor schließen!!!

    Hat man während der Codebearbeitung andere Programme geöffnet, so kann es sein, dass diese ansichtsmäßig über EEP liegen. In einem solchen Fall muss man durch einen Klick in das Fenster des internen Editors, das Fenster von EEP oder auf das EEP-Icon in der Windows-Taskleiste wieder den Focus auf den internen Editor richten. Im Normalfall liegt er aber nach dem Schließen des externen Editors wieder beim internen Editor.

    Aber Achtung, nach der Rückkehr in den internen Lua-Skript-Editor muss man nach einer Änderung des Codes unbedingt mit der gleichnamigen Schaltfläche (Bild 3.3) das "Skript neu laden".

    Will man eine Bearbeitung im externen Editor abbrechen, geht man am besten folgendermaßen vor. Man schließt im externen Editor die temporäre Datei und beantwortet ggf. die Abfrage, ob man sie nicht speichern möchte, mit "nein". Danach schließt man den externen Editor (WICHTIG) und bricht auch den internen Editor über das X in dessen Kopfzeile ab.

    Was man nicht tun sollte ist, aus dem externen Editor (ohne diesen zu schließen) durch einen Klick in das Fenster des internen Editors, in das EEP-Fenster oder auf das EEP-Icon in der Windows-Taskleiste den Fokus wieder auf EEP setzen. In dem Fall färbt sich EEP milchig ein und entweder in der Kopfzeile des internen Editors oder in der des EEP-Fensters steht "keine Rückmeldung". Nun sollte man möglichst nicht auf eine der X-Schaltflächen in den Kopfzeilen klicken, denn dann erscheint die Windows-Warnung "EEP reagiert nicht" mit den Möglichkeiten zu schließen oder zu warten. Nun sollte man auf keinen Fall auf "Programm schließen" klicken, denn dann sind alle ggf. gemachten Änderungen verloren.

    Es gibt aber (selbst noch an dieser Stelle) einen Ausweg, denn der externe Editor ist ja noch offen. Durch einen Klick in den externen Editor oder auf dessen Icon in der Windows-Taskleiste holt man ihn wieder in den Fokus. Nun kann man die temporäre Datei schließen oder auch nicht. Auf jeden Fall sollte man nun den externen Editor schließen. Danach erscheint EEP als wäre nichts gewesen.

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 3.3 Von EEP generiertes Lua-(Start)-Skript

    Mit jeder neuen Anlage generiert EEP eine Lua-Datei mit dem Namen der Anlage und der Endung .lua. Diese Datei enthält zu Beginn folgendes Lua-Skript (Bild 3.6).

    In Zeile 1 des Skripts wird die Variable I mit 0 initialisiert. I ist eine globale Variable, d.h. sie steht im gesamten Skript in allen Funktionen zur Verfügung. Auf die Bedeutung von I wird nachstehend genauer eingegangen.

    In Zeile 2 werden mit dem Aufruf der Funktion clearlog() (siehe hierzu 9.2 System-Funktionen) alle Einträge im EEP-Ereignisfenster (siehe Kapitel 3.4) gelöscht.

    Die print-Funktion (siehe hierzu 9.2 System-Funktionen) in Zeile 4 gibt einen ersten neuen Text im EEP-Ereignisfenster aus. Hierbei muss alles, was ausgegeben werden soll, zwischen den runden Klammern (…) hinter print stehen. Reiner Text muss wie bei einer wörtlichen Rede in einem Buch zwischen Anführungszeichen"…" geschrieben werden. "Hey let's start, EEP Version is: " (zu Deutsch: "Hey, fangen wir an, die EEP-Version ist: ") kann natürlich gegen einen eigenen Text ausgetauscht werden. EEPVer ist eine spezifische EEP-Lua-Variable, die die aktuell geöffnete EEP-Version zurückgibt. (Siehe hierzu Kapitel 9.1 System-Variablen.) EEP verbindet den Eigentext mit dem Wert der Variablen zu einem Gesamttext: Hey let's start, EEP Version is: 17.

    Das Herzstück jedes Lua-Skripts in EEP ist die Funktion EEPMain() (siehe hierzu 9.2 System-Funktionen), hier in Zeile 6. Wie jede Funktionsdefinition beginnt diese mit dem englischen Schlüsselwort function (zu Deutsch: Funktion). Dahinter folgt der Name der Funktion, hier EEPMain. Hinter dem Funktionsnamen stehen immer die beiden sich schließenden runden Klammern (). Bei vielen Funktionen können sog. Parameter übergeben werden, die dann durch Kommata getrennt zwischen die runden Klammern geschrieben werden, wie z.B. oben bei der print-Funktion. An die EEPMain() können keine Parameter übergeben werden. Eine Funktionsdefinition endet immer mit dem englischen Schlüsselwort end (zu Deutsch: Ende), hier in Zeile 11.

    Die EEPMain() wird in der Regel 5 x pro Sekunde – also alle 0,2 Sekunden – von EEP aufgerufen. Was während eines Aufrufs der EEPMain() durch EEP passieren soll, muss zwischen den Zeilen function EEPMain() und end stehen.

    In Zeile 7 wird über einen print-Befehl nicht nur der aktuelle Wert der Variablen I ausgegeben, sondern auch das davor gesetzte Wort "Counter: " (zu Deutsch: Zähler). Mit ihm wird klar, was I ist. I zählt die Durchläufe der Funktion EEPMain(). Hierzu wird I in Zeile 8 bei jedem Aufruf der EEPMain() durch EEP um 1 erhöht.

    Somit kann man die Variable I nutzen, um z.B. beim x-ten Durchlauf der EEPMain() etwas passieren zu lassen. Im von den EEP-Programmierern vorgefertigten Skript geschieht das in Zeile 9: if (I>9) then (zu Deutsch: wenn (I größer 9) ist, dann …). Doch zu Beginn ist das ja noch nicht der Fall. Beim 1. Aufruf der EEPMain() ist I ja noch 0 und Lua springt sofort zur nächsten Zeile 10.

    return (zu Deutsch: zurück/Rückgabe) ist ein weiteres Lua-Schlüsselwort. Mit return wird der dahinterstehende Wert an EEP übergeben und die Funktion beendet. Ist dieser Rückgabewert gleich 1, so bedeutet das für EEP, dass EEP weiterhin alle 0,2 Sekunden die EEPMain() aufruft.

    D.h., dass mit jedem Aufruf der EEPMain() I um 1 erhöht wird. Nach 2 Sekunden ist I dann aber größer 9, Zeile 9 tritt in Kraft und der Wert 0 wird an EEP zurückgegeben. Der Rückgabewert 0 bedeutet für EEP, die EEPMain() ab sofort nicht mehr aufzurufen. Alle anderen eventuellen Lua-Funktionen, die z.B. durch Kontaktpunkte aufgerufen werden (siehe Kapitel 5) werden weiterhin abgearbeitet, aber nicht mehr die EEPMain().

    Möchte man also den zyklischen Aufruf der EEPMain() in seinem Lua-Skript nutzen, was in der Regel der Fall ist, so muss man als erste Maßnahme Zeile 9 aus dem vorgegebenen Skript löschen!

    In dem Fall wird aber dauernd (also alle 0,2 Sekunden) der Wert von I im Ereignisfenster ausgegeben. Hierdurch kann man sehr schnell andere wichtige Ausgaben übersehen. Deshalb empfiehlt es sich, entweder auch Zeile 7 zu löschen oder wenigstens direkt vor print 2 Minuszeichen zu setzen: --print("Counter: ", I). 2 Minuszeichen interpretiert Lua als sog. Kommentarzeichen und ignoriert alles was in der Zeile hinter den beiden Minuszeichen steht. Möchte man z.B. für eine Kontrolle doch einmal den Wert von I angezeigt haben, so muss man nur die beiden Minuszeichen wieder löschen.

    Mit dem Plug-in1 zu EEP 17.1 wurde aus dem in Bild 3.6 gezeigten Startcode sowohl die Willkommens-print-Zeile (4) als auch alles was zum Zähler I gehört (Zeilen 1 und 7 – 9) entfernt. Damit wurde der Startcode auf das unbedingt Notwendige reduziert:

    Lua
    clearlog()
    
    function EEPMain()
        return 1
    end

    In den meisten Fällen ist es egal, wo man andere Funktionen in das Skript einträgt, da es nach jedem neuen Laden 1 x durch EEP komplett abgearbeitet wird. Es kann jedoch passieren, dass bestimmte Funktionen nur dann ausgeführt werden, wenn die Funktionen vor der EEPMain() im Skript stehen. Aus diesem Grund ist es ratsam, die EEPMain() immer ans Ende der .lua-Datei mit dem Anlagennamen zu stellen.

    3.4 Ausgabe von Meldungen im EEP-Ereignisfenster

    Lua-Fehlermeldungen oder mit der Lua-Funktion print() im Skript erstellte eigene Meldungen werden im EEP Ereignis-Fenster ausgegeben (Bild 3.7).

    Damit das Ereignisfenster auf dem Bildschirm dargestellt wird, muss es in den Programmeigenschaften (erreichbar über den Menüpunkt "Datei") im Bereich "Optionale Funktionsweise" aktiviert werden (siehe Bild 3.8).

    Neben den Lua-Fehlermeldungen und eigenen Meldungen können auch Statusmeldungen von Signal-, Weichen-, Fahrzeug- und Kontaktpunktereignissen im Ereignisfenster angezeigt werden, wenn dies entsprechend im Skript-Editor aktiviert wird (siehe Bild 3.1 links unten und Bild 3.9).

    Mit dem Plug-in 2 zu EEP 17.2 hat sich die Anzahl der letzten im Ereignisfenster sichtbaren Ausgabezeilen von 500 auf 1.024 Zeilen erhöht, so dass man über einen mehr als doppelt so großen Bereich die Ausgaben zurückverfolgen kann.

    Außerdem ist es nun möglich diese Ausgaben über das Fenstermenü des Ereignisfensters zu speichern (siehe Bild 3.10).

    Die gespeicherte Log-Datei heißt MeineAnlage.eep.log und befindet sich im selben Ordner, in dem sich auch die Datei MeineAnlage.anl3 befindet. Dabei entspricht natürlich "MeineAnlage" dem Namen, unter dem die Anlage zuletzt gespeichert wurde

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 4 Lua-Wizard

    Der in EEP enthaltene Lua-Wizard liefert die Möglichkeit Lua-Skripte bzw. EEP-spezifische Funktionen auf einfache Art zu erstellen. Den Wizard öffnet man über das Menü Extras -> Wizard. Nach dem Start legt er sich über das Menü und die Werkzeugleiste von EEP, ist aber frei beweglich. Der Wizard besteht zunächst neben einem Kurzmenü nur aus einer Auswahlleiste für die zu erstellenden diversen Lua-Aufgaben (Bild 4.1). Die nicht nummerierte Schaltfläche am Ende der Leiste schließt den Wizard. Nach Betätigen einer der mit 1 - 6 nummerierten Schaltflächen erscheint grundsätzlich zuerst ein Fenster mit der Frage, ob man die Anlage vor dem Aufruf des Wizards gespeichert hat. Hierzu wird dringend geraten. Erst nach Bejahung der Frage erscheinen nacheinander weitere Fenster, die einen durch den Wizard führen.

    4.1 Erstellung eines Lua-Skripts für einen EEP-Fahrplan

    Durch einen Klick auf die mit 1 im Bild 4.1 gekennzeichnete Schaltfläche erscheint das Hauptfenster für die Fahrplanerstellung (Bild 4.2).

    Durch Anklicken der Schaltfläche "Hinzufügen" erscheint ein Detailfenster zur Eingabe der entsprechenden Daten (Bild 4.3). Dort klickt man nach der Dateneingabe auf die Schaltfläche "Angaben übernehmen.

    Um eine Datensatz zu ändern, markiert man ihn zunächst durch Anklicken im Hauptfenster (Bild 4.2) und klickt dann auf die Schaltfläche "Ändern". Es erscheint hierfür wieder das Detailfenster (Bild 4.3).

    Um einen Datensatz zu löschen, verfährt man ebenso: Datensatz markieren und Schaltfläche "Löschen" anklicken.

    Sind alle Datensätze eingegeben, klickt man auf die Schaltfläche "Skript erstellen". Es erscheint ein neues Fenster (Bild 4.4) mit dem fertigen Skript inclusive des Lua-Codes, der bereits vorher in der Anlage gespeichert war. Dies kopiert man in die Zwischenablage mit einem Klick auf die gleichnamige Schaltfläche.

    Nachdem sich das Skript-Fenster geschlossen hat, wird man aufgefordert im Lua-Skript-Editor den vorhandenen Text durch den soeben kopierten zu ersetzen und das Skript neu zu laden.

    Hierzu öffnet man den Lua-Script-Editor (siehe Kapitel 3), klickt einmal in den vorhandenen Text und markiert ihn durch gleichzeitiges Drücken der Tasten Strg + A. Danach ersetzt man den markierten Text durch das in der Zwischenablage hinterlegte neue Lua-Skript durch gleichzeitiges Drücken entweder der Tasten Strg + V oder der Tasten Shift + Einfg (gleichwertige Möglichkeiten). Zum Schluss überträgt man das Skript mit der Schaltfläche "Skript neu laden" (Bild 3.3) an EEP.

    Um nach einem späteren erneuten Aufruf der Anlage gegebenenfalls den EEP-Fahrplan zu ändern, ruft man einfach erneut den Lua-Wizard wieder auf.

    Hinweis: Einen Fahrplan, der auch Züge und Routen berücksichtigt und kein Lua-Skript benötigt, kann im Menü "Routen" unter der Option "Fahrplan" erstellt werden (siehe hierzu Kapitel 6.3.2 im EEP-Handbuch).

    4.2 Erstellung eines Lua-Skripts für einen beschrankten Bahnübergang

    Durch einen Klick auf die mit 2 im Bild 4.1 gekennzeichnete Schaltfläche wird man nach der Speicherabfrage gebeten, in den 2D-Modus "Signalsystem" zu wechseln. Nach der Bestätigung mit OK erscheint das Eingabefenster zum Bahnübergang (Bild 4.5). (Achtung: Es erfolgt keine Plausibilitätsprüfung, jedoch ist der nächste Schritt nur im 2D-Modus "Signalsystem" möglich.)

    Folgen Sie den Angaben im Hinweisfenster und klicken Sie die dem Bahnübergang zugehörigen Schranken nacheinander an. Der Wizard ermittelt selbständig die Signal-ID der Schranken und trägt sie in das obere Fenster ein.

    Sind alle Schranken eingegeben schließt man das Fenster über die Schaltfläche "Nächster Schritt". Es öffnet sich das Fenster für das fertige Skript (wie Bild 4.4 nur mit dem Skript für den Bahnübergang). Auch hier enthält das Skript den Code, der bereits vorher in der Anlage gespeichert war. Über die gleichnamige Schaltfläche kopiert man alles in die Zwischenablage.

    Danach wird man aufgefordert im Lua-Skript-Editor den vorhandenen Text durch den soeben kopierten zu ersetzen und das Skript neu zu laden (Vorgehensweise siehe oben "Erstellung eines Lua-Skripts für einen EEP-Fahrplan".)

    Lua-mäßig ist der Bahnübergang damit abgeschlossen. Damit sich die Schranken aber schließen und wieder öffnen, müssen einige Kontaktpunkte gesetzt werden.

    Zunächst setzt man einen Zug-Kontaktpunkt (KP) vor den Bahnübergang in einer Entfernung, dass die Schranken geschlossen sind, bevor sie vom schnellsten Zug auf der Anlage erreicht werden. Im KP setzt man die Häkchen zur Fahrtrichtung (rote Markierung in Bild 4.6) so, dass das Dreieck des KPs in Richtung des Bahnübergangs zeigt. Unter Lua-Funktion (gelbe Markierung) trägt man den Funktionsnamen zum Schließen der Schranken aus dem Lua-Skript BUE_1_SCHLIESSEN ohne die runden Klammern ein.

    Den nächsten Zug-Kontaktpunkt setzt man auf demselben Gleisstrang direkt hinter dem Bahnübergang. Hier setzt man im KP die Häkchen zur Fahrtrichtung so, dass das Dreieck des KPs von dem Bahnübergang weg zeigt. Der KP muss hier vom Zugschluss durch das entsprechend gesetzte Häkchen (grüne Markierung) ausgelöst werden. Unter Lua-Funktion trägt man den Funktionsnamen zum Öffnen der Schranken aus dem Lua-Skript BUE_1_OEFFNEN ohne die runden Klammern ein.

    Für jeden weiteren Gleisstrang zwischen den Schranken setzt man in gleicher Weise KPs.

    Wird ein Gleisstrang von beiden Richtungen befahren, so sind Schließen-Kps wie oben beschrieben auf beiden Seiten des Bahnübergangs zu erstellen. Zum Öffnen genügt ein KP und zwar genau in der Mitte des Bahnübergangs. Im KP sind beide Häkchen für die Fahrtrichtung (rote Markierung in Bild 4.6) zu setzen. Auch hier muss der KP durch das entsprechende Häkchen durch den Zugschluss ausgelöst werden. Damit der KP aber wirklich erst nach dem Passieren des Bahnübergangs durch den Zug ausgelöst wird, setzt man eine Aktivierungsdistanz von 15 Metern (blaue Markierung). Letztlich ist unter Lua-Funktion BUE_1_OEFFNEN einzutragen.

    Befinden sich auf einer Anlage mehrere Bahnübergänge, so ruft man für jeden den Wizard auf. Der Wizard erkennt, dass bereits ein Skript für einen Bahnübergang existiert und erhöht im nächsten Skript entsprechend die ID des Bahnübergangs.

    Wenn ein Bahnübergang zur Zufriedenheit funktioniert, könnte eventuell die dauernde Ausgabe der Meldungen "Bahnübergang 1 schließen" und "Bahnübergang 1 wird geöffnet" nerven. In dem Fall öffnet man den Lua-Skript-Editor und setzt vor die print-Anweisungen 2 Minus-Zeichen, also -- print("Bahnnübergang …).

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 4.3 Erstellung von Lua-Codes zu EEP-spezifischen Funktionen

    Im Gegensatz zu den bisher genannten Anwendungsmöglichkeiten, bei denen fertige Lua-Skripte erzeugt wurden, ist das bei in Bild 4.1 mit 3 bis 6 bezeichneten Möglichkeiten nicht der Fall. Hier werden nur Codes für EEP-spezifische Funktionen erzeugt. Diese können zwar auch über die Zwischenablage im Skript-Editor (siehe Kapitel 3) in den dort vorhandenen Text kopiert werden, um sie aber während des Anlagenbetriebs zur Anwendung kommen zu lassen, sind mindestens Lua-Grundkenntnisse zur Eingabe von umgebendem Code notwendig.

    Auf alle Konstellationen hier einzugehen, ist nicht möglich. Jedoch sei kurz aufgezeigt, welche Eintragungen notwendig sind, um eine solche EEP-spezifische Funktion über einen Kontaktpunkt aufzurufen.

    • Kopieren Sie den im Wizard erzeugten Code über die Zwischenablage z.B. ans Ende des vorhandenen Codes
    • Fügen Sie davor folgende Zeile ein: function TuWasBestimmtes(). Hierbei ist TuWasBestimmtes ein Synonym für einen von Ihnen gewählten Ausdruck für das, was die EEP-Funktion tun soll.
    • Fügen Sie hinter der Zeile mit der EEP-Funktion eine Zeile mit dem Wort end ein.

    Damit könnte ein Code im Skript wie folgt aussehen:

    Lua
    function Kamera_Uebersicht()
        ok = EEPSetCamera(0,"Uebersicht")
    end

    Kamera_Uebersicht wäre dabei das Synonym für TuWasBestimmtes.

    Die mittlere Zeile ist der vom Wizard erzeugte Code.

    Den Funktionsnamen - im Beispiel also Kamera_Uebersicht - fügt man ohne die Klammern in den auslösenden Kontaktpunkt unter Lua-Funktion ein (siehe Bild 4.6 gelbe Markierung).

    Solange man sich in einem Wizard-Bereich - z.B. für Immobilien-Funktionen - befindet, kann man zwischen dem Lua-Skript-Editor und dem Wizard hin und her bewegen, um z.B. mehrere Funktionen für dieselbe Immobilie oder für andere Immobilien zu erstellen.

    Sobald man aber von einem Wizard-Bereich in einen anderen wechseln will, muss man vorher im Lua-Skript-Editor das bis dahin erstellte Skript über die Schaltfläche "Skript neu laden" an EEP übertragen und danach den Skript-Editor schließen. Der Wizard selbst kann derweil geöffnet bleiben.

    4.4 Erstellung einer EEP-spezifischen Immobilien-Funktion

    Durch einen Klick auf die mit 3 im Bild 4.1 gekennzeichnete Schaltfläche erscheint nach der Speicherungsabfrage das Wizardfenster für Immobilien-Funktionen (Bild 4.7). Entweder im 2D-Immobilienmodus oder im 3D-Objekt-Editiermodus klickt man die gewünschte Immobilie an, deren Lua-Name automatisch im oberen Feld übernommen wird.

    Der Wizard erkennt ebenso automatisch welche EEP-spezifischen Funktionen erstellt werden können. Nicht bei der Immobilie vorhandene Funktionen werden ausgegraut.

    Je nach Auswahl der gewünschten Funktion ändert sich das Feld darunter. Bei Rauch, Licht und Feuer hat man die Wahl zwischen ein- und ausschalten.

    Wenn Achsen vorhanden sind, muss diese ausgewählt werden, auch wenn nur eine existiert. Auch hier können sich die Eingabemöglichkeiten Achsen-spezifisch verändern.

    Zur Änderung der Position bzw. der Rotation sind die X-, Y- und Z-Werte einzugeben.

    Wie oben beschrieben kann die generierte Funktion über die Zwischenablage in das Lua-Skript eingefügt und danach das Skript neu geladen werden.

    4.5 Erstellung einer EEP-spezifischen Kamera-Funktion

    Durch einen Klick auf die mit 4 im Bild 4.1 gekennzeichnete Schaltfläche kann eine EEP-spezifische Kamera-Funktion erstellt werden.

    Hierzu muss allerdings in der Anlage mindestens eine statische Kamera gespeichert sein. Ist keine statische Kamera gespeichert, erscheint nach der obligatorischen Speicherungsabfrage eine kryptische Fehlermeldung. Diese kann zwar über die Schaltfläche "Weiter" übergangen werden, doch im dann erscheinenden Wizardfenster für Kamera-Funktionen (Bild 4.8) kann auch keine auf ein Rollmaterial gerichtete Kamera ausgewählt werden, selbst wenn Fahrzeuge vorhanden sind.

    Ist mindestens eine statische Kamera in der Anlage gespeichert, so muss die gewünschte in der Auswahlliste markiert werden und der hierfür erstellte Befehl erscheint direkt im untersten Anzeigefeld.

    Durch Anklicken von "Kameras auf Rollmaterial" erscheint eine Auswahlliste der vorhandenen Fahrzeuge, aus der das gewünschte Fahrzeug ausgewählt werden muss. Unter der Auswahlliste befinden sich 10 Schaltflächen mit den Ziffern 0 bis 9. Sie entsprechen den numerischen Tasten für die Kameraauswahl:

    0 = Perspektive der "alten Kabine" (ggf. andere Perspektive als bei 8)

    1 = direkt auf die linke Seite des Fahrzeugverbandes,

    2 = direkt auf die rechte Seite des Fahrzeugverbandes,

    3 = seitlich von oben auf die linke Seite des Fahrzeugverbandes,

    4 = seitlich von oben auf die rechte Seite des Fahrzeugverbandes,

    5 = von der Front des Fahrzeugverbandes in Fahrtrichtung,

    6 = von vorne auf die Front des Fahrzeugverbandes,

    7 = aktiviert diejenige automatische Kamera, die dem ausgewählten Fahrzeugverband am nächsten steht,

    8 = aus dem Führerstand (ggf. andere Perspektive als bei 0),

    9 = oberhalb des Fahrzeugverbandes in Fahrtrichtung oder die mit EEPRollingstockSetUserCamera() definierte Position

    In diesen Fahrzeugverfolgerkameras wird zwar die erstellte Funktion im untersten Anzeigefeld unvollständig angezeigt, aber mit Klick auf die entsprechende Schaltfläche korrekt in die Zwischenablage übertragen.

    Wie oben beschrieben kann die generierte Funktion über die Zwischenablage in das Lua-Skript eingefügt und danach das Skript neu geladen werden.

    4.6 Erstellung einer EEP-spezifischen Rollmaterial-Funktion

    Durch einen Klick auf die mit 5 im Bild 4.1 gekennzeichnete Schaltfläche erscheint nach der Speicherungsabfrage das Wizardfenster für Rollmaterial-Funktionen (Bild 4.9). Zur Fahrzeugauswahl muss man in den 3D-Objekt-Editiermodus wechseln. Ist das gewünschte Fahrzeug Teil eines Fahrzeugverbands so muss man zuerst das Führungsfahrzeug des Verbands (z.B. die Lok) anklicken. Im oberen Anzeigefenster erscheint automatisch der Lua-Name (mit #-Zeichen) des Fahrzeugverbandes.

    Danach wählt man die gewünschte Funktion aus. Handelt es sich hierbei um eine spezifische Zug(Train)-Funktion wird vom Wizard im untersten Anzeigefeld in der Funktion der Lua-Name des Fahrzeugverbandes (mit #) eingetragen. Handelt es sich dagegen um eine Fahrzeug(Rollingstock)-Funktion erscheint ein Auswahlfeld für die im Fahrzeugverband enthaltenen Fahrzeuge. Hier muss man nun das gewünschte auswählen und im untersten Anzeigefeld wird in der Funktion automatisch der Name des Fahrzeugs (ohne #) eingetragen.

    Je nach Funktion erscheinen im Detailbereich weitere Auswahl- bzw. Eingabefelder für die entsprechenden Parameter der Funktion.

    Achtung: Hier erfolgt keine Plausibilitätsprüfung, ob die ausgewählte Funktion bei dem ausgewählten Fahrzeug möglich bzw. sinnvoll ist.

    Wie oben beschrieben kann die generierte Funktion aus der Zwischenablage in das Lua-Skript eingefügt und danach das Skript neu geladen werden.

    4.7 Erstellung einer EEP-spezifischen Gleis-Funktion

    Durch einen Klick auf die mit 6 im Bild 4.1 gekennzeichnete Schaltfläche erscheint nach der Speicherungsabfrage das Wizardfenster für zwei Gleis-Funktionen (Bild 4.9).

    Entweder im 2D-Gleismodus oder im 3D-Objekt-Editiermodus klickt man das gewünschte Gleis an. Es erscheint im Ausgabefeld sofort der Befehl zur Abfrage, ob das Gleis besetzt ist. Die generierte Funktion kopiert man über die entsprechende Schaltfläche in die Zwischenablage und fügt sie daraus im Lua-Skript-Editor in das Skript ein.

    Da das Gleis für diese Besetztabfrage registriert werden muss, kehrt man in den Wizard zurück. Dort setzt man das Häkchen für Auswahl registrieren. Jetzt erscheint der Registrierungsbefehl für das ausgewählte Gleis im Anzeigefeld und kopiert ihn ebenfalls über die Zwischenablage in das Lua-Skript.

    Neben Eisenbahn-Gleisen erkennt der Wizard auch andere Gleis-Typen und Straßen und Wege. Im 3D-Objekteditiermodus wird sofort der Typ beim Anklicken erkannt und die entsprechende Funktion als Befehl eingestellt. In 2D muss vorher in den entsprechenden Modus gewechselt werden, also z.B. vom Gleis-Modus in den Straßen-Modus.

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • 5 Aufruf von Lua-Funktionen in Kontaktpunkten

    Im Lua-Skript definierte Funktionen können prinzipiell in jedem Kontaktpunkt aufgerufen werden (siehe auch Bild 4.6). Hierzu trägt man in dessen Objekteigenschaften den Funktions-namen ohne runde Klammern und ohne Parameter ein (rote Markierung in Bild 5.1). Will man allerdings "nur" eine Lua-Funktion aufrufen, so empfiehlt sich hierfür ein Sound-Kontakt, wie hier abgebildet.

    Wichtig: Bevor man aber eine Lua-Funktion in einen Kontaktpunkt einträgt, muss diese im Skript eingetragen (wobei ggf. "function Funktionsname" innerhalb eines Kommentars ausreicht) und nach dem Laden des Skripts dieses einmal (durch einen Wechsel in den 3D-Modus) ausgeführt worden sein. Ansonsten erhält man beim Klick auf OK eine Fehlermeldung.

    Ab EEP 17 sind Kontaktpunkte, in denen eine Lua-Funktion aufgerufen wird, sowohl in der 3D- als auch der 2D-Ansicht entsprechend gekennzeichnet.

    Seit EEP11.2 Plug-in 2 übergibt EEP den Namen des Fahrzeugverbandes, der einen Kontaktpunkt überfährt, als Funktionsparameter an die im Kontaktpunkt eingetragene Funktion. Diesem Parameter kann man einen beliebigen Namen geben, z.B. mein_Zug.

    Ab EEP 16.3 Plug-in 3 übergibt EEP zusätzlich die ID des Gleises (der Straße, des Wasserweges etc.) auf dem der Kontaktpunkt liegt als zweiten Parameter an die im Kontaktpunkt eingetragene Funktion. Auch dieser Parameter ist frei wählbar, z.B. Kontaktgleis. Durch diesen 2. Parameter kann dieselbe Lua-Funktion für verschiedene Zwecke verwendet werden, je nachdem auf welchem Gleisstück sich der Kontaktpunkt befindet (siehe Bild 5.3).

    Die beiden Parameter werden nur in der genannten Reihenfolge in der Funktion im Skript eingetragen. In die Objekteigenschaften des Kontaktpunktes darf auch hier nur der Funktionsname eingetragen werden.

    Die beiden von EEP an Lua übergebenen Parameter müssen immer in der Reihenfolge 1. Zugname, 2. Gleis-ID erfolgen. Wenn man die Gleis-ID nicht benötigt, kann man sie weglassen. Aber wenn man nur die Gleis-ID benötigt, muss eine Variable für den Zugnamen eingetragen sein. Für eine Variable, die nicht benötigt wird aber vorhanden sein muss, hat sich der Unterstrich "_" bei vielen Lua-Nutzern als Variablenname eingebürgert. Benötigt man auch den Zugnamen nicht, ist die Eingabe als Parameter nicht erforderlich.

    Die Möglichkeit andere oder weitere Parameter direkt in einem Kontaktpunkt einzutragen, bietet das Lua-Modul BetterContacts von Benjamin Hogl (BH2). Download, Beschreibung und Einbindungsanweisung ist dem vorgenannten Link zu entnehmen.

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.2.1 Plug-in 1 + 2; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • Fried July 26, 2023 at 11:44 AM

    Set the Label from Updated to Current status