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>
105 lines
3.9 KiB
Python
105 lines
3.9 KiB
Python
"""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
|