Jump to content

Empfohlene Beiträge

Geschrieben

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

Liste Depot.jpg

Geschrieben (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 von Phrontistes
else-Zweig hinzugefügt (kein Fahrzeug)
Geschrieben (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 von Goetz
Geschrieben (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...
Bild001.thumb.jpg.450bea314a8e08cfbb8e8cf79fd43693.jpg

Gruß
EASY

Bearbeitet von EASY
Fehler korrigiert
Geschrieben

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

Geschrieben (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 von Goetz
Anlage angehängt
Geschrieben

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?

temp.JPG.0a481027d47393db08bfd6d0047e61f1.JPG

LG Ronald

 

 

Geschrieben
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)

 

Geschrieben (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"...
Bild001.jpg.44eb310a9b787c0806043618b40e055f.jpg

$("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...
Bild002.jpg.2dc922086fb486d6cc3e13d7cf4c8be6.jpg

$("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...
Bild003.thumb.jpg.d71d0f0c60d7e61df1a0f361cd0ebbc5.jpg

... bedingt durch die maximale Größe des Textfeldes können aber nur 25 davon angezeigt werden...

... und abschließend gibt es noch das...
Bild004.thumb.jpg.d4b1eec69a677bdb290f251ffcf1533f.jpg

Gruß
EASY

Bearbeitet von EASY

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