LUA-Anlagenscripte im Anlagenordner speichern, verwalten und verwenden

!!! 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.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • Da ich Scripte und Definitionen in eigenen Script-Dateien verwalten möchte und sie im Hauptscript dann mit require nachlade, hat mich schon von Anfang an geärgert, dass die Scripte nicht im Anlagenordner gefunden wurden ohne vollständigen Pfad. Beim Lesen in Roberto Ierusalimsky‘s „Programming in Lua“ ist mir dann auch eine für mich gute Lösung eingefallen:


    1. Nach dem ersten Speichern einer Anlage in einem eigenen Anlagensammelordner lege ich im Ordner, in dem die Anlagendateien liegen, einen Unterordner mit dem Anlagennamen an, in dem die LUA-Scripte dann liegen werden.

    2. In meinem Anlagenhauptscript füge ich ganz vorne die folgenden Scriptzeilen ein, natürlich mit den passenenden Pfaden und Namen:

    Die letzte Anweisung setzt einfach den eigenen LUA-Ordner vor den Suchpfad von EEP.

    Jetzt brauche ich nur noch mit den Scripnamen das Laden anfordern:

    require("scriptname")

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • Bei dieser Methode ist ein kleines Problem aufgetaucht, das das gedachte Prinzip etwas aushebelt.

    In meiner Version von EEP (16 + 1-4) kann ein Kontakt die Funktion nicht finden, wenn sie nicht im Hauptscript steht.

    Das ist für mich logisch, weil LUA ja nur eine ID für eine Funktion speichert und nicht den Funktionsnamen, wenn es in den Bytecode übersetzt wurde.

    Und EEP hat erstmal keine Ahnung von den weiteren per require eingebundenen Script-Daten.

    Ein getesteter Workaround ist der, dass (so ähnlich wie in Headerdateien von C oder C++) der Name "definiert" wird und dann im NACHFOLGEND importierten Script "neu geschrieben" wird.


    Im Hauptscript: function FUNKTIONSNAME() end

    Im "require"-Script: FUNKTIONSNAME = function() ... end

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • Hallo Moevenbaer (oder Mövenbär?)


    Was bezeichnest Du denn als Hauptscript?

    Es sollte überhaupt kein Problem darstellen wenn ein KP eine Funktion aufruft, die in einem zusätzlichen Script steht. Natürlich muss das Script mit require eingebunden sein. Das funktioniert bei mir wie auch bei den meisten anderen (denke ich mal) einwandfrei.

    Vielleicht liegt es ja daran das Du bei deinen Tests das mit der Anlage erzeugte Lua Script ( dein Hauptscript?) nicht neu geladen hast? und natürlich vorher deine eigenen Scripte abgespeichert hast?

    Grüße aus dem Badischen :bg_1:
    Peter


    EEEC 2.43 (Ehrenplatz im Schrank), EEP5 (Platz im Schrank), EEP 6 voll ausgebaut, EEP12.1 expert, EEP 16.4 + PlugIns
    Windows 10 64bit, Intel Core i7-4790K, 32 GB RAM, 1 TB SSD, Nvidia GeForce 970 GTX

  • Hallo moevenbaer ,

    das Lua-Script welches durch den EEP-internen Editor geöffnet wird (ich nehme mal an, diese Script-Datei nennst Du "Hauptscript") besteht bei mir nur aus der Erweiterung des Scriptdatei-Such-Ordners und aus require-Zeilen.

    Alle Funktionen und Variablen-Definitionen befinden sich in, nach ihrer Funktionalität aufgeteilten und durch require eingebundenen Scriptdateien.

    Nach dem Neuladen des Lua-Scriptes in EEP stehen alle Funktionen dieser "Unter-Scriptdateien", ohne irgendwelche weiteren Funktionsdefinitionen, für die Verwendung in Kontaktpunkten zur Verfügung.

    Jürgen


    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert, bezahlt, aber nur für Tests im Einsatz, da auf Fehlerbeseitigung gewartet wird)

    keinerlei Zusatztools und manuell manipulierte Anlagendateien


    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

  • Also bei mir steht nur eine Zeile drin im Lua-Editor.

    LUA Source Code
    1. require("\\Anlagenordner\\Hauptskript_01")

    Alles Andere ist ausgelagert. Und funktioniert seit mehreren EEP-Versionen ohne Probleme.

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP16.4 mit Plugin1+2+3

    Zusatzprogramme: ResourcenSwitcher2, Anlagenverbinder für EEP16, EEP-Gleisplan (Frank Buchholz)

  • Damit EEP eine Funktion als bekannt einstuft (sodass man im Kontaktpunkt auf OK klicken kann, muss die Funktion entweder global vorhanden sein (ist erst der Fall, nachdem das Skript einmal ausgeführt wurde), oder im Hauptscript muss irgendwo "function Funktionsname" stehen (wenn ich mich erinnere, kann das sogar in einem Kommentar sein).

    Du hast mit deinen "Headerdaten" die zweite Möglichkeit entdeckt. Die einfachere Möglichkeit dürfte aber sein, darauf zu verzichten und stattdessen nach dem Laden der Anlage einmal kurz in den 3D-Modus zu schalten, sodass das Skript (inklusive der eingebundenen Unterdateien) einmal ausgeführt wird (und dabei alle irgendwo definierten Funktionen global bekannt gemacht werden).

    Danach lassen sich die Funktionen auch in den Kontaktpunkten verwenden.


    Viele Grüße

    Benny

  • Nach dem Neuladen des Lua-Scriptes in EEP

    Genau das war nicht der Fall bei mir, aber ich war eben auch noch nicht im 3D-Modus, weil ja da erst das Script ausgeführt wird. Vorher ist es nur geladen, habe ich jetzt verstanden.

    Die einfachere Möglichkeit dürfte aber sein, darauf zu verzichten und stattdessen nach dem Laden der Anlage einmal kurz in den 3D-Modus zu schalten, sodass das Skript (inklusive der eingebundenen Unterdateien) einmal ausgeführt wird (und dabei alle irgendwo definierten Funktionen global bekannt gemacht werden).

    Das ist noch bequemer und genau richtig für mich. Dankeschön.

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • Hallo,

    da sich meine Anlagen beim Laden und Bauen immer in einem Haltezustand befinden, habe ich mir angewöhnt, nach dem Laden einer Anlage in den 3D-Modus zu wechseln und auch das Neuladen eines Lua-Scriptes nach dem Ändern/Erweitern immer im 3D-Modus durchzuführen.

    Jürgen


    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert, bezahlt, aber nur für Tests im Einsatz, da auf Fehlerbeseitigung gewartet wird)

    keinerlei Zusatztools und manuell manipulierte Anlagendateien


    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

  • dann will ich hier auch mal meinen Vorgehensweise darstellen:


    da ich zwei Rechner nutze, nutze ich eine externe SSD als Laufwerk R nur für EEP.



    Diese ist wie man sieht mit Zahlen und Ordnerbezeichnungen eingerichtet. Unter 01 Anlagen befinden sich weitere Ordner



    Wenn ich eine neue Anlage beginne, kopiere ich mir den Ordner !Anlage Leer und speichere dann unter neuem Namen.

    In diesem Ordner sieht es so aus:



    bis auf dem Ordner Lua sind alle leer.

    im Lua Ordner befinden sich zwei Dateien.

    Damit das so funktioniert, nutze ich den ResourcenSwitcher von Benny (dafür besten Dank :be_1:)

    Somit habe ich nur einen Speicherplatz für die EEP Resourcen und für meine Anlagen / Lua Scripte und ...

    Demnächst mehr


    Gruß Reinhard

    Der Oldenburger :bd_1:

    EEP 15 Plugin1/16 Plugin 1und 2|Home-Nos 15 / 16 |Moodellkatalog|Bilder Scanner|Modell Explorer

    Desktop:Gigabyte Z270-HD3P|Intel i5-7400|Corsair Venegance 16 GB DDR4|Gigabyte GeForce GTX 1050Ti|1TB SSD + 3x 1TB HD

    Samsung SyncMaster S27D390 + Samsung SyncMaster P2450 + Samsung SyncMaster 931BF|Win 10 Pro

    Laptop Acer Aspire E17|17 Zoll FullHD|i5-6200U|12 GB DDR4|GeForce 940mx 2GB DDR5|256GB SSD|1TB HD|Win 10 Home

    von Blender über HomeNos zu EEP -> Mein youtube Kanal

    The post was edited 1 time, last by Karlchen57 ().

  • Post by schlingo ().

    This post was deleted by the author themselves: erledigt ().
  • Unter Lua befinden sich zwei Dateien:

    Datei >00_EEP_Lua.lua<

    Code
    1. clearlog ()
    2. --Nur diese Zeilen in EEP Lua einbinden! Hier wird nur das Hauptprogramm aufgerufen!
    3. -- Hier den Pfad des Anlage-Lua Verzeichnis ";R:\\01 Anlagen\\XXXXXXXXXX\\Lua\\?.lua" anpassen
    4. package.path = package.path..";R:\\01 Anlagen\\XXXXXXXXXX\\Lua\\?.lua"
    5. require ("01_Hauptprogramm")

    Hier wird über package.path auf die SSD verwiesen und über require mein Hauptprogramm einegebunden


    Das Hauptprogramm >01_Hauptprogramm.lua< sieht dann so aus



    So sieht es bei mir aus.

    Weitere Lua teile werden immer dann z.B. 02_Programmname.lua gespeichert und über require eingebunden.


    Gruß Reinhard

    Der Oldenburger :bd_1:

    EEP 15 Plugin1/16 Plugin 1und 2|Home-Nos 15 / 16 |Moodellkatalog|Bilder Scanner|Modell Explorer

    Desktop:Gigabyte Z270-HD3P|Intel i5-7400|Corsair Venegance 16 GB DDR4|Gigabyte GeForce GTX 1050Ti|1TB SSD + 3x 1TB HD

    Samsung SyncMaster S27D390 + Samsung SyncMaster P2450 + Samsung SyncMaster 931BF|Win 10 Pro

    Laptop Acer Aspire E17|17 Zoll FullHD|i5-6200U|12 GB DDR4|GeForce 940mx 2GB DDR5|256GB SSD|1TB HD|Win 10 Home

    von Blender über HomeNos zu EEP -> Mein youtube Kanal