Jump to content

Recommended Posts

Ich experimentiere mit LUA und habe dabei folgendes Problem:

Bei einem Ereignis 'beliebige Weiche schaltet' schreibe ich das Objekt in eine Variable mit 'x = track'. Das funktioniert auch.

Wenn ich aber im LUA-Skript '$("Beschriftung Abzweig").text = "Test" mit $(x).text = "Test" ersetzte, bekomme ich eine Fehlermeldung.

Was mache ich falsch?

Share this post


Link to post
Share on other sites

Hallo BauerHeini,

deine Frage verstehe ich nicht ganz, aber einen Tipp habe ich trotzdem für dich: Wenn ich etwas in der Art nicht weiß, dann mache ich das Ereignis zuerst mit der grafischen EV und klicke dann das Symbol "<>" und lasse es in ein Lua-Skript umwandeln. Dabei lernt man eine Menge. Würde dir das ebenfalls helfen?

Gruß Timba

Share this post


Link to post
Share on other sites

Genau das habe ich ja gemacht. Da ich das Skript aber für mehrere Objekte benutzen will, hatte ich die Idee für alle Objekte dasselbe Skript einzusetzen.

Share this post


Link to post
Share on other sites

Ah, ich sehe, du hast deinen Beitrag editiert. Nun ist es klarer.

Wie ich es sehe, weist du der Variable x ein Gleis-Objekt zu. Ein Gleis-Objekt kann man nicht beschriften, es hat keine Eigenschaft ".text".

Share this post


Link to post
Share on other sites

Ich mache folgendes:

$("Beschriftung Abzweig").text = track.state. Das funktioniert. In der Beschriftung steht der Name der Weiche.

Wenn ich aber, wie oben beschrieben, "Beschriftung Abzweig" durch track.name ersetzte, bekomme ich die Fehlermeldung.

Share this post


Link to post
Share on other sites

track.state ist der Schaltzustand der Weiche, nicht der Name. Du verwirrst mich.

Share this post


Link to post
Share on other sites
vor 11 Minuten schrieb Timba:

Wie ich es sehe, weist du der Variable x ein Gleis-Objekt zu. Ein Gleis-Objekt kann man nicht beschriften, es hat keine Eigenschaft ".text".

Das ist doch die richtige Antwort zu dem Problem.

Share this post


Link to post
Share on other sites

Ok, ich relativiere. Wie kann ich einen Objektnamen durch eine Variable ersetzten? Also '$("Weiche 1")' durch $(x)? Wobei x = "Weiche 1" ist

Share this post


Link to post
Share on other sites
x = $("2262") -- oder wie immer deine Weiche heißt

y = $("Beschriftung")

Dann kannst du sie verwenden, z.B.:

y.text = x.name

 

Share this post


Link to post
Share on other sites

Ja. Hatte ich geschrieben. Du kannst x mit dem Objekt Weiche besetzen, s.o., dann greifst du auf den Namen mit "x.name" zu. Du kannst x genauso auch nur mit dem Text besetzen. Dann ist die Zuweisung:

x = $("2262").name

Dann beschriftest du mit

$("Beschriftung").text = x

Alternativ kannst du auch das Beschriftung-Objekt in eine Variable packen, s.o.

Share this post


Link to post
Share on other sites

Die Frage ist halt, was du anschließend damit veranstalten willst. Wenn du wirklich nur etwas mit dem Namen der Weiche beschriften willst, reicht dir ja der Text. Willst du aber über die Variable auch auf die Weiche zugreifen (z.B. schalten), dann ist es besser, das Objekt in die Variable zu verfrachten.

Share this post


Link to post
Share on other sites

Hallo,

der Operator $ ist MBS-spezifisch und funktioniert nur mit statischen Namen, weil intern das Objekt fest verdrahtet wird. Wenn du dynamisch Objekte anhand von Namen ermitteln möchtest, dann musst du die Funktion getEntityByName verwenden:

local track = layout:getEntityByName(x)

x kann nun jeder beliebige Text sein, auch eine Variable.

Bedenke aber, dass Objektreferenzen anhand von Namen "veraltet" sind, mittlerweile gibt es bessere Möglichkeiten, um dynamisch Objekte zu referenzieren, unabhängig des Namens. Dafür benötigen wir aber mehr Informationen über dein eigentliches Vorhaben.

Viele Grüße,

Neo

Share this post


Link to post
Share on other sites

Vielen Dank für die vielen Antworten. Ich glaube, ich muss das Ganze doch noch einmal erklären.

Ich möchte mir die Weichenschaltung (in diesem Fall einer 'Abzweigung' einer Landstrasse) anzeigen lassen, indem ich 3 Beschriftungsobjekte mit Zeichen der Schriftart 'Wingdings 3' fülle, die mir anzeigen, in welche Richtung die Weiche gestellt ist. Das Skript sieht bei einer bestimmten Weiche folgendermaßen aus:

if $("Abzweig Ort").state == 0 then
  $("Beschriftung Abzweig Ort").text = $("Abzweigung Ort").state
  $("Beschriftung Abzweig Ort 1").text = "f"
  $("Beschriftung Abzweig Ort 2").text = "g"
  $("Beschriftung Abzweig Ort 3").text = "0"
elseif $("Abzweigung Ort").state == 1 then
  $("Beschriftung Abzweig Ort").text = $("Abzweigung Ort").state
  $("Beschriftung Abzweig Ort 1").text = "h"
  $("Beschriftung Abzweig Ort 2").text = "g"
  $("Beschriftung Abzweig Ort 3").text = "f"
elseif $("Abzweigung Ort").state == 2 then
  $("Beschriftung Abzweig Ort").text = $("Abzweigung Ort").state
  $("Beschriftung Abzweig Ort 1").text = "h"
  $("Beschriftung Abzweig Ort 2").text = "g"
  $("Beschriftung Abzweig Ort 3").text = "g"
elseif $("Abzweigung Ort").state == 3 then
  $("Beschriftung Abzweig Ort").text = $("Abzweigung Ort").state
  $("Beschriftung Abzweig Ort 1").text = "f"
  $("Beschriftung Abzweig Ort 2").text = "h"
  $("Beschriftung Abzweig Ort 3").text = "f"
end

Dies möchte ich aber relativieren. Dieses Skript reagiert auf das Ereignis 'Weiche "Abzweigung Ort" schaltet'. Da ich durch die Variable 'track' den Auslöser ermitteln kann, kann ich durch 'track.name' auch den Namen bekommen, in diesem Fall "Abzweig Ort". Diesen möchte ich dann bei weiteren Abzweigungen auf das Ereignis 'Eine "beliebige Weiche" schaltet' anwenden.

Und nun die Frage, wie kann ich beliebige Objekte durch ein Variable ansprechen? Ein Ersetzen von "Beschriftung Abzweigung Ort" durch "Beschriftung " .. track.name funktioniert nämlich nicht.

 

Hier noch ein Bild zur Weiche:

image.jpeg.24e901c5774a8bda297d20faa0ada3d5.jpeg

Edited by BauerHeini

Share this post


Link to post
Share on other sites

Hallo,

vor 2 Stunden schrieb BauerHeini:

in Ersetzen von "Beschriftung Abzweigung Ort" durch "Beschriftung " .. track.name funktioniert nämlich nicht.

mach es so wie ich es bereits weiter oben beschrieben habe:

local Beschriftung = layout:getEntityByName("Beschriftung " .. track.name)
Beschriftung.text = ...

Eine bessere Lösung wäre, wenn du die Beschriftungsobjekte in den jeweiligen Gleisen direkt als Objektvariable referenzierst. Dann bist du unabhängig irgendwelcher Namen.

Viele Grüße,

Neo

Share this post


Link to post
Share on other sites

Hallo @BauerHeini

hier ist ein Beispiel für die von Neo vorgeschlagene Methode.

Leg dir zuerst in der Kreuzung eine Tabelle an, in der du die Textfeld-Objekte festhältst. Das geht auf dieselbe Weise, die du auch für Variablen benutzen würdest. Die Tabelle ist nichts anderes als eine Variable mit mehreren Werten, die jeweils einen eigenen Namen bekommen. Und um diese Namen geht es. Die sind im weiteren Verlauf wichtig, um die einzelnen Textfelder ansprechen zu können.

1482192943_T-Kreuzung01a.thumb.jpg.a46e733798dc8d4f287f78eddae714c6.jpg

Als nächstes legst du in derselben Kreuzung drei weitere Tabellen an. Je eine für die drei Textfelder. Diese Tabellen füllst du mit den Texten für die Weichenstellung 0 bis 3 und benennst jeden Eintrag genau so, wie die Weichenstellung heißt.

942609763_T-Kreuzung02a.thumb.jpg.3f35aabc517baaab0f80b9eb236e75c7.jpg

Jetzt kannst du jedem Textfeld anhand der beiden Tabellen immer den Text schicken, der zur aktuellen Weichenstellung passt.

Und weil die Kreuzung, die ja das Ereignis auslöst, selbst diese Tabellen enthält, kannst du die EV sogar generisch schreiben. Also so, dass mit diesem einen Ereignis jede Kreuzung ihre zugehörigen Elemente und Werte findet.

1625843547_T-Kreuzung03a.thumb.jpg.86b962c1359f6bd406281e4563bfb0a1.jpg

Du könntest jetzt diese Aktion zweimal kopieren, um auch die Textfelder oben und rechts anzusprechen. Dabei musst du nur im Objekt und im Text den Index bzw. Namen "links" in "oben" oder "rechts" ändern. Das legt nahe, dass es auch in einer Wiederholung geht. Und weil du keine Scheu vor Lua hast, ist hier das Skript dazu:

for Name, Objekt in pairs(track.variables["Textfeld"]) do
    Objekt.text = track.variables[Name][state]
end

in pairs() arbeitet Tabellen paarweise ab und gibt diese Wertepaare an zwei Variablen aus.

Das erste Element ist der Bezeichner einer Zelle, das zweite ihr Inhalt.
Also zum Beispiel "links" und die Objektadresse des Textfelds, die unter diesem Bezeichner gespeichert ist.

Ich habe den drei Listen mit den Weichenstellungen dieselben Namen gegeben, wie den drei Objekten in der Tabelle "Textfeld".

So kann ich den Index aus der ersten Tabelle als Name für die zweite Tabelle (mit den zugehörigen Weichenstellungen) einsetzen.

Anbei die kleine Demoanlage dazu:   Weichenanzeige T-Kreuzung.mbp

Viel Spaß beim Experimentieren :)
Götz

Share this post


Link to post
Share on other sites

Vielen Dank für Eure Unterstützung und den Nachhilfeunterricht. Ich bin jedoch ziemlich neu und habe jedemenge Probleme.

Z.B. weiss ich nicht einmal, wie ich Deinen Link, lieber Goetz, öffnen kann. Beim Anklicken werde ich gefragt, wie mein Firefox mit dieser Datei verfahren soll. Die Auswahl 'Öffnen mit 3D-Modellbahn Studio V5 (Standard)' verläuft im Sand. Es passiert nichts.

Die zweite, viel wichtigere Frage ist momentan, wie mache ich aus einer Objektvariablen eine Tabelle? Ich habe folgende Möglichkeiten:

Weiche2.thumb.jpg.54ac3a56055b4653461ffd82214f0c8e.jpg

Ansonsten, meine ich alles verstanden zu haben und freue mich, in meinem Projekt weiter zu arbeiten.

Viele Grüße

BauerHeini

Share this post


Link to post
Share on other sites
vor 33 Minuten schrieb BauerHeini:

Z.B. weiss ich nicht einmal, wie ich Deinen Link, lieber Goetz, öffnen kann. Beim Anklicken werde ich gefragt, wie mein Firefox mit dieser Datei verfahren soll.

Hallo BauerHeini

versuch es mal auf diese Weise: Rechtsklick auf den Link in Götzs Beitrag, "Ziel speichern unter" auswählen.

Damit wird die Datei schon mal runtergeladen und steht in deinem Download-Ordner. Dort einen Doppelklick auf die Datei und schwupps läuft es.

Gruß Timba

 

Share this post


Link to post
Share on other sites

Genau das habe ich schon probiert. Mit Doppelklick passiert nichts und mit 'Öffnen mit 3D-Modellbahn Studio' auch nichts. Ob ich MBS geöffnet habe oder nicht, spielt keinen Unterschied.

Share this post


Link to post
Share on other sites
vor 42 Minuten schrieb BauerHeini:

Die Auswahl 'Öffnen mit 3D-Modellbahn Studio V5 (Standard)' verläuft im Sand. Es passiert nichts.

Sorry - mein Fehler.

Die 3D-MBS Version, die ich für die Anlage benutzt habe, ist noch im Test und nur verfügbar, wenn du in den Einstellungen deines 3D-MBS die Option "Automatisch auf Vorab-Programmversionen aktualisieren" aktivierst.

Deshalb findest du auch keine Tabellen in deinem MBS. Weil die erst mit der Version kommen, die aktuell noch im Beta-Test ist.

Das hatte ich leider nicht bedacht.

Edited by Goetz

Share this post


Link to post
Share on other sites

Ups ... da wäre ich jetzt im Leben nicht drauf gekommen, dass da noch die "alte" V5 im Spiel sein könnte. Normal kommt doch immer eine Fehlermeldung, wenn Datei und Programm nicht kompatibel sind. Hier offenbar nicht. Aber Hauptsache Ursache gefunden. (y)

Share this post


Link to post
Share on other sites
vor 16 Minuten schrieb Timba:

Normal kommt doch immer eine Fehlermeldung

Wenn du eine Anlage aus dem 3D-MBS heraus lädst - ja.

Aber möglicherweise nicht, wenn du umgekehrt versuchst über die Anlagendatei das zugehörige 3D-MBS zu starten. Weil er das dann gar nicht erst findet. Und was nicht läuft, das kann auch keine Meldung ausgeben. ;)

Edited by Goetz

Share this post


Link to post
Share on other sites
vor 2 Stunden schrieb Goetz:

Aber möglicherweise nicht, wenn du umgekehrt versuchst über die Anlagendatei das zugehörige 3D-MBS zu starten. Weil er das dann gar nicht erst findet. Und was nicht läuft, das kann auch keine Meldung ausgeben

Das ist wahr. Ich war in dem Glauben, dass die Verknüpfung über die Dateiendung "mbp" in Windows hinterlegt ist und das beim Aufruf der Datei das verknüpfte Programm, in diesem Fall MBS, gestartet wird, sofern es installiert ist. Dass in der Verknüpfung bereits eine Prüfung der Programmversion stattfindet war mir nicht klar. Ich nahm an, dass in jedem Fall die zuletzt installierte MBS-Version gestartet wird. Aber ich werde jetzt nicht mein MBS deinstallieren um es auszuprobieren und nehme es einfach mal so zur Kenntnis.

Share this post


Link to post
Share on other sites

Ich glaube mich erinnern zu können, dass er nach Installation der V5 und Klick auf .mbp fragte, welche er denn nun starten solle, V4 oder V5.
Und dann kommt da wohl auch eine 'immer?'-Rückfrage.

Gruß
  Andy

Share this post


Link to post
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

×