SlotSugar - einfachere Verwendung der Speicherslots

!!! 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.
  • Wenn du dich schonmal ein bisschen mehr mit Lua beschäftigt hast, wirst du um die Slots zum Datenspeichern kaum herum gekommen sein.
    Und vielleicht hast du dich auch schon über die umständlichen Funktionsaufrufe und doppelten Rückgabewerte geärgert. Damit ist es jetzt vorbei, denn mit dem Lua-Skript SlotSugar kannst du auf die Slots genauso zugreifen wie auf die Einträge einer Tabelle.
    Den Download sowie eine ausführlichere Beschreibung findest du auf meiner Homepage. Dort gibt es auch eine Erklärung, was Slots mit Zucker zu tun haben...


    Hier schonmal ein kurzes Beispiel:
    Was bisher so aussah:

    Code
    1. -- Slot 1 auslesen und ausgeben
    2. meinErfolg, meinWert = EEPLoadData(1)
    3. print(meinWert)
    4. -- 42 in Slot 1 speichern
    5. EEPSaveData(1, 42)


    kann jetzt einfach so geschrieben werden:


    Viele Grüße
    Benny

  • Einfach aber genial!!


    Vielen Dank


    P.S.: verträgt sich das wohl auch mit PlanEx 3.0?

    EEP 15 / EEP 14.1 Expert Plugin 1 / EEP 13 Expert Plugin 1,2 / PlanEx 3.1
    ATHLON A8-5600K, NVIDIA GeForce GTX 1060 6GB , 16GB, Windows 10 Professional 64 Bit
    Notebook Intel Core i7 4GB Nvidia NVS5100M Windows 10 Professional 64 Bit

  • Die Funktionen EEPSaveData() und EEPLoadData ändern sich durch Bennys Code nicht.
    Deshalb sollte PlanEx (und alles, was sonst noch diese Funktionen benutzt) nach meinem Verständnis unbeeinträchtigt bleiben.


    Benny richtet nur einen Metatable ein, der diese zwei Funktionen verwendet.

  • Hallo Benny oder auch Goetz,


    ich bin begeistert von dem "Zuckerle" SlotSugar als auch von der Lösung Parameter anhand von Kontaktpunkten weiter geben zu können. SlotSugar lässt sich ja, wie von Benny beschrieben, einfach per "require" einbinden. Geht das mit der Codezeile für die Kontaktpunkte auch? Hab's versucht aber es funktioniert nicht. Mach ich etwas falsch oder geht das nicht?


    Dankender Gruß
    Franz

    Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz, 16 GB Ram, NVIDIA GeForce GTX 960
    Windows 10, EEP Expert 14.1 [x64], Plug-In 1, NOS14, ModellKatalog, BilderScanner,

    TauschManager und BodentexturTool

  • Bei mir klappt das mit allen Zeilen.
    "require" macht ja nicht anderes als die Zeilen dazulesen.


    Ich verwende übrigens auch vereinfachte Funktionen, die lange komplizierte Aufrufe ersetzen.
    Ich habe dafür bislang nur keine Tabelle genutzt. Gute Idee Benny!


    Gruß
    Thomas

    EEP14, HomeNos13, Modellkatalog, Blender, Tauschmanager, Hugo :aq_1:

  • Das Problem saß mal wieder ..... Ihr wisst schon


    Als ich die LUA-Datei gemacht und die Zeile per Zwischenablage kopiert habe erwischt ich das letzte Zeichen nicht.


    Jetzt geht's. Danke
    Franz

    Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz, 16 GB Ram, NVIDIA GeForce GTX 960
    Windows 10, EEP Expert 14.1 [x64], Plug-In 1, NOS14, ModellKatalog, BilderScanner,

    TauschManager und BodentexturTool

  • Trotzdem - fürs nächste Mal:


    "Es funktioniert nicht" ist ziemlich nutzlos wenn du Hilfe brauchst.
    Schreib bitte genau, was nicht funktioniert.
    z.B.:

    • Das Skript wird mit einer Fehlermeldung abgelehnt (plus Fehlermeldung)
    • Die Parameter werden im Kontaktpunkt nicht angenommen
    • bei der Ausführung tritt folgender Fehler auf

    um beim aktuellen Beispiel zu bleiben.


    Wir sehen nicht, was du siehst und haben ohne solche genauen Fehlerbeschreibungen keine Ahnung, wo wir überhaupt ansetzen sollen.


    Nachtrag:
    Sorry, Benny, dass ich deinen Thread missbrauche.

  • Missbrauch von mir...


    Ich gebe Dir recht Goetz und wenn Du Dir meine bisherigen Hilferufe hier im Forum ansiehst wirst Du sehen, dass ich immer versuche klar und ausführlich zu formulieren. Nun zähle ich mich ja nach wie vor zu den LUA-Anfängern und deshalb war meine eigentlich Frage:


    Mach ich etwas falsch oder geht das nicht?


    Aber wahrscheinlich verbot es Dir Deine Höflichkeit einfach zu schreiben: Es geht. Also machst Du etwas falsch.


    Gruß
    Franz

    Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz, 16 GB Ram, NVIDIA GeForce GTX 960
    Windows 10, EEP Expert 14.1 [x64], Plug-In 1, NOS14, ModellKatalog, BilderScanner,

    TauschManager und BodentexturTool

  • Besten Dank, Benny!


    Nur als Hinweis (nicht an dich, dir dürfte die Möglichkeit sein): Mit

    Code
    1. select(2,EEPLoadData(slot))

    lässt sich auch direkt der Wert eines Slots aufrufen, wobei "slot" natürlich durch die entsprechende Slotnummer darstellt.

    Gruß, Dennis


    EEP 13 Expert auf meiner Uralt-Kiste: Läuft und läuft und läuft und läuft... + Modellkonverter
    Toshiba Satellite P750-12T mit i7 2630QM @ 2 GHz (Boost @ 2,9 GHz); 8 GB RAM; NVidia GeForce GT 540 M; Win 10 64bit

  • Die meisten Fragen hat Götz ja schon beantwortet. Aber ich will auch nochmal :ag_1:


    verträgt sich das wohl auch mit PlanEx 3.0?

    Ja. Mein Skript bietet nur eine neue Möglichkeit zum Slot-Zugriff. Die bestehenden Möglichkeiten (die PlanEx und (bisher) alle anderen Skripte benutzen) bleiben unverändert.


    Benny richtet nur einen Metatable ein, der diese zwei Funktionen verwendet.

    Um genau zu sein, gilt der/die Metatable nur für die eine Variable Slot (oder wie auch immer sie in der ersten Zeile beim Einbinden genannt wurde). Im Gegensatz dazu setzt meine Codezeile eine Metatable für die "allumfassende" Variable _ENV.


    Franz : Hat sich mittlerweile ja geklärt, du hast was falsch gemacht. Ob das Auslagern dieser einen Zeile in eine extra Datei (die dann wiederum mit einer Zeile eingebunden werden muss) Sinn macht, sei mal dahingestellt...


    "require" macht ja nicht anderes als die Zeilen dazulesen.

    dofile macht nichts anderes, als die Zeilen dazuzulesen. require ist noch ein bisschen anders, lässt sich aber auch so verwenden. (Beispielhafte Unterschiede: Bei require gibst du keinen Datei-, sondern einen Modulnamen an. Der wird dann an verschiedenen Stellen (z.B. auch im LUA-Verzeichnis) gesucht. Das geladene Modul wird zwischengespeichert (eher unwichtig), vor allem kann es aber Rückgabewerte geben. Mein SlotSugar gibt beispielsweise die Slot-Tabelle zurück. Das Speichern in einer Variablen (normalerweise Slot) ist dann Sache des Nutzers, sofern er sich nicht an meine Anleitung hält).


    Dennis :
    select() war mir bisher auch nicht bekannt (warum auch immer. Im Lua-Manual steht es drin, auch wenn ich es erst nach längerer Zeit gefunden habe). Vermutlich hätte ich mir selbst eine Funktion geschrieben, die genau das macht.
    Nachteil, wenn man nur den zweiten Parameter ausliest: Man kann einen leeren Slot nicht unterscheiden von einem, in dem 0 gespeichert ist. Meine Funktion gibt bei einem leeren Slot nil zurück.


    Viele Grüße
    Benny

  • Hallo Benny,
    Sehr vielen Dank für den neuen "ZuckerleCodeSchnipsel", gerne werde ich ihn neben der Parameterübergabe durch Kontaktpunkte verwenden, vereinfacht es doch sehr :bb_1:

    Viele Grüße aus Franken
    Manfred
    __________________________

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

    Windows 8.1 64Bit - Intel i7 4790 - GeForce GTX970 4GB - 16GB RAM
    Windows 7 Home Premium 64Bit - Intel i5 650 - Ati Radeon HD5750 - 8GB RAM

    2 Monitore

    EEP 2.43 Gold bis EEP15
    Modell Katalog

    Modell Explorer

  • Hallo Benny,


    dein neues Zuckerle ist prima zu nutzen, habe bereits einen
    entsprechenden Einsatz gefunden:


    Bereiche im Datenslot nutzen Sbhf_Nord[100] = "belegt"
    und gleichzeitig Sbhf_Sued[200] = "belegt"


    weitere Bereiche mit aussagekräftigen Namen einrichten.


    Nachteil, den ich festgestellt habe, man kann den Code nicht
    in ein vorhandenes Script einbinden, z.B.in eine vorhandene "Toolbox".

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.


    http://www.parry-36.jimdo.com
    https://www.twitch.tv/parry_36/

  • Hallo Parry,
    leider verstehe ich dich gleich zweimal nicht...

    Bereiche im Datenslot nutzen Sbhf_Nord[100] = "belegt"
    und gleichzeitig Sbhf_Sued[200] = "belegt"

    Wo willst du das hinschreiben? Bzw. wie willst du die require-Zeile abändern, damit das funktioniert?


    Nachteil, den ich festgestellt habe, man kann den Code nicht
    in ein vorhandenes Script einbinden, z.B.in eine vorhandene "Toolbox".

    Wieso / Was daran soll nicht gehen?


    Viele Grüße
    Benny

  • Ganz einfach, man kann mehrere Instanzen des Moduls laden:


    Sbhf_Nord = require("SlotSugar_BH2")
    Sbhf_Sued = require("SlotSugar_BH2")usw.


    EEP stört sich an das freie "return Slot" in Verbindung
    mit weiterem Code im Tool_Box-Script.


    Gruß Parry36

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.


    http://www.parry-36.jimdo.com
    https://www.twitch.tv/parry_36/

  • Hallo Benny,


    herzlichen Dank für deinen "Zucker". Da habe ich doch glatt eine bzw. mehrere Fragen dazu, da ich keine Ahnung von Lua habe, obwohl bis jetzt alles funktioniert, was ich da so in den Skripten geschrieben habe.
    Da ich mir keine Zahlen merken kann, wo ich was speichere, aber Namen mir einen Ausdruck geben, wollte ich fragen, geht das so?


    Mich interessieren die Zeilen 17, 22 und 25. Und die Fragen im Skipt selbst.


    Vielen Dank im Voraus. :aq_1:

    MfG. Jörg
    Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    installiert: EEP6.1; EEP14.1 expert Patch2 mit Plugin 1; EEP15.0 Patch2

    Zusatzprogramme: EEP Zug-Explorer, EEP Modell-Explorer, JWGleisEditor, ResourcenSwitcher2

  • Schon als ich das Beispiel in der 1.Post gesehen habe, war mir klar, wie
    das externe Skript aufbaut würde, ohne das ich es gesehen habe. Es ist recht einfach, nur man muss
    erst mal die Idee dazu haben. Und darum geht es ja. ;-)
    Man kann auch sagen: Genial einfach Einfach genial!

    Besten Dank, Benny!


    Nur als Hinweis (nicht an dich, dir dürfte die Möglichkeit sein): Mit

    Code
    1. select(2,EEPLoadData(slot))

    lässt sich auch direkt der Wert eines Slots aufrufen, wobei "slot" natürlich durch die entsprechende Slotnummer darstellt.

    Mindestens genauso genial ist der Befehl select. Oft habe ich mich schon darüber geärgert, dass man oft (nicht nur bei Slots) den zweiten Wert braucht und deswegen nicht direkt verarbeiten konnte, sondern den Umweg über zwei Variablen machen musste.
    Mit select könnte man z.B. die Abfrage EEPGetTrainSpeed("#Name") direkt verarbeiten, wenn man nicht zwingend eine Variable dafür braucht.


    Beispiel:

    Code
    1. if select(2,EEPGetTrainSpeed("#Name")) == 30 then
    2. ...
    3. end
  • Na da bin ich aber platt, dass selbst den Experten "select()" bisher nicht bekannt war :D Freut mich sehr, dass ich da dem ein oder anderen helfen konnte! Benny : Bzgl. des Nachteils leerer Slots stimme ich dir zu; das ist bei SlotSugar komfortabler gelöst.


    Kleines Anwendungsbeispiel zur Select (Benny, falls sich daraus eine Diskussion entwickelt, bitte um Verschiebung):

    Code
    1. function fs_anfordern(...)
    2. wahl = math.random(1,select("#",...))
    3. fs = select(wahl,...)
    4. for i=1,#fs do EEPSaveData(fs[i],1) end
    5. end


    Über einen Kontaktpunkt wird eine Tabelle (beliebiger Länge) mit möglichen Routen, die wiederum aus mehreren Fahrstraßen bestehen, übermittelt. Das schaut z.B. so aus: "fs_anfordern{{1,2,3},{1,2,4},{2,6}}". Per Zufall wird eine dieser Routen ausgewählt (select("#",...) gibt die Anzahl der Elemente von ... zurück, in diesem Fall 3) und setzt die einzelnen Fahrstraßen anschließend auf "1" (=angefragt). Die EEPMain überprüft mihilfe von "if select(2,EEPLoadData(sig_slot))==1 then ... endif" die Signalliste und stellt die entsprechenden Fahrstraßen in EEP.

    Gruß, Dennis


    EEP 13 Expert auf meiner Uralt-Kiste: Läuft und läuft und läuft und läuft... + Modellkonverter
    Toshiba Satellite P750-12T mit i7 2630QM @ 2 GHz (Boost @ 2,9 GHz); 8 GB RAM; NVidia GeForce GT 540 M; Win 10 64bit