From 944fc82b1f4b8f8024064b64ea9ba6d794ddb8e0 Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 23 Jun 2026 13:54:08 +0200 Subject: [PATCH] =?UTF-8?q?anh=C3=A4ngen-Funktion=20f=C3=BCr=20Flurst?= =?UTF-8?q?=C3=BCcke?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions/flurstueck_alkis.py | 38 +++++++++++++++++------- functions/verfahrensgebiet_alkis.py | 1 + ui/tabs/working_tab.py | 46 ++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 12 deletions(-) diff --git a/functions/flurstueck_alkis.py b/functions/flurstueck_alkis.py index e20f83c..79463b9 100644 --- a/functions/flurstueck_alkis.py +++ b/functions/flurstueck_alkis.py @@ -53,23 +53,28 @@ def _check_existing_flurstueck_layer(tab_widget): if not existing_layers: return None, LoadStatus.FIRST - reply = QMessageBox.question( - tab_widget, - "Layer bereits vorhanden", - f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\n" - "Möchten Sie ihn löschen und neu laden?", - QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, - QMessageBox.StandardButton.No, + msg = QMessageBox(tab_widget) + msg.setWindowTitle("Layer bereits vorhanden") + msg.setText( + f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\nWas soll geschehen?" ) - if reply == QMessageBox.StandardButton.Yes: + btn_ueberschreiben = msg.addButton("Überschreiben", QMessageBox.ButtonRole.DestructiveRole) + btn_anhaengen = msg.addButton("Anhängen", QMessageBox.ButtonRole.AcceptRole) + btn_abbrechen = msg.addButton("Abbrechen", QMessageBox.ButtonRole.RejectRole) + msg.setDefaultButton(btn_abbrechen) + msg.exec() + clicked = msg.clickedButton() + if clicked is btn_ueberschreiben: for lyr in existing_layers: project.removeMapLayer(lyr.id()) return None, LoadStatus.RELOAD + elif clicked is btn_anhaengen: + return existing_layers[0], LoadStatus.APPEND else: - return existing_layers[0], LoadStatus.KEEP + return None, LoadStatus.NONE -def _lade_flurstuecke_per_gemarkung(schluessel_liste: List[str]): +def lade_flurstuecke_per_gemarkung(schluessel_liste: List[str]): """Lädt Flurstücke für mehrere Gemarkungen, eine WFS-Anfrage pro Schlüssel. Vermeidet das WFS-Feature-Limit einer einzelnen Abfrage mit mehreren @@ -179,6 +184,7 @@ def flurstueck_alkis( Bei Fehlern ist der Layer ``None`` und der Status :attr:`LoadStatus.NONE`. """ # --- Schritt 1: Vorhandenen Layer behandeln ---------------------------- + append_target = None if ohne_dialog: project = QgsProject.instance() hatte_layer = bool(project.mapLayersByName(FLST_LAYER_NAME)) @@ -189,6 +195,10 @@ def flurstueck_alkis( existing, status = _check_existing_flurstueck_layer(tab_widget) if status == LoadStatus.KEEP: return existing, status + if status == LoadStatus.NONE: + return None, LoadStatus.NONE + if status == LoadStatus.APPEND: + append_target = existing # --- Schritt 2: Gemarkungsschlüssel bestimmen ------------------------- if ohne_dialog: @@ -226,7 +236,7 @@ def flurstueck_alkis( return None, LoadStatus.NONE # --- Schritt 3: Flurstücke gemarkungsweise laden ---------------------- - layer = _lade_flurstuecke_per_gemarkung(schluessel_liste) + layer = lade_flurstuecke_per_gemarkung(schluessel_liste) if not layer or not layer.isValid() or layer.featureCount() == 0: if not ohne_dialog: @@ -238,4 +248,10 @@ def flurstueck_alkis( ) return None, LoadStatus.NONE + # --- Anhängen an vorhandenen Layer ------------------------------------ + if status == LoadStatus.APPEND and append_target is not None: + append_target.dataProvider().addFeatures(list(layer.getFeatures())) + append_target.updateExtents() + return append_target, LoadStatus.APPEND + return layer, status diff --git a/functions/verfahrensgebiet_alkis.py b/functions/verfahrensgebiet_alkis.py index f187cfc..dae1c29 100644 --- a/functions/verfahrensgebiet_alkis.py +++ b/functions/verfahrensgebiet_alkis.py @@ -39,6 +39,7 @@ class LoadStatus(Enum): FIRST = "first" # erstmalig geladen RELOAD = "reload" # neu geladen KEEP = "keep" # vorhandener Layer behalten + APPEND = "append" # Features an vorhandenen Layer angehängt def _check_existing_layer(tab_widget): diff --git a/ui/tabs/working_tab.py b/ui/tabs/working_tab.py index 135b348..13e5952 100644 --- a/ui/tabs/working_tab.py +++ b/ui/tabs/working_tab.py @@ -14,7 +14,12 @@ 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, ALKIS_SF_URL +from sn_verfahrensgebiet.functions.flurstueck_alkis import ( + flurstueck_alkis, + lade_flurstuecke_per_gemarkung, + ALKIS_SF_URL, + FLST_LAYER_NAME, +) 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 ( @@ -293,6 +298,11 @@ class WorkingTab(QWidget): self.setze_haken(self.haken_flurst, True) info("Flurstücke", "Vorhandener Layer wurde behalten.", duration=4) + elif status == LoadStatus.APPEND: + self.setze_haken(self.haken_flurst, True) + iface.mapCanvas().refresh() + success("Flurstücke", "Features wurden an den vorhandenen Layer angehängt.", duration=5) + finally: self._set_busy(self.btn_flurst_alkis, False, "Aus ALKIS laden") @@ -366,6 +376,40 @@ class WorkingTab(QWidget): ) return + # Prüfen ob bereits ein Flurstücke-Layer vorhanden → 3-Knopf-Dialog + existing_flst = project.mapLayersByName(FLST_LAYER_NAME) + if existing_flst: + msg_box = QMessageBox(self) + msg_box.setWindowTitle("Layer bereits vorhanden") + msg_box.setText( + f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\nWas soll geschehen?" + ) + btn_ueberschreiben = msg_box.addButton("Überschreiben", QMessageBox.ButtonRole.DestructiveRole) + btn_anhaengen = msg_box.addButton("Anhängen", QMessageBox.ButtonRole.AcceptRole) + btn_abbrechen = msg_box.addButton("Abbrechen", QMessageBox.ButtonRole.RejectRole) + msg_box.setDefaultButton(btn_abbrechen) + msg_box.exec() + clicked = msg_box.clickedButton() + if clicked is btn_abbrechen: + return + if clicked is btn_anhaengen: + temp_layer = lade_flurstuecke_per_gemarkung(vorgabe_schluessel) + if not temp_layer or not temp_layer.isValid() or temp_layer.featureCount() == 0: + 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 + existing_flst[0].dataProvider().addFeatures(list(temp_layer.getFeatures())) + existing_flst[0].updateExtents() + iface.mapCanvas().refresh() + self.setze_haken(self.haken_flurst, True) + success("Flurstücke", "Features wurden an den vorhandenen Layer angehängt.", duration=5) + return + # else: Überschreiben → fall-through zum flurstueck_alkis(ohne_dialog=True)-Aufruf + # Flurstücke direkt laden (kein Dialog) layer, status = flurstueck_alkis( self,