Physische Elemente
ohne Zustand:
Punkte
(und
Ecken
) als Angriffspunkte für Linien und
Vektoren
ungerichtete Linien
als ungerichtete Verbindungen zwischen den Punkten
gerichtete Linien
als gerichtete Verbindungen zwischen den Punkten
Marken
(Detektoren),
die logische Signale erzeugen. Sie liegen immer auf Linien
mit Zustand, der von Meldungen (logischen Elementen) beeinflusst werden kann:
Marken
(Aktoren),
welche Teilnehmer beeinflussen können
Weichen mit den Weichenstellungen
(hier nicht behandelt)
Signale (Ampeln) ![]()
mit zeitabhängigem Zustand:
Teilnehmer (bewegliche Marken), die auf der Topologie
verkehren
(hier nicht behandelt)
Logische Elemente
ohne Zustand:
Knoten für den Zusammenfluss und das Verteilen von Meldungen
(
und
)
Meldewege
als
gerichtete Verbindungen für den Meldungsfluss
mit Zustand:
Knöpfe zur Erzeugung von Meldungen (Sender
) und zu ihrer Aufnahme (Empfänger
)
Rahmen zur Beherbergung von Knöpfen und zur Weiterverarbeitung von Meldungen, entweder von den Knöpfen erhalten oder direkt von einem steuernden Element in codierter Form. Die Meldungen werden entweder an einen Knopf weitergeleitet oder aber an ein gesteuertes Element, wiederum in codierter Form
Filter (Rechenvorschriften), welche Meldungen analysieren und weiterverarbeiten (verteilen, verzögern)
Zeitelemente (hier nicht behandelt):
Event-Glied mit einem Zeitpunkt und einer auszulösenden Reaktion in diesem Zeitpunkt
Temporäre Elemente (hier nicht behandelt):
Referenz-Glied, welches zum Erstellen einer Referenz-Kette benötigt wird, meist eine Auswahl von Gliedern (wie: alle Glieder, die von der Maus berührt werden)
Trajektorie, welche das Fahrverhalten eines Teilnehmers für einen bestimmten Abschnitt beinhaltet
Im Folgenden sollen alle Elemente etwas genauer vorgestellt werden, bezüglich ihres Bauplanes und ihres Verhaltens. Für den Bauplan werden wir in den Tabellen Nummer, Zweck, Zugriffs-Methode und ein Attribut für jedes Feld des Gliedes aufführen (sowie einen möglichen Kommentar). Das Attribut bezeichnet die Art des Feldes mit einem fortlaufenden Index innerhalb der Art. Als Art kommen
G für gespeichert (das Feld steht im Klartext da und ist von keinem anderen Feld abhängig),
R für Relation (der Inhalt des Feldes wird über eine Verknüpfung ermittelt),
B für berechnet (das Feld berechnet sich aus anderen Feldern) und
N für Nebenkette (das Feld referenziert auf eine lokale Nebenkette) vor.
Für berechnete Felder wird weiter in Klammern angegeben, aus welchen Feldern sie sich errechnen.
4.1 PunkteFolgende drei Klassen werden hier vorgestellt:
GliedPunkt als allgemeines, punktförmiges Objekt,
GliedPuEck (Unterklasse von GliedPunkt) als Punkt oder Ecke auf einer physischen Verbindung und
GliedKnoten (Unterklasse von GliedPunkt) als Punkt oder Ecke auf einer logischen Verbindung (für Meldewege).
Ein Punkt ist ein ein-dimensionales Objekt. Je nach seinem Grad kann er bestimmte Eigenschaften haben:
Grad 1: der Punkt ist am Ende einer Linie, er stellt implizit eine Senke dar, in welcher die Teilnehmer verschwinden, da sie das System verlassen.
Grad 2: der Punkt ist eine sogenannte Ecke, er befindet sich auf einem Linienzug. Wird er gelöscht, so löscht er nicht die beiden angrenzenden Linien, sondern er verbindet sie zu einer einzigen, bevor er sich löscht. Ein Punkt kann nur zur Ecke werden, wenn die beiden angrenzenden Linien (bzw. Vektoren) nicht unterschiedlich gerichtet sind.
Grad 3 und grösser: im Punkt laufen Linien aus verschiedenen Richtungen zusammen. Wird er gelöscht, so löscht er automatisch auch alle angreifenden Linien (im Gegensatz zu seiner Form als Ecke). Er verknüpft Vektoren oder auch Linien. Bei nur einem wegführenden Vektor ist seine innere Topologie definiert, sonst muss er vor jeglicher Simulation in eine Weiche umgewandelt werden, damit die Verknüpfung der Linien eindeutig ist.
Ein Knoten nimmt dieselben Funktionen für logische Verbindungen wahr. Er verteilt grundsätzlich Meldungen von allen ankommenden Pfaden (Meldewegen) auf alle abgehenden Pfade; er kann deshalb auch nicht in eine Weiche mit innerer Topologie umgewandelt werden.
Folgende Felder beschreiben einen Punkt:
Nummer |
Zweck |
Methode |
Attribut |
Bemerkungen |
1 |
Koordinaten |
koordinaten |
G1 |
|
2 |
Grad |
(grad) |
F1 bzw. G2 |
G2, wenn erzwungene Ecke |
Die Koordinaten bestimmen, wo der Punkt auf dem Bildschirm liegt.
Der Grad gibt darüber Auskunft, wie viele Linien am Punkt angreifen. Das bedingt, dass dem Punkt durch eine Add Notification gemeldet wird, wenn eine neue Linie definiert wird, die an ihm angreifen soll. Ebenfalls über eine Delete Notification muss dem Punkt das Entfernen der Linie mitgeteilt werden.
Da der Punkt bei seinem Löschen ein anderes Verhalten zeigt, wenn er eine Ecke ist (wenn nur zwei Linien an ihm angreifen, die nicht gegeneinander gerichtet sind), als wenn er ein normaler Punkt ist, muss es auch möglich sein, eine Ecke temporär in einen Punkt umzuwandeln, wenn man die beiden angreifenden Linien des Punkten mitsamt dem Punkt löschen möchte. Das äussert sich darin, dass dem Grad der Wert "nil" zugewiesen wird. Er verliert dadurch sein F-Attribut.
Punkt-Indizes
Sie ordnen die Koordinaten der Reihe nach; sie dienen nur zum schnelleren Auffinden eines Punktes auf dem Bildschirm, sind also nicht unique; verschiedene Punkt dürfen übereinander liegen.
Dafür müssen wir ein Ordnungsprinzip für Punkte definieren: Punkt A ist kleiner als Punkt B, wenn

Ax < Bx oder Ay < By gilt. Wir führen deshalb einen Index in x- und einen in y-Richtung ein.
Folgende Felder definieren den Index für einen Punkt:
Nummer |
Zweck |
Methode |
Attribut |
Bemerkungen |
1 |
Koordinaten |
koordinaten |
G1 |
nicht gespeichert |
Wie in [2] erwähnt, haben auch die referenzierenden Werte eines Index Standardbande:
(a) on add notify after
(b) on delete cascade
(c) on change notify after
(d) koordinaten
Punkt-Index
Punkt
(e) on delete ignore
(f) on change restrict
(g) koordinaten
Die Add Rule (a) wird immer beim Einfügen in die Kette berücksichtigt. Ändert sich der Wert eine Eintrages, so muss der Index benachrichtigt werden, damit er den Referenz-Eintrag neu einordnen kann (c). Ein Index wird normalerweise nicht gelöscht. Ist dies trotzdem einmal der Fall, so interessiert es die referenzierten Glieder nicht: (e) bis (g).
4.2 LinienDie folgenden Klassen werden hier eingeführt:
GliedLinie als allgemeine Oberklasse, welche ein linienförmiges graphisches Objekt definiert, welches an beiden Enden von einem Punkt begrenzt ist.
GliedVektor (eine Unterklasse von GliedLinie) als Klasse, welche eine gerichtete Linie darstellt.
GliedVektorPhys als Unterklasse von GliedVektor, die einen physischen Vektor darstellt (auf welchem Teilnehmer zirkulieren können).
GliedMeldeweg als weitere Unterklasse von GliedVektor, die einen logischen Vektor darstellt (auf welchem Meldungen verschickt werden können).
GliedAdja (eine Unterklasse von GliedLinie) als Linie, welche nur die Adjazenz zweier Punkte repräsentiert (zwei Punkte einander zuordnet); diese Klasse wird für die Weichen benötigt..
Eine Linie ist ein Objekt, das zwei Punkte miteinander verbindet. Sie kann ungerichtet sein oder gerichtet (dann auch Vektor genannt). Auf die verschiedenen Aufgaben der Vektoren wollen wir speziell noch im nächsten Abschnitt eingehen, obwohl sich Vektoren speichermässig nicht von den Linien unterscheiden.
Folgende Felder definieren eine Linie:
Nummer |
Zweck |
Methode |
Attribut |
Bemerkungen |
1 |
Anfangspunkt |
anfang |
R1 |
|
2 |
Endpunkt |
ende |
R2 |
|
3 |
Strecke |
strecke |
B1(R1,R2) |
nicht gespeichert |
4 |
angezeigte Strecke |
streckeDisp |
B2(R1,R2) |
nicht gespeichert |
5 |
Länge |
laenge |
B3(B1) |
|
6 |
Gültigkeit |
gueltigkeit |
G1 |
|
7 |
...nur für |
nur |
G2 |
|
8 |
vmax |
vmax |
G3 |
|
Anfangs- und Endpunkt zeigen je auf ein Element vom Typ Punkt. Sie bestimmen, von wo nach wo die Linie geht, welche zwei Punkte sie miteinander verbindet.
Strecke ist eine andere Darstellungsart von Anfangs- und Endpunkt, zusammengefasst zu einem einzigen Objekt. Dieses Feld wird benötigt, damit eine Marke darauf referenzieren kann.
die angezeigte Strecke kann vom Wert des Feldes Strecke abweichen, wenn einer der Endpunkte (oder beide) eine Weiche ist. In einem solchen Fall hört, durch die Darstellung der Weiche bedingt, die Linie etwas vor dem Punkt auf. Um das Datenmodell sauber zu halten, muss deshalb ein Objekt vom Typ Punkt eine Zugriffsmethode "koordinaten" bereitstellen, welche für die Berechnung des Feldes Strecke benutzt werden kann, und eine weitere Methode "angriffspunkt: fuerLinie", welche die gesuchten Werte für das Feld der angezeigten Strecke liefert. Im Fall eines reinen Punktes (oder einer Ecke) sind die beiden Methoden gleich.
die Länge der Strecke (nicht der angezeigten Strecke) ist wichtig für die Lage von relativ zur Strecke positionierten Marken.
die Gültigkeit bezieht sich auf die Selektivität einer Linie nur für Teilnehmer mit einer gewissen Identifikation (so wie in [1] eingeführt).
ebenfalls das Feld "...nur für" legt die Selektivität fest: ob die Linie für alle Teilnehmer, welche im Feld "Gültigkeit" aufgeführt sind, unsichtbar sein soll, oder ob sie nur für sie sichtbar sein soll.
vmax bestimmt die maximale Geschwindigkeit, mit welcher ein Teilnehmer auf dieser Linie verkehren darf.
Zwei Relationen sind im Bauplan definiert, sie zeigen beide auf ein Glied vom Typ Punkt. Da ein Punkt Bescheid wissen möchte, wieviele Linien an ihm angreifen, muss eine Add Notification geschickt werden, wenn eine neue Linie definiert wird (a).
Wird ein Punkt gelöscht, so wird auch die Linie gelöscht (b). Wird ein Punkt verschoben, so muss er dies der Linie melden (c), damit sie ihre Bildschirmdarstellung anpassen kann (und auch ihre Länge). Als Information über einen Punkt interessieren nur seine Koordinaten (d). Wird eine Linie gelöscht, so muss dies dem Punkt mitgeteilt werden (e), damit er seinen Grad anpassen kann. Wird eine Linie verschoben (diese Funktion soll aus Gründen des Komforts vorgesehen werden), so verschieben sich dadurch die Koordinaten der beiden Endpunkte. Da die Punkte nichts gegen einen solchen Eingriff in ihre Datenhoheit einzuwenden haben (denn eigentlich hat eine Linie nichts an ihren Endpunkten herumzuschieben), muss so etwas den Punkten mitgeteilt werden (f). Was einen Punkt von der Linie interessiert, sind seine Koordinaten (g). Da eine Linie nicht im Bauplan des Punkte vorkommt, ist in diese Richtung auch keine Add Rule vorzusehen.
(a) on add notify before and after
(b) on delete cascade and notify before
(c) on change notify before and after
(d) koordinaten
Linie
Punkt
(e) on delete notify before
(f) on change set value
(g) anfang bzw. ende
Linien-Index
Er dient hauptsächlich zur Vermeidung von doppelt geführten Linien. Darum muss er unique sein. Da Linien ungerichtet sind, muss dem auch der Index Rechnung tragen und die Punkte nicht der Reihe nach als Referenz-Wert zusammensetzen, sondern der Grösse nach geordnet. Das Ordnungsprinzip (welcher Punkt von beiden ist grösser?) ist so gewählt, dass zuerst die x-Koordinaten der Punkte verglichen werden, und wenn diese gleich sind, die y-Koordinaten.
Für den Index aller Unterklassen, die gerichtete Linien darstellen, kann dieser zusätzliche Aufwand entfallen.
Folgende Felder definieren den Index einer Linie:
Nummer |
Zweck |
Methode |
Attribut |
Bemerkungen |
1 |
Anfangspunkt |
anfang |
R1 |
nicht gespeichert |
2 |
Endpunkt |
ende |
R2 |
nicht gespeichert |
3 |
Referenz-Wert |
ref |
B1(R1,R2) |
nicht gespeichert |
(a) on add weigh and notify after
(b) on delete cascade
(c) on change weigh and notify after
(d) (anfang, ende)
Linien-Index
Linie
(e) on delete ignore
(f) on change restrict
(g) (anfang, ende)
Wird eine Linie neu definiert, so muss beim Erstellen des Indexeintrages überprüft werden, ob sie erlaubt ist (a). Ist sie erlaubt, so muss anschliessend der Indexeintrag generiert werden (darum notify after). Wird einer der beiden Endpunkte verschoben, so darf dadurch nicht eine Doppeltführung der Linie entstehen (c). Die Relation zeigt auf beide Endpunkte der Linie gleichzeitig (d).