Comboboxen Thema und Massstab hinzugefügt

This commit is contained in:
2026-03-20 10:11:42 +01:00
parent 6261b88fee
commit 5c00b4abee
2 changed files with 131 additions and 89 deletions

View File

@@ -2,50 +2,30 @@
sn_plan41/ui/tab_b_logic.py Fachlogik für Tab B (Druck) sn_plan41/ui/tab_b_logic.py Fachlogik für Tab B (Druck)
""" """
from __future__ import annotations from __future__ import annotations
from sn_basis.functions.sys_wrapper import get_plugin_root, join_path, file_exists from sn_basis.functions.variable_wrapper import set_variable
from typing import Any, Dict, List, Optional
from collections.abc import Mapping as _Mapping
import os
import datetime
import json
import tempfile
from sn_basis.functions.qgiscore_wrapper import (
QgsVectorFileWriter,
QgsVectorLayer,
QgsProject,
QgsGeometry,
QgsFeature,
QgsField,
QgsFeatureRequest,
QgsCoordinateReferenceSystem,
)
from sn_basis.functions.variable_wrapper import (
get_variable,
set_variable,
)
from sn_basis.functions.ly_existence_wrapper import layer_exists
from sn_basis.functions.ly_metadata_wrapper import get_layer_type
from sn_basis.functions.qt_wrapper import QVariant
from sn_basis.functions.dialog_wrapper import create_progress_dialog
from sn_basis.functions.message_wrapper import info, warning, error
# Prüfer-Typen
from sn_basis.modules.Pruefmanager import Pruefmanager from sn_basis.modules.Pruefmanager import Pruefmanager
from sn_basis.modules.linkpruefer import Linkpruefer
from sn_basis.modules.stilpruefer import Stilpruefer
from sn_basis.modules.Dateipruefer import Dateipruefer
from sn_basis.modules.layerpruefer import Layerpruefer
from sn_basis.modules.LayerLoader import LayerLoader
from sn_basis.modules.Datenschreiber import Datenschreiber
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
from sn_basis.modules.DataGrabber import DataGrabber, SourceType, SourceDict KARTENNAME_VAR = "sn_kartenname"
from sn_basis.modules.Datenabruf import Datenabruf PLOTMASSSTAB_VAR = "sn_plotmassstab"
THEMA_38 = "§38"
THEMA_41 = "§41"
MASSSTAB_WIE_KARTENFENSTER = "Wie Kartenfenster"
KARTENNAME_BY_THEMA = {
THEMA_38: "Planungsübersicht §38 FlurbG",
THEMA_41: "Karte zum Plan über die gemeinschaftlichen und öffentlichen Anlagen (§ 41 FlurbG)",
}
PLOTMASSSTAB_BY_AUSWAHL = {
"1:5.000": "5000",
"1:10.000": "10000",
"1:15.000": "15000",
"1:20.000": "20000",
"1:25.000": "25000",
"1:50.000": "50000",
"1:100.000": "100000",
}
class TabBLogic: class TabBLogic:
""" """
@@ -55,3 +35,20 @@ class TabBLogic:
def __init__(self, pruefmanager: Pruefmanager) -> None: def __init__(self, pruefmanager: Pruefmanager) -> None:
self.pruefmanager = pruefmanager self.pruefmanager = pruefmanager
def set_kartenname_for_thema(self, thema: str) -> None:
"""Setzt die Projektvariable ``sn_kartenname`` anhand des gewählten Druckthemas."""
kartenname = KARTENNAME_BY_THEMA.get(thema, "")
set_variable(KARTENNAME_VAR, kartenname, scope="project")
def set_plotmassstab_for_auswahl(self, auswahl: str, aktueller_massstab: float | None = None) -> None:
"""Setzt die Projektvariable ``sn_plotmassstab`` anhand der Maßstabsauswahl."""
if auswahl == MASSSTAB_WIE_KARTENFENSTER:
if aktueller_massstab and aktueller_massstab > 0:
set_variable(PLOTMASSSTAB_VAR, str(int(round(aktueller_massstab))), scope="project")
else:
set_variable(PLOTMASSSTAB_VAR, "", scope="project")
return
value = PLOTMASSSTAB_BY_AUSWAHL.get(auswahl, "")
set_variable(PLOTMASSSTAB_VAR, value, scope="project")

View File

@@ -9,27 +9,26 @@ from sn_basis.functions.qt_wrapper import (
QWidget, QWidget,
QVBoxLayout, QVBoxLayout,
QLabel, QLabel,
QPushButton,
QToolButton,
QFileDialog,
QMessageBox,
ToolButtonTextBesideIcon,
ArrowDown,
ArrowRight,
SizePolicyPreferred,
SizePolicyMaximum,
QComboBox, QComboBox,
) )
from sn_basis.functions.qgisui_wrapper import QgsFileWidget, QgsMapLayerComboBox from sn_basis.functions.qgisui_wrapper import iface
from sn_basis.functions.qgiscore_wrapper import QgsProject, QgsMapLayerProxyModel
from sn_basis.functions.variable_wrapper import get_variable, set_variable from sn_basis.functions.variable_wrapper import get_variable, set_variable
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
# Services (werden von DockWidget injiziert) # Services (werden von DockWidget injiziert)
from sn_basis.modules.Pruefmanager import Pruefmanager from sn_basis.modules.Pruefmanager import Pruefmanager
from sn_basis.modules.DataGrabber import DataGrabber from sn_basis.modules.DataGrabber import DataGrabber
from sn_basis.modules.Dateipruefer import Dateipruefer from sn_plan41.ui.tab_b_logic import (
from sn_plan41.ui.tab_b_logic import TabBLogic TabBLogic,
MASSSTAB_WIE_KARTENFENSTER,
PLOTMASSSTAB_BY_AUSWAHL,
)
THEMA_VAR = "tab_b_thema"
THEMA_PLACEHOLDER = "Thema wählen"
THEMA_38 = "§38"
THEMA_41 = "§41"
MASSSTAB_VAR = "tab_b_massstab"
class TabB(QWidget): class TabB(QWidget):
""" """
@@ -60,54 +59,100 @@ class TabB(QWidget):
self.pruefmanager: Optional[Pruefmanager] = None self.pruefmanager: Optional[Pruefmanager] = None
self.logic: Optional[TabBLogic] = None self.logic: Optional[TabBLogic] = None
self._thema_combo: Optional[QComboBox] = None
self._massstab_combo: Optional[QComboBox] = None
self._build_ui() self._build_ui()
self._restore_state() self._restore_state()
def set_services(self, pruefmanager: Pruefmanager, data_grabber: DataGrabber) -> None:
"""Injiziert Services vom übergeordneten DockWidget."""
_ = data_grabber
self.pruefmanager = pruefmanager
self.logic = TabBLogic(pruefmanager=self.pruefmanager)
if self._thema_combo:
self.logic.set_kartenname_for_thema(self._thema_combo.currentText())
if self._massstab_combo:
self.logic.set_plotmassstab_for_auswahl(
self._massstab_combo.currentText(),
self._get_current_canvas_scale(),
)
def _build_ui(self) -> None: def _build_ui(self) -> None:
"""Erstellt die komplette UI-Hierarchie mit allen Gruppen.""" """Erstellt die reduzierte UI für die Themenauswahl."""
main_layout = QVBoxLayout() main_layout = QVBoxLayout()
main_layout.setSpacing(4) main_layout.setSpacing(4)
main_layout.setContentsMargins(4, 4, 4, 4) main_layout.setContentsMargins(4, 4, 4, 4)
thema_label = QLabel("Thema")
thema_label.setStyleSheet("font-weight: bold; margin-top: 6px;")
main_layout.addWidget(thema_label)
# === LAYER-AUSWAHL === self._thema_combo = QComboBox(self)
layer_label = QLabel("Verfahrensgebiet-Layer auswählen") self._thema_combo.addItem(THEMA_PLACEHOLDER)
layer_label.setStyleSheet("font-weight: bold; margin-top: 6px;") self._thema_combo.addItem(THEMA_38)
main_layout.addWidget(layer_label) self._thema_combo.addItem(THEMA_41)
self._thema_combo.currentTextChanged.connect(self._on_thema_changed)
main_layout.addWidget(self._thema_combo)
self.layer_combo = QgsMapLayerComboBox() massstab_label = QLabel("Massstab")
self.layer_combo.setFilters(QgsMapLayerProxyModel.VectorLayer) massstab_label.setStyleSheet("font-weight: bold; margin-top: 6px;")
self.layer_combo.layerChanged.connect(self._on_layer_changed) main_layout.addWidget(massstab_label)
main_layout.addWidget(self.layer_combo)
self._massstab_combo = QComboBox(self)
self._massstab_combo.addItem(MASSSTAB_WIE_KARTENFENSTER)
self._massstab_combo.addItems(list(PLOTMASSSTAB_BY_AUSWAHL.keys()))
self._massstab_combo.currentTextChanged.connect(self._on_massstab_changed)
main_layout.addWidget(self._massstab_combo)
main_layout.addStretch(1)
self.setLayout(main_layout)
def _restore_state(self) -> None: def _restore_state(self) -> None:
"""Stellt UI-State aus Projektvariablen/Persistenz wieder her.""" """Stellt die gespeicherten Combobox-Zustände wieder her."""
if not self._thema_combo or not self._massstab_combo:
# === UI CALLBACKS ===
def _toggle_group(self, checked: bool) -> None:
"""Zeigt/verbirgt Verfahrens-DB-Gruppe."""
self.group_button.setArrowType(ArrowDown if checked else ArrowRight)
self.group_content.setVisible(checked)
def _toggle_optional(self, checked: bool) -> None:
"""Zeigt/verbirgt optionale Linkliste."""
self.optional_button.setArrowType(ArrowDown if checked else ArrowRight)
self.optional_content.setVisible(checked)
def _on_layer_changed(self, layer) -> None:
"""Persistiert Layer-Auswahl und registriert Verfahrensgebiet."""
self._pufferlayer = layer
if not layer:
return return
# UI-State speichern saved_thema = get_variable(THEMA_VAR, scope="project")
set_variable("tab_b_layer_id", layer.id(), scope="project") if saved_thema in (THEMA_38, THEMA_41):
self._thema_combo.setCurrentText(saved_thema)
else:
self._thema_combo.setCurrentText(THEMA_PLACEHOLDER)
saved_massstab = get_variable(MASSSTAB_VAR, scope="project")
valid_massstaebe = [MASSSTAB_WIE_KARTENFENSTER, *PLOTMASSSTAB_BY_AUSWAHL.keys()]
if saved_massstab in valid_massstaebe:
self._massstab_combo.setCurrentText(saved_massstab)
else:
self._massstab_combo.setCurrentText(MASSSTAB_WIE_KARTENFENSTER)
def _on_thema_changed(self, value: str) -> None:
"""Persistiert die Themenauswahl und setzt den Kartennamen."""
if value in (THEMA_38, THEMA_41):
set_variable(THEMA_VAR, value, scope="project")
else:
set_variable(THEMA_VAR, "", scope="project")
# 🔹 NEU: Verfahrensgebiet explizit registrieren
if self.logic: if self.logic:
self.logic.save_verfahrensgebiet_layer(layer) self.logic.set_kartenname_for_thema(value)
def _on_massstab_changed(self, value: str) -> None:
"""Persistiert Maßstabsauswahl und setzt ``sn_plotmassstab``."""
set_variable(MASSSTAB_VAR, value, scope="project")
if self.logic:
self.logic.set_plotmassstab_for_auswahl(value, self._get_current_canvas_scale())
def _get_current_canvas_scale(self) -> float | None:
"""Liest den aktuellen Maßstab aus der Kartensicht."""
try:
canvas = iface.mapCanvas()
if canvas is None:
return None
scale = canvas.scale()
return float(scale) if scale else None
except Exception:
return None