{# Fließschema der Prozessflüsse — Grundfließschema in Anlehnung an EN ISO 10628, A3 quer. Gerendert aus /facility/flowsheet. Geometrie kommt fertig aus repos/facility_layout.py, der Graph aus repos/facility_graph.py. Hier wird nur gezeichnet. Seit dem 02.09.2026 A4 QUER mit gemessenem Umbruch — dieselben zwei Bausteine wie beim Container-Ausdruck, beim Protokoll und beim Strukturbericht (docs/formblatt_druck_plan.md §2g, Rezept aus §2d–§2f). Vorher war das hier das letzte Fluss-Dokument: eine lange Spalte auf A3 quer, deren Umbruch allein der Druckdialog machte — ohne Seitenzahl, ohne Kopf und Fuss je Blatt, und ohne dass am Bildschirm zu sehen war, wo die Legende bricht. A4 QUER und nicht A4 hoch: der Graph laeuft von links nach rechts, seine Breite ist die knappe Achse. Hoch blieben 186mm nutzbare Breite statt 273mm — bei einem Schema mit zehn Spalten faellt die Blockschrift damit unter 1mm. Ein Format fuer das ganze Dokument, kein Mischen: `@page`-Regeln je benannter Seite sind genau die Sorte Feature, an der das Protokoll schon einmal gescheitert ist (die Randboxen druckten nie). Die Zeichnung bekommt ihr Blatt per KONSTRUKTION (`.zeichnungsblatt` auf volle Koerperhoehe, danach `.umbruch-neu`) und nicht, weil das Skript sie dort unterbringt. Der Grund ist die Regel des Bausteins: was unteilbar ist und nicht passt, wird sichtbar abgeschnitten. Bei einer Tabelle ist das die richtige Wahl — bei einem Graphen nicht: eine abgeschnittene Kante liest sich als Austritt, das Blatt waere dann nicht unvollstaendig, sondern falsch. Als SVG mit viewBox in einer Box fester Hoehe kann der Fall gar nicht eintreten; wird die Zeichnung dabei zu klein, sagt das Blatt es (Hinweis aus der Route, dort auch gerechnet). Bewusst „in Anlehnung an": ein Grundfließschema (Blöcke, Medienpfeile, Ein-/Austritte) ist mit den vorhandenen Daten vollständig darstellbar. Ein Verfahrensfließschema verlangt Apparatesymbole und eine Stromtabelle (Menge, Druck, Temperatur, Aggregatzustand) — die Daten dafür gibt es nicht, und ein Blatt, das so tut, wäre schlimmer als keines. Der Hinweis dazu steht im Schriftfeld, nicht im Kleingedruckten. #} Fließschema {% import 'docs/_leiste.html' as ui %} {# seiten=true: seit dem gemessenen Umbruch kennt auch dieses Blatt seine Seitenzahl — vorher wusste es nicht, was der Drucker aus ihm macht. #} {% call ui.leiste(etikett='Fließschema', seiten=true, zurueck_url=zurueck_url, zurueck_text='Zurück zur Anlagenübersicht') -%} Stand {{ datenstand }} · {% if gegenstand_text %}{{ gegenstand_text }} · {% endif %} {{ ausschnitt_text }} · {{ tiefe_text }} · {{ layout.knoten | length }} Blöcke, {{ layout.kanten | length }} Verbindungen {%- endcall %}
{{ branding.company_name }} Logo
FLIESSSCHEMA
Grundfließschema in Anlehnung an EN ISO 10628
{# Der Kopf traegt nur noch, was der Leser BEIM ANSEHEN der Zeichnung braucht: welcher Prozess, welcher Ausschnitt, welcher Stand. Das volle Gitter (Blöcke, Verbindungen, Detailtiefe, Kontext) stand hier bis zum Umbau doppelt — es sagte dasselbe wie das Schriftfeld am Ende. Jetzt steht es dort einmal, und die 20mm, die es hier kostete, gehoeren der Zeichnung. #}
{# Der Gegenstand steht ZUERST: er beantwortet die Frage, mit der der Leser das Blatt aufgeschlagen hat („welcher Prozess ist das?"). Ohne ?fluss= gibt es keinen — dann fehlt die Zeile, statt „alle" zu behaupten. #} {% if gegenstand_text %}
Gegenstand{{ gegenstand_text }}
{% endif %} {# Der Kontext bleibt im Kopf und wandert NICHT ins Schriftfeld: er erklaert die blassen Linien, und die stehen auf DIESEM Blatt. Die Legende, die dasselbe noch einmal sagt, liegt seit dem Umbau eine Seite weiter — auf dem Zeichnungsblatt muss der Satz stehen. #} {% if kontext_text %}
Kontext{{ kontext_text }}
{% endif %}
Ausschnitt{{ ausschnitt_text }} · {{ tiefe_text }}
Stand{{ datenstand }} · {{ layout.knoten | length }} Blöcke, {{ layout.kanten | length }} Verbindungen
{% if layout.knoten %} {% for pfeil in pfeile %} {% endfor %} {# Erst die Kanten, dann die Blöcke: so verschwindet eine Linie unter dem Block, in den sie mündet, statt darüber zu liegen. LEITUNGSBRÜCKE: jede Kante wird zweimal gezogen — erst weiß und breiter, dann in ihrer Farbe. Dadurch unterbricht die später gezeichnete Linie die früheren an jeder Kreuzung, und ein Kreuz liest sich als Kreuzung statt als Verbindung. Das Layout sorgt dafür, dass zwei Linien nie DECKUNGSGLEICH laufen (repos/facility_layout.py) — nur deshalb ist die Brücke hier harmlos: sie unterbricht immer quer, nie längs. Die weiße Unterlage ist durchgezogen, auch bei gestrichelten Medien: eine gestrichelte Brücke wäre keine. #} {# GEGENSTAND UND KONTEXT. Ist ein Fluss als Gegenstand des Blattes angefordert (?fluss=), werden die Linien der ÜBRIGEN Flüsse blass gezeichnet — nicht weggelassen. Ein Prüfraum mit Kraftstoffzulauf und ohne Abgasweg wäre kein sparsameres Fließbild, sondern ein falsches. Die weiße Leitungsbrücke bleibt voll deckend: sie ist kein Zeichen, sondern das Loch, durch das die kreuzende Linie sichtbar wird. #} {% for kante in layout.kanten %} {# Die beteiligten Flüsse liegen ohnehin am Graphen; ohne diesen Titel erklärt am Bildschirm nichts, wofür die „(3)" hinter dem Medium steht. Im Ausdruck ändert er nichts. #} {{ kante.medium or 'ohne Medium' }}: {{ kante.fluesse | map(attribute='name') | join(', ') }}{% if kante.fremd %} (Kontext){% endif %} {% endfor %} {% for k in layout.knoten %} {# Der Block führt in die 3D-Ansicht zurück. Im Ausdruck ist der Anker wirkungslos, am Bildschirm ist er der Rückweg (§8 des Plans). #} {# Ein Block, an dem AUSSCHLIESSLICH fremde Linien hängen, gehört zum Kontext und wird mit ihnen blass. Ein Block ohne jede Linie bleibt normal: „nicht angeschlossen" ist eine Aussage über den Ausschnitt, nicht über den Fluss. #} {# Ein Umgebungsknoten hat kein Sprungziel (es gibt nichts, wohin die Kamera fliegen koennte) — dafuer traegt er seinen Hinweis aus dem Katalog. Am Bildschirm erklaerend, im Ausdruck wirkungslos. #} {% if k.viewer_url %}{{ k.viewer_titel }} {% elif k.hinweis %}{{ k.hinweis }}{% endif %} {% set env = k.art == 'aussenknoten' %} {# TEXTACHSE. Alles ausser der Umgebung steht in einem Kasten und schreibt mittig hinein. Die Umgebung hat keinen — ihre Schrift haengt an der Seite, an der die Linie ankommt, sonst zeigt der Pfeil ins Leere und das Wort steht daneben. #} {% set anker = 'start' if (env and k.anschluss == 'links') else ('end' if (env and k.anschluss == 'rechts') else 'middle') %} {# Eine Fahne laeuft rechts in eine Spitze aus (15 Einheiten breit) — mittig ueber die volle Breite gesetzt, haengt ihre Schrift links heraus. Sie zentriert deshalb ueber dem RECHTECKIGEN Teil. #} {% set tx = (k.x + 9) if anker == 'start' else ((k.x + k.b - 9) if anker == 'end' else (k.x + ((k.b - 15) if (k.art != 'einheit' and not env) else k.b) / 2)) %} {# Die Namenszeilen ruecken hoch, wo darunter noch etwas steht: bei der Umgebung die Rolle dicht am Namen (ein freies Etikett soll kompakt sein), bei einer Fahne die Fortsetzungsangabe. #} {% set mitte = (k.h / 2 - 6) if env else ((k.h / 2 - 12) if k.pfad_kurz else k.h / 2) %} {% if k.art == 'einheit' %} {# Sammelanschluss: das Segment haengt am Bereich SELBST, waehrend seine Einheiten daneben stehen. Der Kasten bekommt eine zweite, aeussere Kontur — ein Rahmen um einen Rahmen, wie ihn die Norm fuer eine Gruppe verwendet. Die Unterscheidung ist eine FORM, keine Farbe: das Blatt wird schwarzweiss gedruckt. #} {% if k.sammel %} {% endif %} {% elif not env %} {# BLATTGRENZE. Die Fahne zeigt in Flussrichtung. Sie ist ein VERWEIS: dahinter steht eine echte Einheit, die nur dieser Ausschnitt weggelassen hat. Was sie traegt, ist deshalb eine Fortsetzungsangabe — Kennung, Name und Pfad der Einheit ausserhalb. Die Umgebung bekommt hier bewusst KEINE Form (02.09.2026). Sie hatte bis dahin dieselbe Fahne, nur gestrichelt — also dasselbe Zeichen fuer „laeuft woanders weiter" und fuer „hier endet es", unterschieden durch eine Strichelung, die im Ausdruck neben der gestrichelten Kontur eines Kontextblocks kaum zu halten ist. Ein Strich, der frei an einem Wort endet, sagt dasselbe wie ein Kasten mit dem Wort darin, nur ohne zu behaupten, dahinter stehe noch etwas. #} {% endif %} {# Die Kennung steht am Kasten oben links, an der Fahne dagegen UNTEN in der Fussnote: dort ist sie kein Etikett des Blocks, sondern Teil der Fortsetzungsangabe („4.3 · Austritt · Luft"), und oben links naehme sie der Namenszeile den Platz, den die Pfadzeile darunter schon kostet. #} {% if k.kennung and k.art == 'einheit' %} {{ k.kennung }} {% endif %} {% for zeile in k.zeilen %} {{ zeile }} {% endfor %} {% if k.pfad_kurz %} {# FORTSETZUNGSANGABE, zweiter Teil. „Ventil 3" gibt es im Baum siebenmal; erst der Pfad sagt, welches gemeint ist. Steht die Einheit ganz oben, bleibt die Zeile weg — dann sagt die Kennung „1" schon alles. #} {{ k.pfad_kurz }} {% endif %} {% if k.art != 'einheit' %} {% if env %}Umgebung{% else %}{% if k.kennung %}{{ k.kennung }} · {% endif %}{% if k.art == 'eintritt' %}Eintritt{% else %}Austritt{% endif %}{% endif %} · {{ k.medium or 'ohne Medium' }} {% elif k.sammel %} {# „enthält 38" waere hier eine Luege: der Kasten steht NICHT stellvertretend fuer die 38 — die stehen als eigene Kaesten daneben. #} Anschluss am Bereich selbst {% elif k.enthaelt %} enthält {{ k.enthaelt }} {% endif %} {% endfor %} {# VERBINDUNGSSTELLEN. Zuletzt, damit sie auf dem Kastenrand sitzen und nicht halb darunter. Jede Kante hat seit dem Kanal-Umbau ihren eigenen Anschlusspunkt am Kasten; der Punkt macht sichtbar, dass die Linie dort ENDET und nicht dahinter weiterläuft — bei vielen Leitungen der Unterschied zwischen Anschluss und Kreuzung. Nur am Abgang: am Zulauf steht die Pfeilspitze, zwei Zeichen übereinander wären einer zu viel. #} {% for kante in layout.kanten %} {% endfor %} {% else %}

Für diesen Ausschnitt gibt es keine zeichenbare Verbindung. Entweder ist noch kein Prozessfluss gepflegt, oder die gewählten Blöcke hängen an keinem.

{% endif %}
{# /.zeichnungsblatt — hier endet Blatt 1 #} {# Alles Weitere beginnt auf einem neuen Blatt. Nicht weil es dort schoener aussieht, sondern weil die Zeichnung das erste ganz braucht. #}
{% if medien or hat_sammel or hat_fahne %}

Legende — der Schlüssel zur Zeichnung

{# Die Form des Kastens gehoert genauso in die Legende wie die Farbe des Strichs — sonst raet der Leser, was der doppelte Rahmen bedeutet. #} {% if hat_sammel %} Sammelanschluss Fluss hängt am Bereich selbst, nicht an einer Einheit darin {% endif %} {# Nur die Fahne wird erklaert: sie sagt nicht von selbst, dass Pfad und Kennung darauf ein VERWEIS auf etwas sind, das hier fehlt. Fuer die Umgebung steht hier BEWUSST nichts. Ihr Zeichen waere in der Legende ein Strich mit Pfeilspitze — also genau das, was jede Medienlinie drei Zentimeter weiter rechts auch ist. Der Eintrag erklaerte damit nicht die Umgebung, sondern behauptete, es gebe eine besondere Linienart fuer sie. Auf dem Blatt steht das Wort „Umgebung · " an der Stelle selbst; das ist die Erklaerung, und sie steht dort, wo sie gebraucht wird. #} {% if hat_fahne %} {# Kurz halten. Die Fahne trägt „Eintritt"/„Austritt", Kennung, Name und Pfad bereits auf sich — die Legende muss das nicht nacherzählen, sondern nur sagen, was die FORM bedeutet: es geht weiter. #} Blattgrenze läuft außerhalb weiter {% endif %} {% if kontext_text %} Kontext anderer Fluss: {{ kontext_text }} {% endif %} {% for m in medien %} {{ m.name or 'ohne Medium' }} {{ m.linienart_text }} {% endfor %}
{% if medien %}

An den Linien steht kein Text: welches Medium eine Linie führt, sagt ausschließlich diese Legende. Im Schwarzweiß-Ausdruck trägt dabei die Linienart — führen zwei Medien dieselbe, steht das unten als Befund.

{% endif %} {% endif %} {% if hinweise %} {% for h in hinweise %}

{{ h }}

{% endfor %} {% endif %} {% if graph.befunde %} {# Ueberschrift und Tabelle sind EIN Block: die Befundliste ist als einzige hier unbegrenzt lang, ihre Zeilen duerfen deshalb auf mehrere Blaetter (data-teilbar) — und die Fortsetzung haengt ihre Marke ans erste Kind des Blocks, also an die Ueberschrift. Eine nackte als Block bekaeme ausdruecklich keine. #}

Befunde zum Modell

{% for b in graph.befunde %} {% endfor %}
ArtFeststellungBetroffen
{{ b.art_text }} {{ b.text }} {{ b.namen or '—' }}
{% endif %}
Anlage{{ branding.company_name }}
DokumentGrundfließschema
Ausschnitt{{ ausschnitt_text }} · {{ tiefe_text }}
Datenstand{{ datenstand }}
{# Die zweite Zeile ist der Rest des frueheren Kopfgitters. Sie steht hier und nicht mehr dort: auf dem Zeichnungsblatt kostete sie Hoehe, die die Zeichnung braucht, und wiederholte, was das Schriftfeld ohnehin sagt. #}
Detailtiefe{{ tiefe_text }}
Blöcke{{ layout.knoten | length }}
Verbindungen{{ layout.kanten | length }}
FormatA4 quer
{% if gegenstand_text or kontext_text %} {# Die eine Zeile, die das Blatt bisher schuldig blieb: WELCHER Prozess gemeint ist und was nur mitläuft. Ohne sie liest sich jede blasse Linie als Teil desselben Weges. #}
Auf diesem Blatt {% if gegenstand_text %}{{ gegenstand_text }}{% else %}kein Fluss als Gegenstand angegeben{% endif %}{% if kontext_text %} · zusätzlich {{ kontext_text }} als Kontext (blass) — diese Linien gehören nicht zum Gegenstand des Blattes. Ein durchgehender Weg über beide hinweg ist keine Aussage des Modells.{% endif %}
{% endif %}
Abgeleitet aus der gepflegten Anlagenstruktur (Betriebseinheiten und Prozessflüsse). Darstellung in Anlehnung an EN ISO 10628 als Grundfließschema: Blöcke, Medienbenennung, Ein- und Austritte. Dies ist kein Verfahrensfließschema — Apparatesymbole nach ISO 10628-2 und eine Stoffstromtabelle (Menge, Druck, Temperatur, Aggregatzustand) sind nicht Bestandteil des Datenmodells.