diff --git a/modules/print_logic.py b/modules/print_logic.py index 27fc600..74a74b4 100644 --- a/modules/print_logic.py +++ b/modules/print_logic.py @@ -120,6 +120,21 @@ class PrintLogic: self._rectangle_tool: Any | None = None self._previous_map_tool: Any | None = None + def _failed_result(self) -> dict: + return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + + def _show_target_size_too_small(self) -> dict: + self.pruefmanager.zeige_hinweis( + "Zielgroesse zu klein", + "Die gewaehlte Zielgroesse reicht fuer den Einzelblatt-Druck nicht aus.", + ) + return self._failed_result() + + def _is_enabled_flag(self, raw_value: Any) -> bool: + if raw_value in (None, ""): + return True + return str(raw_value).strip().lower() in {"1", "true", "ja", "yes", "on"} + def _resolve_layer_from_project(self) -> object | None: project = QgsProject.instance() # Primär: neue zentrale Variable aus sn_verfahrensgebiet_manager @@ -476,10 +491,15 @@ class PrintLogic: if not callable(layouts_fn): return False try: - layout_list = layouts_fn() - if not layout_list: + layout_iterable = layouts_fn() + if layout_iterable is None: return False - layout = layout_list[-1] + last_layout: Any | None = None + for candidate_layout in cast(Any, layout_iterable): + last_layout = candidate_layout + if last_layout is None: + return False + layout = last_layout except Exception: return False else: @@ -1151,7 +1171,7 @@ class PrintLogic: if kartenname_auswahl not in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE): self.pruefmanager.zeige_hinweis("Kartennamen waehlen", "Kartennamen waehlen") - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._failed_result() if massstab_auswahl == MASSSTAB_WIE_KARTENFENSTER: # Maßstab direkt vom aktuellen Canvas lesen; Projektvariable als Fallback. @@ -1172,11 +1192,11 @@ class PrintLogic: if massstab_zahl <= 0: self.pruefmanager.zeige_hinweis("Massstab fehlt", "Kein gueltiger Massstab angegeben.") - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._failed_result() extent, layer_for_extent = self._resolve_extent(resolved_layer, druckbereich_auswahl, massstab_zahl) if extent is None: - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._failed_result() if layer_for_extent is not None: layer_id = getattr(layer_for_extent, "id", lambda: "")() or "" @@ -1190,7 +1210,7 @@ class PrintLogic: force_fit_extent_for_min_a4 = False if kartenname_auswahl == KARTENNAME_BAUFREIGABE: - din_format, auto_page_w, auto_page_h, auto_map_w, auto_map_h, _bf_fallback = self._get_baufreigabe_page_dimensions( + _, auto_page_w, auto_page_h, auto_map_w, auto_map_h, _bf_fallback = self._get_baufreigabe_page_dimensions( kartenbild_w, kartenbild_h, max_format=zielgroesse if zielgroesse in {"DIN A4", "DIN A3"} else "DIN A3", @@ -1203,40 +1223,29 @@ class PrintLogic: formfaktor, ) if standard_layout is None: - self.pruefmanager.zeige_hinweis( - "Zielgroesse zu klein", - "Die gewaehlte Zielgroesse reicht fuer den Einzelblatt-Druck nicht aus.", - ) - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._show_target_size_too_small() auto_page_w, auto_page_h, auto_map_w, auto_map_h, force_fit_extent_for_min_a4 = standard_layout # Finale Sicherheitspruefung: alle Layoutobjekte muessen auf die Seite passen. if kartenname_auswahl == KARTENNAME_BAUFREIGABE: - fits_page = self._does_plot_fit_page( - auto_page_w, - auto_page_h, - auto_map_w, - auto_map_h, - BAUFREIGABE_LAYOUT_FIXBREITE_MM, - BAUFREIGABE_LAYOUT_FIXHOEHE_MM, - ) + fixed_width_mm = BAUFREIGABE_LAYOUT_FIXBREITE_MM + fixed_height_mm = BAUFREIGABE_LAYOUT_FIXHOEHE_MM else: - fits_page = self._does_plot_fit_page( - auto_page_w, - auto_page_h, - auto_map_w, - auto_map_h, - STANDARD_LAYOUT_FIXBREITE_MM, - STANDARD_LAYOUT_FIXHOEHE_MM, - ) + fixed_width_mm = STANDARD_LAYOUT_FIXBREITE_MM + fixed_height_mm = STANDARD_LAYOUT_FIXHOEHE_MM + + fits_page = self._does_plot_fit_page( + auto_page_w, + auto_page_h, + auto_map_w, + auto_map_h, + fixed_width_mm, + fixed_height_mm, + ) if not fits_page: - self.pruefmanager.zeige_hinweis( - "Zielgroesse zu klein", - "Die gewaehlte Zielgroesse reicht fuer den Einzelblatt-Druck nicht aus.", - ) - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._show_target_size_too_small() kartenname = get_variable(KARTENNAME_VAR, scope="project") or KARTENNAME_BY_AUSWAHL.get( kartenname_auswahl, "Vorlage" @@ -1249,15 +1258,13 @@ class PrintLogic: default_text=kartenname, ) if not bestaetigt: - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._failed_result() vorlage_name = (vorlage_name or "").strip() or kartenname # Atlas-Status vorab bestimmen, damit er sowohl an create_ als auch configure_ uebergeben wird. atlas_raw_bf = get_variable(ATLAS_ERZEUGEN_UI_VAR, scope="project") - atlas_erzeugen_bf = True if atlas_raw_bf in (None, "") else str(atlas_raw_bf).strip().lower() in { - "1", "true", "ja", "yes", "on", - } + atlas_erzeugen_bf = self._is_enabled_flag(atlas_raw_bf) # Verzweigung: Baufreigabe vs. Standard-Layout try: @@ -1291,13 +1298,13 @@ class PrintLogic: ) except ValueError as exc: self.pruefmanager.zeige_hinweis("Vorlage anlegen", str(exc)) - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._failed_result() except Exception as exc: self.pruefmanager.zeige_hinweis( "Vorlage anlegen", f"Die Vorlage konnte nicht angelegt werden: {exc}", ) - return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0} + return self._failed_result() # Nach erfolgreicher Layout-Erstellung: Atlas ggf. konfigurieren (nur falls aktiviert) if kartenname_auswahl == KARTENNAME_BAUFREIGABE: