Jump to content

EASY

Mitglieder
  • Gesamte Inhalte

    3346
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von EASY

  1. Hallo, ... danke für die Aufklärung (... immer diese kleinen Feinheiten [über die man stolpert...]) Gruß EASY
  2. Hallo, @Neo ich habe das Beispiel von @Goetz etwas erweitert... local modul = layout:getEventsByName("SC_1")[1] -- Original structured table local testState = { shortPhase = { "Vo1","Vo1a" }, longPhase = { "Vo2" }, currentMode = "countDown" } -- Store in module variable modul.variables["BrokenState"] = testState -- Also store in global variable _G.goodState = testState -- Later access (simulate after a timer or defer callback) local broken = modul.variables["BrokenState"] local good = _G.goodState print("From testState") for k, v in pairs(testState) do print(" " .. k, type(v)) if type(v)=="table" or type(v)=="object" then for i,w in ipairs(v) do print(k,w,i) end else print(k,v) end end print() print("From modul.variables:") for k, v in pairs(broken) do print(" " .. k, type(v)) if type(v)=="table" or type(v)=="object" then for i,w in ipairs(v) do print(k,w,i) end else print(k,v) end end print() print("From _G:") for k, v in pairs(good) do print(" " .. k, type(v)) if type(v)=="table" or type(v)=="object" then for i,w in ipairs(v) do print(k,w,i) end else print(k,v) end end ... mit diesem Ergebnis... ... wie Goetz schon angemerkt hat, wird beim Übertragen von "testState" auf die Modulvariable der Typ "table" auf den Typ "object" geändert obwohl die Variable prinzipiell richtig angelegt wird... und bei der Übertragung auf eine globale Variable nicht. ... zum Auslesen wird der typ "object" wieder wie eine Tabelle (Liste) behandelt. Da ich neugierig bin... hat das einen bestimmten Sinn? Was verbirgt sich hinter dem Typ "object"? Gruß EASY
  3. Hallo, ... deshalb extra so gewählt... Gruß EASY
  4. Hallo, ... wird anscheinend so interpretiert. Wenn man... local signalLists = { ["XAB"] = { $("Hauptsignal Hp0/1"), $("Hauptsignal Hp0/1/2") }, ["XAC"] = { $("H/V Blocksignal"), $("H/V Hauptsignal") } } $("Ereignisse").variables["SignalLists"] = signalLists ... definiert, kommt in dem Beispiel von @Goetz... for k, v in pairs ($("Ereignisse").variables["SignalLists"]) do print(k) end 171 und 172 zurück... ... wenn man hingegen.... local signalLists = { ["XGG"] = { $("Hauptsignal Hp0/1"), $("Hauptsignal Hp0/1/2") }, ["XGH"] = { $("H/V Blocksignal"), $("H/V Hauptsignal") } } $("Ereignisse").variables["SignalLists"] = signalLists ... definiert, dann kommt auch XGG und XGH zurück... ... ist also etwas gemischt mit der Interpretation... Gruß EASY
  5. Hallo, um Teilstrecken zu messen, kannst Du auch wie folgt vorgehen (Hinweis: mit dieser Methode werden nur ganze Gleislängen ausgelesen)... Temporär eine Fahrstraße mit 2 Gleiskontakten anlegen... ... in der EV folgendes Ereignis anlegen... ... dieses Skript einfügen... --[[ Länge aller Gleise einer Fahrstraße ermitteln Hinweis: Längenangabe in ganzen Gleisen --]] if route.active then Gleise=$("FSLänge").tracks local l=0 for _,g in ipairs(Gleise) do if g.routeCount>1 then for i=0,g.routeCount-1 do if g.routes[i].active then l=l+g.routes[i].length end end else l=l+g.routes[0].length end end print() print("Gleislänge (in ganzen Gleisen):") print(l,"Meter") print() end ... wenn die Fahrstraße aktiviert wird (wichtig! damit die richtige Spur der Weiche aktiv ist), wird die Gleislänge im Ereignisprotokoll angezeigt... Wichtig! Die Fahrstraße wieder deaktivieren (sonst funktionieren nachfolgende Schritte nicht, da die Weiche gesperrt ist)... Zum Messen des anderen Gleisstranges, den hinteren Gleiskontakt verschieben. Dadurch wird die Fahrstraße (logischerweise) ungültig... ... auf den Bleistift klicken... ... um die Fahrstraße neu zu definieren im nachfolgenden Fenster noch einmal auf dem Bleistift klicken... ... und übernehmen... ... jetzt wird mit dem Aktivieren der Fahrstraße die Länge des anderen Zweiges angezeigt... Gruß EASY
  6. Hallo, ... ist sehr praktisch wenn man verschiedene Lösungswege ausprobieren möchte und auf schnelle Art und Weise zwischen den Lösungen hin und her wechseln möchte oder zum Unterdrücken von Codezeilen bei der Fehlersuche... geht auf jeden Fall schneller, wie die "Lösung" in lua... Gruß EASY
  7. Hallo, ich kenne Deinen Aufbau nicht. Mein Lösungsansatz wäre folgender: Wenn ein Zug den Bahnhof verlassen hat (Gleis ist garantiert frei), wird nachgesehen, ob ein Zug auf Einfahrt wartet (weil er kein freies Gleis gefunden hat). Damit braucht es keinen Timer... @Goetz war einen Tick schneller... Gruß EASY
  8. Hallo, ... "empty" ist v auch, wenn die Variable ein Objekt oder eine Liste / Tabelle beinhaltet... ist also nicht so ganz zuverlässig... Gruß EASY
  9. Hallo, ... liefert zwar nicht für alle Variablentypen ein Ergebnis (v)... ich aber für einen Überblick ganz praktisch und ausbaufähig Gruß EASY
  10. Hallo, ... da bist Du nicht alleine... diese Frage taucht immer wieder auf... @Neo ... und bei dem Tooltip... ... kommt man nicht zwingend auf die Idee den kleinen Pfeil für das Einfügen aus Datei / Katalog zu nutzen Gruß EASY
  11. Hallo @RoBa-MoBa, ... siehe hier Einen Key bekommst du nicht, du kannst aber die Steam-Version direkt im Programm aus mit deinem Benutzerkonto hier verknüpfen. Im Studio gibst du dafür einfach die E-Mail des Benutzerkontos an, der Rest geht automatisch. Viele Grüße, Neo Gruß EASY
  12. Hallo, ... die Falle liegt allerdings bei Dir Du hast in Deiner Definition der Funktion "function IsStartKontakt(keyword, kontakt)" "keyword" als Variablenname. Dies ist im MBS lua ein Schlüsselwort! (auf das Du ja auch noch abfragst) if kontakt.variables[keyword .. "_Start"] == keyword then... kann in diesem Fall niemals "true" sein. Mit... function IsStartKontakt(key, kontakt) if kontakt.variables[key .. "_Start"] == keyword then return true else return false end end ... geht auch die 1. Variante... Gruß EASY
  13. Hallo, der einzige Umweg, der mir einfällt ist, den Schlagwortnamen (die Schlagwortnamen) in einer Objekt-Textvariablen (Liste Objekt-Textvariable) zu hinterlegen und diese dann abfragen. Dann hast Du eine (namentlich bekannte) Variable für weitere Verzweigungen... dies steht allerdings etwas entgegen zu dem eigentlichen Sinn von Schlagworten, da man so prinzipiell natürlich dann auch nur über die Variable arbeiten könnte. Gruß EASY
  14. Hallo @Chaosgrummi, ... noch ein kleiner Hinweis: Wenn Du im Simulationsmodus ein Fahrzeug markierst, dann wird mit einen animierten grünen Pfeil die aktuelle Fahrtrichtung des Fahrzeugs angezeigt (auch wenn es steht) [MBS V9]... ... Ziele können nur festgelegt werden, wenn sie in Fahrtrichtung liegen... deshalb: Gruß EASY
  15. Hallo, einfach gar nicht ... die Variablen gehen über (eindeutige) Namen. Wildcards sind im MBS nicht vorgesehen. Prinzipiell geht es nur über eine Referenzliste als Variable z.B. "Variablennamen" mit allen Variablennamen, die in einer Schleife durchlaufen wird. Um auf alle Objekte zuzugreifen gibt es ... layout:enumEntities() Und so würde ein Listendurchlauf beispielsweise aussehen... local t = $("Ereignisse").variables["Variablennamen"] for _,v in ipairs(t) do layout:enumEntities(function (entity) entity.variables[v]=nil end) end ... dabei muß man allerdings bedenken, daß bei jedem Durchlauf allen Objekten die Variable zugewiesen wird und da "nil", diese jedoch nicht als solche gespeichert bzw. [wenn vorhanden] gelöscht wird (also nicht erschrecken beim Verfolgen in Ereignisprotokoll...). Für Schlagwörter gäbe es noch als Alternative eine Liste z.B. "SwNamen" mit den Namen aller Schlagwörter, die durchlaufen wird... t = $("Ereignisse").variables["SwNamen"] for _,v in ipairs(t) do local s=layout:getEntitiesByKeyword(v) for _,sw in ipairs(s) do sw.variables[v] = nil end end ... so werden beim Listendurchlauf nicht immer alle Objekte angesprochen sondern nur die, mit dem entsprechenden Schlagwort... ... etwas "einfacheres" ist mir [leider] nicht eingefallen... wäre aber vielleicht etwas für die "Wunschliste" Gruß EASY
  16. Hallo @gmd, Neo hat es eigentlich schon beschrieben. Noch ergänzend dazu ein Wort zu "Spezialfall". Du hast eine Szene mit Straßenverkehr, bei dem es z.B. keine Weichen im eigentlichen Sinn gibt. Bedenke bitte, daß es im MBS auch noch den Schienenverkehr gibt und da spielen für den Anfangszustand die Stellungen von z.B. Weichen und Signalen eine bedeutende Rolle (wenn diese im Test in ihrer Stellung verändert werden, sollten sie schon zurückgesetzt werden...) Gruß EASY
  17. Hallo, ... in Deiner Antwort liegt liegt ein wichtiger Aspekt. Ich nehme an, daß Neo mit "Zuständen" wohl mehr auf den Zustand von z.B. Weichen, Signalen... angesprochen hat und das läßt sich nicht "mit einem einfachen loeschen aller temporarer variablen regeln" und da beginnt die Schwierigkeit für @Neo, Deinen "Spezialfall" zu berücksichtigen bei dem dies (anscheinend) keine Rolle spielt. P.S. ... es ist zwar etwas mehr Aufwand aber mit STRG+C (markierte Objekte) und STRG+V läßt sich auch einfach eine Objektliste in einer z.B. Modulvariablen füllen. Dann bist Du unabhängig von eindeutigen Namen. Mit zwei Tastern und den dazugehörigen Ereignissen kannst Du dann die Anfangs-position / -rotation z.B. als Objektvariablen abspeichern und die Objekte wieder auf die Anfangs-position / -rotation bringen... so habe ich dieses "Problem" schon einmal für mich gelöst. Gruß EASY
  18. Hallo, ... danke für den Hinweis. Ich habe noch etwas herumexperimentiert. Wie es aussieht liegt es tatsächlich an der Ausgabe im Visual Studio 2022 und die Newtonsoft Bibliothek arbeitet korrekt. Wenn da noch jemand einen Tipp hat, an welcher Stelle man da noch etwas an den Einstellungen drehen könnte... gerne! (... die Microsoft Hilfe dazu ist zwar interessant aber [wie gewohnt] mehr verwirrend als hilfreich...) Gruß EASY
  19. Hallo, ... du denkst zu kompliziert... ... beides steht im Ereignisprotokoll (ein Ereignis [event] wurde ausgelöst... also muß es das auch geben) Gruß EASY
  20. Hallo, ... Zeit für eine Pause? (... um aus dem Fokus des Programmierens zu kommen) Gruß EASY
  21. Hallo, ... es gibt das event... ... mit den Rückgabe Parametern "depot" -> welches Depot, "vehicle" -> welches Fahrzeug, die Du auswerten kannst. Oder hat sich Deine Frage nur auf das Portal bezogen? @Neo wäre nach meiner Meinung logisch, wenn es auch ein event wäre, da eigentlich eine Verbindung zwischen zwei Gleisen (Spuren) darstellt und auch "betreten" und "verlassen" wird (wie ein Gleis / Straße). Gruß EASY
  22. EASY

    Lua Error

    Hallo, ... ist das auch der Grund warum es mir nicht gelingen mag eine "print" Kommando über die JSON Schnittstelle zu senden? {"jsonrpc":"2.0","method":"layout.invokeScript","params":"print('Hallo Welt')","id":2} ... zeigt (bei mir) im Ereignisprotokoll nichts an. Gruß EASY
  23. Hallo, aus den Versuchen von @Wopke und @Phrontistes ist immerhin ersichtlich, daß der KI folgende Informationen zur Verfügung stehen... Die Organisation von Gleisen über den Katalog erfolgt über IDs Es gibt unterschiedliche Gleissysteme Die Gleise lassen sich in ihrer Geometrie verändern Der prinzipielle geometrische Aufbau erfolgt über Segmente ... ich möchte wirklich niemand zu nahe treten, aber ich würde einmal behaupten, daß nicht jedem Anwender des MBS um alle Punkte weiß. Von der prinzipiellen Logik her, wären beide Skripte anwendbar [wenn auch etwas "kindlich naiv" betrachtet]. Was ich daran bemerkenswert finde, daß die KI lua Kommandos erfindet um ein Ergebnis präsentieren zu können... da würde mich sehr interessieren, wie das zustande kommt / woher diese "Informationen" stammen. Gruß EASY
  24. Hallo, Da es mir geholfen hat Ereignisse über die JSON Schnittstelle auswerten zu können, anbei die JSON Struktur der einzelnen Ereignisse... (die Namen von Objekten oder Rückgabewerte sind beispielhaft...) { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{E5555398-A0B4-40FC-9752-D25D0F93DD3E}", "name": "Weiche schaltet", "params": { "track": { "_class": "entity", "name": "24620" }, "state": 1.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{3A3AC222-BE3D-40C0-AC6F-4FE760D61ACD}", "name": "Signal schaltet", "params": { "signal": { "_class": "entity", "name": "Hauptsignal Hp0/1" }, "state": 1.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{87089543-10D9-45C0-BD26-4A36CBFF68A4}", "name": "Schalter wird betätigt", "params": { "controller": { "_class": "entity", "name": "Schalter groß" }, "state": 0.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{2BB87EF8-698A-4001-80B1-50C77B5C5ED8}", "name": "Schalter wird betätigt (integriert)", "params": { "entity": { "_class": "entity", "name": "ADtranz DE-AC33C (BlueTiger)" }, "action": "02-Fahrlicht vorn rot", "state": 1.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{D2DE7F99-5258-49FD-9057-DF237BFC1BAF}", "name": "Gleiskontakt wird ausgelöst", "params": { "contact": { "_class": "entity", "name": "Beschleunigungskontakt" }, "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" }, "direction": 1.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{708C2FC0-4823-4ADC-B05A-A4CE65DE6C13}", "name": "Zug/Fahrzeug betritt ein Gleis/Straße", "params": { "track": { "_class": "entity", "name": "Gleis 2" }, "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" }, "oldTrack": { "_class": "entity", "name": "Gleis 1" } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{DA8B4A24-9D02-4000-9B3B-1E6A0C4540FD}", "name": "Zug/Fahrzeug verlässt ein Gleis/Straße", "params": { "track": { "_class": "entity", "name": "Gleis 1" }, "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" }, "newTrack": { "_class": "entity", "name": "Gleis 2" } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{4BCC10DE-ED83-4830-975D-E5B11B180018}", "name": "Zug/Fahrzeug erreicht sein Ziel", "params": { "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" }, "target": { "_class": "entity", "name": "Beschleunigungskontakt" } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{5DC268D6-F196-468B-99BD-9C26CC5D2266}", "name": "Zug/Fahrzeug stoppt", "params": { "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{61B21003-1099-4C36-BD5E-118295EEC70C}", "name": "Zug/Fahrzeug betritt ein virtuelles Depot", "params": { "depot": { "_class": "entity", "name": "Depot" }, "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{130999F3-5855-4CC3-8628-8E73E4D0DA35}", "name": "Zug/Fahrzeug verlässt ein virtuelles Depot", "params": { "depot": { "_class": "entity", "name": "Depot 1" }, "vehicle": { "_class": "entity", "name": "DR-Baureihe 102.1 - Gartenlaube" } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{ABCD8CA1-C844-45D0-BCF7-BCEB4683B751}", "name": "Fahrstraße wird aktiviert/deaktiviert", "params": { "route": { "_class": "route", "name": "TestFahrstraße" }, "state": true } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{DA6A84C7-EAC6-41AB-B354-BEB42106D3BA}", "name": "Kran hat Transportgut aufgenommen/abgesetzt", "params": { "crane": { "_class": "entity", "name": "Portalkran Holzkontor" }, "target": { "_class": "entity", "name": "Objekt1" }, "state": 1.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{CD810070-811D-4B45-9D22-38B5180CF20A}", "name": "Kran wurde zurückgesetzt", "params": { "crane": { "_class": "entity", "name": "Portalkran Holzkontor" }, "standby": false } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{357EA41F-8215-484D-AD2C-F0DEE25DD026}", "name": "Animation gestartet/gestoppt", "params": { "entity": { "_class": "entity", "name": "Windrad" }, "name": "_AnimUndefined", "running": true } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{E520655B-BB24-4EF3-ACB8-FD37376ABC22}", "name": "Timer läuft ab", "params": { "eventModule": { "_class": "event", "name": "Ereignisse" }, "name": "Timer 1" } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{7A3CA30D-037C-4DBB-B5B4-5F91483480B4}", "name": "Zeitpunkt erreicht", "params": { "time": { "_class": "time", "value": 0.65 } } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{BD4C3F83-293F-4024-81B4-B17E1B37BE96}", "name": "Objekt-Variable wird gesetzt", "params": { "entity": { "_class": "entity", "name": "Pyramide" }, "name": "Objektvariable", "value": 10.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{F0096CC6-9C67-480C-A7B1-F7A637FB4D3A}", "name": "Modul-Variable wird gesetzt", "params": { "eventModule": { "_class": "event", "name": "Ereignisse" }, "name": "Modulvariable", "value": 20.0 } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{50EE5CD0-1561-4571-B19E-D9A7398AD8D7}", "name": "Ereignis/Modul wird aktiviert/deaktiviert", "params": { "event": { "_class": "event", "name": "TestEvent" }, "state": true } } } { "jsonrpc": "2.0", "method": "layout.eventTriggered", "params": { "id": "{157AF46E-18AD-4087-A79A-7B564DD6D79C}", "name": "Tastenkürzel wird gedrückt", "params": { "shortcut": 9.0 } } } ... vielleicht hilft es ja jemand, der sich damit beschäftigen möchte... Gruß EASY
      • 1
      • Gefällt mir
  25. Hallo @Neo, nachdem es mir gelungen ist Ereignisse über die JSON Schnittstelle auszuwerten (Danke an @gmd für entscheidende Hinweise) habe ich die eine oder andere Frage: Gibt es einen (logischen) Grund weshalb "state" (Weiche, Gleiskontakt, Kran) oder "direction" (Gleiskontakt) mit Dezimalstelle (z.B. 1.0) zurückgegeben wird? Bei "Gleiskontakt wird ausgelöst" fehlt nach meiner Meinung ein Parameter, das Auskunft darüber gibt, ob "betreten", "betreten (Mitte)" oder "verlassen" (Auswahl in der EV möglich). Sonst erzeugt ein Fahrzeug das über den Gleiskontakt fährt drei mal das Ereignis ohne das man ausschließen kann, daß das Ereignis [meistens] zwei mal nichts tun sollte. Bei z.B. Taster "Taste ▲" (CD41F1D2-6ADF-4307-9964-66523248ABBA) und "Taste ▼" (43F18DCC-73EE-4F83-B9D5-B85E102980A7) habe ich ein Problem mit den Sonderzeichen. Eine Namensauswertung mit Newtonsoft.Json bringt in beiden Fällen "Taster ?" zurück. Hast Du noch einen Hinweis, wie man mit diesen Sonderzeichen umgehen kann? (da die Schnittstelle ja nur Namen kann)... Gruß EASY
×
×
  • Neu erstellen...