From 5c00b4abee38b27682743f684f9636b1a8b75297 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 20 Mar 2026 10:11:42 +0100 Subject: [PATCH] =?UTF-8?q?Comboboxen=20Thema=20und=20Massstab=20hinzugef?= =?UTF-8?q?=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/tab_b_logic.py | 81 +++++++++++++-------------- ui/tab_b_ui.py | 139 ++++++++++++++++++++++++++++++---------------- 2 files changed, 131 insertions(+), 89 deletions(-) diff --git a/ui/tab_b_logic.py b/ui/tab_b_logic.py index 7588e6f..eea9e9e 100644 --- a/ui/tab_b_logic.py +++ b/ui/tab_b_logic.py @@ -2,50 +2,30 @@ sn_plan41/ui/tab_b_logic.py – Fachlogik für Tab B (Druck) """ from __future__ import annotations -from sn_basis.functions.sys_wrapper import get_plugin_root, join_path, file_exists - -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.functions.variable_wrapper import set_variable 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 -from sn_basis.modules.Datenabruf import Datenabruf + +KARTENNAME_VAR = "sn_kartenname" +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: """ @@ -54,4 +34,21 @@ class TabBLogic: def __init__(self, pruefmanager: Pruefmanager) -> None: 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") \ No newline at end of file diff --git a/ui/tab_b_ui.py b/ui/tab_b_ui.py index e706d25..02b6638 100644 --- a/ui/tab_b_ui.py +++ b/ui/tab_b_ui.py @@ -9,27 +9,26 @@ from sn_basis.functions.qt_wrapper import ( QWidget, QVBoxLayout, QLabel, - QPushButton, - QToolButton, - QFileDialog, - QMessageBox, - ToolButtonTextBesideIcon, - ArrowDown, - ArrowRight, - SizePolicyPreferred, - SizePolicyMaximum, QComboBox, ) -from sn_basis.functions.qgisui_wrapper import QgsFileWidget, QgsMapLayerComboBox -from sn_basis.functions.qgiscore_wrapper import QgsProject, QgsMapLayerProxyModel +from sn_basis.functions.qgisui_wrapper import iface 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) from sn_basis.modules.Pruefmanager import Pruefmanager from sn_basis.modules.DataGrabber import DataGrabber -from sn_basis.modules.Dateipruefer import Dateipruefer -from sn_plan41.ui.tab_b_logic import TabBLogic +from sn_plan41.ui.tab_b_logic import ( + 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): """ @@ -60,54 +59,100 @@ class TabB(QWidget): self.pruefmanager: Optional[Pruefmanager] = None self.logic: Optional[TabBLogic] = None - + self._thema_combo: Optional[QComboBox] = None + self._massstab_combo: Optional[QComboBox] = None self._build_ui() 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: - """Erstellt die komplette UI-Hierarchie mit allen Gruppen.""" + """Erstellt die reduzierte UI für die Themenauswahl.""" main_layout = QVBoxLayout() main_layout.setSpacing(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 === - layer_label = QLabel("Verfahrensgebiet-Layer auswählen") - layer_label.setStyleSheet("font-weight: bold; margin-top: 6px;") - main_layout.addWidget(layer_label) - - self.layer_combo = QgsMapLayerComboBox() - self.layer_combo.setFilters(QgsMapLayerProxyModel.VectorLayer) - self.layer_combo.layerChanged.connect(self._on_layer_changed) - main_layout.addWidget(self.layer_combo) + self._thema_combo = QComboBox(self) + self._thema_combo.addItem(THEMA_PLACEHOLDER) + self._thema_combo.addItem(THEMA_38) + self._thema_combo.addItem(THEMA_41) + self._thema_combo.currentTextChanged.connect(self._on_thema_changed) + main_layout.addWidget(self._thema_combo) + + massstab_label = QLabel("Massstab") + massstab_label.setStyleSheet("font-weight: bold; margin-top: 6px;") + main_layout.addWidget(massstab_label) + + 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: - """Stellt UI-State aus Projektvariablen/Persistenz wieder her.""" - - # === 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: + """Stellt die gespeicherten Combobox-Zustände wieder her.""" + if not self._thema_combo or not self._massstab_combo: return - # UI-State speichern - set_variable("tab_b_layer_id", layer.id(), scope="project") + saved_thema = get_variable(THEMA_VAR, 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: - 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