From 0a81fd75faebd052b695d71cdb9bb5731b7be48d Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 2 Oct 2026 13:26:35 +0200 Subject: [PATCH] Legenden-Mindestbreite (Basis #96) dokumentiert - schnittstellen.md Abschnitt 12: Mindestbreite 180 mm (= Kartenschild), Layout-Eigenschaft sn_legende_mindestbreite, Listener in sn_basis.main - fallstricke.md: setMinimumSize wird nicht im Projekt gespeichert - modulkarte.md, STATUS.md, Testkatalog Co-Authored-By: Claude Opus 5.5 --- docs/architektur/modulkarte.md | 4 +-- docs/architektur/schnittstellen.md | 5 +++ docs/status/STATUS.md | 3 +- docs/tests/testkatalog.html | 50 ++++++++++++++++++------------ docs/tests/testkatalog.md | 22 ++++++++----- docs/wissen/fallstricke.md | 3 ++ 6 files changed, 57 insertions(+), 30 deletions(-) diff --git a/docs/architektur/modulkarte.md b/docs/architektur/modulkarte.md index a74b35a..855a2e6 100644 --- a/docs/architektur/modulkarte.md +++ b/docs/architektur/modulkarte.md @@ -58,11 +58,11 @@ Legende: ⚠ = über 600 Zeilen, nie komplett laden, per `grep -n "def "` navigi | `modules/Datenschreiber.py` | 448 | `schreibe_Daten(...)` in GeoPackage, `lade_Layer(...)` ins Projekt, `schreibe_log(...)` HTML-Protokoll | | `modules/print_logic.py` ⚠ | 1 360 | `PrintLogic`, `AtlasConfig`, `RectangleCaptureTool`: Druckbereich, Maßstab, Atlas, Layoutaufruf | | `modules/print_layout.py` ⚠ | 1 127 | `PrintLayout`: Layoutaufbau für § 38 / § 41 (Karte, Legende, Gitter, Schriftfeld) | -| `modules/print_kartenrand.py` | 189 | Kartenrand (Legenden, Quellenangabe, Kartenschild) überlappungsfrei anordnen: 1–3 Legendenspalten, Rand breiter, Seite ggf. höher (#93) | +| `modules/print_kartenrand.py` | 284 | Kartenrand (Legenden, Quellenangabe, Kartenschild) überlappungsfrei anordnen: 1–3 Legendenspalten, Rand breiter, Seite ggf. höher (#93); Legenden-Mindestbreite 180 mm samt Listener für das Neuladen (#96) | | `modules/print_layout_baufreigabe.py` | 403 | Layout „Anlage zur Baufreigabe“ (feste DIN A3/A4 quer) | | `modules/basemap_legende.py` | 471 | Basemap-Legende (#88): Legendenkatalog laden, Styles → Einträge, Auswahl merken, Basemap-Layer erkennen, Auswertebereich; `BasemapLegende.aktualisiere(layout)` als Einstieg | | `modules/basemap_kacheln.py` | 192 | Kacheln des Basemap-Layers kachelweise über `selectByGeometry` auswerten, Renderer-Styles lesen, Zoomstufen wie der QGIS-Renderer | -| `modules/basemap_legende_layout.py` | 465 | Legendensymbole aus Projektlayer-Styles zusammensetzen (weiße Flächen mit Legendenrand, #92), leere Hilfslayer, Legendenelement „Legende Basemap“ schreiben und platzieren | +| `modules/basemap_legende_layout.py` | 471 | Legendensymbole aus Projektlayer-Styles zusammensetzen (weiße Flächen mit Legendenrand, #92), leere Hilfslayer, Legendenelement „Legende Basemap“ schreiben und platzieren | | `modules/basemap_katalog.py` | 418 | Erzeugt/aktualisiert `data/basemap_legende.json` aus der basemap.de-Style-JSON (nur Standardbibliothek, eigenständig aufrufbar) | | `modules/basemap_stilkorrektur.py` | 99 | Darstellungsfehler des Basemap-Layers korrigieren: Punktlinien mit Strichlänge 0 sichtbar machen (#90) | | `modules/basemap_stilvorlagen.py` | 181 | Lokale Stilvorlagen des Basemap-Layers (QML + JSON im QGIS-Profil), Standard in `QSettings` | diff --git a/docs/architektur/schnittstellen.md b/docs/architektur/schnittstellen.md index 41a4768..49e4bd6 100644 --- a/docs/architektur/schnittstellen.md +++ b/docs/architektur/schnittstellen.md @@ -161,3 +161,8 @@ die Elemente **über ihre IDs**: `Hauptkarte`, `Legende`, `Legende Basemap`, `Qu muss die Liste anpassen. Die Seitengröße aus `print_logic` ist danach nur noch eine Mindestgröße: Breite und Höhe können wachsen, die Karte bleibt bei 10 mm / 10 mm mit unveränderter Größe. +Legenden sind mindestens so breit wie das Kartenschild (180 mm, `MIN_SPALTENBREITE_MM`; die 210 mm in +`print_logic.STANDARD_LAYOUT_FIXBREITE_MM` sind der gesamte Kartenrand mit Abständen). Weil QGIS die Mindestgröße +nicht speichert, trägt das Layout die Eigenschaft `sn_legende_mindestbreite`; `sn_basis.main` verbindet beim Start +`setup_mindestbreiten_listener()` (readProject) und trennt ihn in `unload()` (Basis #96). + diff --git a/docs/status/STATUS.md b/docs/status/STATUS.md index 6bc3612..957e749 100644 --- a/docs/status/STATUS.md +++ b/docs/status/STATUS.md @@ -68,7 +68,8 @@ spätere Phase und beginnt erst, wenn die Test-Baseline grün ist und das Projek (Bezeichnungen, Gruppen, Zusammenfassungen; Konzept `docs/konzept/10_basemap_legende.md` Abschnitt 10, ADR 0010; bisher unauffällig). Unter QGIS 4 geprüft (Plugin funktioniert, Rückmeldung 02.10.2026). 16. **Kartenrand-Überlappung bei kleinen Verfahren (Basis #93).** Gemergt (PR #95). Mehrspaltige Legenden schmaler - (#96: Textumbruch 60 mm, ungleiche Spaltenbreiten, zweizeiliger Basemap-Titel) auf + (#96: Textumbruch 60 mm, ungleiche Spaltenbreiten, zweizeiliger Basemap-Titel, Mindestbreite 180 mm wie das + Kartenschild) auf `Plugin_SN_Basis:bugfix/96-legenden-spaltenbreite`, PR steht aus. **Hinweis zum lokalen Stand (04.09.2026):** Die Klone `Plugin_SN_Verfahrensgebiet` (4 Commits: PR #43, PR #45) diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 4cdaf3f..16b3044 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -119,20 +119,20 @@ Testkatalog der sn_*-Plugins — was die Suite heute prüft, auf einen Blick.
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
-
676Testfälle
-
633grün
+
681Testfälle
+
638grün
35rot (Baseline)
79%mit Docstring
58Testdateien
Verteilung je Paket
-
sn_basis41 Dateien · 424 Testfälle
+
sn_basis41 Dateien · 429 Testfälle
sn_verfahrensgebiet12 Dateien · 208 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -147,9 +147,9 @@

sn_basis

-

Plattform-Plugin · Ordner Plugin_SN_Basis · 41 Testdateien · 424 Testfälle

+

Plattform-Plugin · Ordner Plugin_SN_Basis · 41 Testdateien · 429 Testfälle

- @@ -326,7 +326,7 @@ classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420; classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20; classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08; - classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestStileUndEintraege
test_stil_aktiv_nur_eingeschaltet_und_im_zoombereich
Prüft, dass ein Style nur aktiv ist, wenn er eingeschaltet ist und die Zoomstufe im Bereich liegt (-1 = unbegrenzt).grün
TestStileUndEintraege
test_getroffene_stile_pruefen_layer_geometrie_zoom_und_filter
Prüft, dass ein Style nur Objekte seines Quell-Layers und Geometrietyps zählt, deren Filter zutrifft, und nur bei passender Zoomstufe.grün
TestStileUndEintraege
test_eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe
Prüft, dass mehrere Styles eines Katalogeintrags einen Eintrag ergeben und die Einträge nach Gruppen- und Katalogreihenfolge sortiert sind.grün
TestStileUndEintraege
test_ausgeschlossene_und_unbekannte_styles
Prüft, dass ausgeschlossene Styles entfallen und unbekannte Styles als nicht bekannter Eintrag in „Sonstiges“ landen.grün
TestAuswahlUndEinstellungen
test_vorauswahl_bekannte_an_unbekannte_aus
Prüft, dass ohne gespeicherte Auswahl Katalogeinträge vorausgewählt und unbekannte Styles abgewählt sind.grün
TestAuswahlUndEinstellungen
test_auswahl_wird_gemerkt_und_vorbelegt
Prüft, dass ab- und angewählte Einträge in der Projektvariable gespeichert und beim nächsten Mal so vorbelegt werden.grün
TestAuswahlUndEinstellungen
test_merken_ergaenzt_die_bisherige_auswahl
Prüft, dass das Merken die Auswahl nicht angezeigter Einträge aus früheren Läufen behält.grün
TestAuswahlUndEinstellungen
test_kaputte_projektvariable_ergibt_leere_auswahl
Prüft, dass eine nicht lesbare Projektvariable als leere Auswahl gilt.grün
TestAuswahlUndEinstellungen
test_auswertebereich_standard_und_umstellung
Prüft, dass der Auswertebereich standardmäßig das Verfahrensgebiet ist, umgestellt werden kann und unbekannte Werte abgewiesen werden.grün
TestAuswahlUndEinstellungen
test_legende_erzeugen_standard_an
Prüft, dass das Erzeugen der Basemap-Legende standardmäßig eingeschaltet ist und abgeschaltet werden kann.grün
TestLayerErkennung
test_erkennung_ueber_quelle_und_namen
Prüft, dass der Basemap-Layer an Vektorkacheln mit basemap.de-Quelle erkannt wird, der Name nur als Rückfall dient und andere Layertypen nicht zählen.grün
TestLayerErkennung
test_sichtbare_layer_aus_thema_feste_liste_oder_layerbaum
Prüft, dass die Layer der Karte aus dem Kartenthema, sonst aus der festen Layerliste, sonst aus dem sichtbaren Layerbaum kommen.grün
TestAblauf
test_ohne_basemap_layer_passiert_nichts
Prüft, dass ohne sichtbaren Basemap-Layer weder Dialog noch Legende entstehen.grün
TestAblauf
test_gewaehlte_eintraege_werden_geschrieben_und_gemerkt
Prüft, dass nur die im Dialog gewählten Einträge in die Legende geschrieben und die Auswahl gespeichert wird.grün
TestAblauf
test_abbruch_im_dialog_aendert_nichts
Prüft, dass ein Abbruch im Auswahldialog die Legende nicht verändert und keine Auswahl speichert.grün
TestAblauf
test_rueckfall_auf_druckbereich_wird_gemeldet
Prüft, dass ohne Verfahrensgebiet auf den Druckbereich zurückgefallen und das gemeldet wird.grün
TestAblauf
test_ohne_objekte_keine_legende
Prüft, dass ohne Basemap-Objekte im Auswertebereich weder Dialog noch Legende entstehen.grün
TestAblauf
test_viele_kacheln_werden_vorher_bestaetigt
Prüft, dass vor einer Auswertung mit sehr vielen Kacheln nachgefragt wird und eine Ablehnung die Auswertung abbricht.grün

Tests für modules/basemap_legende_layout.py – Basemap-Legende im Drucklayout (Basis #88).

TestKennzeichenUndKarte 2TestSymbolwahl 2TestHilfslayer 3TestPlatzierung 6
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestStileUndEintraege
test_stil_aktiv_nur_eingeschaltet_und_im_zoombereich
Prüft, dass ein Style nur aktiv ist, wenn er eingeschaltet ist und die Zoomstufe im Bereich liegt (-1 = unbegrenzt).grün
TestStileUndEintraege
test_getroffene_stile_pruefen_layer_geometrie_zoom_und_filter
Prüft, dass ein Style nur Objekte seines Quell-Layers und Geometrietyps zählt, deren Filter zutrifft, und nur bei passender Zoomstufe.grün
TestStileUndEintraege
test_eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe
Prüft, dass mehrere Styles eines Katalogeintrags einen Eintrag ergeben und die Einträge nach Gruppen- und Katalogreihenfolge sortiert sind.grün
TestStileUndEintraege
test_ausgeschlossene_und_unbekannte_styles
Prüft, dass ausgeschlossene Styles entfallen und unbekannte Styles als nicht bekannter Eintrag in „Sonstiges“ landen.grün
TestAuswahlUndEinstellungen
test_vorauswahl_bekannte_an_unbekannte_aus
Prüft, dass ohne gespeicherte Auswahl Katalogeinträge vorausgewählt und unbekannte Styles abgewählt sind.grün
TestAuswahlUndEinstellungen
test_auswahl_wird_gemerkt_und_vorbelegt
Prüft, dass ab- und angewählte Einträge in der Projektvariable gespeichert und beim nächsten Mal so vorbelegt werden.grün
TestAuswahlUndEinstellungen
test_merken_ergaenzt_die_bisherige_auswahl
Prüft, dass das Merken die Auswahl nicht angezeigter Einträge aus früheren Läufen behält.grün
TestAuswahlUndEinstellungen
test_kaputte_projektvariable_ergibt_leere_auswahl
Prüft, dass eine nicht lesbare Projektvariable als leere Auswahl gilt.grün
TestAuswahlUndEinstellungen
test_auswertebereich_standard_und_umstellung
Prüft, dass der Auswertebereich standardmäßig das Verfahrensgebiet ist, umgestellt werden kann und unbekannte Werte abgewiesen werden.grün
TestAuswahlUndEinstellungen
test_legende_erzeugen_standard_an
Prüft, dass das Erzeugen der Basemap-Legende standardmäßig eingeschaltet ist und abgeschaltet werden kann.grün
TestLayerErkennung
test_erkennung_ueber_quelle_und_namen
Prüft, dass der Basemap-Layer an Vektorkacheln mit basemap.de-Quelle erkannt wird, der Name nur als Rückfall dient und andere Layertypen nicht zählen.grün
TestLayerErkennung
test_sichtbare_layer_aus_thema_feste_liste_oder_layerbaum
Prüft, dass die Layer der Karte aus dem Kartenthema, sonst aus der festen Layerliste, sonst aus dem sichtbaren Layerbaum kommen.grün
TestAblauf
test_ohne_basemap_layer_passiert_nichts
Prüft, dass ohne sichtbaren Basemap-Layer weder Dialog noch Legende entstehen.grün
TestAblauf
test_gewaehlte_eintraege_werden_geschrieben_und_gemerkt
Prüft, dass nur die im Dialog gewählten Einträge in die Legende geschrieben und die Auswahl gespeichert wird.grün
TestAblauf
test_abbruch_im_dialog_aendert_nichts
Prüft, dass ein Abbruch im Auswahldialog die Legende nicht verändert und keine Auswahl speichert.grün
TestAblauf
test_rueckfall_auf_druckbereich_wird_gemeldet
Prüft, dass ohne Verfahrensgebiet auf den Druckbereich zurückgefallen und das gemeldet wird.grün
TestAblauf
test_ohne_objekte_keine_legende
Prüft, dass ohne Basemap-Objekte im Auswertebereich weder Dialog noch Legende entstehen.grün
TestAblauf
test_viele_kacheln_werden_vorher_bestaetigt
Prüft, dass vor einer Auswertung mit sehr vielen Kacheln nachgefragt wird und eine Ablehnung die Auswertung abbricht.grün

Tests für modules/basemap_legende_layout.py – Basemap-Legende im Drucklayout (Basis #88).

TestKennzeichenUndKarte 2TestSymbolwahl 2TestHilfslayer 3TestPlatzierung 7
flowchart TD
   root(["test_basemap_legende_layout.py"])
   class root rootnode
   root --> g1["TestKennzeichenUndKarte (2)"]
@@ -342,14 +342,15 @@
   g3 --> t5("je_gruppe_und_geometrietyp_ein_leerer_hilfslayer")
   g3 --> t6("alte_hilfslayer_werden_entfernt")
   g3 --> t7("ohne_eintraege_wird_vorhandene_basemap_legende_entfernt")
-  root --> g4["TestPlatzierung (6)"]
+  root --> g4["TestPlatzierung (7)"]
   class g4 groupnode
   g4 --> t8("einspaltig_ueber_der_quellenangabe")
   g4 --> t9("mehrspaltig_wenn_hoehe_nicht_reicht")
   g4 --> t10("spalten_ungleich_breit")
   g4 --> t11("mindestgroesse_mit_ungleichen_spalten_und_umbruch")
-  g4 --> t12("titel_zweizeilig")
-  g4 --> t13("nie_breiter_als_der_seitenrand_mit_hinweis")
+  g4 --> t12("neue_basemap_legende_mindestens_so_breit_wie_kartenschild")
+  g4 --> t13("titel_zweizeilig")
+  g4 --> t14("nie_breiter_als_der_seitenrand_mit_hinweis")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -363,11 +364,12 @@
   class t11 ok
   class t12 ok
   class t13 ok
+  class t14 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestKennzeichenUndKarte
test_layout_kennzeichen_setzen_und_erkennen
Prüft, dass ein markiertes Layout als Nutzer der Basemap-Legende erkannt und in der Projektliste geführt wird.grün
TestKennzeichenUndKarte
test_hauptkarte_ueber_id
Prüft, dass die Karte mit der ID „Hauptkarte“ gefunden wird.grün
TestSymbolwahl
test_symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge
Prüft, dass die Symbol-Styles des Katalogs in Zeichenreihenfolge genommen und inaktive übergangen werden.grün
TestSymbolwahl
test_ohne_aktive_symbol_stile_erster_getroffener_style
Prüft, dass ohne aktiven Symbol-Style der erste tatsächlich getroffene Style das Legendensymbol liefert.grün
TestHilfslayer
test_je_gruppe_und_geometrietyp_ein_leerer_hilfslayer
Prüft, dass je Gruppe und Geometrietyp ein Hilfslayer außerhalb des Layerbaums entsteht, Flächen vor Linien, ohne Rückfrage beim Schließen.grün
TestHilfslayer
test_alte_hilfslayer_werden_entfernt
Prüft, dass die Hilfslayer einer früheren Basemap-Legende des Layouts aus dem Projekt entfernt werden.grün
TestHilfslayer
test_ohne_eintraege_wird_vorhandene_basemap_legende_entfernt
Prüft, dass ohne gewählte Einträge eine vorhandene Basemap-Legende entfernt und die Auswahl am Layout vermerkt wird.grün
TestPlatzierung
test_einspaltig_ueber_der_quellenangabe
Prüft, dass die Basemap-Legende einspaltig unten an der Quellenangabe verankert wird, wenn der Platz reicht.grün
TestPlatzierung
test_mehrspaltig_wenn_hoehe_nicht_reicht
Prüft, dass die Legende zwei- oder dreispaltig wird, wenn sie einspaltig nicht zwischen Hauptlegende und Quellenangabe passt.grün
TestPlatzierung
test_spalten_ungleich_breit
Prüft, dass die Basemap-Legende ungleich breite Spalten bekommt (#96).grün
TestPlatzierung
test_mindestgroesse_mit_ungleichen_spalten_und_umbruch
Prüft, dass der Platzbedarf mit ungleich breiten Spalten und Textumbruch berechnet wird (#96).grün
TestPlatzierung
test_titel_zweizeilig
Prüft, dass der Titel der Basemap-Legende zweizeilig ist, damit er die Mindestbreite nicht bestimmt (#96).grün
TestPlatzierung
test_nie_breiter_als_der_seitenrand_mit_hinweis
Prüft, dass keine Spaltenzahl gewählt wird, die über den Seitenrand ragt, und dann ein Hinweis kommt.grün

Tests für den Legendenrand weißer Basemap-Flächen (Basis #92).

TestBrauchtLegendenrand 4TestErgaenzeLegendenrand 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestKennzeichenUndKarte
test_layout_kennzeichen_setzen_und_erkennen
Prüft, dass ein markiertes Layout als Nutzer der Basemap-Legende erkannt und in der Projektliste geführt wird.grün
TestKennzeichenUndKarte
test_hauptkarte_ueber_id
Prüft, dass die Karte mit der ID „Hauptkarte“ gefunden wird.grün
TestSymbolwahl
test_symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge
Prüft, dass die Symbol-Styles des Katalogs in Zeichenreihenfolge genommen und inaktive übergangen werden.grün
TestSymbolwahl
test_ohne_aktive_symbol_stile_erster_getroffener_style
Prüft, dass ohne aktiven Symbol-Style der erste tatsächlich getroffene Style das Legendensymbol liefert.grün
TestHilfslayer
test_je_gruppe_und_geometrietyp_ein_leerer_hilfslayer
Prüft, dass je Gruppe und Geometrietyp ein Hilfslayer außerhalb des Layerbaums entsteht, Flächen vor Linien, ohne Rückfrage beim Schließen.grün
TestHilfslayer
test_alte_hilfslayer_werden_entfernt
Prüft, dass die Hilfslayer einer früheren Basemap-Legende des Layouts aus dem Projekt entfernt werden.grün
TestHilfslayer
test_ohne_eintraege_wird_vorhandene_basemap_legende_entfernt
Prüft, dass ohne gewählte Einträge eine vorhandene Basemap-Legende entfernt und die Auswahl am Layout vermerkt wird.grün
TestPlatzierung
test_einspaltig_ueber_der_quellenangabe
Prüft, dass die Basemap-Legende einspaltig unten an der Quellenangabe verankert wird, wenn der Platz reicht.grün
TestPlatzierung
test_mehrspaltig_wenn_hoehe_nicht_reicht
Prüft, dass die Legende zwei- oder dreispaltig wird, wenn sie einspaltig nicht zwischen Hauptlegende und Quellenangabe passt.grün
TestPlatzierung
test_spalten_ungleich_breit
Prüft, dass die Basemap-Legende ungleich breite Spalten bekommt (#96).grün
TestPlatzierung
test_mindestgroesse_mit_ungleichen_spalten_und_umbruch
Prüft, dass der Platzbedarf mit ungleich breiten Spalten und Textumbruch berechnet wird (#96).grün
TestPlatzierung
test_neue_basemap_legende_mindestens_so_breit_wie_kartenschild
Prüft, dass eine neu angelegte Basemap-Legende die Breite des Kartenschilds als Mindestbreite bekommt.grün
TestPlatzierung
test_titel_zweizeilig
Prüft, dass der Titel der Basemap-Legende zweizeilig ist, damit er die Mindestbreite nicht bestimmt (#96).grün
TestPlatzierung
test_nie_breiter_als_der_seitenrand_mit_hinweis
Prüft, dass keine Spaltenzahl gewählt wird, die über den Seitenrand ragt, und dann ein Hinweis kommt.grün

Tests für den Legendenrand weißer Basemap-Flächen (Basis #92).

TestBrauchtLegendenrand 4TestErgaenzeLegendenrand 2
flowchart TD
   root(["test_basemap_legende_rand.py"])
   class root rootnode
   root --> g1["TestBrauchtLegendenrand (4)"]
@@ -940,7 +942,7 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
IsCaseSensitiveFsTests
test_windows_ist_nicht_case_sensitiv
Prüft, dass Windows als nicht case-sensitives Dateisystem gilt.grün
IsCaseSensitiveFsTests
test_macos_ist_nicht_case_sensitiv
Prüft, dass macOS als nicht case-sensitives Dateisystem gilt.grün
IsCaseSensitiveFsTests
test_linux_ist_case_sensitiv
Prüft, dass Linux als case-sensitives Dateisystem gilt.grün

Tests für modules/print_kartenrand.py – Anordnung des Kartenrands neben der Karte (Basis #93).

TestBerechneAnordnung 5TestOrdneKartenrandAn 4TestAnbindungPrintLayout 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
IsCaseSensitiveFsTests
test_windows_ist_nicht_case_sensitiv
Prüft, dass Windows als nicht case-sensitives Dateisystem gilt.grün
IsCaseSensitiveFsTests
test_macos_ist_nicht_case_sensitiv
Prüft, dass macOS als nicht case-sensitives Dateisystem gilt.grün
IsCaseSensitiveFsTests
test_linux_ist_case_sensitiv
Prüft, dass Linux als case-sensitives Dateisystem gilt.grün

Tests für modules/print_kartenrand.py – Anordnung des Kartenrands neben der Karte (Basis #93).

TestBerechneAnordnung 5TestOrdneKartenrandAn 5TestMindestbreiteBeimLaden 3TestAnbindungPrintLayout 2
flowchart TD
   root(["test_print_kartenrand.py"])
   class root rootnode
   root --> g1["TestBerechneAnordnung (5)"]
@@ -950,16 +952,22 @@
   g1 --> t3("seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen")
   g1 --> t4("seite_wird_nie_kleiner")
   g1 --> t5("ohne_legenden_nur_kartenschild")
-  root --> g2["TestOrdneKartenrandAn (4)"]
+  root --> g2["TestOrdneKartenrandAn (5)"]
   class g2 groupnode
   g2 --> t6("seite_hoeher_und_kartenschild_verschoben")
   g2 --> t7("spalten_ungleich_breit_und_text_umgebrochen")
-  g2 --> t8("passt_nichts_wird_verschoben")
-  g2 --> t9("ohne_karte_keine_anordnung")
-  root --> g3["TestAnbindungPrintLayout (2)"]
+  g2 --> t8("legenden_mindestens_so_breit_wie_kartenschild")
+  g2 --> t9("passt_nichts_wird_verschoben")
+  g2 --> t10("ohne_karte_keine_anordnung")
+  root --> g3["TestMindestbreiteBeimLaden (3)"]
   class g3 groupnode
-  g3 --> t10("vorlage_ordnet_kartenrand_an")
-  g3 --> t11("fehler_bei_der_anordnung_verhindert_die_vorlage_nicht")
+  g3 --> t11("mindestbreite_nur_fuer_vermerkte_layouts")
+  g3 --> t12("listener_verbinden_und_trennen")
+  g3 --> t13("ohne_qgis_kein_listener")
+  root --> g4["TestAnbindungPrintLayout (2)"]
+  class g4 groupnode
+  g4 --> t14("vorlage_ordnet_kartenrand_an")
+  g4 --> t15("fehler_bei_der_anordnung_verhindert_die_vorlage_nicht")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -971,11 +979,15 @@
   class t9 ok
   class t10 ok
   class t11 ok
+  class t12 ok
+  class t13 ok
+  class t14 ok
+  class t15 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestBerechneAnordnung
test_passt_einspaltig_nichts_aendert_sich
Prüft, dass bei genug Platz neben der Karte einspaltig angeordnet wird und Seite und Kartenschild bleiben.grün
TestBerechneAnordnung
test_mehr_spalten_und_breiterer_rand
Prüft, dass bei zu hohen Legenden die kleinste passende Spaltenzahl gewählt und der Kartenrand dafür verbreitert wird.grün
TestBerechneAnordnung
test_seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen
Prüft, dass die Seite höher wird und Quellenangabe und Kartenschild nach unten rutschen, wenn auch drei Spalten nicht reichen.grün
TestBerechneAnordnung
test_seite_wird_nie_kleiner
Prüft, dass Seitenbreite und -höhe nie unter die ursprüngliche Seitengröße fallen.grün
TestBerechneAnordnung
test_ohne_legenden_nur_kartenschild
Prüft, dass ohne Legenden nur Quellenangabe und Kartenschild zählen und die Seite bei zu niedriger Karte höher wird.grün
TestOrdneKartenrandAn
test_seite_hoeher_und_kartenschild_verschoben
Prüft, dass bei zu niedriger Karte die Legende dreispaltig wird, die Seite wächst und Quellenangabe und Kartenschild um denselben Betrag nach unten rutschen.grün
TestOrdneKartenrandAn
test_spalten_ungleich_breit_und_text_umgebrochen
Prüft, dass die Legenden ungleich breite Spalten und einen automatischen Textumbruch bekommen, damit mehrspaltige Legenden nicht unnötig breit werden (#96).grün
TestOrdneKartenrandAn
test_passt_nichts_wird_verschoben
Prüft, dass bei ausreichend hoher Karte weder Seite noch Kartenschild verändert werden.grün
TestOrdneKartenrandAn
test_ohne_karte_keine_anordnung
Prüft, dass ein Layout ohne Hauptkarte unverändert bleibt.grün
TestAnbindungPrintLayout
test_vorlage_ordnet_kartenrand_an
Prüft, dass PrintLayout beim Anlegen einer Vorlage den Kartenrand anordnen lässt.grün
TestAnbindungPrintLayout
test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht
Prüft, dass ein Fehler bei der Anordnung nur als Warnung gemeldet wird und keine Ausnahme durchreicht.grün

— (Docstring fehlt)

TestPrintLayout 5
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestBerechneAnordnung
test_passt_einspaltig_nichts_aendert_sich
Prüft, dass bei genug Platz neben der Karte einspaltig angeordnet wird und Seite und Kartenschild bleiben.grün
TestBerechneAnordnung
test_mehr_spalten_und_breiterer_rand
Prüft, dass bei zu hohen Legenden die kleinste passende Spaltenzahl gewählt und der Kartenrand dafür verbreitert wird.grün
TestBerechneAnordnung
test_seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen
Prüft, dass die Seite höher wird und Quellenangabe und Kartenschild nach unten rutschen, wenn auch drei Spalten nicht reichen.grün
TestBerechneAnordnung
test_seite_wird_nie_kleiner
Prüft, dass Seitenbreite und -höhe nie unter die ursprüngliche Seitengröße fallen.grün
TestBerechneAnordnung
test_ohne_legenden_nur_kartenschild
Prüft, dass ohne Legenden nur Quellenangabe und Kartenschild zählen und die Seite bei zu niedriger Karte höher wird.grün
TestOrdneKartenrandAn
test_seite_hoeher_und_kartenschild_verschoben
Prüft, dass bei zu niedriger Karte die Legende dreispaltig wird, die Seite wächst und Quellenangabe und Kartenschild um denselben Betrag nach unten rutschen.grün
TestOrdneKartenrandAn
test_spalten_ungleich_breit_und_text_umgebrochen
Prüft, dass die Legenden ungleich breite Spalten und einen automatischen Textumbruch bekommen, damit mehrspaltige Legenden nicht unnötig breit werden (#96).grün
TestOrdneKartenrandAn
test_legenden_mindestens_so_breit_wie_kartenschild
Prüft, dass die Legenden die Breite des Kartenschilds als Mindestbreite bekommen und das Layout sie für das Neuladen vermerkt.grün
TestOrdneKartenrandAn
test_passt_nichts_wird_verschoben
Prüft, dass bei ausreichend hoher Karte weder Seite noch Kartenschild verändert werden.grün
TestOrdneKartenrandAn
test_ohne_karte_keine_anordnung
Prüft, dass ein Layout ohne Hauptkarte unverändert bleibt.grün
TestMindestbreiteBeimLaden
test_mindestbreite_nur_fuer_vermerkte_layouts
Prüft, dass beim Laden die Mindestbreite nur an Layouts mit Vermerk wieder gesetzt wird.grün
TestMindestbreiteBeimLaden
test_listener_verbinden_und_trennen
Prüft, dass der Listener readProject einmal verbindet, beim Trennen wieder löst und beides mehrfach aufgerufen werden darf.grün
TestMindestbreiteBeimLaden
test_ohne_qgis_kein_listener
Prüft, dass im Mock-Modus kein Listener verbunden wird.grün
TestAnbindungPrintLayout
test_vorlage_ordnet_kartenrand_an
Prüft, dass PrintLayout beim Anlegen einer Vorlage den Kartenrand anordnen lässt.grün
TestAnbindungPrintLayout
test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht
Prüft, dass ein Fehler bei der Anordnung nur als Warnung gemeldet wird und keine Ausnahme durchreicht.grün

— (Docstring fehlt)

TestPrintLayout 5
flowchart TD
   root(["test_print_layout.py"])
   class root rootnode
   root --> g1["TestPrintLayout (5)"]
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md
index 7a47038..defb867 100644
--- a/docs/tests/testkatalog.md
+++ b/docs/tests/testkatalog.md
@@ -9,17 +9,17 @@ selbst (Docstrings) und aus der Testbaseline.
 
 Stand der Baseline: `docs/status/testbaseline.json` (SHA-256 `aeabc946a7f3`)
 
-Gesamt: 3 Pakete, 58 Testdateien, 676 Testfälle – 633 grün, 35 rot (Baseline), 8 übersprungen.
-Mit Beschreibung (Docstring): 531 von 676 (79 %).
+Gesamt: 3 Pakete, 58 Testdateien, 681 Testfälle – 638 grün, 35 rot (Baseline), 8 übersprungen.
+Mit Beschreibung (Docstring): 536 von 681 (79 %).
 
 ## Zusammenfassung
 
 | Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung |
 | --- | ---: | ---: | ---: | ---: | ---: | ---: |
-| `sn_basis` | 41 | 424 | 424 | 0 | 0 | 424 von 424 (100 %) |
+| `sn_basis` | 41 | 429 | 429 | 0 | 0 | 429 von 429 (100 %) |
 | `sn_verfahrensgebiet` | 12 | 208 | 166 | 34 | 8 | 106 von 208 (51 %) |
 | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) |
-| **Summe** | **58** | **676** | **633** | **35** | **8** | **531 von 676 (79 %)** |
+| **Summe** | **58** | **681** | **638** | **35** | **8** | **536 von 681 (79 %)** |
 
 ### Legende
 
@@ -31,7 +31,7 @@ Mit Beschreibung (Docstring): 531 von 676 (79 %).
 
 ## Paket `sn_basis`
 
-Plattform-Plugin, Ordner `Plugin_SN_Basis` – 41 Testdateien mit 424 Testfällen (424 grün, 0 rot, 0 übersprungen).
+Plattform-Plugin, Ordner `Plugin_SN_Basis` – 41 Testdateien mit 429 Testfällen (429 grün, 0 rot, 0 übersprungen).
 
 ### `Plugin_SN_Basis/tests/test_base_dockwidget.py`
 
@@ -161,7 +161,7 @@ Testgruppen:
 - `TestKennzeichenUndKarte` (2 Testfälle): — (Docstring fehlt)
 - `TestSymbolwahl` (2 Testfälle): — (Docstring fehlt)
 - `TestHilfslayer` (3 Testfälle): — (Docstring fehlt)
-- `TestPlatzierung` (6 Testfälle): — (Docstring fehlt)
+- `TestPlatzierung` (7 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status |
 | --- | --- | --- |
@@ -176,6 +176,7 @@ Testgruppen:
 | `TestPlatzierung.test_mehrspaltig_wenn_hoehe_nicht_reicht` | Prüft, dass die Legende zwei- oder dreispaltig wird, wenn sie einspaltig nicht zwischen Hauptlegende und Quellenangabe passt. | grün |
 | `TestPlatzierung.test_spalten_ungleich_breit` | Prüft, dass die Basemap-Legende ungleich breite Spalten bekommt (#96). | grün |
 | `TestPlatzierung.test_mindestgroesse_mit_ungleichen_spalten_und_umbruch` | Prüft, dass der Platzbedarf mit ungleich breiten Spalten und Textumbruch berechnet wird (#96). | grün |
+| `TestPlatzierung.test_neue_basemap_legende_mindestens_so_breit_wie_kartenschild` | Prüft, dass eine neu angelegte Basemap-Legende die Breite des Kartenschilds als Mindestbreite bekommt. | grün |
 | `TestPlatzierung.test_titel_zweizeilig` | Prüft, dass der Titel der Basemap-Legende zweizeilig ist, damit er die Mindestbreite nicht bestimmt (#96). | grün |
 | `TestPlatzierung.test_nie_breiter_als_der_seitenrand_mit_hinweis` | Prüft, dass keine Spaltenzahl gewählt wird, die über den Seitenrand ragt, und dann ein Hinweis kommt. | grün |
 
@@ -602,7 +603,8 @@ Worum es in der Datei geht: Tests für modules/print_kartenrand.py – Anordnung
 Testgruppen:
 
 - `TestBerechneAnordnung` (5 Testfälle): — (Docstring fehlt)
-- `TestOrdneKartenrandAn` (4 Testfälle): — (Docstring fehlt)
+- `TestOrdneKartenrandAn` (5 Testfälle): — (Docstring fehlt)
+- `TestMindestbreiteBeimLaden` (3 Testfälle): — (Docstring fehlt)
 - `TestAnbindungPrintLayout` (2 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status |
@@ -614,8 +616,12 @@ Testgruppen:
 | `TestBerechneAnordnung.test_ohne_legenden_nur_kartenschild` | Prüft, dass ohne Legenden nur Quellenangabe und Kartenschild zählen und die Seite bei zu niedriger Karte höher wird. | grün |
 | `TestOrdneKartenrandAn.test_seite_hoeher_und_kartenschild_verschoben` | Prüft, dass bei zu niedriger Karte die Legende dreispaltig wird, die Seite wächst und Quellenangabe und Kartenschild um denselben Betrag nach unten rutschen. | grün |
 | `TestOrdneKartenrandAn.test_spalten_ungleich_breit_und_text_umgebrochen` | Prüft, dass die Legenden ungleich breite Spalten und einen automatischen Textumbruch bekommen, damit mehrspaltige Legenden nicht unnötig breit werden (#96). | grün |
+| `TestOrdneKartenrandAn.test_legenden_mindestens_so_breit_wie_kartenschild` | Prüft, dass die Legenden die Breite des Kartenschilds als Mindestbreite bekommen und das Layout sie für das Neuladen vermerkt. | grün |
 | `TestOrdneKartenrandAn.test_passt_nichts_wird_verschoben` | Prüft, dass bei ausreichend hoher Karte weder Seite noch Kartenschild verändert werden. | grün |
 | `TestOrdneKartenrandAn.test_ohne_karte_keine_anordnung` | Prüft, dass ein Layout ohne Hauptkarte unverändert bleibt. | grün |
+| `TestMindestbreiteBeimLaden.test_mindestbreite_nur_fuer_vermerkte_layouts` | Prüft, dass beim Laden die Mindestbreite nur an Layouts mit Vermerk wieder gesetzt wird. | grün |
+| `TestMindestbreiteBeimLaden.test_listener_verbinden_und_trennen` | Prüft, dass der Listener readProject einmal verbindet, beim Trennen wieder löst und beides mehrfach aufgerufen werden darf. | grün |
+| `TestMindestbreiteBeimLaden.test_ohne_qgis_kein_listener` | Prüft, dass im Mock-Modus kein Listener verbunden wird. | grün |
 | `TestAnbindungPrintLayout.test_vorlage_ordnet_kartenrand_an` | Prüft, dass PrintLayout beim Anlegen einer Vorlage den Kartenrand anordnen lässt. | grün |
 | `TestAnbindungPrintLayout.test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht` | Prüft, dass ein Fehler bei der Anordnung nur als Warnung gemeldet wird und keine Ausnahme durchreicht. | grün |
 
@@ -1453,7 +1459,7 @@ Arbeitsliste: Diese Testfälle haben keinen Docstring; was sie fachlich prüfen,
 aus dem Quelltext erschließen. Jeder Eintrag braucht eine einzeilige Beschreibung im Testfall,
 dann verschwindet er hier von selbst.
 
-### `sn_basis` – 0 von 424 Testfällen ohne Beschreibung
+### `sn_basis` – 0 von 429 Testfällen ohne Beschreibung
 
 Keine Lücken.
 
diff --git a/docs/wissen/fallstricke.md b/docs/wissen/fallstricke.md
index f817cbf..31bb6ff 100644
--- a/docs/wissen/fallstricke.md
+++ b/docs/wissen/fallstricke.md
@@ -91,6 +91,9 @@ Kurz, konkret, mit Datum und Quelle. Neue Einträge oben in der passenden Rubrik
   Mehrspaltige Legenden: Mit `setEqualColumnWidth(True)` bestimmt der längste Text die Breite **aller** Spalten.
   Schmaler wird es mit ungleichen Spalten und `setAutoWrapLinesAfter(mm)`; der Legendentitel bricht dabei **nicht**
   automatisch um und bestimmt die Mindestbreite – Zeilenumbruch (`\n`) im Titel setzen. (02.10.2026, Basis #96)
+  `setMinimumSize` an Layoutelementen wird **nicht im Projekt gespeichert**: Nach dem Neuladen schrumpft eine
+  Legende mit „an Inhalt anpassen“ bei der nächsten Größenberechnung wieder (gemessen 180 → 43,7 mm). Mindestgröße
+  am Layout vermerken und beim Laden (`readProject`) neu setzen. (02.10.2026, Basis #96)
 - **Projektvariablen-Schlüssel ohne `sn_` übergeben.** `set_variable("sn_abdeckungslayer", ...)` erzeugt `sn_sn_abdeckungslayer` (Altlast in Druckmodulen; funktioniert nur, weil Lesen und Schreiben denselben Fehler machen).
 - **Zwei Schreibweisen für den Verfahrensgebiet-Layer:** `verfahrensgebiet_layer` (Manager, Fachplugins) und `verfahrensgebietslayer` (`print_logic.py`). Bis zur Bereinigung nicht auf Gleichheit vertrauen.
 - **Layer werden über Anzeigenamen gefunden** (`BROR_LAYER_NAME` usw.). Umbenennungen in der UI brechen Abläufe.