lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ src render surface.ts

3,0 KB Rohdatei
src/render/surface.ts — 93 Zeilen
1 /**
2 * Abstrakte Zeichenflaeche.
3 *
4 * Der Signalzeitenplan wird genau einmal beschrieben (siehe signalPlanDrawing.ts)
5 * und auf zwei Flaechen ausgegeben: auf die Bildschirmleinwand und in das PDF.
6 * Der Altbestand hatte zwei getrennte Zeichenroutinen; sie liefen auseinander,
7 * sodass der Ausdruck andere Signalbilder zeigte als der Bildschirm.
8 *
9 * Alle Koordinaten in Punkten mit Ursprung links oben.
10 */
11
12 export interface TextStyle {
13 readonly size: number;
14 readonly bold?: boolean;
15 readonly color?: string;
16 readonly align?: 'links' | 'mitte' | 'rechts';
17 readonly baseline?: 'oben' | 'mitte' | 'unten';
18 }
19
20 export interface Surface {
21 /** Nutzbare Breite der Flaeche. */
22 readonly width: number;
23 /** Nutzbare Hoehe der Flaeche. */
24 readonly height: number;
25
26 rect(x: number, y: number, width: number, height: number, fill: string): void;
27 /**
28 * Gefuelltes Vieleck - fuer das Band des Zeit-Weg-Diagramms.
29 *
30 * WARUM DIE FLAECHE UND NICHT NUR ZWEI LINIEN: Das Band einer Gruenen Welle
31 * ist ein Parallelogramm ueber Zeit und Weg; seine AUSDEHNUNG ist die
32 * Aussage. Zwei Randlinien zeigen zwei Fahrten, nicht den Bereich dazwischen,
33 * und ein schraeges Band laesst sich mit `rect` nicht bilden.
34 *
35 * Weniger als drei Punkte zeichnen nichts: Eine Flaeche aus zwei Punkten hat
36 * keinen Inhalt, und eine Umrandung waere hier die falsche Ersatzhandlung.
37 */
38 polygon(points: readonly { readonly x: number; readonly y: number }[], fill: string): void;
39 strokeRect(
40 x: number,
41 y: number,
42 width: number,
43 height: number,
44 color: string,
45 lineWidth?: number,
46 ): void;
47 line(x1: number, y1: number, x2: number, y2: number, color: string, lineWidth?: number): void;
48 /** Gestrichelte Linie fuer Hilfslinien. */
49 dashedLine(
50 x1: number,
51 y1: number,
52 x2: number,
53 y2: number,
54 color: string,
55 lineWidth?: number,
56 ): void;
57 /**
58 * Kreis mit Fuellung und Umriss - fuer den Signalgeber auf dem Lageplanblatt.
59 *
60 * BEIDE ZUGLEICH und nicht zwei Befehle: Ein Signalgebersinnbild ist ein
61 * gefuellter Kreis MIT Rand; in zwei Aufrufen zerlegt, liefe es auf beiden
62 * Flaechen mit verschiedener Rundung auseinander, und ueber dem Luftbild
63 * saehe man den Spalt.
64 *
65 * `fill` darf leer bleiben - dann wird nur der Umriss gezeichnet.
66 */
67 circle(
68 x: number,
69 y: number,
70 radius: number,
71 fill: string,
72 stroke: string,
73 lineWidth?: number,
74 ): void;
75 text(value: string, x: number, y: number, style: TextStyle): void;
76 /** Breite eines Textes in der angegebenen Groesse. */
77 measureText(value: string, style: TextStyle): number;
78 }
79
80 /** Kuerzt einen Text so, dass er in die verfuegbare Breite passt. */
81 export function fitText(
82 surface: Surface,
83 value: string,
84 maxWidth: number,
85 style: TextStyle,
86 ): string {
87 if (surface.measureText(value, style) <= maxWidth) return value;
88 let text = value;
89 while (text.length > 1 && surface.measureText(`${text}…`, style) > maxWidth) {
90 text = text.slice(0, -1);
91 }
92 return text.length <= 1 ? '' : `${text}…`;
93 }