Jump to content

Variable in Lua


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Bearbeitet von BauerHeini
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

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. ;)

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...