BauerHeini Geschrieben 7. November 2019 Geschrieben 7. November 2019 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?
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 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
BauerHeini Geschrieben 7. November 2019 Autor Geschrieben 7. November 2019 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.
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 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".
BauerHeini Geschrieben 7. November 2019 Autor Geschrieben 7. November 2019 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.
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 track.state ist der Schaltzustand der Weiche, nicht der Name. Du verwirrst mich.
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 Was genau willst du eigentlich erreichen?
Andy Geschrieben 7. November 2019 Geschrieben 7. November 2019 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.
BauerHeini Geschrieben 7. November 2019 Autor Geschrieben 7. November 2019 Ok, ich relativiere. Wie kann ich einen Objektnamen durch eine Variable ersetzten? Also '$("Weiche 1")' durch $(x)? Wobei x = "Weiche 1" ist
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 x = $("2262") -- oder wie immer deine Weiche heißt y = $("Beschriftung") Dann kannst du sie verwenden, z.B.: y.text = x.name
BauerHeini Geschrieben 7. November 2019 Autor Geschrieben 7. November 2019 Das ist ok. Ich möchte aber "2262" durch eine Variable (z.B. x) ersetzen
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 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.
Timba Geschrieben 7. November 2019 Geschrieben 7. November 2019 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.
Neo Geschrieben 7. November 2019 Geschrieben 7. November 2019 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
BauerHeini Geschrieben 7. November 2019 Autor Geschrieben 7. November 2019 (bearbeitet) 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: Bearbeitet 7. November 2019 von BauerHeini
Neo Geschrieben 7. November 2019 Geschrieben 7. November 2019 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
Goetz Geschrieben 8. November 2019 Geschrieben 8. November 2019 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. 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. 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. 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
BauerHeini Geschrieben 8. November 2019 Autor Geschrieben 8. November 2019 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: Ansonsten, meine ich alles verstanden zu haben und freue mich, in meinem Projekt weiter zu arbeiten. Viele Grüße BauerHeini
Timba Geschrieben 8. November 2019 Geschrieben 8. November 2019 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
BauerHeini Geschrieben 8. November 2019 Autor Geschrieben 8. November 2019 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.
Goetz Geschrieben 8. November 2019 Geschrieben 8. November 2019 (bearbeitet) 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 8. November 2019 von Goetz
Timba Geschrieben 8. November 2019 Geschrieben 8. November 2019 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.
Goetz Geschrieben 8. November 2019 Geschrieben 8. November 2019 (bearbeitet) 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 8. November 2019 von Goetz
Timba Geschrieben 8. November 2019 Geschrieben 8. November 2019 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.
Andy Geschrieben 8. November 2019 Geschrieben 8. November 2019 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
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