Analyse einer EEP-Anlage-Datei

Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • Wo ist welcher Zug?

    Wie lang ist die Gleisstecke?

    Wieviele Bäume wurden gepflanzt?

    All solche Fragen lassen sich im Prinzip aus eine EEP-Anlage-Datei ermitteln.

    Man kann mit Notepad++ (oder einem anderen XML-Editor) die EEP-Anlage-Datei direkt anschauen. Die Größe und Komplexität der Datenstruktur ist jedoch beeindruckend und fordert geradezu eine automatisierte Analyse. Nun wollte ich also die Datei per Programm genauer auswerten und was liegt näher, als dies eben mit Lua zu tun.

    Hier also das Ergebnis meiner ersten Programmierübungen mit Lua von diesem Wochenende, das ich hier zur Diskussion stellen möchte.

    Die Lua-Datei EEP_Inventar.lua sollte im LUA-Ordner der EEP-Programminstallation angelegt werden und kann sowohl aus EEP heraus mit require('EEP_Inventar') wie auch standalone z.B. in SciTE in gestartet werden.

    Es werden weitere Bibliotheken benötigt (woran man bereits merkt, dass all dies sich eher an erfahrene Programmierer richtet):

    PrintToFile_BH2 von https://emaps-eep.de/lua/printtofile (optional)

    xml2lua von https://github.com/manoelcampos/xml2lua

    Versionshistorie:

    29.01.2019 (ungefähre) Berechnung der Ende-Position von Gleisen, Gleisverbindungen werden nun bei den Gleisen eingetragen

    https://github.com/FrankBuchholz/EEP

    25.01.2019 Erneute Überarbeitung der Programmstruktur und Erweiterung auf Kontakte und Kontakt-Ziele (Weichen und Signale)

    Veröffentlichung ab jetzt über GitHub:

    https://github.com/FrankBuchholz/EEP

    18.02.2019 Aufteilung des Sktipts in ein Anzeigeskript und ein Verarbeitungsmodul

    siehe:

    EEP_Inventar.lua

    EEP2Lua.lua Teil 1

    EEP2Lua.lua Teil 2

    14.02.2019 Initiale Version

    Teil 1:

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

    5 Mal editiert, zuletzt von frank.buchholz (29. Januar 2019 um 22:30)

  • Teil 2:

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

    2 Mal editiert, zuletzt von frank.buchholz (18. Januar 2019 um 15:28)

  • Naja, mich interessiert eigentlich, warum er das in Lua macht?

    Vielleicht ist das Ziel ja nur, zu Wissen, wie die Anlagendatei aufgebaut ist.

    Vielleicht auch, Lua durch einen Anwendungsfall besser zu lernen.

    Bei mir war das Ziel, einen Depot Editor als Zusatztool zu schreiben, mit dem man die in der Anlagendatei enthaltenen Depots und Zugverbände offline verwalten kann. Mit Bildern, also grafisch u.s.w.

    Dazu habe ich aber Visual Basic benutzt, da man damit leicht eine grafische Benutzeroberfläche erstellen kann.

    @Jumei: Leider habe ich als einziger Entwickler dieses Zusatztools irgendwann die Lust verloren und es ist nicht ganz fertig geworden. :ma_1:

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

  • @Jumei: Leider habe ich als einziger Entwickler dieses Zusatztools irgendwann die Lust verloren und es ist nicht ganz fertig geworden.

    :af_1: Schade. Dabei wollte ich es doch unbedingt haben. :an_1:

    Was sind Depots und Zugverbände? Jetzt aber nichts wie raus hier ...

    Es ist müssig, dauernd den Weltuntergang heraufzubeschwören. Man muss auch aktiv etwas dafür tun. :bn_1:

  • Naja, mich interessiert eigentlich, warum er das in Lua macht?

    Vielleicht ist das Ziel ja nur, zu Wissen, wie die Anlagendatei aufgebaut ist.

    Vielleicht auch, Lua durch einen Anwendungsfall besser zu lernen.

    [...]

    ja und ja

    Der initiale Auslöser war, dass ich etliche sehr schöne, für mich jedoch zunächst nutzlose Anlagen aus dem Internet geladen habe, bei denen entweder viele Modelle in meiner Installation fehlen, deren Steuerung ich nicht durchschaue oder die so groß und wunderschön vollgestellt sind, dass mein kleiner Laptop sie nicht mit ansprechender Framerate anzeigen kann. Was kann ich in solchen Fällen tun, um doch etwas von diesen Anlagen lernen zu können?

    Gerade die Steuerung über Kontakte ist (zumindest für mich) ohne zusätzliche Anlagen-Dokumentation bei komplexen Abläufen sehr schwer nachvollziebar. Selbst bei kleinen Beispielen wie demTutorial "57 sanftes Ankuppeln" ist das bereits recht aufwändig. (Blockstecken und Bahnhofsein- und Ausfahrten sind dageben meist recht einfach zu erkennen.)

    Jedenfalls wollte ich versuchen so eine Ablauf-Steuerung in Lua nachzubauen wobei die Logik in der Anlage dann möglicht schlicht und übersichtlich sein sollte. Dazu muss ich Lua kennen lernen und

    - voila, das Projekt für's Wochenende war geboren.

    (Und die Veröffentlichung hier mache ich, weil ich erstens Likes sammmeln möchte - das macht einfach Laune - und weil es spannender ist, von euch zu lernen und es mit euch zu teilen.)

    Warum jedoch in vielen Internet-Foren bei Projektvorstellungen, wie auch hier, als erstes" Warum machst du das?" gefragt wird, werde ich wohl nie verstehen;-)

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

  • (Und die Veröffentlichung hier mache ich, weil ich erstens Likes sammmeln möchte - das macht einfach Laune - ...)

    Klasse! Jemand gibt zu, dass ihm virtuelle Streicheleinheiten wichtig sind. Passiert hier nicht oft. Dafür gab's gerade ein Like von mir. :bn_1:

    Gruß Uwe

    Desktop: Intel i7-8700K 6x3,7Ghz, 32GB RAM DDR4, Gigabyte GeForce GTX 1080 8GB VRAM, HDD 2TB, 1xSSD Samsung 1TB PCIe M.2, 1x SSD 120GB SATA, Windows10 Home, EEP15/16/17.2, HomeNOS15/16/17

    Meine Webseite

    Mein Youtube-Kanal mit freundlichen EEP-Videoimpressionen

    _____________________________________________________________________________

    "Nie wieder!" ist jetzt!

  • Ich hätte noch einen (sinnvollen) Erweiterungs-Vorschlag?

    die Koordinaten der jeweiligen Modelle auch auslesen, damit man weiß, wo man nachschauen kann

  • Nützliche und nutzlose Beobachtungen (aka Fun-Facts)...

    ...zur EEP-Anlagen-Datei:

    • Ich habe bislang keine Möglichkeit gefunden wie ein Lua Programm herausfinden kann wie die aktuell von EEP geladene Anlage heißt bzw. welche EEP-Anlagen-Datei geladen wurde.
    • EEP-Anlagen-Dateien enthalten zwar eine Beschreibung (<sutrackp><Beschreibung>) jedoch überraschenderweise keinen Namen der Anlage.
    • Der Typ von Gleisen, Kontakten und Fuhrparks wird über ein etwas sperriges Attribut clsid festgelegt, während andere Klassifikationen in einfacheren Attributen gemacht wurden, z.B. type="Steuerstrecken" für Gleissysteme oder Dynamic="1" für Kameras.
    • Es gibt überraschende Namen, z.B. Schandlaft statt Landschaft, GebaudesammlungID statt GebaeudesammlungID, Kammera statt Kamera (was mich zum schmunzeln bringt: es sieht so aus, als ob das Team früher ein wenig subversiv programmiert hat) und es gibt eine Mischung aus deutschen und englischen Begriffen.
    • Zu vielfach vorkommenden Tokens gibt es zumeist einen Oberbegriff, nicht jedoch zum Token Kollektor. Einen Grund für diese Designentscheidung kann ich nicht erkennen, es macht jedenfalls die Anzeige der Datei in notepad++ etwas unübersichtlicher, weil man diese Textblöcke dann nicht in eine einzige Zeile zusammenklappen kann.
    • Man kann also einige sehr alte Design- oder Namensentscheidungen des EEP-Entwicklungsteams erkennen, die sie heute möglicherweise anders machen würden. Das ist eine typische Beobachtung wenn man in fremde (und eigene!) Programme schaut, die mich selber immer wieder daran erinnert, eigene Konzepte und Programme immer wieder auf den Prüfstand zu stellen.

    ...zu Lua

    Es ist eine faszinierende Sprache vor allem wegen dem Konstrukt "Funktionen als Daten" und der konsequenten und einzig vorhandenen Datenstruktur "Tabelle mit genau einem Primärschlüssel" aus der trotzdem alles gebaut werden kann.

    Zu xml2lua:

    Mehrfach vorkommende Tokens haben zumeist ein identifizierendes Attribut (z.B. Gleissystem: GleissystemID, Gleis: GleisID) oder einen identifizierenden Wert (z.B. Vektor: Pos, Dir, Nor, Bin). Es gibt allerdings auch Tokens ohne offensichtliche Identifikation (z.B. Kontakte) .

    xml2lua ist allerdings ein universelles Skript und weiß von diesen Identifikation nichts und kann daher nicht diese Identifikation als Schlüssel für die resultierenden Lua-Tabelleneinträge nutzen.

    In der EEP-Anlagen-Datei gibt es Tokens, die nur einmal vorkommen (z.B. Version, Settings, Beschreibung), andere Tokens, die immer mehrfach vorkommen (z.B. Gleissystem, Kollektor, Gebaeudesammlung) sowie Tokens, die keinmal, einmal oder mehrfach vorkommen können (z.B. Gleis, Zugverband, Rollmaterial). Gerade der letzte Fall macht bei der Auswertung den Lua-Tabellenstruktur einige Schwierigkeiten, da xml2lua eine weitere nummerierte Tabellenebene erzeugt wenn Tokens mehrfach vorkommen, darauf jedoch verzichtet wenn das Token genau einmal vorkommt.

    Ich überlege daher ob ich in meinem Skript vor der Auswertung nicht die Tabellenstruktur umbauen sollte oder gar eine modifizierte Form von xmlhandler.tree verwenden sollte, damit eine besser zur Struktur der Anlage passende Lua-Tabellenstruktur entsteht.

    ...zu meinem Skript:

    Es ist offensichtlich ein schnell hingeschriebenes nicht allzu strukturieres Skript. Beispielsweise wird das "EVA-Prinzip" noch eklatant verletzt: Eingabe, Verarbeitung und Ausgabe sollten immer strikt voneinander getrennt sein. Das ist bislang nur im Ansatz bei der Erstellung und Ausgabe der Dateiliste erkennbar. Auch eine Lua-typische Moularisierung fehlt noch, man könnte also noch nicht den Verarbeitungsteil in eine separate mit require zu ladende Datei packen.

    Vor den im nächsten Abschnitt geplanten funktionalen Erweiterungen werde ich daher zunächst vor allem an einer Lua-gemäßen Strukturierung arbeiten.

    Geplante funktionale Ergänzungen:

    • Übersicht zu Lua-Funktionen, die von Kontakten und Signalen ausgelöst werden.
    • Anzeige der statischen Tipp-Texte.
    • Prüfung ob die 3dm-Dateien existieren (damit ist allerdings noch nicht gesagt, ob die Modelle auch in der 3D-Ansicht angezeigt werden).
    • Übersicht zu Immobilien mit Koordinaten (Landschaft, Faune, Tiere, Menschen, Güter, die in großer Zahl auftreten können dabei erst einmal ignorieren)

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

  • frank.buchholz

    hallo frank,

    Du hast Dir eine wahnsinns Arbeit gemacht, aber Excel importiert das alles auch

    ohne eine Programmzeile selbst zu schreiben. Nur die Beschriftung der Zellen

    muss man selbst durchführen um die kryptischen Namen lesbar zu machen.

    Das geht aber sehr leicht mit der Liste von "Mbit" (Alter Schwede).

    Und was ist das Ziel?

    Also ich hab schon falsch gestellte Signale, falsch verknüpfte KPs usw gefunden.

    Nicht falsch verstehen, das waren meine Fehler nicht die von EEP.

    viele Grüße Max

  • Hi

    Ich verstehe den Aufwand nicht der hier gemacht wird.

    Ich nehme dafür "XML Notepad 2007" und lade mir die

    .anl3 hinein und habe alles geordnet vor mir.

    Gruß Wilfried

    Board Asus Rog Strix B550-F Gaming CPU AMD Ryzen 7 5800X3D 32GB Ram NVIDIA GeForce GTX 3070TI 8GB Ram 2TB SSD 2TB Festplatte

    Board MSI B450M BAZOOKA CPU AMD Ryzen 7 2700x 8 Core 3,7-4,2 GH 32 Gb Ram NVIDIA GeForce GTX 3060 12 GB Ram Window 11 Prof 64 Bit

    Asus G713RW-LL108W 17,3 Zoll 16 GB Ram Ryzen 6800H GTX 3070TI 8GB Ram Window 11 Hom 64 Bit

    Sun-Guru-Barebone CPU I7-9750H 16 GB Ram NVIDIA GeForce GTX1660TI 6 GB Ram Window 11 Hom 64 Bit

    8. bis 31. EEP-Treffen in Bremen ich war da

  • Du hast Dir eine wahnsinns Arbeit gemacht, Excel importiert das alles auch ohne eine Programmzeile selbst zu schreiben. Nur die Beschriftung der Zellen muss man selbst durchführen um die kryptischen Namen lesbar zu machen.

    Das geht aber sehr leicht mit der Liste von "Mbit" (Alter Schwede).

    viele Grüße Max

    Cool, ich habe zwar irgendwie gewusst, dass Excel auch XML importieren kann, aber gar nicht daran gedacht es hierfür zu nutzen - wobei die Hauptmotivation meines Projektes nicht nur war, die Inhalte einer Anlagedatei zu verstehen und anzeigbar und auswertbar zu machen, sondern vor allem um mit Lua zu experimentieren.

    Jedenfalls würde nach dem Import in Excel auch eine Art von Recherche und Programmierarbeit beginnen (dann mit VisualBasic), z.B. um die Position von Zugverbänden indirekt über die Position des Gleises zu bestimmen.

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

  • aber Excel importiert das alles auch

    Ich nehme dafür "XML Notepad 2007"

    Ja klar. Aber ... Er sagte doch schon früher und jetzt nochmal

    vor allem um mit Lua zu experimentieren

    Und das ist ok so.

    Wenn es nur um das Ergebnis gehen würde, würde ich EEP nehmen. Da sieht man sogar grafisch wo der Zug steht und wie er aussieht. :bo_1:

    :aq_1:Gruss Jürg

    Es ist müssig, dauernd den Weltuntergang heraufzubeschwören. Man muss auch aktiv etwas dafür tun. :bn_1:

  • Ich wollte damals nur die doppelten IDs finden, diese Seuche ist ja nun zum Glück beseitigt.

    Den Spaß am Programmieren will ich nicht nehmen,

    mir war es wichtig anderen, andere Wege zu zeigen.

    Wie leicht verwischt die Sicht bei einer solchen LUA-Diskussion und man glaubt,

    dass dies der einziste Weg ist. Jeder möge für sich so selbst für das Werkzeug seiner Wahl

    entscheiden.

    Und mit Verlaub, die Überschrift gibt meinen Einwand her, sonst hätte ich nichts geschrieben.

    viele Grüße Max

  • Da sieht man sogar grafisch wo der Zug steht und wie er aussieht.

    bedingter Widerspruch. Ich seh da bloß blaue Fragezeichen und wo was steht bleibt nebulös

  • Das Skript ist jetzt in zwei Teile aufgeteilt:

    1. 1. das Modul EEP2Lua, das die EEP-Anlagedatei liest und konvertiert
    2. 2. das Skript EEP_Inventar, das die Ausgabe der Ergebnisse übernimmt

    Das Modul EEP2Lua könnte, geeignet eingebunden (und ggf. geeignet erweitert), nun auch innerhalt einer normalen EEP-Anlagedatei verwendet werden, um den Betriebsstart zu beeinflussen.

    Beispielweise könnte man nach dem Einsetzen von Zügen in Schattenbahnhöfe (Speichern der Anlage nicht vergessen!) dann beim Neustart der Anlage die Zugverbände mit Höhe z<0 für sein eignenes Skript ermitteln ohne dass die Züge zunächst über Kontakte fahren müssen. Möglicherweise ließe sich so die EEP-Speicherverwaltung teilweise ersetzen. Man könnte auch einfach alle Zugverbände - da man nun ja alle Namen kennt - starten oder stoppen, alle Licher an- oder ausschalten, alle Signale auf Halt stellen und dergleichen mehr. Es ließe sich also auch allerlei Unsinn anstellen, also hübsch vorsichtig vorgehen:-)

    Allerdings gäbe es für derlei Anwendungen das wohl schwerwiegende Hindernis, dass das Modul nur den Zustand der gespeicherten Anlage lesen kann, also nicht den aktuellen Zustand der laufenden Anlage kennt.

    Die Laufzeit bei größeren Anlagen ist auch nicht zu vernachlässigen. Für den Demoanlage in EEP 13 dauert es z.B. ca 12 Sekunden, bis xml2lua die 7.2 MB große Datei verearbeitet hat. (Dagegen fallen die weiteren Verarbeitungsschritte nicht ins Gewicht.)

    Die Neustrukturierung des Programms hat übrigens - wie zu erwarten war - deutlich mehr Zeit gekostet, als die Erstellung der ursprünglichen Version. Ein besonderer Dank geht an Christopher dessen Beitrag zur Lua-Programmierung mir viele Tipps und Ideen lieferte. (Vielleicht baue ich auch noch sein Debug-Modul ein.)

    Eine Weile habe ich zwischen folgenden Designmöglichkeiten geschwankt:

    1. Möglichst geringer Eingriff in die von xml2lua gelieferte Datenstruktur. Dabei hätte ich lediglich Querbeziehungen zwischen den Tags hinzufügt, so dass man leicht z.B. vom Rollmaterial über den Zugverband zu einen Gleis und damit zur Position kommt. Bei Datenzugriffen hätte das dann allerdings elendlich lange Zugriffspfade ergeben.
    2. Konsequenter Einsatz von get-Funktionen, die grundsätzlich auf die von xml2lua gelieferte Datenstruktur zugreifen. Alldings finde ich es eher hässlich überall im Auswertungsskript dann getXxx() schreiben zu müssen.
    3. Am Ende habe ich jedoch eine für den Aufrufer möglichst übersichtliche Schnittstelle gewählt, so dass vor allem das Anzeigeskript EEP_Inventar leicht zu lesen und verstehen ist . (hoffentlich...).

    Die Analyse der XML-Datenstruktur ist übrigens vermutlich komlizierter programmiert als notwendig: Das Modul xmlhandler.tree bietet einige Optionen an, mit der das Ergebnis der Konvertierung beeinflusst werden kann. Insbesondere könnte erreicht werden, dass Tags wie z.B. 'Rollmaterial', die ein oder mehrfach vorkommen können einheitlich dargestellt werden. Mit der aktuellen Version musste ich dafür noch ein paar Klimmzüge machen.

    Einen Strukturierungsfehler muss ich noch korrigieren: Die Funktionen sind noch nicht alle als local deklariert - ich hatte versäumt, die aufeinander aufbauenden Funktionen in der notwendigen Reihenfolge anzugeben. Das fällt nicht weiter auf, da man globale Funktionen auch dann aufrufen kann wenn die Definition erst danach in der Datei vorkommt.

    Und zu guter Letzt ein Wort zum Lua-Fluch der Punkte und Kommas: Ich weiß nicht wie oft ich gespeichert und gestartet habe, nur um festzustellen das ein Punkt oder Komma zuviel oder zuwenig vorkam...

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

    Einmal editiert, zuletzt von frank.buchholz (18. Januar 2019 um 18:37)