Forum: PC-Programmierung GUI für Modellbahnsteuerung


von Benjamin A. (benjamin_a72)


Angehängte Dateien:

Lesenswert?

Hallo alle miteinander,

ich hab mal wieder Problemchen :D

diesmal gehts um die GUI für mein Modellbahnprojekt...

ich würde diese gerne auf Java Basis bauen, aus dem ganz einfachen 
Grund, weil ich mich zumindest halbwegs auskenne und mich zum anderen 
noch nicht entschieden habe, welches OS als Untergrund dienen wird ;)

Soweit so gut, mein Problem ist dann folgendes (ich hoffe ihr versteht 
was ich meine):
ich würde gerne das Übersichtsbild eines Bahnhofs oder 
Streckenabschnitts schematisch darstellen, ähnlich einer Landkarte, 
dabei möchte gerne den Bhf in einzelne, quadratische Zellen einteilen, 
wobei jede Zelle einer funktionalen Einheit, also zum Beispiel einem 
Gleis, einer Weiche, einem Signal (=Ampel) usw entspricht. Wichtig dabei 
ist, dass jede Einheit auch noch konfigurierbar bleiben muss, sprich, 
Weichen sollen per Mausklick umschaltbar sein, Gleisbelegungen sollen 
zur Änderung der Gleisfarbe führen, Bahnübergänge sollen sie 
öffnen/schliessen etc... Zur Demonstration habe ich hier eine kleine 
Skizze angehängt. Ist zwar nur mit Paint, aber ich hoffe man sieht, wie 
ich das ungefähr handhaben möchte...

Hat jemand von Euch eine Idee, wie ich das somit in Java umsetzen kann, 
sodass es gut skaliert, und die Performance halbwegs ok bleibt?

von Tr (Gast)


Lesenswert?

Wenn die Darstellung nicht zu umfangreich werden soll/muss kannst du so 
machen.

Dafür baust du dir einige grundlegende Objekte:
-Gleis
-Weiche
-Bahnsteig (bzw. allgemein für Grafiken, Beschriftung)

Mit Vererbung usw. kannst du die Funktionen erweitern (BÜ-Gleis, 
Endgleis, Kreuzungsweiche, ...).
Signale würde ich auch einem Gleis zuordnen, die stehen ja sowieso immer 
nebendran.

Für die Darstellung verwendest du dein Raster bzw. so ein Grid Control 
aus dem Grafikpaket deiner Wahl. Jeder Zelle ist ein Objekt zugeordnet. 
Beim Bildaufbau übergibst du dem Objekt die Zeichenfläche/Canvas der 
Raster-Zelle, das zeichnet dann seine jeweilige Darstellung da rein.
Entsprechend kann ein Objekt auch onClick Handler registrieren usw.

Für die Datenübertragung baust du dir ein virtuelles Stellwerk.
Das hat dann eine Liste mit ihm zugewiesenen Objekten (Gleisabschnitte, 
Signale, ...) und eine Verbindung zur Anlage.
Wenn auf der Anlage was passiert kann das Stellwerk die neuen Daten an 
das zugehörige Objekt weiterleiten.
Entsprechend kennt ein Objekt auch "sein" Stellwerk und kann 
Stellbefehle absetzen.

Wenn du das Stellwerk auch als Objet auf das Raster setzt brauchst du 
später bloß das Raster-Objekt serialisieren um die komplette 
Konfiguration der Anlage zu speichern.

von Benjamin A. (benjamin_a72)


Lesenswert?

Danke erstmal für deine Antwort, ich werde Punkt für Punkt auf deine 
Antwort eingehen, dann wird vielleicht auch mein Anliegen nochmal eine 
Spur klarer ;)

Tr schrieb:
> Wenn die Darstellung nicht zu umfangreich werden soll/muss kannst du so
> machen.

Der Umfang sollte doch schon ein wenig größer werden, das angehänge Bild 
im ersten Beitrag soll nur beispielhaft die Idee herzeigen.

> Dafür baust du dir einige grundlegende Objekte:
> -Gleis
> -Weiche
> -Bahnsteig (bzw. allgemein für Grafiken, Beschriftung)

Genauso wollte ich das machen. alle Elemente als Vektorgrafik zeichnen 
(aber im Negativ). dann den einzelnen Zellen die Grafiken übergeben, bei 
Weichen mit der Auswahl der Stellen (also ob L oder R). Somit kann ich 
zb Gleisbesetzungen über Änderung der Hintergrundfarbe der Zelle 
darstellen.


> Mit Vererbung usw. kannst du die Funktionen erweitern (BÜ-Gleis,
> Endgleis, Kreuzungsweiche, ...).
> Signale würde ich auch einem Gleis zuordnen, die stehen ja sowieso immer
> nebendran.

> Für die Datenübertragung baust du dir ein virtuelles Stellwerk.
> Das hat dann eine Liste mit ihm zugewiesenen Objekten (Gleisabschnitte,
> Signale, ...) und eine Verbindung zur Anlage.
> Wenn auf der Anlage was passiert kann das Stellwerk die neuen Daten an
> das zugehörige Objekt weiterleiten.
> Entsprechend kennt ein Objekt auch "sein" Stellwerk und kann
> Stellbefehle absetzen.

Geb ich dir total recht. Man merkt du hast Ahnung in dem Gebiet, über 
Funktionen per se mach ich mir aber derzeit nicht die großen Gedanken. 
Es sei so viel gesagt: im Großen soll es mehrere µCs geben, die mit der 
GUI kommunizieren. Jeder Controller übernimmt dann eine Aufgabe, wie das 
Stellen der Weichen, Signale usw. Somit hab ich dann auch kein 
"virtuelles Stellwerk" sondern ein echtes ;) Im weiteren Fall möchte ich 
es dann auch so machen, dass die GUI über XML-Daten gefüttert werden 
kann und sich der Bahnhof dadurch selbst aufbaut und entsprechende 
Bilder erzeugt, mit entsprechenden Menüs, Events etc. um auch mehrere 
Streckenabschnitte oder verschiedene Anlagen bedienen zu können.

> Für die Darstellung verwendest du dein Raster bzw. so ein Grid Control
> aus dem Grafikpaket deiner Wahl. Jeder Zelle ist ein Objekt zugeordnet.
> Beim Bildaufbau übergibst du dem Objekt die Zeichenfläche/Canvas der
> Raster-Zelle, das zeichnet dann seine jeweilige Darstellung da rein.
> Entsprechend kann ein Objekt auch onClick Handler registrieren usw.
>

HIER kommen wir zum Kern meiner Frage: WELCHES Grafikpaket, welche 
Control ist hier geeignet. Ich habe einen Versuch mit jPanels gestartet 
(Swing-GUI).
Ich wollte (wie im obigen Bild) die Panels in einem Grid-Layout anordnen 
und dann, wie weiter oben beschrieben, den Bahnhof Stück für Stück 
aufbauen. Das funktioniert für 10 Panels gut, für 100 auch noch, aber 
bei 500...1000 nicht mehr. Allein schon aus Programmiertechnischer 
Sicht... Meine Idee dahinter war, die Anzahl der Panels konstant zu 
halten und einfach nur jedes bei Bedarf mit einer Grafik zu füllen. Und 
zur konkreten Anzahl... nehmen wir einen Bildschirm, der mit FullHD 
Auflösung arbeitet, dann haben wir 1920x1080 pixel. Gehen wir davon aus, 
dass ich in der Breite möglichst alles ausnutzen will, also zb 
1900pixel, in der Höhe ungefähr 2/3, das würde ungefähr 800pixel, dann 
würde das bei einer Zellengröße von 30x30 Pixeln also ca. 63x24=1512 
Zellen entsprechen.

> Wenn du das Stellwerk auch als Objet auf das Raster setzt brauchst du
> später bloß das Raster-Objekt serialisieren um die komplette
> Konfiguration der Anlage zu speichern.

Da komm ich jetzt nicht ganz mit, was du meinst, bitte nochmal um 
genauere Erklärung ;)

von Michael B. (laberkopp)


Lesenswert?

Benjamin A. schrieb:
> ich würde gerne das Übersichtsbild eines Bahnhofs oder
> Streckenabschnitts schematisch darstellen, ähnlich einer Landkarte,

Solche Stellwerke gibt es nicht mehr, die sehen heute so aus:

http://www.onetz.de/weiden-in-der-oberpfalz/lokales/stellwerk-elektronisch-dieter-zintl-am-sogenannten-bedienplatz-fuer-das-stellwerk-neustadtwn-das-den-bereich-zwischen-weiden-und-windischeschenbach-inklusive-des-abzweigs-richtung-felixberg-abdeckt-m153758,17736.html

von Benjamin A. (benjamin_a72)


Lesenswert?

Michael B. schrieb:
> Benjamin A. schrieb:
>> ich würde gerne das Übersichtsbild eines Bahnhofs oder
>> Streckenabschnitts schematisch darstellen, ähnlich einer Landkarte,
>
> Solche Stellwerke gibt es nicht mehr, die sehen heute so aus:
>
> 
http://www.onetz.de/weiden-in-der-oberpfalz/lokales/stellwerk-elektronisch-dieter-zintl-am-sogenannten-bedienplatz-fuer-das-stellwerk-neustadtwn-das-den-bereich-zwischen-weiden-und-windischeschenbach-inklusive-des-abzweigs-richtung-felixberg-abdeckt-m153758,17736.html

Was genau unterscheidet meine Bahnhofsansicht von der auf dem Bild? 
Klar, das Foto zeigt irgend ein ESTW einer richtigen Bahn, ich nehme 
wohl an DB oder irgend eine deutsche Lokalbahn, den Hersteller erkenne 
ich jetzt an dem Bild nicht. So viel kann ich aber sagen: Ein kleines 
winziges bisschen Ahnung hab ich von Stellwerken, und soweit ich das 
beurteilen kann, ist meine Idee nicht wirklich auf dem Holzweg, mit dem 
Unterschied, dass ich natürlich nicht redundant und 2-kanalig arbeite, 
da es sich hier um eine Modellbahn und nicht um ein echtes ESTW handelt 
;)

von Mark B. (markbrandis)


Lesenswert?

Benjamin A. schrieb:

> HIER kommen wir zum Kern meiner Frage: WELCHES Grafikpaket, welche
> Control ist hier geeignet. Ich habe einen Versuch mit jPanels gestartet
> (Swing-GUI).
> Ich wollte (wie im obigen Bild) die Panels in einem Grid-Layout anordnen
> und dann, wie weiter oben beschrieben, den Bahnhof Stück für Stück
> aufbauen. Das funktioniert für 10 Panels gut, für 100 auch noch, aber
> bei 500...1000 nicht mehr.

Naja, im obigen Beispiel hast Du 16 * 10 = 160 Zellen. Das ist schon 
noch was anderes als 500 bis 1000, es ist ja immerhin Faktor 3 bis 6 
dazwischen.

> Allein schon aus Programmiertechnischer Sicht...

Was soll da aus programmiertechnischer Sicht nicht gehen?

> Meine Idee dahinter war, die Anzahl der Panels konstant zu
> halten und einfach nur jedes bei Bedarf mit einer Grafik zu füllen.

Man kann auch manche Zellen des Grids gar nicht füllen. Geht wunderbar 
:)

> Und
> zur konkreten Anzahl... nehmen wir einen Bildschirm, der mit FullHD
> Auflösung arbeitet, dann haben wir 1920x1080 pixel. Gehen wir davon aus,
> dass ich in der Breite möglichst alles ausnutzen will, also zb
> 1900pixel, in der Höhe ungefähr 2/3, das würde ungefähr 800pixel, dann
> würde das bei einer Zellengröße von 30x30 Pixeln also ca. 63x24=1512
> Zellen entsprechen.

Deine Zahlen werden mit jedem Posting größer... :-D

Wieviele von den ca. 1500 Zellen wären denn so im Durchschnitt 
tatsächlich besetzt?

von Mark B. (markbrandis)


Lesenswert?

Hast Du Dir generell schon mal JMRI angeschaut? Vielleicht kannst Du das 
ja für Deine Zwecke einsetzen.

JMRI - Java Model Railroad Interface:
http://jmri.sourceforge.net/

Da gibt es unter anderem "PanelPro, an application to make Control 
Panels":
http://jmri.sourceforge.net/help/en/html/apps/PanelPro/PanelPro.shtml

von Benjamin A. (benjamin_a72)


Lesenswert?

Mark B. schrieb:
> Benjamin A. schrieb:
>
>> HIER kommen wir zum Kern meiner Frage: WELCHES Grafikpaket, welche
>> Control ist hier geeignet. Ich habe einen Versuch mit jPanels gestartet
>> (Swing-GUI).
>> Ich wollte (wie im obigen Bild) die Panels in einem Grid-Layout anordnen
>> und dann, wie weiter oben beschrieben, den Bahnhof Stück für Stück
>> aufbauen. Das funktioniert für 10 Panels gut, für 100 auch noch, aber
>> bei 500...1000 nicht mehr.
>
> Naja, im obigen Beispiel hast Du 16 * 10 = 160 Zellen. Das ist schon
> noch was anderes als 500 bis 1000, es ist ja immerhin Faktor 3 bis 6
> dazwischen.

Nochmal: das Bild soll nur andeuten, wie ich mir die Ansicht vorstelle.

>
>> Allein schon aus Programmiertechnischer Sicht...
>
> Was soll da aus programmiertechnischer Sicht nicht gehen?

schon mal 1500 Zellen umbenannt, mit einem Bild versehen, Events 
programmiert etc? :D

>
>> Meine Idee dahinter war, die Anzahl der Panels konstant zu
>> halten und einfach nur jedes bei Bedarf mit einer Grafik zu füllen.
>
> Man kann auch manche Zellen des Grids gar nicht füllen. Geht wunderbar
> :)

Du meinst also konkret zwar das Grid auf die maximale Anzahl an Zellen 
auszulegen, sprich ~1500, aber nur jene überhaupt mit einem Panel zu 
füllen, die auch wirklich eine Funktion innehaben?

>> Und
>> zur konkreten Anzahl... nehmen wir einen Bildschirm, der mit FullHD
>> Auflösung arbeitet, dann haben wir 1920x1080 pixel. Gehen wir davon aus,
>> dass ich in der Breite möglichst alles ausnutzen will, also zb
>> 1900pixel, in der Höhe ungefähr 2/3, das würde ungefähr 800pixel, dann
>> würde das bei einer Zellengröße von 30x30 Pixeln also ca. 63x24=1512
>> Zellen entsprechen.
>
> Deine Zahlen werden mit jedem Posting größer... :-D
>
> Wieviele von den ca. 1500 Zellen wären denn so im Durchschnitt
> tatsächlich besetzt?

also die ca 1500 Zellen sind aus derzeitiger Rechnung die MAXIMAL 
Anzahl, also das, was die Applikation auch im Vollbild anzeigen können 
MUSS. Wie viele Zellen nun schlussendlich belegt sind, hängt wiederum 
vom konkreten Aufbau ab. Das würde ich gerne vorerst nicht genau 
definieren, da es ja (theoretisch) auf mehreren Anlagen funktionieren 
soll. Sprich: ich bastle da nicht alleine dran, bzw. es ist nicht nur 
für meine Anlage gedacht, sondern soll auch bei Freunden, Verwandten,... 
zum Einsatz kommen.

von Benjamin A. (benjamin_a72)


Lesenswert?

Mark B. schrieb:
> Hast Du Dir generell schon mal JMRI angeschaut? Vielleicht kannst Du das
> ja für Deine Zwecke einsetzen.
>
> JMRI - Java Model Railroad Interface:
> http://jmri.sourceforge.net/
>
> Da gibt es unter anderem "PanelPro, an application to make Control
> Panels":
> http://jmri.sourceforge.net/help/en/html/apps/PanelPro/PanelPro.shtml

Das sieht auf jedenfall mal interessant aus und ist ein paar Blicke wert 
;)

von Mark B. (markbrandis)


Lesenswert?

Benjamin A. schrieb:
> schon mal 1500 Zellen umbenannt, mit einem Bild versehen, Events
> programmiert etc? :D

Nö :-)

Das meiste was ich bisher hatte... hmmmm.. das waren so etwa 10 x 10.

> Du meinst also konkret zwar das Grid auf die maximale Anzahl an Zellen
> auszulegen, sprich ~1500, aber nur jene überhaupt mit einem Panel zu
> füllen, die auch wirklich eine Funktion innehaben?

Genau.

Benjamin A. schrieb:
> Das sieht auf jedenfall mal interessant aus und ist ein paar Blicke wert
> ;)

Ja ist cool ne? :)

von Benjamin A. (benjamin_a72)


Lesenswert?

Ok, das geht definitiv in die richtige Richtung, ich schau mal, ob ich 
da nur den Source-Code auch finde, und ob ich das ein bisschen abspecken 
kann, die Software ist relativ mächtig und kann eigentlich sehr viel. 
Nachdem sich mein derzeitiges Konzept nicht auf vorgefertigte Protokolle 
wie DCC oder ähnliches stützt, kann ich nicht sagen, ob ich das so 
verwenden kann. Ganz davon abgesehen möchte ich ja selbst auch noch ein 
wenig tüfteln :P

Es ist auf jedenfall mal ein erster Schritt in die Richtung, sollte es 
aber noch andere Vorschläge geben, werde ich natürlich denen auch 
nachgehen. Was ich auch definitiv probieren werde, ist die Idee nur alle 
benötigten Felder mit jPanels zu füllen. Vielleicht fange ich überhaupt 
gleich an, ein Test-XML zu schreiben und einmal zu testen, wie gut die 
Performance hier ist.

von Tr (Gast)


Lesenswert?

Benjamin A. schrieb:
> Der Umfang sollte doch schon ein wenig größer werden, das angehänge Bild
> im ersten Beitrag soll nur beispielhaft die Idee herzeigen.

Da war ich ungenau was ich mit "Umfang" meinte.
Umfang "Anzahl Elemente/Objekte": Mit dem Raster-System egal, bis der 
RAM platzt.
Umfang "Eyecandy": Da bist du ans Raster gebunden, Elemente über mehrere 
Kästen zeichnen wird fummelig.

Benjamin A. schrieb:
> HIER kommen wir zum Kern meiner Frage: WELCHES Grafikpaket, welche
> Control ist hier geeignet. Ich habe einen Versuch mit jPanels gestartet
> (Swing-GUI).

Tja da muss ich passen, so gut kenne ich Java nicht. In Delphi würde ich 
ein TStringGrid nehmen. Also definitiv ein fertiges 
Grid/Tabellen-Steuerelement, nicht selbst etwas mit Paneln basteln.
Dein Bahnhof wird mal größer werden, dann möchtest du bestimmt scrollen 
& zoomen. Das mit selbst gestrickten Panels zu machen wird ein Alptraum.

Benjamin A. schrieb:
> Es sei so viel gesagt: im Großen soll es mehrere µCs geben, die mit der
> GUI kommunizieren. Jeder Controller übernimmt dann eine Aufgabe, wie das
> Stellen der Weichen, Signale usw. Somit hab ich dann auch kein
> "virtuelles Stellwerk" sondern ein echtes ;)

IMHO solltest du das dann auch wie ein echtes ESTW aufbauen/konzipieren.
D.h. ein "reales" Stellwerk bedient alle Weichen, Signale, ... von einem 
Abschnitt und wird durch ein "virtuelles" repräsentiert.
Wenn du ein "Stellwerk" (µC) für alle Weichen, eines für alle Signale, 
... nimmst geht das große Basteln los. Fahrstraßen werden dann extrem 
schwierig, die sind so schon knifflig genug.

Benjamin A. schrieb:
> Da komm ich jetzt nicht ganz mit, was du meinst, bitte nochmal um
> genauere Erklärung ;)

Du baust dir so eine Struktur für das Raster bzw. die Objekte:
BildObjekt - Gleis - Signalgleis
                   - BÜ Gleis
           - Weiche
                   - Kreuzungsweiche
           - Stellwerk

Das BildObjekt hat Dummy-Funktionen für onPaint, onClick, ... und wird 
dann jeweils passend erweitert um ein Gleis oder eine Weiche 
darzustellen.

Das Raster ist dann sinngemäß sowas:
raster = array[x][y] of BildObject;

Das Ding kannst du dann komplett wegspeichern und hast automatisch die 
Position, Typ, Verknüpfungen usw. mit dabei.

von Benjamin A. (benjamin_a72)


Lesenswert?

>> Es sei so viel gesagt: im Großen soll es mehrere µCs geben, die mit der
>> GUI kommunizieren. Jeder Controller übernimmt dann eine Aufgabe, wie das
>> Stellen der Weichen, Signale usw. Somit hab ich dann auch kein
>> "virtuelles Stellwerk" sondern ein echtes ;)
>IMHO solltest du das dann auch wie ein echtes ESTW aufbauen/konzipieren.
>D.h. ein "reales" Stellwerk bedient alle Weichen, Signale, ... von einem
>Abschnitt und wird durch ein "virtuelles" repräsentiert.
>Wenn du ein "Stellwerk" (µC) für alle Weichen, eines für alle Signale,
>... nimmst geht das große Basteln los. Fahrstraßen werden dann extrem
>schwierig, die sind so schon knifflig genug.

Nachdem das meiste ja eigentlich mehr oder minder zumindest besprochen 
wurde, gehe ich nur auf den zitierten Punkt ein: Ich glaube ich habe 
mich hier ein wenig ungeschickt ausgedrückt, was das Naming betrifft. 
Als Stellwerk würde ich hier den gesamten Aufbau bezeichnen, also sowohl 
die Interfaces, die Controller, die "Zentrale" inklusive GUI und 
Software. Die Controller sollen relativ "dumm" werden. Die sollen 
lediglich die Sensoren/Aktoren bedienen und mit der Zentrale 
kommunizieren, und zwar in einer angenehmen Art und Weise, ich möchte 
also nicht hinterrücks über meine Java-Applikation Pins sowie 1-en und 
0-en herumschieben. Dadurch wird auch das Stellen von Fahrstraßen 
einfacher, hier hab ich mir auch schon Gedanken gemacht, soll aber hier 
vorerst noch nicht das große Thema sein. Ich frage hier wirklich nach 
einer Methode, mein Gleislayout auf eine Ansprechende und trotzdem 
performante Art und Weise darzustellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.