Files
Plugin_SN_Verfahrensgebiet/ui/tabs/eigentuemer_tab.py
T

105 lines
3.9 KiB
Python
Raw Normal View History

"""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