neues Layout "Baufreigabe" hinzugefügt

This commit is contained in:
2026-04-10 22:56:34 +02:00
parent 40c224959d
commit 0900c6d3b0
6 changed files with 975 additions and 53 deletions
+191 -4
View File
@@ -13,9 +13,13 @@ from sn_basis.functions.qt_wrapper import (
QCheckBox,
QHBoxLayout,
QPushButton,
QToolButton,
ToolButtonTextBesideIcon,
ArrowDown,
ArrowRight,
)
from sn_basis.functions.qgiscore_wrapper import QgsProject
from sn_basis.functions.qgisui_wrapper import iface
from sn_basis.functions.qgiscore_wrapper import QgsProject, QgsMapLayerProxyModel
from sn_basis.functions.qgisui_wrapper import iface, QgsMapLayerComboBox
from sn_basis.functions.variable_wrapper import get_variable, set_variable
from sn_basis.modules.Pruefmanager import Pruefmanager
from sn_basis.modules.DataGrabber import DataGrabber
@@ -39,6 +43,7 @@ KARTENNAME_VAR = "tab_b_kartenname"
KARTENNAME_PLACEHOLDER = "Kartenname waehlen"
KARTENNAME_38 = "§38"
KARTENNAME_41 = "§41"
KARTENNAME_BAUFREIGABE = "Anlage zur Baufreigabe"
MASSSTAB_VAR = "tab_b_massstab"
THEMA_VAR = "tab_b_thema"
ZIELGROESSE_UI_VAR = "tab_b_zielgroesse"
@@ -70,6 +75,10 @@ class PrintTab(QWidget):
self._endlosrolle_cb: Optional[Any] = None
self._druckpuffer_button: Optional[Any] = None
self._btn_vorlage_erstellen: Optional[Any] = None
self._atlas_layer_combo: Optional[Any] = None
self._btn_auswahl_as_atlas: Optional[Any] = None
self._atlas_button: Optional[Any] = None
self._atlas_content: Optional[Any] = None
self._build_ui()
self._restore_state()
@@ -110,6 +119,7 @@ class PrintTab(QWidget):
kartenname_combo.addItem(KARTENNAME_PLACEHOLDER)
kartenname_combo.addItem(KARTENNAME_38)
kartenname_combo.addItem(KARTENNAME_41)
kartenname_combo.addItem(KARTENNAME_BAUFREIGABE)
kartenname_combo.currentTextChanged.connect(self._on_kartenname_changed)
self._kartenname_combo = kartenname_combo
main_layout.addWidget(kartenname_combo)
@@ -191,6 +201,49 @@ class PrintTab(QWidget):
main_layout.addLayout(druckbereich_row)
# Atlas-Bereich (einklappbar, analog Tab A)
atlas_button = QToolButton()
atlas_button.setText("Atlas")
atlas_button.setCheckable(True)
atlas_button.setChecked(False)
atlas_button.setToolButtonStyle(ToolButtonTextBesideIcon)
atlas_button.setArrowType(ArrowRight)
atlas_button.setStyleSheet("font-weight: bold; margin-top: 6px;")
atlas_button.toggled.connect(self._toggle_atlas)
self._atlas_button = atlas_button
main_layout.addWidget(atlas_button)
atlas_content = QWidget()
atlas_layout = QVBoxLayout()
atlas_layout.setSpacing(4)
atlas_layout.setContentsMargins(10, 4, 4, 4)
atlas_layer_label = QLabel("Abdeckungslayer", self)
atlas_layout.addWidget(atlas_layer_label)
atlas_layer_combo = QgsMapLayerComboBox(self)
set_filters = getattr(atlas_layer_combo, "setFilters", None)
if callable(set_filters):
set_filters(QgsMapLayerProxyModel.VectorLayer)
layer_changed = getattr(atlas_layer_combo, "layerChanged", None)
if layer_changed is not None:
try:
layer_changed.connect(self._on_atlas_layer_changed)
except Exception:
pass
self._atlas_layer_combo = atlas_layer_combo
atlas_layout.addWidget(atlas_layer_combo)
btn_auswahl_as_atlas = QPushButton("Auswahl als Atlas anlegen", self)
btn_auswahl_as_atlas.clicked.connect(self._on_auswahl_as_atlas_clicked)
self._btn_auswahl_as_atlas = btn_auswahl_as_atlas
atlas_layout.addWidget(btn_auswahl_as_atlas)
atlas_content.setLayout(atlas_layout)
atlas_content.setVisible(False)
self._atlas_content = atlas_content
main_layout.addWidget(atlas_content)
btn_vorlage_erstellen = QPushButton("Vorlage erstellen", self)
btn_vorlage_erstellen.clicked.connect(self._on_vorlage_erstellen)
self._btn_vorlage_erstellen = btn_vorlage_erstellen
@@ -208,7 +261,7 @@ class PrintTab(QWidget):
return
saved_kartenname = get_variable(KARTENNAME_VAR, scope="project")
if saved_kartenname in (KARTENNAME_38, KARTENNAME_41):
if saved_kartenname in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE):
self._kartenname_combo.setCurrentText(saved_kartenname)
else:
self._kartenname_combo.setCurrentText(KARTENNAME_PLACEHOLDER)
@@ -252,12 +305,18 @@ class PrintTab(QWidget):
druckpuffer_cm = DRUCKPUFFER_STANDARD_CM
self._druckpuffer_button.setText(self._format_druckpuffer_label(max(0, druckpuffer_cm)))
self._restore_atlas_layer_selection()
def _on_kartenname_changed(self, value: str) -> None:
if value in (KARTENNAME_38, KARTENNAME_41):
if value in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE):
set_variable(KARTENNAME_VAR, value, scope="project")
else:
set_variable(KARTENNAME_VAR, "", scope="project")
# Atlas-Bereich automatisch ein-/ausklappen je nach Kartenname.
if self._atlas_button:
self._atlas_button.setChecked(value == KARTENNAME_BAUFREIGABE)
if self.logic:
self.logic.set_kartenname_for_auswahl(value)
@@ -358,6 +417,36 @@ class PrintTab(QWidget):
self._connect_theme_collection_signals()
self._restore_state()
def _toggle_atlas(self, checked: bool) -> None:
if self._atlas_button:
self._atlas_button.setArrowType(ArrowDown if checked else ArrowRight)
if self._atlas_content:
self._atlas_content.setVisible(checked)
def _restore_atlas_layer_selection(self) -> None:
if not self._atlas_layer_combo:
return
layer_id = (get_variable("sn_abdeckungslayer", scope="project") or "").strip()
if not layer_id:
return
try:
layer = QgsProject.instance().mapLayer(layer_id)
if layer is None:
return
set_current_layer = getattr(self._atlas_layer_combo, "setLayer", None)
if callable(set_current_layer):
set_current_layer(layer)
return
set_current_layer = getattr(self._atlas_layer_combo, "setCurrentLayer", None)
if callable(set_current_layer):
set_current_layer(layer)
except Exception:
pass
def _disconnect_theme_collection_signals(self) -> None:
collection = self._connected_theme_collection
if collection is not None:
@@ -450,3 +539,101 @@ class PrintTab(QWidget):
return float(scale) if scale else None
except Exception:
return None
def _on_atlas_layer_changed(self, layer_or_name: Any) -> None:
"""Speichert den ausgewaehlten Atlas-Layer als Layer-ID in Projektvariablen."""
if layer_or_name is None or layer_or_name == "":
set_variable("sn_abdeckungslayer", "", scope="project")
return
# Standardfall QgsMapLayerComboBox: echtes Layer-Objekt
layer_id_getter = getattr(layer_or_name, "id", None)
if callable(layer_id_getter):
layer_id = layer_id_getter() or ""
set_variable("sn_abdeckungslayer", layer_id, scope="project")
return
# Fallback: ggf. Name aus Mock/anderen Widgets
value = str(layer_or_name).strip()
if not value:
set_variable("sn_abdeckungslayer", "", scope="project")
return
try:
project = QgsProject.instance()
map_layers = project.mapLayers()
for layer_id, layer in map_layers.items():
if getattr(layer, "name", lambda: "")() == value:
set_variable("sn_abdeckungslayer", layer_id, scope="project")
return
except Exception:
pass
def _on_auswahl_as_atlas_clicked(self) -> None:
"""Handler fuer Button 'Auswahl als Atlas anlegen'.
Erstellt einen neuen Layer 'Atlaslayer' aus der aktuellen Feature-Auswahl
und traegt ihn ins Atlas-Dropdown ein.
"""
if not self.logic or not self.pruefmanager:
return
atlas_layer, layer_id = self.logic.create_atlas_layer_from_selection()
if atlas_layer is None or not layer_id:
return
if self._atlas_button and self._atlas_content:
self._atlas_button.setChecked(True)
self._toggle_atlas(True)
# Neu erstellten Layer im Layer-Combo setzen
if self._atlas_layer_combo:
set_current_layer = getattr(self._atlas_layer_combo, "setLayer", None)
if callable(set_current_layer):
try:
set_current_layer(atlas_layer)
return
except Exception:
pass
set_current_layer = getattr(self._atlas_layer_combo, "setCurrentLayer", None)
if callable(set_current_layer):
try:
set_current_layer(atlas_layer)
return
except Exception:
pass
# Fallback nur fuer Mock/klassische ComboBox
self._populate_atlas_layer_combo()
def _populate_atlas_layer_combo(self) -> None:
"""Fallback-Befuellung, falls kein echtes QgsMapLayerComboBox Verhalten verfuegbar ist."""
if not self._atlas_layer_combo:
return
clear_fn = getattr(self._atlas_layer_combo, "clear", None)
add_item_fn = getattr(self._atlas_layer_combo, "addItem", None)
if not callable(clear_fn) or not callable(add_item_fn):
return
self._atlas_layer_combo.blockSignals(True)
clear_fn()
add_item_fn("")
try:
project = QgsProject.instance()
map_layers = getattr(project, "mapLayers", None)
if not callable(map_layers):
self._atlas_layer_combo.blockSignals(False)
return
layers = map_layers().values() if hasattr(map_layers(), "values") else map_layers()
for layer in layers:
layer_name = getattr(layer, "name", lambda: None)()
if layer_name and layer_name not in ("", "Druckrechteck"):
add_item_fn(layer_name)
except Exception:
pass
self._atlas_layer_combo.blockSignals(False)