Basemap: Punktlinien in Karte und Legende sichtbar machen (#90)

basemap.de zeichnet Punktlinien mit Strichlänge 0 und runder Linienkappe (MapLibre-Muster);
QGIS übernimmt das beim Import 1:1, Qt zeichnet Striche der Länge 0 aber nicht. Baumreihen,
Hecken, Durchlässe, Seilbahnen u. a. (12 Styles) fehlten dadurch in Karte und Legende.

Neues Modul basemap_stilkorrektur: korrigiere_punktlinien(layer) ersetzt Strichlänge 0 durch
0,01 im festen Strichmuster und in den array(...)-Mustern des zoomabhängigen Ausdrucks;
idempotent, andere Styles unverändert. Ausgelöst per Knopf „Punktlinien korrigieren“ im
Basemap-Bereich, sicherbar als Stilvorlage. Wrapper: PROPERTY_CUSTOM_DASH,
QgsProperty.fromExpression im Mock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 12:33:00 +02:00
co-authored by Claude Opus 5.5
parent 8693fedada
commit d6d4403e46
6 changed files with 310 additions and 2 deletions
+26 -2
View File
@@ -2,8 +2,9 @@
sn_basis/ui/widgets/basemap_bereich.py – einklappbarer Bereich „Basemap“ im Druck-Tab
Einstellungen der Basemap-Legende (Auswertebereich, Erzeugen beim Anlegen der Vorlage),
„Basemap-Legende aktualisieren“ für bestehende Vorlagen und lokale Stilvorlagen des
Basemap-Layers (laden, speichern, als Standard markieren, löschen). Basis #88.
„Basemap-Legende aktualisieren“ für bestehende Vorlagen, lokale Stilvorlagen des
Basemap-Layers (laden, speichern, als Standard markieren, löschen) und „Punktlinien
korrigieren“ (Basis #90). Basis #88.
Die Handler enthalten nur Ablauf und Rückfragen; die Logik liegt in
``modules/basemap_legende`` und ``modules/basemap_stilvorlagen``.
@@ -30,6 +31,7 @@ from sn_basis.functions.qt_wrapper import (
)
from sn_basis.modules import basemap_legende as legende
from sn_basis.modules.basemap_legende_layout import layouts_mit_basemap_legende
from sn_basis.modules.basemap_stilkorrektur import korrigiere_punktlinien
from sn_basis.modules.basemap_stilvorlagen import BasemapStilvorlagen
TITEL = "Basemap"
@@ -109,6 +111,14 @@ class BasemapBereich(QWidget):
zeile.addWidget(knopf_stil)
spalte.addLayout(zeile)
self._punktlinien_btn = QPushButton("Punktlinien korrigieren", self)
self._punktlinien_btn.setToolTip(
"Baumreihen, Hecken, Durchlässe u. a. zeichnet QGIS aus dem Basemap-Stil nicht (Strichlänge 0). "
"Korrigiert die Darstellung im Projekt; mit „Speichern unter …“ als Stilvorlage sichern."
)
self._punktlinien_btn.clicked.connect(lambda *_: self._on_punktlinien_korrigieren())
spalte.addWidget(self._punktlinien_btn)
inhalt.setLayout(spalte)
inhalt.setVisible(False)
self._inhalt = inhalt
@@ -162,6 +172,7 @@ class BasemapBereich(QWidget):
self._layout_combo.clear()
self._layout_combo.addItems(layouts_mit_basemap_legende(self._projekt()))
self._aktualisieren_btn.setEnabled(layer is not None and self._layout_combo.count() > 0)
self._punktlinien_btn.setEnabled(layer is not None)
self._stil_combo.clear()
for vorlage in self._vorlagen().liste():
@@ -196,6 +207,19 @@ class BasemapBereich(QWidget):
elif ergebnis["status"] != "abgebrochen":
info(TITEL, ergebnis["meldung"])
# --- Handler: Darstellung korrigieren ------------------------------
def _on_punktlinien_korrigieren(self) -> None:
layer = self.basemap_layer()
if layer is None:
warning(TITEL, KEIN_LAYER_TEXT)
return
anzahl = korrigiere_punktlinien(layer)
if anzahl:
success(TITEL, f"{anzahl} Punktlinien-Styles korrigiert. Basemap-Legende ggf. aktualisieren.")
else:
info(TITEL, "Keine Punktlinien zu korrigieren.")
# --- Handler: Stilvorlagen ------------------------------------------
def _gewaehlte_vorlage(self) -> str: