Jump to content

Empfohlene Beiträge

Geschrieben

Hallo,

kann ich eine umfangreiche Tabelle auslesen, zwischenspeichern und wieder einlesen? 
Grund: Wenn ich Fahrstraßen verändere, auch wenn es nur das versetzen eines Gleiskontaktes ist, dann wird die Fahrstraße ungültig. Ich muss sie neu festlegen. Meine Fahrstraße ist aber in einer Tabelle hinterlegt, um aus der Abfragestelle und der Lok-Nr. die nächste Fahrstraße zu bestimmen. Diese Datenbank ist schon sehr umfangreich. Eine Fahrstraße kann 20 mal in der Datenbank stehen, die ich alle wieder von Hand nachpflegen muss. 
Ich würde mir gerne die Arbeit ersparen und die Tabelle sichern, bevor ich Änderungen an den Fahrstraßen vornehme um sie hinterher wieder einzuspielen.
Ein kleines Lua-Script vielleicht?  
Es handelt sich um die Anlage, die ich hier vorgestellt habe: https://community.3d-modellbahn.de/applications/core/interface/file/attachment.php?id=55119

Gruß Jürgen

Geschrieben (bearbeitet)
  Am 18.11.2021 um 22:06 schrieb jloos:

Ein kleines Lua-Script vielleicht?

Erweitern  

Hallo Jürgen,

um über alle Elemente einer Tabelle zu iterieren, gibt es in Lua die Schleife for k, v in pairs(t) do

k und v können beliebige Variablennamen sein. Die beiden Buchstaben weisen darauf hin, dass die erste Variable den key (= Bezeichner oder Index) der Zelle erhält und die zweite Variable den value (= Wert oder Inhalt).

Beatles = {"John", "Paul", "George", "Ringo"}

for platz, inhalt in pairs(Beatles) do
  print("an Platz "..platz.." steht: "..inhalt)
end

Beachte bitte, dass in pairs() die Tabelle nicht sortiert durchläuft!
Dafür findet es aber alles, was in der Tabelle steht, egal ob die Zellen durchnummeriert sind oder Namen haben.

Für das sortierte Auslesen einer Tabelle mit lückenlos durchnummerierten Plätzen (sprich: iterable table) gibt es in ipairs().
Das i vor pairs weist auf iterable hin.

Wenn du in der grafischen EV eine Wiederholung einsetzt und dann in Lua umwandelst, findest du im Code diese in pairs() Methode.

Um etwas in eine durchnummerierte Tabelle einzufügen, gibt es die Methode table.insert(table, [index,] value).

Viele Grüße
Götz

Nachtrag: Nach einem flüchtigen Blick auf deine Anlage noch ein wichtiger Hinweis. Lua unterscheidet nicht zwischen Listen und Tabellen. Man kann sogar beides vermischt in einer Tabelle haben. Aber das 3D-Modellbahn Studio unterscheidet beides ganz klar! Weil sein Code nicht auf Lua basiert. Du hast deine Fahrstraßen in einer Tabelle gespeichert. Das erkennt man sofort daran, dass in der Liste nach Platz 1 der Platz 10 folgt. Diese Zahlen sind bei einer Tabelle Bezeichner. Also Strings und keine Nummern! Und sie werden somit auch unter Lua wie Bezeichner behandelt.

Besser wäre, du würdest die Fahrstraßen in einer Liste ablegen.

Bearbeitet von Goetz
Ergänzungen
Geschrieben
  Am 19.11.2021 um 07:13 schrieb Goetz:

Besser wäre, du würdest die Fahrstraßen in einer Liste ablegen.

Erweitern  

Oh guter Hinweis. Ich fange grade eine neue Anlage an, die erste war nur Übung. Dann werde ich das gleich berücksichtigen.
Wenn ich wieder eine gut gefüllte Datenbank habe, werde ich wohl noch mal auf das Auslesen zurück kommen :-)

Danke Goetz

Gruß Jürgen

Geschrieben

Hallo,

  Am 18.11.2021 um 22:06 schrieb jloos:

Ich muss sie neu festlegen.

Erweitern  

wie gehst du hier vor? Wenn du nur die Wegpunkte aktualisierst, bleiben die interne ID der Fahrstraße erhalten und somit auch alle Referenzen. Nur wenn du die Fahrstraße löschst und eine neue erstellst, musst du auch Referenzen aktualisieren.

Viele Grüße,

Neo

Geschrieben
  Am 19.11.2021 um 07:54 schrieb Neo:

Wenn du nur die Wegpunkte aktualisierst, bleiben die interne ID der Fahrstraße erhalten

Erweitern  

wenn ich Beginn oder Ende der Fahrstraße durch Verschieben des Signals ändere, wird die Fahrstraße ungültig. Die Aufforderung, aktualisieren sie die Wegpunkte verstehe ich nicht. Was muß ich tun um die Wegpunkte zu aktualisieren?

Gruß Jürgen

Geschrieben (bearbeitet)
  Am 19.11.2021 um 08:18 schrieb jloos:

Was muß ich tun um die Wegpunkte zu aktualisieren?

Erweitern  

Klick auf das Stift Icon.
Das führt dich in das Menü, in dem du die Wegpunkte angibst. Dort klickst du einfach auf "Übernehmen"

1230580274_Fahrstrasseaktualisieren.jpg.4f3edd9b114408b091b59a9c26ee366a.jpg

Bearbeitet von Goetz
Bild hinzugefügt
Geschrieben
  Am 19.11.2021 um 07:13 schrieb Goetz:

Besser wäre, du würdest die Fahrstraßen in einer Liste ablegen.

Erweitern  

meine Abfrage ist ja die Variable "AbfragestellenNr." im Gleiskontakt und als Indes die Variable "Lok-Nr." aus der Lok.  Die Abfragestelle ist die Tabelle, in dieser suche ich dann als Index die Lok-Nr.  Bei einer Liste könnte ich keine Lok-Nr. abfragen, denn es kommen ja nicht alle Loks an der Abfragestelle vorbei. Sonst müsste ich  zu jeder Abfragestelle alle Loknummern eintragen und nur die tatsächlich verwendeten Lok-Nr. mit der Fahrstrasse belegen.

  Am 19.11.2021 um 08:19 schrieb Goetz:

Das führt dich in das Menü, in dem du die Wegpunkte angibst. Dort klickst du einfach auf "Übernehmen"

Erweitern  

ja, das funktioniert,  danke

Gruß Jürgen

Geschrieben
  Am 19.11.2021 um 08:37 schrieb jloos:

meine Abfrage ist ja die Variable "AbfragestellenNr." im Gleiskontakt und als Indes die Variable "Lok-Nr." aus der Lok.

Erweitern  

Dann ist die Tabelle mit den Nummern als Bezeichner der richtige Weg.
Tut mir leid, Jürgen ... so im Detail hatte ich deine Anlage nicht studiert.

Gruß
Götz

Geschrieben

Hallo,

ich komme noch mal auf das Thema Datenbank anlegen zurück. Dafür habe ich ein Beispiel angehängt.

Für die untere Gleistrecke habe ich die Tabelle Fahrstraße mit der Abfragestelle "01" als Tabelle und der Lok-Nr  "05" vom Typ Fahrstraße mit der Fahrstraße 01.11 per EV angelegt. 

Nun habe ich aber sehr viele Fahrstraßen mit 20 Loks. Alle Fahrstraßen sind angelegt, jetzt muss ich nur die Datenbank anlegen, das möchte ich per Tool machen. Dafür habe ich hier im Beispiel  für die obere Gleisstrecke ein Ereignis  "Schalter wird betätigt" angelegt. Doch es legt mir die Datenbank nicht so an, wie es sein soll.

Ich stelle mir vor, das per Lua zu machen, indem ich nur die Daten austausche.

Was mache ich falsch?

Danke für Eure Hilfe

Jürgen

Datenbank per EV.mbpFetching info...

Geschrieben
  Am 26.11.2021 um 16:38 schrieb jloos:

Was mache ich falsch?

Erweitern  

Der mittlere der drei Befehle ist falsch.
Der speichert  "12" als Text in deiner Tabelle.
Schmeiß den raus! Die beiden anderen Befehle sind alles, was du brauchst. Und sie tun, was sie sollen.

  • 2 Wochen später...
Geschrieben
  Am 19.11.2021 um 07:13 schrieb Goetz:

Hallo Jürgen,

um über alle Elemente einer Tabelle zu iterieren, gibt es in Lua die Schleife for k, v in pairs(t) do

k und v können beliebige Variablennamen sein. Die beiden Buchstaben weisen darauf hin, dass die erste Variable den key (= Bezeichner oder Index) der Zelle erhält und die zweite Variable den value (= Wert oder Inhalt).

Erweitern  

Hallo Götz,

ich bin inzwischen in meinen Daten verloren. Meine Fahrstraßendatenbank hat inzwischen 41 Tabellen mit insgesamt 207 Fahrstraßeneinträgen.  Ich habe mich immer bemüht den aktuellen Stand in einer Exceltabelle zu dokumentieren.  Doch das läuft immer wieder auseinander :-(

Ein nettes Tool wäre, solch eine Datenbank vollständig im csv-Format  ausgeben zu können um damit in Excel oder anderen Programmen zu arbeiten. Ich kann leider kein Lua, deshalb komme ich auch mit den Angaben im Zitat nicht zurecht. 

Vielleicht könntest Du mir mal ein Beispiel programmieren, basierend auf meiner eingestellten Anlage. 

Ich würde mich darüber sehr freuen, 
schöne Adventstage wünsche ich Allen

 

Gruß Jürgen

Geschrieben
  Am 7.12.2021 um 09:36 schrieb jloos:

Ich kann leider kein Lua, deshalb komme ich auch mit den Angaben im Zitat nicht zurecht. 

Erweitern  

Das tut mir leid, Jürgen.

Da du mich um ein kleines Skript gebeten hattest ging ich davon aus, dass du es verstehen würdest.

Aber wenn du das einfach gehaltene Beispiel mit den Beatles Namen nicht verstehst, dann nützt dir ein Beispiel, basierend auf deiner Anlage auch nichts. Das wäre nur komplizierter. 

Viele Grüße
Götz

Geschrieben

Hallo Goetz,

ich habe eben Probleme Dein Beispiel mit den Beatles und deren Gruppenmitglieder auf meinen Fall umzusetzen. Lasse ich Dein Skript auf der Lua Demoseite ablaufen, kommt 

an Platz 1 steht: John
an Platz 2 steht: Paul
an Platz 3 steht: George
an Platz 4 steht: Ringo

raus. Dein Skript funktioniert. 

Aber ich kann es nicht auf meine Situation umsetzen. Die Abhängigkeiten sind:
Fahrstraße = Abfragestelle , Lok-Nr. 

Außerdem ist mir nicht klar, wohin die Ausgabe geschrieben wird.

Aber trotzdem vielen Dank für Deine Hilfe Goetz, vielleicht kommt bei mir noch durch viel Lesen im Forum die Erkenntnis.

Gruß Jürgen

Geschrieben

Hallo Jürgen,

schau Dir schnell mal dieses Beispiel mit dem Skript von Götz an. Du musst nur das Ereignisprotokoll einblenden. Bei jedem Tastendruck wird das Skript ausgeführt und im Ereignisprotokoll angezeigt.....

E5D00493-4C13-4C66-BE3F-D2077F91A38E

Gruß Frank

Geschrieben

Hallo Jürgen,

  Am 7.12.2021 um 13:10 schrieb jloos:

Dein Skript funktioniert.

Erweitern  

Wenn du nur sehen kannst, dass es funktioniert, aber nicht wie es funktioniert, dann nützt das alles nichts.

Das Skript ist so klein und überschaubar, dass du wirklich den kompletten Mechanismus in allen Einzelheiten sehen kannst.
Und wenn du das durchschaust, dann kannst du es auch auf andere Situationen umsetzen. 

Viele Grüße
Götz

Geschrieben

Hallo,

nach wie vor weiß ich nicht, wie ich das Beispiel auf meine Datenbank anwenden soll.

Bei Günther Jauch könnte ich jetzt meinen Telefonjoker anrufen :-)

 Gruß Jürgen

Fahrstrassen.jpg

Geschrieben

Es ist kein Quizz, Jürgen.
Kein Ratespiel.

Mit dem folgenden Skript siehst du im Protokollfenster eine Liste all deiner 207 Fahrstraßen und ihren aktuellen Status.

local FS = $("Ereignisse").variables["Fahrstrassen"]
local Status = {"ist nicht aktiv", "ist angefordert", "läuft ein", "ist eingelegt und verriegelt"}
local Muster = "Fahrstraße %s %s"

for index1, value1 in ipairs(FS) do
  for index2, value2 in ipairs(value1) do
    local Name = value2.name
    local Text = Status[value2.state + 1]
    print(Muster:format(Name, Text))
  end
end

Das Beispiel zeigt dir, wie du alle Fahrstraßen aus deiner Tabellenstruktur (mit Untertabellen!) auslesen kannst.
Aber ich fürchte, das wird dir auch nicht weiterhelfen. 

In eine Excel Tabelle kann ich die Daten nicht wandeln. Das lässt das Studio nicht zu. Die Gefahr des Missbrauchs wäre zu hoch.

Viele Grüße
Götz

Geschrieben

Kleiner Hinweis:

Wenn man im Skript von Götz als Muster "%s;%s" nimmt und die Ausgabe / das Protokoll in eine Datei schreibt, erhält man ein Format, dass als .CSV-Datei in Excel eingelesen werden kann.

Grüße, Wolfgang

 

Geschrieben

Hallo Götz,

sicherlich hast Du da Recht. "Automatisiert" ist das nicht möglich. Es können aber Daten nach Excel mit einigen manuellen Eingriffen übergeben werden:

Daten_nach_Excel1.thumb.JPG.f1e7d2df8b36dcfa140d229f4d6d7b77.JPG

Diese Skript schreibt einige Informationen in das Protokoll (Signal, wartenden Zug falls vorhanden). Das Ergebnis im Protokoll sieht dann so aus:

Daten_nach_Excel2.JPG.9c0d804ae7f181aae842fd4ef0e5f9cd.JPG

Mit der rechten Maustaste kann man die Protokolldaten in eine Textdatei speichern. Mit Excel (hier bei mir OpenOffice) kann man diese Datei laden:

Daten_nach_Excel3.JPG.2a83e6ecb5a666ac651d06cd82f9ddbb.JPG

Das Ergebnis sieht dann so aus:

Daten_nach_Excel4.thumb.JPG.0bf2020a4dc0fc792ede2190549c1e71.JPG

Mit wenigen Befehlen (alle Zeilen löschen, die in Spalte B nicht "Signalbelegung:" beinhalten, ggf. Spalte A und B löschen) hat man das gewünschte Ergebnis in Excel.

Das entspricht nicht den ursprünglichen Anforderungen hier. Aber generell ist es möglich, Daten nach außen zu geben.

Grüße, Wolfgang

 

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