Geht das in LUA?

!!! 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.
  • @LUA-Sachverständigen

    Für das SpDrS60 von Ralf gibt es die Möglichkeit, Elemente durch eine Programmzeile zu schalten statt über den Klick auf den entsprechenden Taster. Der Aufruf dazu sieht z. B. so aus:


    SpDrSigEA_ID3017.setObjByPrg(nil,nil)


    wobei die nil-Angaben natürlich ersetzt werden müssen. Meine Frage dazu ist:


    um diesen Aufruf in einer Schleife mit verschiedenen IDs zu versehen, gibt es eine Möglichkeit die ID durch eine Variable zu ersetzen?

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Wenn Du nicht den Strukturnamen ändern möchtest, kannst Du Dir auch beliebig viele IF ID= ELSE IF ID = in eine Funktion kopieren und der Funktion die ID übergeben.

    So ein Programmierstil ist manchmal tatsächlich angebracht.

    Kann man auch auslagern und mit REQUEST aufrufen.


    Natürlich kann man auch den Namen der Struktur/Funktion ändern.

    Wie das genau geht können die Spezialisten hier sicher erklären.

    EEP16, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager, Hugo :aq_1:

  • gibt es eine Möglichkeit die ID durch eine Variable zu ersetzen?

    Ja, die gibt es.

    Jeder Funktionsname in Lua ist eigentlich ein Bezeichner in einer Tabelle.

    Und diese Bezeichner sind Strings.

    Und einen String kann man zusammensetzen:

    LUA Source Code
    1. for Zahl = 1, 5 do
    2. local String = "SpDrSigEA_ID"..tostring(Zahl)..".setObjByPrg"
    3. print(String)
    4. end

    Das verbindende Element sind zwei Punkte. Die sind für Strings das, was für Zahlen das + ist.


    Das Beispiel zeigt aber nur, wie man einen String zusammensetzt und in der Mitte einen Teil einfügt, der sich in einer Schleife mehrfach ändert.

    Es zeigt nicht, wie man daraus einen Funktionsnamen macht!



    Aber warum willst du da mit Dingen hantieren, die du nicht durchschaust?

    Warum stellst du das Signal nicht einfach per EEPSetSignal()?

    Bei dem Befehl weißt du, wie du eine Schleife einsetzen kannst. Und die Elemente im SpDrS60 sind im EEP-Sinne alle Signale. Auch die, welche wie Taster oder andere Dinge aussehen.



    Nebenbemerkung:

    Im Übrigen verstehe ich nicht, warum sich Menschen an diese Umstandskrämerei mit den ellenlangen if - elseif Konstrukten klammern. Wenn es für jede Möglichkeit eine passende Antwort gibt, dann sind Möglichkeit und Antwort perfekte Paare für eine sehr einfache Tabelle. Die kann man leichter schreiben, leichter pflegen und schneller nutzen als diese if-Ketten. Man muss nur aufhören, Umgangssprache 1:1 in Skripttext zu übertragen.

  • Warum stellst du das Signal nicht einfach per EEPSetSignal()?

    So kann man z.B. DKW von GK3 schalten, indem man dem Melder nur die Position 1,2,3 oder 4 übergibt.


    in meiner Steuerung schalte ich die Weichen aber, indem ich die Taster-Elemente mit EEPSetSignal() anspreche. Das funktioniert für EW, EKW DKW genau gleich.


    Für die Darstellung von Fahrstraßen bastle ich aber auch an den Funktionen herum, weil das nicht durch eine Signalschaltung funktioniert. Hier ein Beispiel aus meiner Fahrstraßen-Reservierung:


    Code
    1. if tasterID < 8000 then
    2. _ENV["SwitchObjSpDr_ID"..weichenID].setDtcState(2)
    3. else
    4. if tasterID < 9000 then
    5. _ENV["SB_EkwSpDr_ID"..weichenID].setDtcState(2)
    6. else
    7. _ENV["SB_DkwSpDr_ID"..weichenID].setDtcState(2)
    8. end
    9. end

    Hier verwende ich übrigens die Taster-ID, um zwischen EW, EKW und DKW zu unterscheiden, damit ich sie in der Funktion einfach nur über die Weichen-ID ansprechen kann. Denn die Stellfunktionen für die Elemente haben jeweils verschiedene Namen. EKW-Taster bekommen bei mir eine ID zwischen 8000 und 8999, DKW-Taster eine ID >=9000.

  • HaNNoveraNer , Goetz und Oliver

    Danke für Eure Antworten.

    Goetz

    zu Deiner Frage: Aber warum willst du da mit Dingen hantieren, die du nicht durchschaust?

    Einfach, um sie durchschauen zu lernen. Und zum Lernen braucht man halt manchmal eine Hilfestellung.

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Einfach, um sie durchschauen zu lernen.

    Okay, das ist ein guter Grund.


    Also:

    Alle Funktionen und Variablen stehen bei Lua in einer einzien, großen Tabelle mit dem Namen _ENV. Das ist eine Besonderheit, die für dein Vorhaben sehr nützlich ist.


    Wie gut bist du schon im Umgang mit Tabellen?

  • Hallo Goetz,

    Bisher habe ich Tabellen vorwiegend für meine Ein- und Ausfahrten für meinen Hbf mit 5 Personen- und 6 Gütergleisen mit je 1 zweigleisigen Hauptbahn und 1 eingleisigen Nebenbahn Ost und West mit entsprechenden, selbst definierten Fahrstraßen und der Verbindung zum SpDrS60 genutzt.

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Okay.

    _ENV ist - wie gesagt - der Name einer Tabelle, in der alle Funktionen, Variablen etc. stehen.


    Wenn man mit Text = "Hallo" das Wort "Hallo" in einer Variablen namens "Text" speichert, dann heißt das eigentlich, dass man das Wort "Hallo" in der Tabelle _ENV unter dem Bezeichner Text ablegt.


    Wie müsste der Code lauten, um das Wort "Hallo" anschließend aus dieser Tabelle _ENV auszulesen?

  • Hallo Goetz,

    ich denke, das hängt davon ab, ob Text explizit in _ENV gespeichert wurde.

    Dann müsste, wenn ich es richtig verstanden habe, print(_ENV.Text) das Wort "Hallo" ausgeben.

    Die einfache Zuweisung Text = "Hallo" würde ich mit print(Text) ausgeben wollen.

    Anleitung dazu findet man in "Programmieren mit LUA 3. Auflage" ab Seite 192

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Dann müsste, wenn ich es richtig verstanden habe, print(_ENV.Text) das Wort "Hallo" ausgeben.

    Ganz genau.


    Und jetzt kommt der entscheidende Hinweis:

    print(_ENV.Text) funktioniert auch dann, wenn die Zuweisung einfach Text = "Hallo" war. Es funktioniert deshalb, weil _ENV eine Tabelle ist, in der alle Variablen, Tabellen, Funktionen etc. stehen.


    Probier es aus:


    Das ist eine Besonderheit von Lua. Es gaukelt uns Variablen vor, obwohl es gar keine kennt. Wir dürfen Text = "Hallo" schreiben. Aber Lua macht daraus _ENV.Text = "Hallo" und genauso wandelt Lua ein print(Text) automatisch in ein print(_ENV.Text) um.


    Funktionen werden genauso behandelt.

    Egal, ob EEPMain(), EEPSetSignal(), EEPOnTrainLooseCoupling() oder eigene Funktionen wie Anmelden(Zugname), FS_Dortmund(Gleis) oder was man sonst so alles im Skript haben mag … es steht alles in dieser _ENV-Tabelle.


    Denn auch das ist eine Besonderheit von Lua:

    Es akzeptiert in Tabellen eine Mischung von Zahlen, Strings, Booleans, Tabellen, Funktionen. Jede Zelle darf einen Inhalt anderen Typs haben.


    Normalerweise interessiert uns diese _ENV überhaupt nicht. Soll Lua den ganzen Kram doch abspeichern, wo es will. Hauptsache, ich kann in meinem Skript wie gewohnt Text = "Hallo" schreiben.



    Aber in deinem Fall kann man sich das Wissen um die _ENV-Tabelle zunutze machen. Dafür muss man eine zweite Schreibweise für Tabellenplätze mit Bezeichnern kennen:

    Statt Tabelle.Platz kann man auch Tabelle["Platz"] schreiben. Beides bedeutet genau das selbe.

    Text = "Hallo" und _ENV.Text = "Hallo" und _ENV["Text"] = "Hallo" sind alle drei identisch. Das ist deshalb wichtig zu wissen, weil ich in die eckigen Klammern eine Variable schreiben kann, die den Bezeichner enthält.


    Kannst du jetzt mit diesem Wissen das Wort "Hallo" in einer Variablen speichern, deren Namen sich aus zwei Variablen zusammensetzt?

    LUA Source Code
    1. a = "Te"
    2. b = "xt"
    3. -- hier muss etwas mit _ENV, a, b und "Hallo" hin,
    4. -- sodass die folgende Zeile funktioniert:
    5. print(Text) -- gibt das Wort "Hallo" aus.

    "Im weiteren Verlauf der Befassung mit diesem Thema"

    - Klaus S. -

    The post was edited 2 times, last by Goetz: Code besser formatiert ().

  • Hallo zusammen,


    im neuen Jahr werde ich die Weiterentwicklung des SpDr wieder in Angriff nehmen, möchte aber zu dem hier angefragten Problem kurz Stellung nehmen.


    Das SpDr bietet ab Erweiterungsset 1 eine Datei im Lua-Root von EEP ( TmpDtcCol.lua ). Diese Datei enthält Kollektionen aller in den Config-Tabellen registrierten Objekte. Mit Hilfe einer For-Schleife kann ich über diese Sammlungen iterieren und dabei auf Methoden der Objekte zugreifen. Weitere Informationen dazu findet ihr hier.


    Ray

  • Hallo Ray,

    es ist schön, dass Du Dich hier zurückmeldest, bedeutet das doch wohl, dass Deine berufliche Neuerfindung gelungen ist. Dazu herzlichen Glückwunsch und viel Erfolg.

    Für den Augenblick aber erst einmal beste Wünsche für ein gesegnetes und friedvolles Weihnachtsfest und alles Gute zum Neuen Jahr.

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Sorry, es ist einfach weihnachtliche und somit familiäre EEP Pause

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Sorry, es ist einfach weihnachtliche und somit familiäre EEP Pause

    Natürlich, Berthold.

    Nachdem du dem Rayler geantwortet hattest wusste ich nur nicht, ob du überhaupt noch weitermachen willst oder nicht. Ich warte einfach, bis du die letzte Aufgabe von mir löst und dann machen wir weiter. Egal, wann ...

  • Hallo Götz,

    ich hoffe, Du hattest ein schönes Weihnachtsfest.

    Du hast mich mit Deinem Posting auf keinen Fall verloren. Im Gegenteil, ich danke Dir sehr herzlich für Deine Bereitschaft, mir bei meinen Fragen weiter zu helfen. Allerdings wird EEP wohl nicht vor dem 8. 1. wieder geöffnet, wenn die Töchter mit Ihren Männern wieder bei sich zu Hause sind und alles wieder seinen normalen Gang geht.

    Für das Neue Jahr wünsche ich Dir alles Gute, Gesundheit, Zufriedenheit und viel Zeit für Alle und Alles die/was Dir wichtig sind/ist.

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Hallo Goetz,

    ich bin doch etwas früher als erwartet wieder hier mit folgender Frage:

    Kann es sein, dass die von Dir beschriebene Arbeitsweise der _ENV Tabelle speziell in EEP LUA implementiert wurde?

    Anlass der Frage ist …

    in EEP funktioniert Dein Beispiel mit der Variablen Text . Versuche ich genau dieses Beispiel in LuaEdit, einem Programm, dass ich installiert habe um mich durch das LUA-Lehrbuch zu arbeiten, erhalte ich eine Fehlermeldung wegen eines nil-Wertes.

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager

  • Hallo Goetz,

    nein, vertippt habe ich mich nicht, den Code habe ich per copy and paste von EEP nach LUA Edit übertragen. und dort funktioniert er nicht.

    Nur die erste Zeile wird bearbeitet: print("Test der _ENV-Tabelle")

    Viele Grüße
    Berthold


    Lenovo LegionY720 i7 2,8GHz, 16GB 64bit, NVIDIA GeForce GTX 1060 - Win10Home

    EEP14.1 Exp (64) P2 U1, EEP15.1 Exp Patch2 Plugin 1,EEP16 Patch3, PlanEx 3.2, SpDrS60 mit Ergänzungen, Modellkatalog, Modellkonverter,Tauschmanager