From f36418b814d24da19ab89b43eb8143d1e11116a7 Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 23 Jun 2026 13:30:11 +0200 Subject: [PATCH] =?UTF-8?q?Button=20und=20Funktion=20"Flurst=C3=BCcke=20au?= =?UTF-8?q?s=20Gemarkungen=20laden"=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/tabs/working_tab.py | 111 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/ui/tabs/working_tab.py b/ui/tabs/working_tab.py index 3bc1a3d..135b348 100644 --- a/ui/tabs/working_tab.py +++ b/ui/tabs/working_tab.py @@ -14,12 +14,13 @@ from sn_basis.modules.pruef_ergebnis import pruef_ergebnis from qgis.utils import iface from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis import LoadStatus -from sn_verfahrensgebiet.functions.flurstueck_alkis import flurstueck_alkis +from sn_verfahrensgebiet.functions.flurstueck_alkis import flurstueck_alkis, ALKIS_SF_URL from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett import verfahrensgebiet_alkis_komplett from sn_verfahrensgebiet.functions.grenzpunkt_alkis import grenzpunkte_gemarkungsweise, JOINED_LAYER_NAME from sn_verfahrensgebiet.functions.gemarkung_alkis import ( gemarkung_schluessel_und_namen_von_vg_geometrie, lade_gemarkungen_layer, + ALKIS_VEREINF_URL, ) from sn_verfahrensgebiet.functions.umringstatistik_grenzpunkte import umringstatistik_grenzpunkte from sn_verfahrensgebiet.functions.verfahrensgebiet_edit_service import ( @@ -108,6 +109,11 @@ class WorkingTab(QWidget): row_flurst_buttons.addWidget(self.btn_flurst_shape) layout.addLayout(row_flurst_buttons) + row_flurst_gem_buttons = QHBoxLayout() + self.btn_flurst_aus_gemarkungen = QPushButton("aus gewählten Gemarkungen laden") + row_flurst_gem_buttons.addWidget(self.btn_flurst_aus_gemarkungen) + layout.addLayout(row_flurst_gem_buttons) + # Abschnitt 2c: Grenzpunkte row_grenz_header = QHBoxLayout() lbl_grenz = QLabel("Grenzpunkte") @@ -150,6 +156,7 @@ class WorkingTab(QWidget): # Signale verbinden self.btn_verf_alkis.clicked.connect(self.handle_verf_alkis) self.btn_flurst_alkis.clicked.connect(self.handle_flurst_alkis) + self.btn_flurst_aus_gemarkungen.clicked.connect(self.handle_flurst_aus_gemarkungen) self.btn_gem_alkis.clicked.connect(self.handle_gem_alkis) self.btn_grenz_alkis.clicked.connect(self.handle_grenz_alkis) self.btn_umring_statistik.clicked.connect(self.handle_umringstatistik) @@ -289,6 +296,108 @@ class WorkingTab(QWidget): finally: self._set_busy(self.btn_flurst_alkis, False, "Aus ALKIS laden") + def handle_flurst_aus_gemarkungen(self) -> None: + """Lädt Flurstücke aus ALKIS anhand der Auswahl im Layer 'Gemarkungen'. + + - Kein Layer 'Gemarkungen': Layer wird geladen, Nutzer aufgefordert Auswahl zu treffen. + - Keine Auswahl: Warnmeldung. + - Auswahl vorhanden: Gemarkungsschlüssel extrahieren und Flurstücke direkt laden. + """ + self._set_busy(self.btn_flurst_aus_gemarkungen, True, "aus gewählten Gemarkungen laden") + try: + project = QgsProject.instance() + + # Fall A: Layer 'Gemarkungen' nicht vorhanden → laden + gem_layers = project.mapLayersByName("Gemarkungen") + if not gem_layers: + gem_layer = lade_gemarkungen_layer() + if not gem_layer: + error( + "Gemarkungen", + f"Gemarkungslayer konnte nicht geladen werden – " + f"Dienst nicht erreichbar ({ALKIS_VEREINF_URL}). " + f"Bitte Netzwerkverbindung prüfen.", + duration=0, + ) + return + project.addMapLayer(gem_layer) + apply_style(gem_layer, "gemarkungen_beschriftet.qml") + self.setze_haken(self.haken_gem, True) + QMessageBox.information( + self, + "Gemarkungen", + "Gemarkungslayer wurde geladen – bitte Gemarkungen auswählen.", + ) + return + + gemarkungen_layer = gem_layers[0] + + # Fall B: Keine Auswahl + if not gemarkungen_layer.selectedFeatureCount(): + QMessageBox.warning( + self, + "Gemarkungen", + "Bitte mindestens eine Gemarkung im Layer Gemarkungen auswählen.", + ) + return + + # Fall C: Auswahl vorhanden → Schlüssel extrahieren + vorgabe_schluessel = [] + vorgabe_namen = [] + for feat in gemarkungen_layer.selectedFeatures(): + try: + schluessel = str(feat["schluessel"]).strip() + nummer = schluessel[-4:] if len(schluessel) >= 4 else schluessel + except Exception: + nummer = "" + try: + name = str(feat["ave_name"]).strip() + except Exception: + name = "" + if nummer: + vorgabe_schluessel.append(nummer) + vorgabe_namen.append(name) + + if not vorgabe_schluessel: + error( + "Flurstücke", + "Aus der Gemarkungsauswahl konnten keine gültigen Gemarkungsschlüssel extrahiert werden.", + duration=8, + ) + return + + # Flurstücke direkt laden (kein Dialog) + layer, status = flurstueck_alkis( + self, + vorgabe_schluessel=vorgabe_schluessel, + vorgabe_namen=vorgabe_namen, + ohne_dialog=True, + ) + + if not layer or not layer.isValid(): + error( + "Flurstücke", + f"Flurstücke konnten nicht geladen werden – WFS-Dienst ({ALKIS_SF_URL}) " + f"nicht erreichbar oder keine Features für die gewählten Gemarkungen.", + duration=0, + ) + return + + if status in (LoadStatus.FIRST, LoadStatus.RELOAD): + project.addMapLayer(layer) + apply_style(layer, "GIS_Flst_Beschriftung_ALKIS_NAS.qml") + iface.mapCanvas().refresh() + self.setze_haken(self.haken_flurst, True) + msg = "erstmalig geladen" if status == LoadStatus.FIRST else "neu geladen" + success("Flurstücke", f"Layer wurde {msg}.", duration=5) + + elif status == LoadStatus.KEEP: + self.setze_haken(self.haken_flurst, True) + info("Flurstücke", "Vorhandener Layer wurde behalten.", duration=4) + + finally: + self._set_busy(self.btn_flurst_aus_gemarkungen, False, "aus gewählten Gemarkungen laden") + # ------------------------------------------------------------------ # Gemarkungen-Handler # ------------------------------------------------------------------