-
Gesamte Inhalte
3346 -
Benutzer seit
-
Letzter Besuch
Alle erstellten Inhalte von EASY
-
Hallo, ... danke für die Aufklärung (... immer diese kleinen Feinheiten [über die man stolpert...]) Gruß EASY
-
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
-
Hallo, ... deshalb extra so gewählt... Gruß EASY
-
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
-
Koordinaten Ursprung setzen (auch zum nachträglichen messen ...)
EASY antwortete auf egech01s Thema in Feature-Wünsche
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 -
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
-
Hallo, ... "empty" ist v auch, wenn die Variable ein Objekt oder eine Liste / Tabelle beinhaltet... ist also nicht so ganz zuverlässig... Gruß EASY
-
Hallo, ... liefert zwar nicht für alle Variablentypen ein Ergebnis (v)... ich aber für einen Überblick ganz praktisch und ausbaufähig Gruß EASY
-
Ereignisverwaltung kopieren aus einer Tutorialanlage
EASY antwortete auf Erwins Thema in Fragen zur Planung
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 -
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
-
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
-
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
-
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
-
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
-
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
-
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
-
Fragen zu Auswertung Ereignisse über JSON Schnittstelle
EASY antwortete auf EASYs Thema in Erweiterungen (Plugins)
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 -
Hallo, ... du denkst zu kompliziert... ... beides steht im Ereignisprotokoll (ein Ereignis [event] wurde ausgelöst... also muß es das auch geben) Gruß EASY
-
Hallo, ... Zeit für eine Pause? (... um aus dem Fokus des Programmierens zu kommen) Gruß EASY
-
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
-
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
-
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
-
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
-
-
Fragen zu Auswertung Ereignisse über JSON Schnittstelle
EASY hat Thema erstellt in Erweiterungen (Plugins)
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