Jump to content

Steuerung der Texte beim GBS3 Textfeld per EV


hoffmi

Recommended Posts

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."

Link to comment
Share on other sites

  • 1 month later...

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

Link to comment
Share on other sites

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:

Tram.jpg.a985a157480dff3482da46fbbf107794.jpg

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

Link to comment
Share on other sites

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:

2000761688_alleFahrzeugeimVerbund.jpg.62557cd765879874b47deec2d38f68dd.jpg

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".

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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:

1272875035_Wiederholung1.jpg.6b2cb197ee922ce13b696e74056fd1d8.jpg

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?

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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

 

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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

110-1.jpg

Link to comment
Share on other sites

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.

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...