Baufreigabe-Layout fix auf A3/A4

This commit is contained in:
2026-04-10 23:26:58 +02:00
parent 0900c6d3b0
commit 7ad8ba054f
3 changed files with 169 additions and 67 deletions
+70 -34
View File
@@ -51,7 +51,7 @@ ATLAS_CONFIG_BAUFREIGABE_DEFAULT: AtlasConfig = {
"sort_expression": "",
"sort_ascending": True,
"hide_coverage": False,
"limit_render_to_current_feature": False,
"limit_render_to_current_feature": True,
"description": "Baufreigabe Atlas mit Standardkonfiguration",
}
@@ -61,6 +61,7 @@ PLOTMASSSTAB_VAR = "plotmassstab"
VIEW_VAR = "view"
ZIELGROESSE_VAR = "zielgroesse"
FORMFAKTOR_VAR = "formfaktor"
ATLAS_ERZEUGEN_UI_VAR = "tab_b_atlas_erzeugen"
DRUCKBEREICH_VAR = "druckbereich"
DRUCKPUFFER_VAR = "druckpuffer"
DRUCKRECHTECK_LAYER_NAME = "Druckrechteck"
@@ -484,6 +485,27 @@ class PrintLogic:
if atlas is None:
return False
atlas_enabled = bool(atlas_config.get("enabled", True))
if not atlas_enabled:
set_enabled = getattr(atlas, "setEnabled", None)
if callable(set_enabled):
try:
set_enabled(False)
except Exception:
pass
# Hauptkarte ebenfalls aus Atlas-Steuerung lösen
item_by_id = getattr(layout, "itemById", None)
if callable(item_by_id):
try:
hauptkarte = item_by_id("Hauptkarte")
set_atlas_driven = getattr(hauptkarte, "setAtlasDriven", None)
if callable(set_atlas_driven):
set_atlas_driven(False)
except Exception:
pass
return True
coverage_layer_id = get_variable("sn_abdeckungslayer", scope="project") or ""
if not coverage_layer_id:
return True
@@ -888,19 +910,15 @@ class PrintLogic:
def _get_baufreigabe_page_dimensions(
self,
kartenbild_w: float,
kartenbild_h: float,
zielgroesse: str,
) -> tuple[str, float, float, float, float]:
"""Berechnet Seitenformat und verfuegbare Kartenfenster fuer Baufreigabe.
"""Berechnet feste Seiten- und Hauptkartengroessen fuer Baufreigabe.
Args:
kartenbild_w: Berechnete Kartenbild-Breite aus Extent/Massstab
kartenbild_h: Berechnete Kartenbild-Hoehe aus Extent/Massstab
zielgroesse: "DIN A3" oder "DIN A4" (wird zu Querformat konvertiert)
Returns:
(din_format, page_width_mm, page_height_mm, adjusted_map_w, adjusted_map_h)
(din_format, page_width_mm, page_height_mm, map_w_mm, map_h_mm)
"""
# Nur A3/A4 im Querformat fuer Baufreigabe
if zielgroesse == "DIN A3":
@@ -910,18 +928,21 @@ class PrintLogic:
din_format = "DIN A4"
page_w, page_h = 297.0, 210.0
# Verfuegbare Flaeche fuer Kartenbild: Seite - Kartenschild und Maerchen
kartenschild_w = 120.0
# Feste Hauptkartenflaeche aus Querformat mit festen Rändern:
# links 10 mm, oben 10 mm, rechts 10 mm, unten 10 mm,
# plus 10 mm Abstand zum rechten Seitenbereich.
kartenschild_w = 80.0
kartenschild_h = 92.0
margin = 10.0
avail_w = page_w - 2 * margin - kartenschild_w - margin
avail_h = page_h - 2 * margin - kartenschild_h - margin
map_w = page_w - (3 * margin + kartenschild_w)
map_h = page_h - (2 * margin)
adjusted_map_w = min(kartenbild_w, avail_w)
adjusted_map_h = min(kartenbild_h, avail_h)
# Untergrenzen zur Sicherheit bei abweichenden Seiteneinstellungen
map_w = max(map_w, 50.0)
map_h = max(map_h, kartenschild_h + margin)
return din_format, page_w, page_h, adjusted_map_w, adjusted_map_h
return din_format, page_w, page_h, map_w, map_h
def druckvorlage_anlegen(
self,
@@ -983,22 +1004,23 @@ class PrintLogic:
ziel_w = min(plotgroesse_w, cap_w)
ziel_h = min(plotgroesse_h, cap_h)
if ziel_w < DIN_GROESSEN["DIN A4"][0] or ziel_h < DIN_GROESSEN["DIN A4"][1]:
self.pruefmanager.zeige_hinweis(
"Blattgroesse kleiner als DIN A4",
"Die Layouterstellung wird trotzdem fortgesetzt.",
)
if kartenname_auswahl != KARTENNAME_BAUFREIGABE:
if ziel_w < DIN_GROESSEN["DIN A4"][0] or ziel_h < DIN_GROESSEN["DIN A4"][1]:
self.pruefmanager.zeige_hinweis(
"Blattgroesse kleiner als DIN A4",
"Die Layouterstellung wird trotzdem fortgesetzt.",
)
if plotgroesse_w > ziel_w or plotgroesse_h > ziel_h:
if plotgroesse_w <= ziel_h and plotgroesse_h <= ziel_w:
ziel_w, ziel_h = ziel_h, ziel_w
if plotgroesse_w > ziel_w or plotgroesse_h > ziel_h:
if plotgroesse_w <= ziel_h and plotgroesse_h <= ziel_w:
ziel_w, ziel_h = ziel_h, ziel_w
if plotgroesse_w > ziel_w or plotgroesse_h > ziel_h:
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}
if plotgroesse_w > ziel_w or plotgroesse_h > ziel_h:
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}
kartenname = get_variable(KARTENNAME_VAR, scope="project") or KARTENNAME_BY_AUSWAHL.get(
kartenname_auswahl, "Vorlage"
@@ -1018,10 +1040,8 @@ class PrintLogic:
# Verzweigung: Baufreigabe vs. Standard-Layout
try:
if kartenname_auswahl == KARTENNAME_BAUFREIGABE:
# Baufreigabe: feste DIN A3/A4 Querformat-Logik mit 120mm Kartenschild
din_format, page_w, page_h, map_w, map_h = self._get_baufreigabe_page_dimensions(
kartenbild_w, kartenbild_h, zielgroesse
)
# Baufreigabe: feste DIN A3/A4 Querformat-Logik mit 80mm Kartenschild
din_format, page_w, page_h, map_w, map_h = self._get_baufreigabe_page_dimensions(zielgroesse)
PrintLayoutBaufreigabe().create_baufreigabe_layout(
name=vorlage_name if vorlage_name != kartenname else "Baufreigabe",
din_format=din_format,
@@ -1055,8 +1075,24 @@ class PrintLogic:
)
return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0}
# Nach erfolgreicher Layout-Erstellung: Atlas konfigurieren (falls Baufreigabe)
# Nach erfolgreicher Layout-Erstellung: Atlas ggf. konfigurieren (nur falls aktiviert)
if kartenname_auswahl == KARTENNAME_BAUFREIGABE:
self.configure_atlas_for_baufreigabe_layout()
atlas_raw = get_variable(ATLAS_ERZEUGEN_UI_VAR, scope="project")
atlas_erzeugen = True if atlas_raw in (None, "") else str(atlas_raw).strip().lower() in {
"1",
"true",
"ja",
"yes",
"on",
}
if atlas_erzeugen:
self.configure_atlas_for_baufreigabe_layout()
else:
self.configure_atlas_for_baufreigabe_layout(
atlas_config={
"enabled": False,
}
)
return {"ok": True, "switch_to_tab_a": False, "atlas_seiten": 1}