freemapperEnglish

Handbuch › freemapper-print

11. Abdeckungen für Fenster- und Korridor-OL

Beim Fenster-OL zeigt das Blatt die Karte nur in kleinen Fenstern um die Posten, dazwischen ist das Papier weiß. Die Läufer überbrücken die Lücken mit Kompass und Entfernungsgefühl und lesen erst im nächsten Fenster wieder Karte.

Beim Korridor-OL zeigt das Blatt die Karte nur in einem schmalen Streifen, und alle Posten liegen darin. Wer den Korridor verlässt, hat keine Karte mehr, also muss man die Richtung genau halten.

Für beides gibt es in der Projektdatei Abdeckungen ([[masks]]). Eine Abdeckung verbirgt die Karte in einer Fläche. Sie gehört zur Zuordnung einer Bahn und gilt nur auf deren Blatt. Nie abgedeckt werden der Bahnaufdruck (Start, Posten, Strecken, Nummern, Ziel und die Sonderobjekte), der Beschreibungskasten, der Titelblock, die Kontrollstrecke, andere Blattelemente, die Rahmenlinie und die Fußzeile. Auch die Strecken zwischen den Fenstern druckt das Programm immer, denn die Läufer brauchen die Richtung, und ohne die Linie gewinnt das Training nichts.

Zwei Beispiele gehen alles mit jedem Befehl durch: examples/gleisdreieck-training-window für Fenster-OL und examples/gleisdreieck-training-corridor für Korridor-OL.

Die Abdeckung in der Projektdatei

[[assignments]]
course = "Fenster"
layout = "a4-4000"
mask = "halbe-karte"

[[masks]]
id = "halbe-karte"
polygons = [
    [
        [[0.0, -110.0], [150.0, -110.0], [150.0, 110.0], [0.0, 110.0]],
        [[40.0, -75.0], [60.0, -75.0], [60.0, -55.0], [40.0, -55.0]],
        [[70.0, 0.0], [90.0, 0.0], [90.0, 25.0], [70.0, 25.0]],
    ],
]

Diese Abdeckung verbirgt auf dem Blatt einer Bahn „Fenster“ die östliche Hälfte der Karte und lässt darin zwei eckige Fenster offen.

  • id ist der Name der Abdeckung: 1 bis 64 Zeichen, keine Steuerzeichen, in der Datei nur einmal.
  • polygons ist eine Liste von Polygonen. Jedes Polygon ist eine Liste von Ringen, jeder Ring eine Liste von Punkten [x, y]. Der erste Ring ist der Umriss, jeder weitere ein Loch, also ein Fenster. Den ersten Punkt am Ende zu wiederholen ist nicht nötig. Ob ein Ring im oder gegen den Uhrzeigersinn läuft, ist gleich.
  • Abgedeckt ist, was im Umriss liegt und in keinem seiner Löcher. Außerhalb jedes Umrisses und in jedem Loch zeigt das Blatt die Karte. Löcher dürfen sich überlappen, sie verschmelzen dann zu einem Fenster. Das gilt für Abdeckungen, die Sie selbst schreiben; masks window hält seine Fenster auseinander, siehe unten.
  • Die Punkte sind Millimeter auf der Karte im Kartenmaßstab mit der y-Achse nach oben, genau so, wie OOM sie in der Statusleiste anzeigt, wenn die Koordinatenanzeige auf Kartenkoordinaten steht. Das ist dieselbe Regel wie bei centre_map_mm (Kapitel 6). Die .omap-Datei speichert y nach unten. Wer Punkte von dort kopiert, bekommt eine gespiegelte Abdeckung, und check meldet dann meist, dass die Abdeckung den ganzen Kartenausschnitt verbirgt oder nichts.
  • In [[assignments]] nennt mask die Abdeckung, mit der die Bahn gedruckt wird. Eine Bahn hat höchstens eine Abdeckung, mehrere Bahnen dürfen dieselbe nutzen. Eine Bahn ohne mask bekommt die Abdeckflächen (White-out) ihrer Bahndatei, siehe unten.

Eine Abdeckung, die keine Bahn nutzt, meldet check einmal als Information.

Fenster um die Posten: masks window

Den Normalfall des Fenster-OL schreibt das Programm selbst: ein rundes Fenster um jeden Posten einer Bahn.

freemapper-print masks window stadtsprint --course A --radius 15 --assign
OptionBedeutung
--course <NAME>die Bahn, wie in der Bahndatei. Ihre Posten bekommen die Fenster, ihr Layout gibt den Druckmaßstab. Pflicht.
--controls <LISTE|BEREICH>welche Posten ein Fenster bekommen: Codes mit Kommas dazwischen (31,32,35) oder die Postennummern auf dem Blatt als Bereich (3-6). Im Bereich zählen Start und Ziel nicht mit. Ohne Angabe jeder Posten. Start und Ziel bekommen ihr Fenster in jedem Fall.
--radius <MM>Radius jedes Fensters, 1 bis 100 mm. Ohne Angabe 15.
--radius-for <CODE=MM>eigener Radius für einen Posten, etwa 35=20. Der Start hat meist den Code STA1, das Ziel FIN1. Darf mehrmals stehen, nur für Posten, die ein Fenster bekommen.
--gap <MM>kleinster Abstand zwischen den Rändern zweier Fenster, 1 bis 100 mm. Ohne Angabe 3.
--no-startder Start bekommt kein Fenster
--no-finishdas Ziel bekommt kein Fenster
--id <ID>ID der neuen Abdeckung. Ohne Angabe window-<Bahn>, mit angehängter Nummer (-2, -3 …), wenn es die schon gibt.
--assigndie Bahn wird mit der neuen Abdeckung gedruckt: Ihre Zuordnung bekommt mask, oder eine neue Zuordnung kommt hinzu.

Der Radius gilt in Millimetern auf dem Papier, im Druckmaßstab des Layouts, auf dem die Bahn gedruckt wird. Ein Fenster sieht deshalb in jedem Maßstab gleich groß aus und zeigt bei größerem Maßstab weniger Gelände: 15 mm sind bei 1:4000 60 m, bei 1:3000 45 m. Das Programm rechnet den Radius selbst in Karten-mm um, und die Abdeckung behält die Karten-mm. Ändern Sie später den Druckmaßstab des Layouts oder geben Sie die Abdeckung einer Bahn auf einem Layout mit anderem Maßstab, haben die Fenster nicht mehr den gewünschten Radius. Löschen Sie dann die Abdeckung und rufen Sie den Befehl noch einmal auf. Der Kommentar über der Tabelle nennt den Maßstab, für den sie entstand.

Auch Start und Ziel bekommen ein Fenster, damit sich die Läufer am Start orientieren können. --no-start und --no-finish lassen sie weg; dann sagt der Befehl das, und check meldet sie unter der Abdeckung. Ein Fenster ist ein Vieleck mit mindestens 48 Ecken, das höchstens 0,05 mm vom Kreis abweicht. Der Umriss ist ein Rechteck 100 mm außerhalb der Karte, sodass kein Teil der Karte daran vorbeischaut.

Die Fenster überlappen nicht. Zwischen den Rändern zweier Fenster bleibt mindestens der Abstand von --gap frei, in Millimetern auf dem Papier wie der Radius. Ohne Angabe sind es 3 mm, bei 1:4000 also 12 m im Gelände. Liegen zwei Posten dafür zu nah, werden beide Fenster kleiner, bis genau dieser Abstand bleibt. Jedes gibt im Verhältnis seines gewünschten Radius nach, auch ein Fenster mit eigenem Radius aus --radius-for, und Start und Ziel zählen wie jedes andere Fenster. Hat ein Fenster mehrere Nachbarn, die zu nah liegen, kommt das engste Paar zuerst dran; die anderen teilen sich den Platz, der dann bleibt. Für jedes verkleinerte Fenster schreibt der Befehl eine Zeile, und der Kommentar über der Tabelle wiederholt sie.

Kleiner als 5 mm Radius wird kein Fenster, sonst passt der Postenkreis nicht mehr hinein. Bräuchte der Abstand das, schreibt der Befehl nichts, nennt die beiden Posten und ihren Abstand auf dem Papier und endet mit Exit-Code 2. Lassen Sie dann einen der beiden weg, mit --controls, --no-start oder --no-finish, oder geben Sie einen kleineren --gap an; die Meldung nennt den größten, der noch passt. Eine Abdeckung, die Sie von Hand schreiben, prüft das Programm nicht auf den Abstand. Dort dürfen Fenster überlappen.

Die Ausgabe aus gleisdreieck-training-window:

Abdeckung „window-A“ in ./freemapper-print.toml eingetragen: 10 Fenster mit 15 mm Radius auf dem Papier bei 1:4000 um den Start, die Posten 31, 32, 33, 34, 35, 36, 37 und 38 und das Ziel der Bahn „A“, mindestens 3 mm auseinander.
Posten 34 hat ein Fenster mit 20 mm Radius.
Die Bahn „A“ wird jetzt damit gedruckt, auf Layout a4-a.
Mit check sehen Sie das Ergebnis.

Hier bleibt jedes Fenster bei seinem Radius, denn die Posten liegen weit genug auseinander. Mit --radius 30 statt der Voreinstellung kämen für die verkleinerten Fenster Zeilen wie diese dazu, gekürzt:

Der Start hat ein Fenster mit 25,25 mm Radius statt 30 mm, damit der Abstand bleibt.
Posten 31 hat ein Fenster mit 25,25 mm Radius statt 30 mm, damit der Abstand bleibt.
Posten 34 hat ein Fenster mit 19,73 mm Radius statt 30 mm, damit der Abstand bleibt.
Das Ziel hat ein Fenster mit 19,73 mm Radius statt 30 mm, damit der Abstand bleibt.

A4-Blatt hochkant, auf dem die Karte nur in zehn getrennten runden Fenstern um Start, Posten und Ziel zu sehen ist, dazwischen weißes Papier mit den violetten Strecken

Die Bahn „A“ mit Abdeckung für Fenster-OL (masks window --course A --assign, sonst nur Voreinstellungen): zehn Fenster mit 15 mm Radius auf dem Papier um Start, Posten und Ziel. Keins berührt ein anderes. Zwischen ihnen bleibt weißes Papier. Karte: Remo Madella, MOO Challenge Berlin 2025.

Ein Korridor entlang einer Linie: masks corridor

Einen automatischen Korridor gibt es nicht. Kein Regelwerk legt fest, wo ein Korridor verläuft; das entscheidet der Bahnleger. Sie geben die Linie vor, das Programm macht daraus den Streifen.

freemapper-print masks corridor stadtsprint --points "-92,2.3;-60,4.4;-28,-2.5;-15.5,58.5" --width 12 --assign --course A
OptionBedeutung
--points <X,Y;X,Y;…>die Linie als Punkte in Karten-mm mit der y-Achse nach oben, wie OOMs Statusleiste sie zeigt, Dezimalstellen mit Punkt. Mindestens 2 verschiedene Punkte, höchstens 1000. Pflicht.
--width <MM>Breite des Korridors, 1 bis 100 mm. Ohne Angabe 10.
--course <NAME>die Bahn, deren Layout den Druckmaßstab für die Breite gibt
--assigndie Bahn aus --course wird mit dem Korridor gedruckt. Braucht --course.
--id <ID>ID der neuen Abdeckung. Ohne Angabe corridor-<n> mit der ersten freien Nummer.

Die Punkte suchen Sie in OOM: Zeigen Sie auf eine Stelle der Straße und lesen Sie die beiden Zahlen in der Statusleiste ab, genau wie für centre_map_mm. Setzen Sie einen Punkt an jede Kreuzung und an jeden Knick und achten Sie darauf, dass jeder Posten der Bahn im Korridor liegt.

Auch die Breite gilt in Millimetern auf dem Papier: mit --course im Druckmaßstab des Layouts dieser Bahn, sonst im Druckmaßstab, den alle Layouts gemeinsam haben. Drucken die Layouts in verschiedenen Maßstäben, verlangt der Befehl --course. Wie beim Radius behält die Abdeckung die Breite in Karten-mm. Nach einem neuen Druckmaßstab löschen Sie die Abdeckung und rufen den Befehl noch einmal auf. Der Korridor reicht die halbe Breite zu jeder Seite der Linie und ist an seinen Enden gerade abgeschnitten. Ein Knick bis 120° behält außen eine spitze Ecke, ein schärferer wird abgeschrägt. Das Programm lehnt einen Korridor ab, der auf sich selbst zurückläuft, ein Stück hat, das für den Knick an seinem Ende zu kurz ist, oder sich selbst kreuzt. Vereinfachen Sie dann die Linie an der genannten Stelle oder nehmen Sie eine kleinere Breite. Das Programm repariert die Linie nicht selbst.

Der Kommentar über der neuen Tabelle wiederholt die Punkte als --points "…", damit Sie den Befehl später wieder aufrufen können. Eine Abzweigung oder einen zweiten Korridor für dieselbe Bahn schreibt der Befehl nicht. Rufen Sie ihn dafür ohne --assign mit --id für jedes Stück auf und kopieren Sie danach den zweiten Ring (das Loch) des einen Stücks in das Polygon des anderen. Löcher dürfen sich überlappen. Die Tabelle, die Sie dann nicht mehr brauchen, löschen Sie.

Querformatiges Blatt mit einem schmalen Streifen Karte, der entlang der Strecken durch alle fünf Posten führt und sich selbst kreuzt, sonst weißes Papier; oben rechts der Beschreibungskasten

Die Bahn „B“ mit Korridor-Abdeckung (masks corridor --width 12) auf einem Blatt von 190 mm × 160 mm (page_mm). Die Strecken 1–2 und 4–5 der Bahn kreuzen sich, deshalb ist der Korridor in zwei Stücken gemacht und zusammengeführt, wie oben beschrieben. Karte: Remo Madella, MOO Challenge Berlin 2025.

Was beide Befehle in die Datei schreiben

Beide hängen die neue Tabelle [[masks]] als Text ans Ende der Projektdatei, mit einem Kommentar, wie sie entstand. Mit --assign bekommt die Zuordnung der Bahn eine Zeile mask = "…" direkt unter ihrer Kopfzeile [[assignments]], oder eine neue Zuordnung folgt nach der Tabelle. Alles andere bleibt, wie es ist, auch die Kommentare und die Zeilenenden. Danach lädt das Programm die Datei neu und stellt den alten Inhalt wieder her, wenn das scheitert.

Eine vorhandene Abdeckung ändern die Befehle nie. Eine ID, die es schon gibt, und eine Bahn, die schon mit einer anderen Abdeckung gedruckt wird, lehnen sie mit Exit-Code 2 ab. Für einen neuen Radius oder eine neue Linie löschen Sie die Tabelle und die Zeile mask = "…" und rufen den Befehl noch einmal auf. Danach zeigt check das Ergebnis.

Abdeckflächen aus Purple Pen

Purple Pen kennt Abdeckflächen (White-out). Das Programm druckt sie als Abdeckungen mit den IDs whiteout-<n>, wobei n die Nummer ist, die Purple Pen der Fläche gegeben hat (nicht immer 1, 2 …), auf den Bahnen, für die sie in Purple Pen gelten. Eine Bahn ohne mask in ihrer Zuordnung bekommt jede ihrer Abdeckflächen, jede für sich, auch wenn sie sich überlappen. check nennt die Abdeckflächen einmal zur Information.

  • Nennt die Zuordnung einer Bahn eine eigene Abdeckung, gilt nur diese, und die Abdeckflächen fallen für diese Bahn weg.
  • mask = "whiteout-101" druckt die Bahn nur mit der Abdeckfläche mit der Nummer 101.
  • Eine Tabelle [[masks]] mit der ID whiteout-101 tritt an die Stelle der Abdeckfläche mit der Nummer 101.
  • Hat die Bahndatei die genannte Abdeckfläche nicht mehr, meldet check das, und die Bahn wird ohne Abdeckung gedruckt. Die Zuordnung bleibt in der Projektdatei.

Die Nummer in whiteout-<n> ist Purple Pens eigene Nummer der Fläche. Sie bleibt, wenn Sie eine andere Abdeckfläche löschen oder die Reihenfolge ändern. Nur eine Bahndatei ohne solche Nummern (nicht aus Purple Pen 4) fällt auf die Stelle in der Datei zurück; dann kann whiteout-2 nach einem Löschen eine andere Fläche meinen. Prüfen Sie nach einer solchen Änderung die Zuordnungen und die Tabellen [[masks]]. Dabei hilft check mit einer Zeile zur Information für jede Bahn, deren Zuordnung eine Abdeckfläche mit ihrer Nummer nennt oder auf deren Blatt eine Tabelle [[masks]] an die Stelle einer Abdeckfläche tritt. Die Zeile nennt die Mitte der Fläche in Karten-mm mit der y-Achse nach oben, so finden Sie sie in OOM.

Ein Blatt wendet höchstens 1000 Abdeckungen an. Hat eine Bahn mehr Abdeckflächen, fehlen die übrigen, und check warnt.

Was check zu Abdeckungen meldet

check prüft jedes Blatt gegen die Abdeckungen, die es anwendet. Die Meldungen stehen mit ihrer Abhilfe in Kapitel 10; hier, wann sie kommen:

  • Ein Posten, der Start, das Ziel oder ein Kartenwechsel liegt mit seinem Mittelpunkt in einer abgedeckten Fläche (Hinweis). Beim Fenster-OL fehlt meist ein Fenster, beim Korridor-OL liegt der Posten neben dem Korridor. Ergänzen Sie das Fenster, verlegen Sie die Linie, oder prüfen Sie, ob die Zuordnung die richtige Abdeckung nennt.
  • Pflichtstrecken, Querungsstellen, verbotene Strecken, Sperrgebiete und ihre Grenzen, Gefahrengebiete oder Texte der Bahndatei liegen ganz oder teilweise unter der Abdeckung (Hinweis, je Art mit ihrer Zahl). Der Läufer sähe sie ohne Karte darunter. Vergrößern Sie ein Fenster oder legen Sie eins an; ist es gewollt, lassen Sie den Hinweis stehen. Gewöhnliche Strecken und Postennummern zählen nicht.
  • Die Abdeckung verbirgt den ganzen Kartenausschnitt (Hinweis). Meist ist y falsch herum geschrieben.
  • Ein Blattelement oder die Fußzeile deckt im Kartenausschnitt einen Teil eines Fensters ab (Hinweis).
  • Die Abdeckung verbirgt im Kartenausschnitt nichts (Information). Abdeckflächen aus Purple Pen, die nichts verbergen, stehen in einer Zeile je Bahn.
  • Die Prüfung hat ihre Grenze erreicht, höchstens 200 000 Punkte und 50 Millionen Rechenschritte je Blatt (Hinweis). Sehen Sie sich das Blatt an.
  • Keine Bahn nutzt eine Abdeckung (Information, einmal je Lauf).

Grenzen

Was das Programm noch nicht kann:

  • Es legt keinen Korridor von selbst und keine Fenster um Strecken. Andere Formen als Kreise und Korridore schreiben Sie von Hand.
  • Die Befehle ändern und ersetzen keine Abdeckung. Der Editor (Kapitel 12) zeichnet Abdeckungen, ersetzt aber auch keine; zum Ändern bearbeiten Sie die Datei oder nehmen eine neue Kennung.
  • Ein Layoutblatt ohne Bahn (export --layout) hat keine Abdeckung.
  • Nordlinien, die das Programm ohne Symbol 601 im Symbolsatz ergänzt, liegen auf der Blattebene und bleiben über dem abgedeckten Papier sichtbar (Kapitel 6, „Nordlinien“). Die Nordlinien der Karte verschwinden mit der Karte.
  • Eine Abdeckfläche aus Purple Pen, deren Ring sich selbst kreuzt, prüft das Programm nicht. Eine Schleife, die gegen den Rest läuft, zeigt dort die Karte, wo Purple Pen sie abdeckt.

Für Abdeckungen, die Sie von Hand schreiben, prüft das Programm beim Laden:

RegelGrund
Ein Ring hat mindestens 3 verschiedene Punkte, die nicht auf einer Linie liegen.Sonst umschließt er keine Fläche.
Ein Ring kreuzt und berührt sich nicht selbst.Bei einem Ring, der sich kreuzt, ist nicht klar, was innen liegt.
Ein Loch liegt ganz im Umriss seines Polygons und berührt ihn nicht.Ein Loch außerhalb des Umrisses deckt nichts auf; was gemeint war, bleibt offen.
Die Umrisse einer Abdeckung überlappen sich nicht, berühren sich nicht und liegen nicht ineinander.In einer Überlappung würde die Karte wieder sichtbar. Für zwei Flächen, die sich berühren, zeichnen Sie einen Umriss um beide.
Jede Zahl ist endlich und liegt zwischen −2 000 000 und 2 000 000 mm.Das ist die Reichweite einer OOM-Karte.
Höchstens 64 Abdeckungen je Datei, 256 Polygone je Abdeckung, 4096 Punkte je Ring, 100 000 Punkte in der ganzen Datei, 100 Millionen Rechenschritte für alle Prüfungen zusammen.Die Grenzen schützen vor kaputten oder feindlichen Dateien. Ein Fenster aus masks window hat etwa 50 Punkte, die zehn Fenster aus gleisdreieck-training-window zusammen etwa 500.
Die Projektdatei ist höchstens 16 MB groß.Die Abdeckungen einer Datei innerhalb der übrigen Grenzen brauchen höchstens etwa 4 MB. Eine größere Datei würde beim Lesen Gigabytes an Speicher belegen, bevor diese Grenzen sie ablehnen könnten.

Eine verletzte Regel hält check und export an. Die Meldung ist vorerst englisch und nennt Datei, Zeile, Spalte und das Feld, zum Beispiel:

./freemapper-print.toml:74:9: field `masks[0].polygons[0][2]`: the hole must lie wholly inside the outline of its polygon (the first ring) and not touch it

polygons[0][2] ist der dritte Ring des ersten Polygons, also das zweite Loch.

Fehler der Befehle

Diese Meldungen beenden masks window und masks corridor mit Exit-Code 2, die Projektdatei bleibt unverändert:

  • „die Projektdatei hat schon eine Abdeckung …“: Wählen Sie mit --id eine andere ID.
  • „die Bahn … wird schon mit der Abdeckung … gedruckt“: Ändern Sie die Zuordnung von Hand; das Programm ersetzt keine Abdeckung.
  • „die Zuordnung der Bahn … steht nicht als eigene Tabelle [[assignments]] in der Datei …“: Tragen Sie mask = "…" von Hand ein. „die Zuordnungen stehen nicht als Tabellen [[assignments]] in der Datei …“ kommt für eine Bahn ohne Zuordnung, wenn die Datei ihre Zuordnungen als assignments = [...] schreibt: Tragen Sie die Zuordnung mit mask = "…" von Hand ein.
  • „… mm liegt außerhalb von 1 bis 100 mm …“: Radius, Breite und Abstand sind Druck-mm.
  • „… liegen auf dem Papier nur … mm auseinander, zu nah für zwei Fenster …“: Lassen Sie einen der beiden Posten weg, oder geben Sie einen kleineren --gap an, höchstens den Wert, den die Meldung nennt.
  • „--controls nimmt Postencodes mit Kommas dazwischen …“ und „die Bahn … hat die Postennummern 1 bis …“: Prüfen Sie die Auswahl.
  • „Posten … bekommt kein Fenster, deshalb kann --radius-for seinen Radius nicht setzen“: Nehmen Sie den Posten in --controls auf oder lassen Sie --radius-for für ihn weg.
  • „--points nimmt Punkte als x,y;x,y;… in Karten-mm …“: Trennen Sie die Punkte mit Semikolon, x und y mit Komma, Dezimalstellen mit Punkt.
  • „der Korridor knickt bei … für seine Breite zu scharf ab …“ und „der Korridor kreuzt sich selbst bei …“: Vereinfachen Sie die Linie dort oder verringern Sie die Breite.
  • „die Layouts drucken in verschiedenen Maßstäben …“: Geben Sie --course an.

Mit Exit-Code 1 endet ein Befehl, wenn sich Projekt, Karte oder Bahndatei nicht laden oder die Datei nicht schreiben lässt, oder wenn die geänderte Datei nicht lädt. Im letzten Fall stellt das Programm den alten Inhalt wieder her.

Stand: v0.11.0 · Quelle auf GitHub