Files
Plugin_SN_Verfahrensgebiet/ui/tabs/eigentuemer_tab.py
T
DanielandClaude Opus 5.5 c8b380b5d3 Tab „Eigentümer“ mit Flurstückssuche (#56)
Gemarkung (Name oder Nummer) und Flurstücksnummer eingeben, die Treffer
werden im Layer „Flurstücke“ ausgewählt, angezoomt und kurz hervorgehoben.
Verglichen wird das flurstueckskennzeichen, Gemarkungsnamen werden über
den Layer „Gemarkungen“ aufgelöst. Ohne Layer „Flurstücke“ weist ein
Dialog darauf hin, zuerst Verfahrensgebiet und Flurstücke zu laden.

Erster Schritt von #56; Eigentümersuche und Anzeigefenster folgen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:44:45 +02:00

105 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""sn_verfahrensgebiet/ui/tabs/eigentuemer_tab.py – Tab „Eigentümer“ (#56).
Enthält die Flurstückssuche: Gemarkung (Name oder Nummer) und Flurstücksnummer
eingeben, „Suchen“ wählt die Treffer im Layer „Flurstücke“ aus und zoomt hin.
Die Suchlogik liegt in :mod:`sn_verfahrensgebiet.functions.flurstueck_suche`.
"""
from sn_basis.functions.qt_wrapper import (
QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QLineEdit, QPushButton, Qt,
)
from sn_basis.functions.qgisui_wrapper import iface
from sn_basis.functions.dialog_wrapper import show_info_dialog
from sn_basis.functions.message_wrapper import success, info, warning
from sn_verfahrensgebiet.functions.flurstueck_suche import (
flurstueck_suchen,
FlurstueckSucheFehler,
KeinFlurstueckslayer,
)
_TITEL_SUCHE = "Flurstückssuche"
class EigentuemerTab(QWidget):
"""Tab für Flurstückssuche und (später) Eigentümerabgleich.
Attributes:
tab_title: Anzeigetitel des Tabs ("Eigentümer")
"""
tab_title = "Eigentümer"
def __init__(self, parent=None):
super().__init__(parent)
layout = QVBoxLayout()
layout.setAlignment(Qt.AlignmentFlag.AlignTop)
layout.addWidget(QLabel("<b>Flurstückssuche</b>"))
raster = QGridLayout()
raster.addWidget(QLabel("Gemarkung:"), 0, 0)
self.gemarkung_edit = QLineEdit()
self.gemarkung_edit.setPlaceholderText("Name oder Nummer, z. B. 0268")
raster.addWidget(self.gemarkung_edit, 0, 1)
raster.addWidget(QLabel("Flurstück:"), 1, 0)
self.flurstueck_edit = QLineEdit()
self.flurstueck_edit.setPlaceholderText("z. B. 562 oder 12/3")
raster.addWidget(self.flurstueck_edit, 1, 1)
layout.addLayout(raster)
zeile_suchen = QHBoxLayout()
zeile_suchen.addStretch()
self.btn_flurstueck_suchen = QPushButton("Suchen")
self.btn_flurstueck_suchen.setToolTip(
"Sucht im Layer „Flurstücke“. Ohne Nenner werden alle Flurstücke "
"mit diesem Zähler gefunden."
)
zeile_suchen.addWidget(self.btn_flurstueck_suchen)
layout.addLayout(zeile_suchen)
self.btn_flurstueck_suchen.clicked.connect(self._on_flurstueck_suchen)
self.gemarkung_edit.returnPressed.connect(self._on_flurstueck_suchen)
self.flurstueck_edit.returnPressed.connect(self._on_flurstueck_suchen)
self.setLayout(layout)
def _on_flurstueck_suchen(self) -> None:
"""Sucht das eingegebene Flurstück, wählt die Treffer aus und zoomt hin."""
gemarkung = self.gemarkung_edit.text().strip()
nummer = self.flurstueck_edit.text().strip()
try:
ergebnis = flurstueck_suchen(gemarkung, nummer)
except KeinFlurstueckslayer as exc:
show_info_dialog(_TITEL_SUCHE, str(exc), self)
return
except FlurstueckSucheFehler as exc:
warning(_TITEL_SUCHE, str(exc))
return
if not ergebnis.feature_ids:
info(_TITEL_SUCHE, f"Flurstück {nummer} in Gemarkung {gemarkung} nicht gefunden.")
return
ergebnis.layer.selectByIds(ergebnis.feature_ids)
self._zoome_auf_auswahl(ergebnis.layer, ergebnis.feature_ids)
anzahl = len(ergebnis.feature_ids)
text = "1 Flurstück" if anzahl == 1 else f"{anzahl} Flurstücke"
success(_TITEL_SUCHE, f"{text} im Layer „{ergebnis.layer.name()}“ ausgewählt.")
@staticmethod
def _zoome_auf_auswahl(layer, feature_ids) -> bool:
"""Zoomt auf die Auswahl und lässt die Treffer kurz aufblinken.
``zoomToSelected`` rechnet selbst in das KBS der Kartenansicht um.
Gibt ``False`` zurück, wenn keine Kartenansicht verfügbar ist.
"""
try:
canvas = iface.mapCanvas()
canvas.zoomToSelected(layer)
canvas.flashFeatureIds(layer, feature_ids)
return True
except Exception:
return False