SlotSugar - einfachere Verwendung der Speicherslots

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.
  • 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:

    Lua
    -- Slot 1 auslesen und ausgeben
    meinErfolg, meinWert = EEPLoadData(1)
    print(meinWert)
    
    -- 42 in Slot 1 speichern
    EEPSaveData(1, 42)


    kann jetzt einfach so geschrieben werden:

    Lua
    -- SlotSugar einmal am Anfang des Skripts einbinden
    Slot = require("SlotSugar_BH2")
    
    -- Slot 1 auslesen und ausgeben
    print(Slot[1])
    
    -- 42 in Slot 1 speichern
    Slot[1] = 42

    Viele Grüße
    Benny

  • Einfach aber genial!!

    Vielen Dank

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

    EEP 17.2 Plugin 2 / EEP 16
    Desktop HP Z2G9 Intel Core i7 3,6GHz 32GB RAM NVIDIA GTX1060 6GB Windows 11 Pro 22H2
    Notebook HP Dragonfly Intel i5-8265U CPU @ 1.60GHz 1.80 GHz 8GB Intel UHD Grafik 620 Windows 110Pro22H2

  • 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

    Viele Grüße

    Franz:bm_1:

    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,

    Modell-Explorer, 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

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, 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

    Viele Grüße

    Franz:bm_1:

    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,

    Modell-Explorer, 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

    Viele Grüße

    Franz:bm_1:

    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,

    Modell-Explorer, TauschManager und BodentexturTool

  • Besten Dank, Benny!

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

    Code
    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

    Immer noch EEP 13 Expert + Modellkonverter, jetzt aber auf neuer Infrastruktur:

    Acer Nitro 5 (75AM) mit i7-10750H @2.6 GHz (Boost @5.0 GHz), 16GB RAM, NVidia GeForce RTX3060 (6GB), 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
    __________________________

    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,

    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, HomeNos 15

    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.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    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, HomeNos 15

    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.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    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
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • 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
    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
    if select(2,EEPGetTrainSpeed("#Name")) == 30 then
    	...
    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 (BH2): 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
    function fs_anfordern(...)
    	wahl = math.random(1,select("#",...))
    	fs = select(wahl,...)
    		for i=1,#fs do EEPSaveData(fs[i],1) end
    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

    Immer noch EEP 13 Expert + Modellkonverter, jetzt aber auf neuer Infrastruktur:

    Acer Nitro 5 (75AM) mit i7-10750H @2.6 GHz (Boost @5.0 GHz), 16GB RAM, NVidia GeForce RTX3060 (6GB), Win 10 64bit