Basemap-Legende: Auswertung und Legendenelement im Drucklayout (#88)

Beim Erstellen einer §38-/§41-Vorlage wertet BasemapLegende die Kacheln des sichtbaren
basemap.de-Layers im Verfahrensgebiet (wahlweise Druckbereich) kachelweise über
selectByGeometry aus, prüft die Renderer-Styles mit derselben Zoomlogik wie QGIS und
bildet daraus Legendeneinträge. Ein Mehrfachauswahl-Dialog (neu: ask_mehrfachauswahl)
lässt Kategorien abwählen; die Auswahl wird im Projekt gemerkt. Die gewählten Einträge
stehen mit der Signatur des Projektlayers (zoomabhängige Werte festgeschrieben) in
einem eigenen Legendenelement über der Quellenangabe. Ein eigenes Element ist nötig,
weil die nach Karteninhalt filternde Hauptlegende die Hilfslayer ausblenden würde.

Wrapper um die nötigen QGIS-/Qt-Symbole mit Mock ergänzt (eigener Block in
qgiscore_wrapper; QgsRectangle hatte bisher keinen Mock).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 11:57:09 +02:00
co-authored by Claude Opus 5.5
parent 7408740dfe
commit b549cb8a5a
11 changed files with 2223 additions and 0 deletions
+23
View File
@@ -981,6 +981,7 @@ class PrintLayout:
kartenname_auswahl: str = "",
thema: str = "",
fit_extent_to_map: bool = True,
basemap_legende: bool = False,
) -> Any:
layout_manager = self.project.layoutManager()
existing_layout = layout_manager.layoutByName(name)
@@ -1082,7 +1083,29 @@ class PrintLayout:
kartenname_auswahl,
)
if basemap_legende:
self._erzeuge_basemap_legende(layout)
layout_manager.addLayout(layout)
self._current_layout = None
open_layout_designer(layout)
return layout
def _erzeuge_basemap_legende(self, layout: Any) -> None:
"""Kennzeichnet das Layout und erzeugt die Basemap-Legende (Basis #88).
Ein Fehler bei der Basemap-Legende darf das Anlegen der Vorlage nicht verhindern; er wird
als Warnung gemeldet.
"""
from sn_basis.functions.message_wrapper import warning
from sn_basis.modules.basemap_legende import BasemapLegende
from sn_basis.modules.basemap_legende_layout import markiere_layout
markiere_layout(layout)
try:
ergebnis = BasemapLegende(self.project).aktualisiere(layout)
except Exception as fehler:
warning("Basemap-Legende", f"Die Basemap-Legende konnte nicht erzeugt werden: {fehler}")
return
if ergebnis.get("status") == "keine_eintraege":
warning("Basemap-Legende", ergebnis.get("meldung", ""))