dbahr Geschrieben 23. Dezember 2024 Geschrieben 23. Dezember 2024 Hallo liebe Forumsmitglieder! Bei einem Depot gibt es doch die Liste den darin vorhandenen Fahrzeuge. Wie kann ich diese Liste einfach in ein Textfeld übernehmen - siehe Screenshot. Danke für einen Tipp und weihnachtliche Grüße! Detlef
Phrontistes Geschrieben 23. Dezember 2024 Geschrieben 23. Dezember 2024 (bearbeitet) vor 14 Stunden schrieb dbahr: Wie kann ich diese Liste einfach in ein Textfeld übernehmen Nur mit Lua if $("Ost Depot").count > 0 then -- Nur wenn sich mindestens ein Fahrzeug im Depot (hier Objekt "Ost Depot") befindet local txt = "" -- Text initialisieren und leer setzen local Anfang = 0 -- Die Zählung in den Depots beginnt mit 0 local Ende = $("Ost Depot").count - 1 -- Anzahl der Fahrzeuge im Depot - 1 for zz = Anfang, Ende do -- Die Schleifen-Variable (zz) ist lokal, ohne dass sie explizit als "local" deklariert werden muss txt = txt .. $("Ost Depot").entries[zz].name -- Fahrzeugname in die Textvariable schreiben if zz < Ende then -- Zeilumbruch bis zum vorletzen Element hinzufügen txt = txt .. "\n" end end $("Text box").text = txt -- Text in die Textbox (hier Objekt "Text Box") schreiben else $("Text box").text = "Kein Fahrzeug im Depot" end Hier eine kleine Beispielsanlage 20241223 Inhalt Depot anzeigen.mbp Bearbeitet 24. Dezember 2024 von Phrontistes else-Zweig hinzugefügt (kein Fahrzeug)
Goetz Geschrieben 24. Dezember 2024 Geschrieben 24. Dezember 2024 (bearbeitet) Angeregt durch das Lua Skript von @Phrontistes für das Auflisten eines Depot Inhalts Lua kennt eine sehr schöne Methode, um Textbausteine aus einer Tabelle zu einem größeren Textblock zusammenzufügen. table.concat(Tabelle, "Trennzeichen") Damit könnte der Code von Phrontistes alternativ so aussehen: if $("Ost Depot").count > 0 then local Liste = {$("Ost Depot").entries[0].name} -- weil [0] von ipairs nicht berücksichtigt würde for k, v in ipairs($("Ost Depot").entries) do -- die folgende Plätze ab 1 aufwärts table.insert(Liste, v.name) end $("Text box").text = table.concat(Liste, "\n") else $("Text box").text = "kein Farzeug im Depot" end Und wenn die Ausgabe mehrfach benötigt wird, ist es ratsam sie in eine Funktion zu packen. Dann besteht keine Gefahr, bei eventuellen Änderungen später eine von mehreren Stellen im Code zu vergessen. Für solche zentralen Funktionen eignet sich das Skript unter Ereignisse sehr gut function DepotInhalt(Depot) if Depot.count > 0 then local Liste = {Depot.entries[0].name} -- weil [0] von ipairs nicht berücksichtigt würde for k, v in ipairs(Depot.entries) do -- die folgende Plätze ab 1 aufwärts table.insert(Liste, v.name) end return table.concat(Liste, "\n") else return "kein Fahrzeug im Depot" end end Im eigentlichen Ereignis "Depot wird betreten" weist man der Textbox dann nur noch den String zu, den die Funktion zurück gibt $("Text box").text = DepotInhalt($("Ost Depot")) Für den Zweck, den das Beispiel von Phrontistes erfüllen soll, macht das keinen Unterschied. Es soll auch bitte keine Kritik an seiner Herangehensweise sein! Sein Beispiel bot nur eine gute Vorlage, um table.concat() zu demonstrieren. Phrontistes Beispielanlage mit den vorgeschlagenen Änderungen: Alternative Inhalt Depot anzeigen.mbp Viele Grüße Götz Bearbeitet 24. Dezember 2024 von Goetz
dbahr Geschrieben 24. Dezember 2024 Autor Geschrieben 24. Dezember 2024 Vielen Dank für die Antwort und die Beispielanlage. Liebe Grüße Detlef
EASY Geschrieben 24. Dezember 2024 Geschrieben 24. Dezember 2024 (bearbeitet) Hallo, ... noch eine kleine Ergänzung für die Ausgabe... --[[ Hinweis: Für das Textfeld muß eine Monospace-Schrift verwendet werden! z.B: MS-Gothic, Consolas Die Formatierung des Textfeldes sind 3 Spalten Fortlaufende Nummer, Fahrzeugname, Geschwindigkeit des Fahrzeugs Die Breite der mittleren Spalte wird durch den längsten Namen festgelegt --]] local depot=$("Depot 1b") local n=depot.count -- Anzahl Depoteinträge local text="" -- Hilfsvariable für Text if n>0 then -- Depot ist nicht leer? local nz=0 -- Längsten Namen suchen (für Spaltenbreite) for i=0,n-1 do local nz1=utf8.len(depot.entries[i].name) if nz1>nz then nz=nz1 end end for i=0,n-1 do -- Depotliste durchgehen -- Nr., Fahrzeugname und Geschwindigkeit auslesen local name=depot.entries[i].name local v=depot.entries[i].speed local ts=string.format("%2s %s%ss %3s km/h",i,"%",-nz,v)-- Spaltenformatierung text=text..string.format(ts,name) -- Text um Eintrag erweitern if i<n-1 then -- nicht letzte Zeile? text=text.."\n" -- Zeilenumbruch end end else -- Depot ist leer! text="Depot ist leer" end $("Textfeld Depot 1b").text=text -- Text in das Textfeld schreiben ... sieht dann so aus... Gruß EASY Bearbeitet 25. Dezember 2024 von EASY Fehler korrigiert
dbahr Geschrieben 26. Dezember 2024 Autor Geschrieben 26. Dezember 2024 Danke für den zusätzlichen Hinweis! Liebe Grüße
dbahr Geschrieben 28. Dezember 2024 Autor Geschrieben 28. Dezember 2024 Ich habe jetzt das Beispiel von @Goetzausprobiert. Folgendes ist mir aufgefallen: Nachdem die erste Lok im Depot ist - wird angezeigt "kein Fahrzeug im Depot" Nach der zweiten Lok wird dann die erste und nach der dritten Lok die erste und zweite Lok im Textfeld angezeigt. Bitte könnt ihr das noch einmal überprüfen - im vorhinein schon ein Danke für eure Mühe. Lieber Grüße Detlef Depotanzeige.mbp
Goetz Geschrieben 28. Dezember 2024 Geschrieben 28. Dezember 2024 (bearbeitet) vor 27 Minuten schrieb dbahr: Nachdem die erste Lok im Depot ist - wird angezeigt "kein Fahrzeug im Depot" Bei der Einfahrt musst du bitte einen kleinen Moment warten, weil die eingetroffene Lok nicht sofort im Depot registriert wird. Setz bitte eine kurze Verzögerung davor. Depotanzeige nach 1 Sekunde.mbp Im Beispiel habe ich zur Verdeutlichung 1 Sekunde gewählt. Tatsächlich würden schon 0 Sekunden genügen, weil diese Verzögerung Lua zwingt, das Ereignis ein zweites Mal aufzurufen. Und mit diesem nächsten Aufruf ist ein Programmzyklus vergangen. Mehr braucht es nicht. Bei der Ausfahrt ist diese Verzögerung nicht erforderlich. Bearbeitet 28. Dezember 2024 von Goetz Anlage angehängt
dbahr Geschrieben 28. Dezember 2024 Autor Geschrieben 28. Dezember 2024 Danke vielmals für den Tipp! Liebe Grüße und allen die besten Wünsche für 2025😊
Phrontistes Geschrieben 28. Dezember 2024 Geschrieben 28. Dezember 2024 In meiner Beispielsanlage, welche Du hier bekommen hattest war eine Verzögerung von einer halben Sekunde enthalten. Ebenso in der Variante von Goetz.
RoniHB Geschrieben 29. Dezember 2024 Geschrieben 29. Dezember 2024 Hallo zusammen, ich denke das Thema passt hierher. Ich habe das Skript aus Brummis Anlage in meiner Anlage verwendet, und nur die Variablennamen angepasst. Es wird der Fahrzeugname und der Zugtyp angezeigt. Funktioniert auch soweit. Nur eine Sache ist mir aufgefallen: Zugtypen mit Umlauten werden nicht rechtsbündig angezeigt. Kann es sein, dass Lua Umlaute, wie äüö, als zwei Zeichen zählt, wodurch der String 1 Zeichen länger ist, und daher das Wort Güterzug nicht 8 sondern 9 Zeichenlang ist? LG Ronald
Phrontistes Geschrieben 29. Dezember 2024 Geschrieben 29. Dezember 2024 vor 8 Minuten schrieb RoniHB: Kann es sein, dass Lua Umlaute, wie äüö, als zwei Zeichen zählt, Ja, und das hat @EASY oben auch berücksichtigt. Am 24.12.2024 um 13:59 schrieb EASY: local nz1=utf8.len(depot.entries[i].name)
RoniHB Geschrieben 29. Dezember 2024 Geschrieben 29. Dezember 2024 Alles klar, danke, hatte ich glatt überlesen, aber dafür habe ich euch ja LG Ronald
EASY Geschrieben 30. Dezember 2024 Geschrieben 30. Dezember 2024 (bearbeitet) Hallo, ich habe das Skript noch etwas erweitert und noch eine Funktion hinzugefügt, die dem Problem mit den Umlauten entgegenwirkt, außerdem regelt es ein Problem mit langen Fahrzeugnamen. Ich wollte die Variable für eine Zusatzanzeige etwas universeller gestalten so daß nicht das Skript den Variablennamen vorgibt. Die Beschreibung was ich mir gedacht habe, findet sich in den Kommentaren... P.S. Ich habe dabei das Prinzip mit der Liste von @Goetz übernommen... --[[ Wichtig: Für das Textfeld muß eine Monospace-Schrift verwendet werden! (Schrift mit konstanter Breite für alle Zeichen) z.B: Consolas, MS Gothic Info: Das Textfeld ist in seiner max. Breite beschränkt. Wenn eine Zeile zu lang ist, findet ein Übertrag in eine weitere Zeile statt. Hinweis: Die max. Länge ist abhängig von der verwendeten Schrift! Hinweis: die max. Größe des Textfeldes ist 640x640 mm in H0 (1:87) -> 55,68x55.68 m (1:1) somit ist die max. Anzahl von Zeichen je Zeile und von Zeilen begrenzt. z.B. Schrift Consolas -> max. 58 Zeichen je Zeile (-1 Zeichen für Zeilenumbruch -> 57 Zeichen) -> max. 27 Zeilen z.B. Schrift MS Gothic -> max. 64 Zeichen je Zeile (-1 Zeichen für Zeilenumbruch -> 63 Zeichen) -> max. 31 Zeilen --]] --[[ -- Depotinhalt in ein Text umwandeln--- Das Textfeld ist in 3 Spalten unterteilt. Fortlaufende Nummer|Fahrzeugname|Zusatzinformation Variablen für den Aufruf: "Depot" [Objekt] -> Depot das ausgelesen werden soll. "Zeilen" [Zahl] -> Anzahl der Zeilen, die maximal angezeigt werden sollen. (mindestens 1) "nName" [Zahl] -> Anzahl der Zeichen für den Fahrzeugnamen. (mindestens 15) "nInfo" [Zahl] -> Anzahl der Zeichen für Zusatzinformation. (mindestens 3) "Info_Titel" [String] -> Überschrift für Zusatzinformation. "Info_Variable" [String] -> Name der Variablen aus der die Zusatzinformation ausgelesen werden soll. [Objektvariable des Fahrteugs] Beispielaufruf: $("").text=DepotInhalt($("Depot 1a"),10,25,10,"Typ","Zugtyp") Hinweis: Wenn keine Zusatzinformationen vorhanden sind oder deren Anzeige nicht gewünscht ist, dann können die letzten 3 Parameter weggelassen werden. $("").text=DepotInhalt($("Depot 1a"),10,25) (In diesem Fall ist die letzte Spalte " ") Die Überschreitung von Grenzwerten wird korrigiert. --]] function DepotInhalt(Depot,Zeilen,nName,nInfo,Info_Titel,Info_Variable) local ZeichenMax=57 -- Max. Anzahl Zeichen je Zeile * (Schrift Consolas) [MS Gothic 63] local ZeilenMax=27 -- Max. Anzahl Zeilen * (Schrift Consolas) [MS Gothic 31] if Zeilen==nil or Zeilen<1 then Zeilen=1 end -- Mindestens eine Zeile -- Höchstens ZeilenMax-2 (für Titel und Übertrag Anzeige) if Zeilen>ZeilenMax-2 then Zeilen=ZeilenMax-2 end if nName==nil or nName<15 then nName=15 end -- Länge Namen mindestens 15 Zeichen if nInfo==nil or nInfo<3 then nInfo=3 end -- Länge Info mindestens 3 Zeichen Info_Titel=Info_Titel or " " -- Info_Titel gesetzt? Info_Variable=Info_Variable or " " -- Info_Variable gesetzt? local z=ZeichenMax-4 --(Erste Spalte (Zahl 2-stellig) + 2 x Trennungszeichen "|") if nInfo>z//2 then nInfo=z//2 end -- nInfo höchstens Mitte z=z-nInfo if nName>z then nName=z end -- Restliche Zeichen für Name local Anzahl=Depot.count -- Anzahl Einträge im Depot local Format_Zeile1 = "%2s>%-"..nName.."s|%-"..nInfo.."s" -- Formatierung füe Titel local Format_Zeile = "%2s|%-"..nName.."s|%-"..nInfo.."s" -- Formatierung füe Zeile local Format_Zusatz = "..%2d weitere.." -- Formatierung für Überlauf -- 1. Zeile erzeugen (Überschrift Liste) local Name=utf8_formatName(nName,Depot.name,"..") -- Depotname auslesen (Name evtl. kürzen) local Info=utf8_formatName(nInfo,Info_Titel,"..") -- Titel für Info auslesen (Name evtl. kürzen) local Liste={Format_Zeile1:format(Anzahl, Name, Info)} -- Eintrag in Liste if Anzahl > 0 then -- Depot nicht leer? -- Erster Eintrag manuell auslesen (wegen Index = 0) Name=utf8_formatName(nName,Depot.entries[0].name,"..") -- Name evtl. kürzen -- Zusatzinformation auslesen wenn Variable existiert sonst " " local Info=Depot.entries[k].variables[Info_Variable] or " " Info=utf8_formatName(nInfo,Info,"..") -- Name evtl. kürzen table.insert(Liste, Format_Zeile:format(1, Name, Info)) -- Eintrag in Liste for k, v in ipairs(Depot.entries) do if Anzahl > Zeilen and k > Zeilen-1 then -- Max. Anzahl Zeilen überschritten? local text=utf8_formatName(nName,Format_Zusatz:format(Anzahl-Zeilen),"..") -- Name evtl. kürzen table.insert(Liste, Format_Zeile:format("++",text, "")) -- Eintrag in Liste break -- Abbruch der Schleife else Name = utf8_formatName(nName,v.name,"..") -- Name evtl. kürzen -- Zusatzinformation auslesen wenn Variable existiert sonst " " Info = Depot.entries[k].variables[Info_Variable] or " " Info=utf8_formatName(nInfo,Info,"..")-- Name evtl. kürzen table.insert(Liste, Format_Zeile:format(k+1, Name, Info)) -- Eintrag in Liste end end return table.concat(Liste, "\n") --Rückgabe der Tabelle mit Seperator Zeilenumbruch else -- Depot ist leer! local text=utf8_formatName(nName,"Depot ist leer","..") -- Name evtl. kürzen table.insert(Liste, Format_Zeile:format("--",text, "")) -- Eintrag in Liste return table.concat(Liste, "\n") --Rückgabe der Tabelle mit Seperator Zeilenumbruch end end --================================================================================ -- Name formatieren auf einheitliche Länge -- maxz = max. Anzahl von Zeichen Zeile (muß positive Integer >=1 sein) -- s = String -- rz = Zeichen für Reststellen, wenn String zu lang -- (kann aus mehreren Zeichen bestehen z.B. "..") (Standard -> "") -- * Durch die Kürzung mit rz muß xnmax min. xr+1 sein -- --> maxz min. = xr+1 -- für fehlende Parameter werden Standardwerte gesetzt -- z.B. bei utf8_formatName (maxz,s) für rz="", rz="" -- Ausgabestring hat die Länge=maxz: Ausgabestring = s -- Ausgabestring hat die Länge<maxz: Ausgabestring = s+" "(x-mal) (" "(x-mal) bis Länge=maxz) -- Ausgabestring hat die Länge>maxz: Ausgabestring = s(gekürzt)+rz (s(gekürzt) bis Länge=maxz - Länge rz) function utf8_formatName(maxz,s,rz) if type(s) ~= 'string' then return "s kein String" end -- s ist kein String oder nil if type(rz) ~= 'string' then rz=nil rz=rz or "" end -- rz nicht vorhanden oder rz kein String -> rz="" if math.type(maxz)~="integer" then return "maxz Integer!" end -- maxz nicht vorhanden oder nicht Integer local xn=utf8.len(s) -- Länge String local xr=utf8.len(rz) -- Länge Restzeichen local xnmax=maxz --> max. Zeichen für String * local dx=xr+1 --* if maxz<dx then -- max. Zeilenlänge ist zu klein! * return "maxz>="..dx.."!" end local s1="" -- Ausgabestring if xn>xnmax then -- String ist zu lang? local b2=utf8.offset(s,xnmax-xr) -- Byte-Position Zeichen nnmax-xr local s1=utf8.char(utf8.codepoint(s, 1, b2))..rz -- String kürzen + rz return s1 elseif xn==xnmax then -- String hat richtige Länge return s else -- String ist zu kurz xl=xnmax-xn -- Anzahl "_" Ende String hinzufügen bis Länge=maxz s1=s..string.rep(" ",xl) -- Ausgabestring bilden return s1 end end --================================================================================ Beispielaufrufe... $("TF Depot 1c").text=DepotInhalt($("Depot 1c"),10,25,10,"Typ","Zugtyp") ... ... das Depot hat 3 Einträge und es sollen max. 10 Einträge angezeigt werden und die Fahrzeuge haben als Zusatzinfo die Variable "Zugtyp"... $("TF Depot 1a").text=DepotInhalt($("Depot 1a"),17,30) ... ... das Depot hat 35 Einträge davon sollen max. 17 angezeigt werden Einträge und die Fahrzeuge haben kein Zusatzinfo... $("TF Depot 1a").text=DepotInhalt($("Depot 1a"),35,30) ... ... das Depot hat 35 Einträge es sollen alle angezeigt werden und die Fahrzeuge haben kein Zusatzinfo... ... bedingt durch die maximale Größe des Textfeldes können aber nur 25 davon angezeigt werden... ... und abschließend gibt es noch das... Gruß EASY Bearbeitet 30. Dezember 2024 von EASY
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