hoffmi Geschrieben 31. Dezember 2022 Geschrieben 31. Dezember 2022 Vielleicht sehe ich es einfach nicht und vielleicht wurde es auch schon gefragt: Ich bastele gerade ein Gleisbildstellpult für meinen Schattenbahnhof. Das funktioniert auch soweit ganz prima, aber wie lassen sich beim "GBS3 Textfeld mit 3 Beschriftungsfeldern" (A7158F7C-799A-4104-88A6-06060BF5A6A4) die Texte dynamisch aus der EV heraus setzen? Das Textfeld verhält sich ja wie ein Signal -- allerdings lassen sich über die Signalbegriffe lediglich die über die Eigenschaften vordefinierten Texte ein- und ausblenden. Ich möchte aber zumindest einen dieser Texte dynamisch aus der Ereignisverwaltung heraus setzen. Laut Beschreibung des Textfelds müsste das möglich sein: "Das Textfeld enthält 3 Beschriftungen, die über die Eigenschaften editiert oder über die EV angesprochen werden können."
hoffmi Geschrieben 31. Dezember 2022 Autor Geschrieben 31. Dezember 2022 Okay, kaum hat man eine Frage gepostet, findet man's auch selber raus: $("Name des Textfelds").labels["Beschriftung mittig"].text = "Hallo"
Goetz Geschrieben 31. Dezember 2022 Geschrieben 31. Dezember 2022 Und für Mitleser, denen Lua fremd ist ... So sieht es in der grafischen EV aus:
Klartexter Geschrieben 12. Februar 2023 Geschrieben 12. Februar 2023 Ich habe da mal eine Frage betreffend der Textänderungen. Wie ihr ja vielleicht wisst baue ich derzeit an einer Straßenbahnanlage. An den jeweiligen Endstellen sollen die Zielinformationen im Fahrzeug geändert werden. Das funktioniert auch - wenn ich ein einzelnes Fahrzeug zum Test nehme. Aber da auf jeder Linie 4 Fahrzeuge geplant sind, muss ich ja zwangsläufig auch jedes Fahrzeug aufführen. Mit dem Script ändert aber nur das erste Fahrzeug die Daten, bei den anderen ist das Ziel unverändert. Frage: Muss ich für jedes Fahrzeug einen eigenen Gleiskontakt setzen? Denn bisher habe ich nur einen Gleiskontakt gesetzt, der beim überfahren dann diese Aktion auslösen soll: $("TW 110").labels["Zielbahnhof vorn"].text = "Hauptbahnhof" $("TW 110 H").labels["Zielbahnhof hinten"].text = "Hauptbahnhof" $("TW 110").labels["Zielbahnhof Seite"].text = "Hauptbahnhof" $("TW 110").labels["Streckeninfo Seite"].text = "" $("TW 110 H").labels["Streckeninfo hinten"].text = "" $("TW 110").labels["Streckeninfo vorn"].text = "" $("TW 111").labels["Zielbahnhof vorn"].text = "Hauptbahnhof" $("TW 111 H").labels["Zielbahnhof hinten"].text = "Hauptbahnhof" $("TW 111").labels["Zielbahnhof Seite"].text = "Hauptbahnhof" $("TW 111").labels["Streckeninfo Seite"].text = "" $("TW 111 H").labels["Streckeninfo hinten"].text = "" $("TW 111").labels["Streckeninfo vorn"].text = "" $("TW 112").labels["Zielbahnhof vorn"].text = "Hauptbahnhof" $("TW 112 H").labels["Zielbahnhof hinten"].text = "Hauptbahnhof" $("TW 112").labels["Zielbahnhof Seite"].text = "Hauptbahnhof" $("TW 112").labels["Streckeninfo Seite"].text = "" $("TW 112 H").labels["Streckeninfo hinten"].text = "" $("TW 112").labels["Streckeninfo vorn"].text = "" $("TW 113").labels["Zielbahnhof vorn"].text = "Hauptbahnhof" $("TW 113 H").labels["Zielbahnhof hinten"].text = "Hauptbahnhof" $("TW 113").labels["Zielbahnhof Seite"].text = "Hauptbahnhof" $("TW 113").labels["Streckeninfo Seite"].text = "" $("TW 113 H").labels["Streckeninfo hinten"].text = "" $("TW 113").labels["Streckeninfo vorn"].text = "" Was muss ich da ändern, dass sich die Zielangaben bei jedem Fahrzeug ändern? Sollte da dann erst eine Bedingung in der EV erfüllt sein, bevor die Befehle abgearbeitet werden? An sich sind doch die erforderlichen Angaben bereits vorhanden. Bei den leeren Texten Streckeninfo im obigen Script ist auf der anderen Endstelle ein Zusatztext (Ziel Universität, Info Uni-Klinik) gegeben, welcher auf der Rückfahrt nicht gilt. Über Tipps würde ich mich freuen. Schönen Sonntag wünscht euch ein stark erkälterter Walter
Goetz Geschrieben 12. Februar 2023 Geschrieben 12. Februar 2023 vor 11 Minuten schrieb Klartexter: Muss ich für jedes Fahrzeug einen eigenen Gleiskontakt setzen? Nein, du musst in der EV das auslösende Fahrzeug ansprechen. vehicle.labels["Zielbahnhof vorn"].text = "Hauptbahnhof"
Klartexter Geschrieben 12. Februar 2023 Geschrieben 12. Februar 2023 Hallo @Goetz, erst einmal vielen Dank für den Tipp, aber das löst das Problem nicht. Offensichtlich funktioniert die Textänderung immer nur bei einem Text. In meinem Script kann man ja sehen, dass ich jedes Fahrzeug mehrfach aufgerufen habe. Zur Verdeutlichung auch hier ein Bild: Die Straßenbahn besteht aus drei Teilen, die ich mit Fahrzeugnummer TW 100/TW 100 M/TW 100 H zugeordnet habe. Geändert werden sollen die Fahrtzielvorgaben vorne, seitlich und hinten. Tatsächlich geändert wird aber nur die Fahrzielangabe vorn und seitlich, hinten erfolgt keine Änderung. Ich habe die EV schon durchsucht, ob es da eine Möglichkeit gibt, mehrere Beschriftungen in einen Befehl zu integrieren, aber ich bin da nirgendwo fündig geworden. Die Textänderung geht also scheinbar nur für einen einzigen Wagenteil, denn die Zielinformation beim hinteren Wagen wird nicht geändert. Die funktioniert aber auch nicht, wenn ich einen eigenen Gleiskontakt für den hinteren Wagenteil erstelle. Warum das so ist erschließt sich mir nicht. Die Gleiskontakte sind auch entsprechend weit auseinander, so dass sich die Scripte eigentlich nicht ins Gehege kommen können. Die Welt geht sicher nicht unter, wenn ich hinten nichts ändern kann, aber interessieren tuts mich doch, warum da nichts geht. In diesem Sinne noch einen schönen Restsonntag. Walter
Goetz Geschrieben 12. Februar 2023 Geschrieben 12. Februar 2023 (bearbeitet) vor 21 Minuten schrieb Klartexter: Die Straßenbahn besteht aus drei Teilen Aaaahhhh - das ist ein ganz anderer Fall. Du willst in einem Rutsch mehrere Fahrzeuge in einem Verbund ansprechen. Das geht so: local t = layout:getVehicleGroup(vehicle) -- vehicle ist das auslösende Fahrzeug im Verbund for i, Wdh in ipairs(t) do -- t ist die oben erzeugte Liste und enthält alle Zugteile Wdh.labels["Zielbahnhof vorn"].text = "Hauptbahnhof" end Erläuterung: Wenn ein Zug einen Kontakt betritt (oder verlässt), dann ist immer genau ein Fahrzeug im Verbund der "Repräsentant" dieses Zuges. Dieses Fahrzeug muss nicht zwingend das Fahrzeug sein, welches den Kontakt berührt hat. Man möchte ja zum Beispiel erreichen, dass derselbe Zug einen Kontakt sowohl betreten als auch verlassen kann. Deshalb muss das Referenzfahrzeug immer dasselbe bleiben, auch wenn der Zuganfang den Kontakt betritt, aber das Zugende ihn verlässt. In aller Regel ist das angetriebene Fahrzeug im Verbund der Ansprechpartner. Der "Auslöser". Bearbeitet 12. Februar 2023 von Goetz Ergänzungen
Klartexter Geschrieben 12. Februar 2023 Geschrieben 12. Februar 2023 Danke @Goetzfür den Tipp, werde ich mir morgen mal zu Gemüte führen. Heute macht mir meine Erkältung schon zuviel zu schaffen, da ist keine konzentrierte Arbeit mehr möglich. Walter
Klartexter Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 So, jetzt habe ich mal den Tipp von @Goetz umgesetzt, und nun funktioniert auch der Wechsel der Zielanzeige hinten. Nun ja, zumindest teilweise. Das MBS ist mitunter voller Geheimnisse, aber vielleicht gibt es ja ein paar Detektive, die dem Rätsel auf die Spur kommen? Ich hänge hier mal die Testanlage mit an, damit man selbst sehen kann, was eigentlich nicht sein kann. Vorab noch eine Info für @Goetz: Wenn ich den Zusatz Wdh.labels bei den einzelnen Befehlen verwende in der Liste, dann wechselt die hintere Anzeige nicht. Wenn ich aber quasi die EV Lua verwende, dann gibt es kein Problem. Aber vielleicht hab ich Dich da auch nicht richtig verstanden, wie gesagt, das ist nur eine Info, keine Kritik, Dein Tipp war mir eine große Hilfe. Ich habe also auf der Testanlage einfach mal eine kurze Strecke mit zwei Haltestellen und Wendeschleifen erstellt, vor den jeweiligen "Endstationen" habe ich je einen Gleiskontakt gesetzt, der in der EV einen Textwechsel auslösen soll. Platziert habe ich auch zwei dreiteilige Straßenbahnen, die Wagen (TW) 110 und 111. Die Bahnen sind Variationen der Adtranzbahn von mir. Der Wagen 111 dreht da auch brav seine Runden ohne Beanstandungen beim Textwechsel. Aber der Wagen 110 wechselt auch ohne Gleiskontakt das Fahrziel, nur eben nicht ins richtige. Vor der Haltestelle Hauptbahnhof wechselt er das Ziel durchaus richtig zur Universität. Nach der Einfahrt in die Haltestelle öffnen sich die Türen - und das Ziel wechselt wieder zu Hauptbahnhof! Ich habe mehrmals die Texte manuell gewechselt, aber das hat nichts gebracht. Aber vielleicht findet ja hier jemand den Grund. Die Lua-Befehle sind auch auf der Platte zu sehen. Schönen Tag wünscht euch Walter Texttestanlage.mbp
Goetz Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 (bearbeitet) Hallo Walter, leider können wir das Verhalten nicht beobachten, denn im Katalog sind deine Straßenbahnmodelle noch in der Form ohne variable Beschriftung. Aber ich kann dem Skript auch so ansehen, warum da einiges schief geht: Du änderst hier die Beschriftung an beiden Zügen. Und die Elemente aus der Wiederholung ignorierst du einfach. Weil die Wiederholung für alle Zugteile durchgeführt wird, änderst du hier die Beschriftung auf beiden Zügen dreimal! Eigentlich willst du die Beschriftung aber nur auf den Fahrzeugen ändern, die du aus der Wiederholung bekommst. Dazu müsstest du bei Beschriftung für das Zielobjekt "Wiederholung" in der Auswahl finden. Und das gibt es für Beschriftungen noch nicht. ( @Neo?) Aber im Lua Code kannst du es verwenden: local t = layout:getVehicleGroup(vehicle) for i, Wdh in ipairs(t) do Wdh.labels["Zielbahnhof vorn"].text = "Hauptbahnhof" Wdh.labels["Zielbahnhof Seite"].text = "Hauptbahnhof" Wdh.labels["Zielbahnhof hinten"].text = "Hauptbahnhof" end Beachte die Variable Wdh anstelle der Objektangabe. Sie enthält das Fahrzeug, welches dir die Wiederholung aus dem Zugverband "rausgfischt". Eins nach dem anderen, bis alle Fahrzeuge behandelt wurden. Wdh (für Wiederholung) ist nur ein Namensvorschlag vom Studio Du kannst auch einen anderen Namen wählen: local t = layout:getVehicleGroup(vehicle) for i, Zugteil in ipairs(t) do Zugteil.labels["Zielbahnhof vorn"].text = "Hauptbahnhof" Zugteil.labels["Zielbahnhof Seite"].text = "Hauptbahnhof" Zugteil.labels["Zielbahnhof hinten"].text = "Hauptbahnhof" end Beachte dabei, dass du in der Zeile, die mit for beginnt, denselben Variablennamen wählen musst. Der gezeigte Code ist noch unvollständig. Er versucht jetzt in jedem Zugteil alle drei Beschriftungen zu ändern, ohne Rücksicht darauf, ob es die jeweiligen Felder überhaupt gibt. Das führt bei geöffnetem Protokollfenster zu einer Fehlermeldung und zum Abbruch. Denn das vordere Fahrzeug hat kein Textfeld "Zielbahnhof hinten". Du wirst also für jedes Feld prüfen müssen, ob es überhaupt existiert: local t = layout:getVehicleGroup(vehicle) for i, Zugteil in ipairs(t) do if Zugteil.labels["Zielbahnhof vorn"] then Zugteil.labels["Zielbahnhof vorn"].text = "Hauptbahnhof" end if Zugteil.labels["Zielbahnhof Seite"] then Zugteil.labels["Zielbahnhof Seite"].text = "Hauptbahnhof" end if Zugteil.labels["Zielbahnhof hinten"] then Zugteil.labels["Zielbahnhof hinten"].text = "Hauptbahnhof" end end Bei der Türsteuerung auf derselben Anlage benutzt du übrigens schon die Prinzipien, die ich hier vorgeschlagen habe. Aber das ist dir vermutlich gar nicht bewusst? Bearbeitet 13. Februar 2023 von Goetz Ergänzungen
Klartexter Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 Danke für die Info, @Goetz. Ich war der Meinung, dass die längst von @Neowieder freigeschaltet wurden, da sich außer den Texten ja nichts am eigentlichen Modell geändert hat. Offenbar hat @Neoes übersehen, dass die Bahnen auf Freischaltung warten.
Goetz Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 (bearbeitet) Probier mal bitte diese Alternative aus: Texttestanlage Alternativvorschlag.mbp korrigiert! Anders als im obigen Beispiel lege ich hier zunächst eine Liste der Textfelder an, die beschriftet werden sollen. Damit entfällt die Prüfung, ob ein Feld überhaupt existiert. Denn die erste Schleife fügt in dem Fall einfach ein nil in die Tabelle ein. Also gar nichts. In einer zweiten Wiederholung weise ich dann allen Feldern aus dieser Liste den Text zu. local t = layout:getVehicleGroup(vehicle) local Felder = {} local Ziel = "Hauptbahnhof" if contact == $("GK 01") then Ziel = "Universität" end for i, Zugteil in ipairs(t) do table.insert(Anzeigen, Zugteil.labels["Zielbahnhof vorn"]) table.insert(Anzeigen, Zugteil.labels["Zielbahnhof Seite"]) table.insert(Anzeigen, Zugteil.labels["Zielbahnhof hinten"]) end for i, Textfeld in ipairs(Anzeigen) do Textfeld.text = Ziel end Dieser Code ist für beide Kontakte (Mehrfachauswahl!) geeignet, da im Code selbst unterschieden wird, welcher Kontakt ausgelöst wurde und welches Ziel deshalb angezeigt werden soll. (Noch schöner wäre es, das jeweilige Fahrziel in einer Objektvariable des Kontakts bereitzuhalten.) Beim Türöffner Code habe ich ebenfalls die Prüfungen entfernt, ob die jeweilige Tür existiert. Auch hier gilt: Was es nicht gibt, wird nicht in die Tabelle eingefügt. Viel Spaß beim Studium der Anlage Götz Bearbeitet 13. Februar 2023 von Goetz Ergänzungen
Klartexter Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 Hallo @Goetz, erst einmal vielen Dank für die Mühe, die Du Dir hier gemacht hast. Aber der Code funktioniert leider nicht. Ich habe die Fahrzeuge ersetzt und dann fahren lassen. Nun wird generell nur noch das Ziel Hauptbahnhof angezeigt, wie Du auf dem beigefügten Bild sehen kannst. Da müsste nämlich die Universität als Ziel stehen, aber es ist der Hauptbahnhof. Ich werde @Neomal fragen, warum die Bahnen immer noch nicht freigeschaltet sind, das Update habe ich ja bereits am 29.11. gemacht. Vielleicht schaltet er die Bahn ja dann frei, dann kannst Du selber sehen, dass der Code nicht das macht, was er soll. Und meine gsinnerte 110 kannst Du ja dann auch erleben. Einstweilen erstmal vielen Dank. Walter
Goetz Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 (bearbeitet) vor 16 Minuten schrieb Klartexter: der Code funktioniert leider nicht. ... Nun wird generell nur noch das Ziel Hauptbahnhof angezeigt Folgenden Fehler habe ich in meinem Beispiel entdeckt: Die Zeile 3 des Skripts "Zielwechsel" muss lauten: local Anzeigen = {} Ich hatte den Namen mehrfach geändert (weil ich mich nicht entscheiden konnte). Zum Schluss hatte ich dann eine Anpassung in Zeile 3 vergessen. Sorry. Ich habe die Beispielanlage aus dem vorherigen Posting korrigiert und ausgetauscht. Bearbeitet 13. Februar 2023 von Goetz Ergänzungen
Klartexter Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 Hallo @Goetz, jetzt funktioniert es! Danke nochmal. @Neohat mich informiert, dass das Modell jetzt freigeschaltet wurde, auch hier nochmal ein Dank. Und jetzt ruft die Frau zum Abendessen. Walter
Klartexter Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 vor 5 Stunden schrieb Goetz: Bei der Türsteuerung auf derselben Anlage benutzt du übrigens schon die Prinzipien, die ich hier vorgeschlagen habe. Aber das ist dir vermutlich gar nicht bewusst? Jetzt habe ich gerade entdeckt, dass Du den Beitrag noch stark erweiterst hattest, @Goetz. Du weißt ja, ich bin Novize bei Lua, da muss ich wirklich jeden Befehl auch verstehen bzw. nachvollziehen können. Das braucht so seine Zeit, ein alter Mann ist ja kein D-Zug. Umso mehr schätze ich Deine Erklärungen zum Thema, die helfen mir, Lua zu "verstehen". Wie Du ja selber festgestellt hast, fehlt in der EV bei den Texten der Punkt Wiederholung. Daher war ich mir auch nicht sicher, ob es an dem Wdh liegt, da die EV das ja bereits in der Kopfzeile Wiederholung angibt. Es ist eben learning by doing. Schönen Abend noch.
Goetz Geschrieben 13. Februar 2023 Geschrieben 13. Februar 2023 vor 24 Minuten schrieb Klartexter: da die EV das ja bereits in der Kopfzeile Wiederholung angibt. Hallo Walter, im Schleifenkopf (= der Zeile mit dem for ... do) werden nacheinander alle Elemente aus der Liste einzeln entnommen und an eine temporäre Variable (mit Namen Wdh) übergeben. Im nachfolgenden Block werden dann eine oder mehrere Aktionen auf dieses Element angewandt, welches du aus der Liste entnommen und an die temporäre Variable übergeben hast. (Das ist keine Lua Spezialität. Das funktioniert in allen Programmiersprachen gleich.) Wenn die Behandlung des Elements erledigt ist, kehrt die Wiederholung an den Anfang zurück, entnimmt der Liste das nächste Objekt, übergibt es an die temporäre Variable und so weiter ... Bis alle Elemente der Liste behandelt wurden. Hier ein ganz einfaches Beispiel, welches das Prinzip besser verdeutlicht: Beatles = {"John", "Paul", "George", "Ringo"} -- Liste for index, wert in ipairs(Beatles) do -- für jedes Element der Liste print(wert) -- schreib das Wort ins Ausgabefenster end Auf dieser Seite kannst du solche kleinen Experimente bequem testen: Lua: demo Viele Grüße Götz
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen.
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden