A4 als Option entfernt, Objektergänzung im Layout als Einzeiler angelegt

This commit is contained in:
2026-03-23 12:58:59 +01:00
parent ed1e8cf28b
commit 57bf12782b
2 changed files with 127 additions and 39 deletions
+127 -38
View File
@@ -28,17 +28,17 @@ class Layout:
_TEXT_FORMAT_TEMPLATES = {
"Format_1": {
"font_family": "Arial",
"font_size": 12,
"font_family": "New Helvetica roman",
"font_size": 10,
"font_style": "normal",
},
"Format_2": {
"font_family": "Arial",
"font_size": 12,
"font_family": "New Helvetica roman",
"font_size": 14,
"font_style": "fett",
},
"Format_3": {
"font_family": "Arial",
"font_family": "New Helvetica roman",
"font_size": 10,
"font_style": "normal",
},
@@ -62,6 +62,8 @@ class Layout:
"id": "Textfeld",
"size_mm": (60.0, 8.0),
"format": "Format_1",
"html_mode": True,
"text": "",
},
}
@@ -80,6 +82,7 @@ class Layout:
def __init__(self, project: Any | None = None) -> None:
self.project = project or QgsProject.instance()
self._current_layout: Any | None = None
def _create_map_item(
self,
@@ -98,6 +101,86 @@ class Layout:
map_item.attemptResize(QgsLayoutSize(width_mm, height_mm, MM))
return map_item
def add_text_label(
self,
text: str,
x_mm: float,
y_mm: float,
template_name: str = "textfeld",
text_format: str | None = None,
width_mm: float | None = None,
height_mm: float | None = None,
html_mode: bool = False,
expression_enabled: bool = False,
) -> Any:
"""Einfache öffentliche Methode zum Hinzufügen eines Text-Labels.
Beispiel: add_text_label("Ausgabedatum: 2026-03-23", 100, 200, text_format="Format_1")
"""
if self._current_layout is None:
raise RuntimeError("Kein Layout aktiv. Bitte create_single_page_layout() oder create_atlas_layout() aufrufen.")
return self._create_label_item(
self._current_layout,
template_name,
text,
x_mm,
y_mm,
text_format=text_format,
width_mm=width_mm,
height_mm=height_mm,
html_mode=html_mode,
expression_enabled=expression_enabled,
)
def _setup_layout_objects(self, kartenfenster_untere_rechte_ecke_mm: tuple, is_atlas: bool = False) -> None:
"""Zentrale Methode zum Hinzufügen aller Standard-Objekte ins Layout.
Diese Methode wird sowohl von create_single_page_layout() als auch von create_atlas_layout() aufgerufen.
Args:
kartenfenster_untere_rechte_ecke_mm: Tupel (x_mm, y_mm) der unteren rechten Kartenecke
is_atlas: True für Atlas-Layout, False für Einzelblatt-Layout
"""
if self._current_layout is None:
raise RuntimeError("Kein Layout aktiv.")
mode_html = getattr(QgsLayoutItemLabel, "ModeHtml", None)
print(f"[Layout] QgsLayoutItemLabel.ModeHtml={mode_html!r}")
lower_left = getattr(getattr(QgsLayoutItem, "ReferencePoint", object), "LowerLeft", None)
print(f"[Layout] QgsLayoutItem.ReferencePoint.LowerLeft={lower_left!r}")
# Quellenangabe: unterschiedliche Positionen für Einzelblatt vs. Atlas
if is_atlas:
quellenangabe_x = kartenfenster_untere_rechte_ecke_mm[0] + 5.0
quellenangabe_y = kartenfenster_untere_rechte_ecke_mm[1]
else:
quellenangabe_x = kartenfenster_untere_rechte_ecke_mm[0] + 10.0
quellenangabe_y = kartenfenster_untere_rechte_ecke_mm[1] - 120.0
self._create_label_item(
self._current_layout,
"quellenangabe",
self._QUELLENANGABE_TEXT,
quellenangabe_x,
quellenangabe_y,
html_mode=True,
)
print("[Layout] Quellenangabe zum Layout hinzugefügt")
# Seitenzahl nur bei Atlas-Layout
if is_atlas:
seitenzahl_x = kartenfenster_untere_rechte_ecke_mm[0] + 5.0
seitenzahl_y = kartenfenster_untere_rechte_ecke_mm[1] - 2.0
self._create_label_item(
self._current_layout,
"seitenzahl",
self._SEITENZAHL_TEXT,
seitenzahl_x,
seitenzahl_y,
expression_enabled=True,
)
print("[Layout] Seitenzahl zum Layout hinzugefügt")
def _create_label_item(
self,
layout: Any,
@@ -186,6 +269,7 @@ class Layout:
layout = QgsPrintLayout(self.project)
layout.initializeDefaults()
layout.setName(name)
self._current_layout = layout
print(f"[Layout] QgsPrintLayout erstellt: {layout!r}")
page = layout.pageCollection().page(0)
@@ -196,6 +280,7 @@ class Layout:
map_top_mm = 10.0
map_right_mm = map_left_mm + map_width_mm
map_bottom_mm = map_top_mm + map_height_mm
kartenfenster_untere_rechte_ecke_mm = (map_right_mm, map_bottom_mm)
print(
f"[Layout] Kartenbild-Kanten: rechts={map_right_mm:.1f} mm, unten={map_bottom_mm:.1f} mm"
)
@@ -295,25 +380,40 @@ class Layout:
print(f"[Layout] WARN: setRefreshStrategy fehlgeschlagen: {exc}")
print(f"[Layout] Hauptkarte vollständig konfiguriert")
self._setup_layout_objects(kartenfenster_untere_rechte_ecke_mm, is_atlas=False)
#Kartenschild-Box
mode_html = getattr(QgsLayoutItemLabel, "ModeHtml", None)
print(f"[Layout] QgsLayoutItemLabel.ModeHtml={mode_html!r}")
lower_left = getattr(getattr(QgsLayoutItem, "ReferencePoint", object), "LowerLeft", None)
print(f"[Layout] QgsLayoutItem.ReferencePoint.LowerLeft={lower_left!r}")
quellenangabe_x_mm = map_right_mm + 20.0
quellenangabe_y_mm = map_bottom_mm - 120.0
self._create_label_item(
layout,
"quellenangabe",
self._QUELLENANGABE_TEXT,
quellenangabe_x_mm,
quellenangabe_y_mm,
html_mode=True,
)
print("[Layout] Quellenangabe zum Layout hinzugefügt")
#Kartenschild-Linien
#Kartenschild-Text
#Herausgeber
#Bezeichnung_Flurbereinigung
#Name Flurbereinigung
#Stadt_Gemeinde
#Landkreis
#Kartenname
#Ergänzung(Seitenzahl)
#gefertigt
#geprüft
#Maßstab
#Ausgabedatum
#Aktenzeichen
layout_manager.addLayout(layout)
print("[Layout] Layout zum LayoutManager hinzugefügt")
self._current_layout = None
open_layout_designer(layout)
print("[Layout] Layout Designer geöffnet")
return layout
@@ -339,6 +439,7 @@ class Layout:
layout = QgsPrintLayout(self.project)
layout.initializeDefaults()
layout.setName(name)
self._current_layout = layout
page = layout.pageCollection().page(0)
page.setPageSize(QgsLayoutSize(page_width_mm, page_height_mm, MM))
@@ -355,6 +456,7 @@ class Layout:
map_top_mm = 10.0
map_right_mm = map_left_mm + map_width_mm
map_bottom_mm = map_top_mm + map_height_mm
kartenfenster_untere_rechte_ecke_mm = (map_right_mm, map_bottom_mm)
hauptkarte = self._create_map_item(
layout,
@@ -481,24 +583,8 @@ class Layout:
# Sicherheit: Größe nochmal nach Atlas-Konfiguration setzen, um sicherzustellen, dass sie nicht von der Atlas-Einstellung überschrieben wurde.
hauptkarte.attemptResize(QgsLayoutSize(map_width_mm, map_height_mm, MM))
print(f"[Layout] Atlas Hauptkarte Größe nach Atlas-Konfiguration erneut gesetzt: {map_width_mm:.1f}mm × {map_height_mm:.1f}mm")
self._create_label_item(
layout,
"quellenangabe",
self._QUELLENANGABE_TEXT,
map_right_mm + 5.0,
map_bottom_mm,
html_mode=True,
)
self._create_label_item(
layout,
"seitenzahl",
self._SEITENZAHL_TEXT,
map_right_mm + 5.0,
map_bottom_mm - 2.0,
expression_enabled=True,
)
self._setup_layout_objects(kartenfenster_untere_rechte_ecke_mm, is_atlas=True)
atlas = layout.atlas()
if atlas is not None:
@@ -520,5 +606,8 @@ class Layout:
set_page_name("attribute(@atlas_feature, 'Seitenzahl')")
layout_manager.addLayout(layout)
print("[Layout] Layout zum LayoutManager hinzugefügt")
self._current_layout = None
open_layout_designer(layout)
print("[Layout] Layout Designer geöffnet")
return layout
-1
View File
@@ -53,7 +53,6 @@ DIN_GROESSEN: dict[str, tuple[int, int]] = {
"DIN A1": (594, 841),
"DIN A2": (420, 594),
"DIN A3": (297, 420),
"DIN A4": (210, 297),
}
DIN_STANDARD = "DIN A0"