Lua-Funktionsaufrufe mit Parametern in KPs: Geht nicht? Geht doch!

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.
  • Update 28.08.2020: Die hier beschriebene Code-Zeile ist veraltet, es gibt jetzt einen Nachfolger namens BetterContacts.


    Seit der Einführung von Lua in EEP lassen sich über Kontaktpunkte Lua-Funktionen aufrufen. Dabei kann man aber nur einen Funktionsnamen angeben, und keine zusätzlichen Parameter. Mit folgendem Trick, man könnte es fast schon „Hack“ nennen, lässt sich diese Einschränkung umgehen. Es lassen sich dann nicht nur Funktionsaufrufe mit Parametern tätigen, man kann sogar jede gültige Lua-Anweisung direkt in einen Kontaktpunkt schreiben.

    Für ganz eilige: Einfach die folgende Code-Zeile irgendwo an den Anfang eures Anlagenskripts kopieren, das Skript neu laden, einmal die 3D-Ansicht aufrufen (damit das Skript einmal ausgeführt wird), und ihr könnt Funktionsaufrufe mit Parametern in Kontaktpunkten verwenden.

    Code
    setmetatable(_ENV,{__index=function(s,k) local n=k:gsub("%.",","); local p=load(n);if p then _ENV[k]=p;_ENV[n]=p;return p end;return nil end})


    Einzige Einschränkung: Da EEP leider automatisch alle Kommas in Punkte umwandelt, kann zwischen Punkt und Komma nicht mehr unterschieden werden. Mit der obigen Zeile werden zwar alle Punkte wieder in Kommas zurückverwandelt (um Funktionsaufrufe mit mehreren Parametern zu ermöglichen), allerdings sind dann auch gewollte Punkte verschwunden.

    Update: In Beitrag 26 gibt es eine neue Version der Codezeile.

    Für die, die es auch verstehen wollen, habe ich anlässlich des 50.000sten Besuchers auf meiner Homepage den obigen Code-Schnipsel nochmal recht ausführlich erklärt. Aber nicht verzweifeln, wenn ihr es auch mit Erklärung nicht versteht: Das dahinterstehende Thema der "metatables" ist sehr komplex. Wichtig ist eigentlich nur, dass ihr den Code-Schnipsel oben kopieren müsst, und dass er dann das tut, was er soll.

    Viele Grüße
    Benny

  • Die Anwendungsbeispiele findet man am besten dann, wenn man es selber braucht...

    Hier trotzdem ein (theoretisches) Beispiel. Man hat sich eine Funktion geschrieben, die die Einfahrt in einen Bahnhof auf das vom Zug gewünschte Gleis stellt. Da man bisher nur Funktionsnamen angeben konnte, hätte man für jedes mögliche Gleis eine eigene (Hilfs-)Funktion schreiben müssen, die dann per KP (mit Routen/Zugfilter) aufgerufen wird.
    Jetzt kann das gewünschte Gleis direkt als Parameter im KP übergeben werden.

    Im Prinzip spart man dadurch einfach einen Haufen von "Hilfsfunktionen", die nichts anderes machen, als eine andere Funktion mit einem festen Parameter aufzurufen.

    Noch ein Beispiel: Man kann an jeder Stelle der Anlage einen "Debug-Kontaktpunkt" setzen, der mittels print("Das ist eine wichtige Meldung") eine frei einstellbare Meldung ins Ereignisfenster schreibt.

    Viele Grüße
    Benny

  • Super Benny! Herzlichen Dank!

    Mainboard: ASUSTeK COMPUTER INC. Z87-EXPERT (SOCKET 1150)
    CPU:Intel Core i7 4770 @ 3.40GHz Haswell 22nm Technologie
    Memory:16.0GB Dual Kanal DDR3 @ 799MHz (9-9-9-27)

    Grafik: Nvidia GeForce GTX d1060 6 GB
    BIOS:American Megatrends Inc, Version 1405
    OS: Windows 11 Pro/64bit
    EEP 8.x, EEP 9.x, EEP 10.2, EEP 11.3, EEP 12.1 , EEP 13, EEP 14, EEP 15, EEP 16.3 Patch2,EEP 17.2 Patch1 Plugins:1

  • Weshalb hat ein Wochenende nur 48 h?
    Danke Benny!

    Viele Grüße
    Thomas

    - - - - -
    MidiTower (i7 9700KF 3,6×3,6GHz, 16GB RAM, 4GB GeForce RTX2070 super, WIN 10)
    DELL-Notebook (Intel Core i7 3520M Quad Core, 2,9GHz, 8GB RAM, NVIDIA Quadro K1500M, WIN 10 Home;
    EEP von 4 bis 17.1

    »Nach diesem Jahrhundert der großen Sprüche und schlimmen Illusionen hoffe ich auf eine Zeit, in der die großen Sprüche nichts mehr gelten, sondern nur noch das, was man wirklich und greifbar getan hat.«

    Gerhard Richter, 1999

  • Ich kann mich da Volker nur anschließen, Benny, echt super, nicht nur dieser Code-Schnipsel. :be_1:

  • Hallo Benny,
    mit LUA werde ich mich natürlich erst dann richtig beschäftigen, wenn ich das Plugin 2 gekauft habe - oder vielleicht auch erst die nächste Version von EEP mit LUA.
    Aber trotzdem habe ich mit großem Interesse Deine Erläuterungen zu Deinem Script gelesen und freue mich mit Dir, dass Du diese Möglichkeit ausgetüftelt hast.
    Jetzt musst Du nur noch einen Weg suchen und finden, die bisher noch nicht zugänglichen Parameter auszulesen und zu beeinflussen.
    Ich weiß jedoch auch, dass sich EEP nicht in jeder Weise überlisten lässt.
    Gruß
    ruetzi

    EEP 5, HomeNos 5/8/13/15, EEP 8, 10, 11, 13, 14, 15, EEP 16.4 Expert, Plugin 1
    PC Intel Core i5-4460 QUAD-Core 3.2 GHz, 16 GB PC1600 DDR3-RAM, 250 GB SSD, nVidia GeForce GTX 750Ti - 2 GB DDR5, Windows 8.1
    Notebook Pentium Dual Core 2 GHz, 4 GB DDR3-RAM, Intel GMA3000 Grafik

    EEP - immerhin das Beste vom Schlechten - mit Tendenz zum Besseren!

  • dieser "Code-Schnipsel" ist einfach Spitze.
    Damit eröffnest Du einige Möglichkeiten in der EEP-Lua Programmierung.

    Hallo Benny,

    Diese Antwort kann ich nur bestätigen ! Sehr nützlicher Tipp ! Danke !!

    EepNolie

    Spoiler anzeigen

    Desktop : W10 Pro 64Bit - i7-7700K 4.5Ghz - 32Gb RAM - MSI Geforce Ti Gaming X 1080 (11Gb) - 3 monitors 24"

    Laptop : W10 Home 64Bit - i7-4750HQ 3.2Ghz - 16Gb RAM - NVidia GTX960M

    Ich bin dabei seit EEP 6 und benutze jetzt EEP 17.

    Zwischendurch stelle ich Modelle zusammen...

    Free EEP-tools : Model Multiplier / Texture Multiplier / Window restore Tool / Inventory Exporter / Settings editor / Project manager

    37310-banner2018-jpg

  • Hallo Benny,
    Auch von mir ein herzliches Dankeschön für den "Schnipsel". :bb_1:
    Ganz besonders fantastisch ist, dass man nun direkt einen Lua Befehl aus dem KP heraus ausführen kann. Damit wird es wunderbar einfach einen Eintrag im Ereignisfenster zu generieren usw., usw., ohne im Lua Script dafür rumeiern zu müssen.

    Viele Grüße aus Franken
    Manfred
    __________________________

    Daten PC/EEP

    Windows 11 64Bit - Intel i7 8700 (6x3.2 GHz) -GeForce GTX1060 6GB - 16GB RAM - PC

    Windows 10 64Bit - Intel i7 4790 - GeForce GTX970 4GB - 16GB RAM - PC

    Windows 11 64Bit - Intel i7-12700F - GeForce GTX1650 4GB -64GB RAM - 1TB SSD - PC

    Virenschutz alle: Windows Defender

    Browser: Firefox

    2 Monitore

    EEP 2.43 Gold bis EEP17.3, Plugins 1,2
    Modell Katalog, Modell Explorer, Tauschmanager

  • Hallo Benny,

    danke auch von mir für deinen Code-Schnipsel. Habe gerade getestet,
    man kann auch mehrere Befehle schreiben. Sogar das geht:
    [Blockierte Grafik: http://up.picr.de/19506928lm.jpg]
    Es ist nur leider nicht viel Platz in der Zeile.

    Kannst du bitte auch etwas erfinden, dass man die Signal-Variablen nicht mehr braucht?
    :ba_1:  :ba_1:  :ba_1:
    Das wäre zu schön um wahr zu sein.

    Gruß, Hans-Christian

  • damit meine ich, dass man Signale verwenden muss um den Zustand von Variablen abzuspeichern
    wenn man nicht möchte, dass nach dem Schließen einer Anlage oder nach dem Neuladen des
    LUA-Scripts alle aktuellen Werte der Variablen flöten gehen.

    Oder habe ich was verpasst, gibt es dafür schon eine Lösung?

    Gruß, Hans-Christian

  • Du kannst nie garantieren, dass zugleich mit einer Anlage auch etwas anderes gespeichert wird, in dem beispielsweise Variablen festgehalten werden. Lua erfährt nicht, dass eine Anlage gespeichert wird. Und kann dementsprechend auch nicht reagieren. Also ist der einzige zuverlässige Speicherplatz für Zustandsmerker die Anlage selbst. Und dort geht es nur mit Signalen oder Weichen. Weil nur diese beiden Elemente beim nächsten Start ausgelesen werden können.