From c92a2ddb8657c9b1e1549f6e003c08eaff984c28 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 2 Oct 2026 12:33:18 +0200 Subject: [PATCH] Basemap-Punktlinien (Basis #90): Ursache und Korrektur dokumentiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fallstricke.md: Strichlänge 0 aus Mapbox-Styles zeichnet Qt nicht - Konzept 10, Abschnitt 10: Punkt „Durchlass/Baumreihe ohne Symbol“ geklärt - modulkarte.md: basemap_stilkorrektur; STATUS.md Punkt 15 nachgezogen - Testkatalog neu erzeugt Co-Authored-By: Claude Opus 5.5 --- docs/architektur/modulkarte.md | 1 + docs/konzept/10_basemap_legende.md | 4 ++- docs/status/STATUS.md | 7 ++-- docs/tests/testkatalog.html | 51 +++++++++++++++++++++++------- docs/tests/testkatalog.md | 34 ++++++++++++++++---- docs/wissen/fallstricke.md | 6 ++++ 6 files changed, 80 insertions(+), 23 deletions(-) diff --git a/docs/architektur/modulkarte.md b/docs/architektur/modulkarte.md index ac50a37..521a38a 100644 --- a/docs/architektur/modulkarte.md +++ b/docs/architektur/modulkarte.md @@ -63,6 +63,7 @@ Legende: ⚠ = über 600 Zeilen, nie komplett laden, per `grep -n "def "` navigi | `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` | 396 | Legendensymbole aus Projektlayer-Styles zusammensetzen, 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` | ### Sonstiges diff --git a/docs/konzept/10_basemap_legende.md b/docs/konzept/10_basemap_legende.md index 29b1108..8d1babb 100644 --- a/docs/konzept/10_basemap_legende.md +++ b/docs/konzept/10_basemap_legende.md @@ -256,7 +256,9 @@ Durchgang der Bezeichnungen ist gemacht; **die fachliche Abnahme steht aus.** **Bekannte Punkte für die Durchsicht:** - „Platz“ (Verkehr, Siedlung) hat im Basemap-Stil eine weiße Füllung ohne Rand und ist in der Legende kaum zu sehen. -- „Durchlass, Düker“ und „Baumreihe“ zeigen in der Legende kein sichtbares Symbol (Ursache noch nicht geklärt). +- ~~„Durchlass, Düker“ und „Baumreihe“ ohne sichtbares Symbol~~ – Ursache gefunden und behoben in **Basis #90**: + basemap.de zeichnet Punktlinien mit Strichlänge 0, die Qt nicht zeichnet (auch nicht in der Karte). Knopf + „Punktlinien korrigieren“ im Basemap-Bereich (12 Styles betroffen). - Gewässerbreiten sind zu „Fließgewässer (Linie)“ zusammengefasst; Symbol ist die 6-m-Linie. **Nicht geprüft:** QGIS 4 (Qt6) – lokal nicht verfügbar. QGIS 3.44.4 (Qt5) offscreen geprüft: Auswertung, diff --git a/docs/status/STATUS.md b/docs/status/STATUS.md index c566d27..2b3539b 100644 --- a/docs/status/STATUS.md +++ b/docs/status/STATUS.md @@ -64,9 +64,10 @@ spätere Phase und beginnt erst, wenn die Test-Baseline grün ist und das Projek `sql=`-Filtern). Vergleich 6↔7 und Anpassungsliste: `docs/konzept/09_alkis7_umstellung.md`. Nächster Schritt: Gitea-Issue in `Plugin_SN_Verfahrensgebiet`. 15. **Basemap-Legende im Druck (Basis #88).** Umgesetzt auf `Plugin_SN_Basis:feature/88-basemap-legende` - (Konzept `docs/konzept/10_basemap_legende.md`, ADR 0010), PR steht aus. Offen: **fachliche Abnahme des - Legendenkatalogs** `sn_basis/data/basemap_legende.json` (Bezeichnungen, Gruppen, Zusammenfassungen; drei - Einträge ohne gut sichtbares Symbol, siehe Konzept Abschnitt 10) und Test unter QGIS 4. + (Konzept `docs/konzept/10_basemap_legende.md`, ADR 0010). Offen: **fachliche Abnahme des + Legendenkatalogs** `sn_basis/data/basemap_legende.json` (Bezeichnungen, Gruppen, Zusammenfassungen; „Platz“ + als weiße Fläche ohne Rand, siehe Konzept Abschnitt 10) und Test unter QGIS 4. #88 ist gemergt (PR #89); + Punktlinien-Korrektur (#90) auf `Plugin_SN_Basis:bugfix/90-basemap-punktlinien`, PR steht aus. **Hinweis zum lokalen Stand (04.09.2026):** Die Klone `Plugin_SN_Verfahrensgebiet` (4 Commits: PR #43, PR #45) und `Repository` (Release 26.8.4-unstable) liegen hinter `origin`. Aktualisieren mit `python scripts/hallo.py`. diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 8de74cd..5b42641 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)
-
648Testfälle
-
605grün
+
656Testfälle
+
613grün
35rot (Baseline)
78%mit Docstring
-
55Testdateien
+
56Testdateien
Verteilung je Paket
-
sn_basis38 Dateien · 396 Testfälle
+
sn_basis39 Dateien · 404 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 · 38 Testdateien · 396 Testfälle

+

Plattform-Plugin · Ordner Plugin_SN_Basis · 39 Testdateien · 404 Testfälle

- @@ -172,7 +172,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
CloseEventTests
test_ruft_cleanup_aller_tabs_auf
Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft.grün
CloseEventTests
test_ignoriert_tabs_ohne_cleanup
Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt.grün
CloseEventTests
test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter
Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert.grün
CloseEventTests
test_setzt_toolbar_action_zurueck
Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt.grün
CloseEventTests
test_ohne_action_wird_nichts_zurueckgesetzt
Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft.grün

Tests für die Anbindung der Basemap-Legende an Druckablauf, Dialog und Druck-Tab (Basis #88):

TestMehrfachauswahl 1TestDruckanbindung 4TestBasemapBereich 8
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
CloseEventTests
test_ruft_cleanup_aller_tabs_auf
Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft.grün
CloseEventTests
test_ignoriert_tabs_ohne_cleanup
Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt.grün
CloseEventTests
test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter
Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert.grün
CloseEventTests
test_setzt_toolbar_action_zurueck
Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt.grün
CloseEventTests
test_ohne_action_wird_nichts_zurueckgesetzt
Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft.grün

Tests für die Anbindung der Basemap-Legende an Druckablauf, Dialog und Druck-Tab (Basis #88):

TestMehrfachauswahl 1TestDruckanbindung 4TestBasemapBereich 10
flowchart TD
   root(["test_basemap_anbindung.py"])
   class root rootnode
   root --> g1["TestMehrfachauswahl (1)"]
@@ -184,7 +184,7 @@
   g2 --> t3("layout_wird_markiert_und_legende_erzeugt")
   g2 --> t4("fehler_der_basemap_legende_verhindert_die_vorlage_nicht")
   g2 --> t5("druck_tab_aktualisiert_basemap_bereich_falls_vorhanden")
-  root --> g3["TestBasemapBereich (8)"]
+  root --> g3["TestBasemapBereich (10)"]
   class g3 groupnode
   g3 --> t6("auswertebereich_wird_gespeichert")
   g3 --> t7("aktualisieren_ohne_vorlage_warnt")
@@ -193,7 +193,9 @@
   g3 --> t10("stil_laden_bricht_bei_fremder_vorlage_ab")
   g3 --> t11("vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt")
   g3 --> t12("speichern_mit_aktueller_legendenauswahl")
-  g3 --> t13("stil_speichern_ohne_basemap_layer_warnt")
+  g3 --> t13("punktlinien_korrigieren_meldet_anzahl")
+  g3 --> t14("punktlinien_ohne_basemap_layer_warnt")
+  g3 --> t15("stil_speichern_ohne_basemap_layer_warnt")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -207,11 +209,13 @@
   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
TestMehrfachauswahl
test_mock_modus_liefert_vorauswahl_in_listenreihenfolge
Prüft, dass der Mehrfachauswahl-Dialog im Mock-Modus die vorausgewählten Schlüssel in Listenreihenfolge liefert.grün
TestDruckanbindung
test_basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter
Prüft, dass nur §-38- und §-41-Vorlagen eine Basemap-Legende bekommen und nur, wenn der Schalter im Druck-Tab an ist.grün
TestDruckanbindung
test_layout_wird_markiert_und_legende_erzeugt
Prüft, dass PrintLayout das Layout als Basemap-Nutzer kennzeichnet und die Basemap-Legende erzeugen lässt.grün
TestDruckanbindung
test_fehler_der_basemap_legende_verhindert_die_vorlage_nicht
Prüft, dass ein Fehler beim Erzeugen der Basemap-Legende nur als Warnung gemeldet wird und keine Ausnahme durchreicht.grün
TestDruckanbindung
test_druck_tab_aktualisiert_basemap_bereich_falls_vorhanden
Prüft, dass der Druck-Tab den Basemap-Bereich neu einliest und ohne Bereich nichts tut.grün
TestBasemapBereich
test_auswertebereich_wird_gespeichert
Prüft, dass die Wahl des Auswertebereichs in der Projektvariable landet.grün
TestBasemapBereich
test_aktualisieren_ohne_vorlage_warnt
Prüft, dass „Basemap-Legende aktualisieren“ ohne vorhandene Vorlage warnt und nichts auswertet.grün
TestBasemapBereich
test_aktualisieren_wertet_gewaehlte_vorlage_aus
Prüft, dass „Basemap-Legende aktualisieren“ die gewählte Vorlage auswertet und den Erfolg meldet.grün
TestBasemapBereich
test_stil_laden_uebernimmt_legendenauswahl
Prüft, dass das Laden einer Stilvorlage den Layerstil ersetzt und ihre Legendenauswahl in das Projekt übernimmt.grün
TestBasemapBereich
test_stil_laden_bricht_bei_fremder_vorlage_ab
Prüft, dass eine Vorlage mit unbekannten Styles nur nach Bestätigung geladen wird.grün
TestBasemapBereich
test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt
Prüft, dass eine gleichnamige Stilvorlage ohne Bestätigung nicht überschrieben wird.grün
TestBasemapBereich
test_speichern_mit_aktueller_legendenauswahl
Prüft, dass eine neue Stilvorlage zusammen mit der aktuellen Legendenauswahl gespeichert wird.grün
TestBasemapBereich
test_stil_speichern_ohne_basemap_layer_warnt
Prüft, dass ohne Basemap-Layer keine Stilvorlage gespeichert, sondern gewarnt wird.grün

Tests für modules/basemap_kacheln.py – kachelweise Auswertung des Basemap-Layers (Basis #88).

TestSammleObjekte 4TestZoomUndStile 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestMehrfachauswahl
test_mock_modus_liefert_vorauswahl_in_listenreihenfolge
Prüft, dass der Mehrfachauswahl-Dialog im Mock-Modus die vorausgewählten Schlüssel in Listenreihenfolge liefert.grün
TestDruckanbindung
test_basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter
Prüft, dass nur §-38- und §-41-Vorlagen eine Basemap-Legende bekommen und nur, wenn der Schalter im Druck-Tab an ist.grün
TestDruckanbindung
test_layout_wird_markiert_und_legende_erzeugt
Prüft, dass PrintLayout das Layout als Basemap-Nutzer kennzeichnet und die Basemap-Legende erzeugen lässt.grün
TestDruckanbindung
test_fehler_der_basemap_legende_verhindert_die_vorlage_nicht
Prüft, dass ein Fehler beim Erzeugen der Basemap-Legende nur als Warnung gemeldet wird und keine Ausnahme durchreicht.grün
TestDruckanbindung
test_druck_tab_aktualisiert_basemap_bereich_falls_vorhanden
Prüft, dass der Druck-Tab den Basemap-Bereich neu einliest und ohne Bereich nichts tut.grün
TestBasemapBereich
test_auswertebereich_wird_gespeichert
Prüft, dass die Wahl des Auswertebereichs in der Projektvariable landet.grün
TestBasemapBereich
test_aktualisieren_ohne_vorlage_warnt
Prüft, dass „Basemap-Legende aktualisieren“ ohne vorhandene Vorlage warnt und nichts auswertet.grün
TestBasemapBereich
test_aktualisieren_wertet_gewaehlte_vorlage_aus
Prüft, dass „Basemap-Legende aktualisieren“ die gewählte Vorlage auswertet und den Erfolg meldet.grün
TestBasemapBereich
test_stil_laden_uebernimmt_legendenauswahl
Prüft, dass das Laden einer Stilvorlage den Layerstil ersetzt und ihre Legendenauswahl in das Projekt übernimmt.grün
TestBasemapBereich
test_stil_laden_bricht_bei_fremder_vorlage_ab
Prüft, dass eine Vorlage mit unbekannten Styles nur nach Bestätigung geladen wird.grün
TestBasemapBereich
test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt
Prüft, dass eine gleichnamige Stilvorlage ohne Bestätigung nicht überschrieben wird.grün
TestBasemapBereich
test_speichern_mit_aktueller_legendenauswahl
Prüft, dass eine neue Stilvorlage zusammen mit der aktuellen Legendenauswahl gespeichert wird.grün
TestBasemapBereich
test_punktlinien_korrigieren_meldet_anzahl
Prüft, dass „Punktlinien korrigieren“ den Basemap-Layer korrigiert und die Anzahl korrigierter Styles meldet.grün
TestBasemapBereich
test_punktlinien_ohne_basemap_layer_warnt
Prüft, dass ohne Basemap-Layer nichts korrigiert, sondern gewarnt wird.grün
TestBasemapBereich
test_stil_speichern_ohne_basemap_layer_warnt
Prüft, dass ohne Basemap-Layer keine Stilvorlage gespeichert, sondern gewarnt wird.grün

Tests für modules/basemap_kacheln.py – kachelweise Auswertung des Basemap-Layers (Basis #88).

TestSammleObjekte 4TestZoomUndStile 2
flowchart TD
   root(["test_basemap_kacheln.py"])
   class root rootnode
   root --> g1["TestSammleObjekte (4)"]
@@ -357,7 +361,30 @@
   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_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 modules/basemap_stilvorlagen.py – lokale Stilvorlagen des Basemap-Layers (Basis #88).

TestStilvorlagen 8
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_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 modules/basemap_stilkorrektur.py – Punktlinien des Basemap-Layers sichtbar machen (Basis #90).

TestMusterUndAusdruck 2TestLayerkorrektur 4
flowchart TD
+  root(["test_basemap_stilkorrektur.py"])
+  class root rootnode
+  root --> g1["TestMusterUndAusdruck (2)"]
+  class g1 groupnode
+  g1 --> t1("strichlaenge_null_im_festen_muster")
+  g1 --> t2("strichlaenge_null_im_zoomabhaengigen_ausdruck")
+  root --> g2["TestLayerkorrektur (4)"]
+  class g2 groupnode
+  g2 --> t3("punktlinien_werden_korrigiert_andere_styles_nicht")
+  g2 --> t4("zweiter_lauf_korrigiert_nichts")
+  g2 --> t5("nur_ausdruck_ohne_festes_muster")
+  g2 --> t6("layer_ohne_renderer")
+  class t1 ok
+  class t2 ok
+  class t3 ok
+  class t4 ok
+  class t5 ok
+  class t6 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
TestMusterUndAusdruck
test_strichlaenge_null_im_festen_muster
Prüft, dass Strichlängen 0 (gerade Positionen) im Strichmuster ersetzt und Lücken der Länge 0 nicht verändert werden.grün
TestMusterUndAusdruck
test_strichlaenge_null_im_zoomabhaengigen_ausdruck
Prüft, dass jede Strichlänge 0 in den array(...)-Mustern des Konverter-Ausdrucks ersetzt wird und der übrige Ausdruck gleich bleibt.grün
TestLayerkorrektur
test_punktlinien_werden_korrigiert_andere_styles_nicht
Prüft, dass nur Styles mit Strichlänge 0 korrigiert werden – Muster und Ausdruck – und die Anzahl zurückkommt.grün
TestLayerkorrektur
test_zweiter_lauf_korrigiert_nichts
Prüft, dass ein zweiter Lauf keine Styles mehr korrigiert und nicht neu zeichnen lässt.grün
TestLayerkorrektur
test_nur_ausdruck_ohne_festes_muster
Prüft, dass auch ein Style korrigiert wird, dessen Strichlänge 0 nur im zoomabhängigen Ausdruck steht.grün
TestLayerkorrektur
test_layer_ohne_renderer
Prüft, dass ein Layer ohne Renderer 0 korrigierte Styles liefert.grün

Tests für modules/basemap_stilvorlagen.py – lokale Stilvorlagen des Basemap-Layers (Basis #88).

TestStilvorlagen 8
flowchart TD
   root(["test_basemap_stilvorlagen.py"])
   class root rootnode
   root --> g1["TestStilvorlagen (8)"]
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md
index 23d6be2..61ea24d 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, 55 Testdateien, 648 Testfälle – 605 grün, 35 rot (Baseline), 8 übersprungen.
-Mit Beschreibung (Docstring): 503 von 648 (78 %).
+Gesamt: 3 Pakete, 56 Testdateien, 656 Testfälle – 613 grün, 35 rot (Baseline), 8 übersprungen.
+Mit Beschreibung (Docstring): 511 von 656 (78 %).
 
 ## Zusammenfassung
 
 | Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung |
 | --- | ---: | ---: | ---: | ---: | ---: | ---: |
-| `sn_basis` | 38 | 396 | 396 | 0 | 0 | 396 von 396 (100 %) |
+| `sn_basis` | 39 | 404 | 404 | 0 | 0 | 404 von 404 (100 %) |
 | `sn_verfahrensgebiet` | 12 | 208 | 166 | 34 | 8 | 106 von 208 (51 %) |
 | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) |
-| **Summe** | **55** | **648** | **605** | **35** | **8** | **503 von 648 (78 %)** |
+| **Summe** | **56** | **656** | **613** | **35** | **8** | **511 von 656 (78 %)** |
 
 ### Legende
 
@@ -31,7 +31,7 @@ Mit Beschreibung (Docstring): 503 von 648 (78 %).
 
 ## Paket `sn_basis`
 
-Plattform-Plugin, Ordner `Plugin_SN_Basis` – 38 Testdateien mit 396 Testfällen (396 grün, 0 rot, 0 übersprungen).
+Plattform-Plugin, Ordner `Plugin_SN_Basis` – 39 Testdateien mit 404 Testfällen (404 grün, 0 rot, 0 übersprungen).
 
 ### `Plugin_SN_Basis/tests/test_base_dockwidget.py`
 
@@ -57,7 +57,7 @@ Testgruppen:
 
 - `TestMehrfachauswahl` (1 Testfälle): — (Docstring fehlt)
 - `TestDruckanbindung` (4 Testfälle): — (Docstring fehlt)
-- `TestBasemapBereich` (8 Testfälle): — (Docstring fehlt)
+- `TestBasemapBereich` (10 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status |
 | --- | --- | --- |
@@ -73,6 +73,8 @@ Testgruppen:
 | `TestBasemapBereich.test_stil_laden_bricht_bei_fremder_vorlage_ab` | Prüft, dass eine Vorlage mit unbekannten Styles nur nach Bestätigung geladen wird. | grün |
 | `TestBasemapBereich.test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt` | Prüft, dass eine gleichnamige Stilvorlage ohne Bestätigung nicht überschrieben wird. | grün |
 | `TestBasemapBereich.test_speichern_mit_aktueller_legendenauswahl` | Prüft, dass eine neue Stilvorlage zusammen mit der aktuellen Legendenauswahl gespeichert wird. | grün |
+| `TestBasemapBereich.test_punktlinien_korrigieren_meldet_anzahl` | Prüft, dass „Punktlinien korrigieren“ den Basemap-Layer korrigiert und die Anzahl korrigierter Styles meldet. | grün |
+| `TestBasemapBereich.test_punktlinien_ohne_basemap_layer_warnt` | Prüft, dass ohne Basemap-Layer nichts korrigiert, sondern gewarnt wird. | grün |
 | `TestBasemapBereich.test_stil_speichern_ohne_basemap_layer_warnt` | Prüft, dass ohne Basemap-Layer keine Stilvorlage gespeichert, sondern gewarnt wird. | grün |
 
 ### `Plugin_SN_Basis/tests/test_basemap_kacheln.py`
@@ -174,6 +176,24 @@ 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_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 |
 
+### `Plugin_SN_Basis/tests/test_basemap_stilkorrektur.py`
+
+Worum es in der Datei geht: Tests für modules/basemap_stilkorrektur.py – Punktlinien des Basemap-Layers sichtbar machen (Basis #90).
+
+Testgruppen:
+
+- `TestMusterUndAusdruck` (2 Testfälle): — (Docstring fehlt)
+- `TestLayerkorrektur` (4 Testfälle): — (Docstring fehlt)
+
+| Testfall | prüft | Status |
+| --- | --- | --- |
+| `TestMusterUndAusdruck.test_strichlaenge_null_im_festen_muster` | Prüft, dass Strichlängen 0 (gerade Positionen) im Strichmuster ersetzt und Lücken der Länge 0 nicht verändert werden. | grün |
+| `TestMusterUndAusdruck.test_strichlaenge_null_im_zoomabhaengigen_ausdruck` | Prüft, dass jede Strichlänge 0 in den array(...)-Mustern des Konverter-Ausdrucks ersetzt wird und der übrige Ausdruck gleich bleibt. | grün |
+| `TestLayerkorrektur.test_punktlinien_werden_korrigiert_andere_styles_nicht` | Prüft, dass nur Styles mit Strichlänge 0 korrigiert werden – Muster und Ausdruck – und die Anzahl zurückkommt. | grün |
+| `TestLayerkorrektur.test_zweiter_lauf_korrigiert_nichts` | Prüft, dass ein zweiter Lauf keine Styles mehr korrigiert und nicht neu zeichnen lässt. | grün |
+| `TestLayerkorrektur.test_nur_ausdruck_ohne_festes_muster` | Prüft, dass auch ein Style korrigiert wird, dessen Strichlänge 0 nur im zoomabhängigen Ausdruck steht. | grün |
+| `TestLayerkorrektur.test_layer_ohne_renderer` | Prüft, dass ein Layer ohne Renderer 0 korrigierte Styles liefert. | grün |
+
 ### `Plugin_SN_Basis/tests/test_basemap_stilvorlagen.py`
 
 Worum es in der Datei geht: Tests für modules/basemap_stilvorlagen.py – lokale Stilvorlagen des Basemap-Layers (Basis #88).
@@ -1388,7 +1408,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 396 Testfällen ohne Beschreibung
+### `sn_basis` – 0 von 404 Testfällen ohne Beschreibung
 
 Keine Lücken.
 
diff --git a/docs/wissen/fallstricke.md b/docs/wissen/fallstricke.md
index 1c11907..83bc28f 100644
--- a/docs/wissen/fallstricke.md
+++ b/docs/wissen/fallstricke.md
@@ -53,6 +53,12 @@ Kurz, konkret, mit Datum und Quelle. Neue Einträge oben in der passenden Rubrik
 
 ## Daten und Dienste
 
+- **Punktlinien aus Mapbox-Styles sind in QGIS unsichtbar.** basemap.de (wie viele MapLibre-Stile) zeichnet Punktlinien
+  als `line-dasharray` mit Strichlänge 0 und `line-cap: round`. QGIS übernimmt das beim Import 1:1, Qt zeichnet
+  Striche der Länge 0 aber gar nicht – auch nicht als Punkt, weder in der Karte noch in der Legende. Betroffen
+  sind bei basemap.de 12 Styles (Baumreihe, Hecke, Durchlass, Seilbahnen …). Abhilfe: Strichlänge 0 durch 0,01
+  ersetzen (`sn_basis.modules.basemap_stilkorrektur`). Beim Prüfen solcher Effekte die Beschriftung abschalten –
+  sonst zählen Labels als „sichtbare Pixel“. (02.10.2026, QGIS 3.44 / PyQt 5.15, Basis #90; QGIS 4 ungeprüft)
 - **basemap.de-Vektorkacheln (Basis #88):** QGIS zeigt für Vektorkachel-Layer keine Legende. Objekte im Gebiet
   liefert `QgsVectorTileLayer.selectByGeometry()` (lädt die Kacheln selbst; `getRawTile` ist in Python gesperrt).
   Kacheln enden bei Zoom 15. Der Renderer prüft Styles mit `scaleToZoomLevel(maßstab, False)` und setzt
-- 
2.54.0