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:
14.02.2019 Initiale Version
Teil 1:
--[[
Analyse einer EEP-Anlage-Datei
Frank Buchholz, 2019
]]
local _VERSION = 'v2019-01-14'
-- In Variable input_file wird der Pfad zur Anlagen-Datei eingetragen
-- Hier einige Varianten unter der Annahme, dass dieses Script im LUA-Ordner der EEP-Installation liegt:
local input_files = {
[1] = "./Anlagen/Tutorials/Tutorial_57_sanftes_Ankuppeln.anl3", -- relativer Pfad beim Start aus EEP heraus
[2] = "../Resourcen/Anlagen/Tutorials/Tutorial_57_sanftes_Ankuppeln.anl3", -- relativer Pfad bei standalone-Ausführung im Editor SciTE
[3] = "./Anlagen/Demo.anl3", -- relativer Pfad beim Start aus EEP heraus
[4] = "../Resourcen/Anlagen/Demo.anl3" -- relativer Pfad bei standalone-Ausführung im Editor SciTE
}
-- Welche Datei soll es sein?
input_file = input_files[4]
-- Hier den Pfad zur zusätzlichen Ausgabe-Datei angeben (siehe printtofile)
local output_file = "C:/temp/output.txt"
-- Ausführliche Protokollierung zur Fehleranalyse (true/false)
local log = false
-- printtofile (optional)-----------------------------------------------------
--[[
Quelle:
https://emaps-eep.de/lua/printtofile
Benötigte Dateien im LUA-Ordner:
PrintToFile_BH2.lua
output:
0: keine Ausgabe (kann Sinn machen, wenn direkt die Ausgabedatei überwacht wird)
1: normale Ausgabe (Standardwert)
2: Ausgabe wie in Datei (diese kann sich von der normalen Ausgabe leicht unterscheiden)
--]]
if EEPVer then -- Nur notwendig wenn das Skript aus EEP heraus gestartet wird
require("PrintToFile_BH2"){file = output_file, output = 1}
end
if EEPVer then -- Nur möglich wenn das Skript aus EEP heraus gestartet wird
clearlog()
print("EEP Version", " ", EEPVer, " ", "Lua Version", " ", _G._VERSION)
else
print("Lua Version", " ", _G._VERSION)
end
-- xml2lua --------------------------------------------------------------
--[[
Quelle:
https://github.com/manoelcampos/xml2lua
Benötigte Dateien im LUA-Ordner:
xml2lua.lua
XmlParser.lua
xmlhandler/tree.lua
--]]
local xml2lua = require("xml2lua")
local handler = require("xmlhandler.tree")
--Load the XML file
local xml = xml2lua.loadFile(input_file)
--Instantiates the XML parser
local parser = xml2lua.parser(handler)
parser:parse(xml)
-- process --------------------------------------------------------------
--[[
Eine EEP-Anlagedatei hat folgenden Aufbau:
sutrackp
Version
Gleissystem (multiple: 1=Eisenbahn, 2=Straßenbahn, 3=Straße, 4=Wasserwege, 5=Steuerstrecken, 6=GBS)
Dreibein
Vektor (multiple: Pos=Position, Dir=Richtung, Nor=Normale, Bin=Binormale)
Gleis (multiple)
Dreibein
Vektor (multiple: Pos=Position, Dir=Richtung, Nor=Normale, Bin=Binormale)
Anfangsfuehrungsverdrehung
Charakteristik
Kontakt
Kollektor
Dreibein
Vektor (multiple)
Gleis (multiple)
Fuhrpark
Zugverband (multiple)
Gleisort
Rollmaterial (multiple)
Zugmaschine
Motor
Getriebe
Modell
Achse
Achse
Gebaeudesammlung (multiple)
Immobile
...
Gleisbildstellpultsammlung
...
AnimRoll
Goods
CrowdSammlung
...
Kammerasammlung
Kammera (multiple)
Settings
Options
Weather
TimeTable
EEPLua (LUAS=Prüfsumme für Lua-Datei, LUAPath=Dateiname)
Kamera3D
Schandlaft
Beschreibung
--]]
local Anlage = handler.root.sutrackp
local GleissystemText = { -- GleissystemID
[1] = 'Eisenbahn',
[2] = 'Straßenbahn',
[3] = 'Straße',
[4] = 'Wasserwege',
[5] = 'Steuerstrecken',
[6] = 'GBS'
}
local Gleisart = { -- clsid
['2E25C8E2-ADCD-469A-942E-7484556FF932'] = 'Normales Gleis',
['C889EADB-63B5-44A2-AAB9-457424CFF15F'] = '2-Weg-Weiche',
['B0818DD8-5DFD-409F-8022-993FD3C90759'] = '3-Weg-Weiche',
['06D80C90-4E4B-469B-BFE0-509A573EBC99'] = 'Prellbock-Gleis'
}
local GebaeudesammlungText = { -- GebaudesammlungID
[1] = 'Gleisobjekte-Gleise',
[2] = 'Gebaeudesammlung 2',
[3] = 'Gleisobjekte-Strassen',
[4] = 'Immobilien',
[5] = 'Landschaftselemente',
[6] = 'Gebaeudesammlung 6'
}
-- Position der Gleise:
-- Gleise[GleissystemID]{Anzahl, Laenge}
-- Gleise[GleissystemID][GleisID]{x,y}
local Gleise = {}
-- Position der Immobilen:
-- Immobilen[GebaeudesammlungID]{Anzahl}
-- Immobilen[GebaeudesammlungID][ImmoIdx]{x,y}
local Immobilen = {}
-- Übersicht zu referenzierten Dateien:
-- Dateien[Typ][Datei]{Anzahl}
local Dateien = {}
Dateien['Gleissystem'] = {}
Dateien['Rollmaterial'] = {}
Dateien['Immobile'] = {}
-- Hilfsfunktion zur Prüfung ob eine Tabelle einen bestimmten Eintrag enthält
function tableHasKey(table,key)
return table[key] ~= nil
end
-- Hilfsfunktion zur sortierung einer Tabelle
-- siehe https://www.lua.org/pil/19.3.html
function sortedTable(t, f)
local a = {}
for n in pairs(t) do table.insert(a, n) end
table.sort(a, f)
local i = 0 -- iterator variable
local iter = function () -- iterator function
i = i + 1
if a[i] == nil then return nil
else return a[i], t[a[i]]
end
end
return iter
end
Alles anzeigen