Kartenschildbox und Linien hinzugefügt

This commit is contained in:
2026-03-23 14:25:14 +01:00
parent 693824f602
commit 96da2ee566
+153 -31
View File
@@ -4,6 +4,7 @@ sn_plan41/ui/layout.py – Aufbau von Drucklayouts für Plan41.
from __future__ import annotations from __future__ import annotations
import math import math
import importlib
from typing import Any from typing import Any
from sn_basis.functions.qt_wrapper import QFont from sn_basis.functions.qt_wrapper import QFont
@@ -47,19 +48,23 @@ class Layout:
_OBJECT_TEMPLATES = { _OBJECT_TEMPLATES = {
"hauptkarte": { "hauptkarte": {
"id": "Hauptkarte", "id": "Hauptkarte",
"object_name": "Hauptkarte",
}, },
"quellenangabe": { "quellenangabe": {
"id": "Quellenangabe", "id": "Quellenangabe",
"object_name": "Quellenangabe",
"size_mm": (180.0, 100.0), "size_mm": (180.0, 100.0),
"format": "Format_1", "format": "Format_1",
}, },
"seitenzahl": { "seitenzahl": {
"id": "Seitenzahl", "id": "Seitenzahl",
"object_name": "Seitenzahl",
"size_mm": (60.0, 8.0), "size_mm": (60.0, 8.0),
"format": "Format_1", "format": "Format_1",
}, },
"textfeld": { "textfeld": {
"id": "Textfeld", "id": "Textfeld",
"object_name": "Textfeld",
"size_mm": (60.0, 8.0), "size_mm": (60.0, 8.0),
"format": "Format_1", "format": "Format_1",
"html_mode": True, "html_mode": True,
@@ -92,15 +97,54 @@ class Layout:
y_mm: float, y_mm: float,
width_mm: float, width_mm: float,
height_mm: float, height_mm: float,
object_name: str | None = None,
) -> Any: ) -> Any:
template = self._OBJECT_TEMPLATES[template_name] template = self._OBJECT_TEMPLATES[template_name]
map_item = QgsLayoutItemMap(layout) map_item = QgsLayoutItemMap(layout)
map_item.setId(template["id"]) map_item.setId(template["id"])
set_object_name = getattr(map_item, "setObjectName", None)
if callable(set_object_name):
set_object_name(object_name or template.get("object_name", template["id"]))
layout.addLayoutItem(map_item) layout.addLayoutItem(map_item)
map_item.attemptMove(QgsLayoutPoint(x_mm, y_mm, MM)) map_item.attemptMove(QgsLayoutPoint(x_mm, y_mm, MM))
map_item.attemptResize(QgsLayoutSize(width_mm, height_mm, MM)) map_item.attemptResize(QgsLayoutSize(width_mm, height_mm, MM))
return map_item return map_item
def _set_item_frame_stroke_width(self, item: Any, stroke_width_mm: float) -> None:
set_frame_stroke_width = getattr(item, "setFrameStrokeWidth", None)
if not callable(set_frame_stroke_width):
return
try:
set_frame_stroke_width(stroke_width_mm)
return
except Exception:
pass
try:
qgis_core = importlib.import_module("qgis.core")
QgsLayoutMeasurement = getattr(qgis_core, "QgsLayoutMeasurement", None)
except Exception:
QgsLayoutMeasurement = None
if QgsLayoutMeasurement is not None:
try:
set_frame_stroke_width(QgsLayoutMeasurement(stroke_width_mm, MM))
return
except Exception:
pass
frame_stroke_width = getattr(item, "frameStrokeWidth", None)
if callable(frame_stroke_width):
try:
measurement = frame_stroke_width()
set_length = getattr(measurement, "setLength", None)
if callable(set_length):
set_length(stroke_width_mm)
set_frame_stroke_width(measurement)
except Exception:
pass
def add_text_label( def add_text_label(
self, self,
text: str, text: str,
@@ -112,6 +156,7 @@ class Layout:
height_mm: float | None = None, height_mm: float | None = None,
html_mode: bool = False, html_mode: bool = False,
expression_enabled: bool = False, expression_enabled: bool = False,
object_name: str | None = None,
) -> Any: ) -> Any:
"""Einfache öffentliche Methode zum Hinzufügen eines Text-Labels. """Einfache öffentliche Methode zum Hinzufügen eines Text-Labels.
@@ -130,13 +175,14 @@ class Layout:
height_mm=height_mm, height_mm=height_mm,
html_mode=html_mode, html_mode=html_mode,
expression_enabled=expression_enabled, expression_enabled=expression_enabled,
object_name=object_name,
) )
def _setup_layout_objects(self, kartenfenster_untere_rechte_ecke_mm: tuple, is_atlas: bool = False) -> None: 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. """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. Diese Methode wird sowohl von create_single_page_layout() als auch von create_atlas_layout() aufgerufen.
Relatipunkt des Objekts ist die untere linke Ecke, berechnet von der unteren, rechten Ecke des Kartefensters
Args: Args:
kartenfenster_untere_rechte_ecke_mm: Tupel (x_mm, y_mm) der unteren rechten Kartenecke 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 is_atlas: True für Atlas-Layout, False für Einzelblatt-Layout
@@ -166,6 +212,60 @@ class Layout:
html_mode=True, html_mode=True,
) )
print("[Layout] Quellenangabe zum Layout hinzugefügt") print("[Layout] Quellenangabe zum Layout hinzugefügt")
# Kartenschild-Box, -Linien und -Text werden hier ergänzt (TODO)
#Kartenschild-Box
kartenschild_x = kartenfenster_untere_rechte_ecke_mm[0] + 10.0
kartenschild_y = kartenfenster_untere_rechte_ecke_mm[1]
self._create_rectangle_box_item(
self._current_layout,
"Kartenschild",
kartenschild_x,
kartenschild_y,
180.0,
92.0,
stroke_width_mm= 1.0,
)
print("[Layout] Kartenschild-Box zum Layout hinzugefügt")
#Kartenschild-Linien
kartenschild_line_x = kartenfenster_untere_rechte_ecke_mm[0] + 10.0
kartenschild_line_offsets_y = (-10.0, -20.0, -30.0, -46.0, -62.0, -82.0)
for index, offset_y in enumerate(kartenschild_line_offsets_y, start=1):
self._create_rectangle_box_item(
self._current_layout,
f"Kartenschild_Linie_{index}",
kartenschild_line_x,
kartenfenster_untere_rechte_ecke_mm[1] + offset_y,
180.0,
0.0,
stroke_width_mm=0.1,
)
print("[Layout] 6 Kartenschild-Linien zum Layout hinzugefügt")
#Kartenschild-Text
#Herausgeber
self.add_text_label("@Amt", 10.0, -92.0, text_format="Format_1", object_name="Herausgeber")
#Bezeichnung_Flurbereinigung
#Name Flurbereinigung
#Stadt_Gemeinde
#Landkreis
#Kartenname
#Ergänzung(Seitenzahl)
#gefertigt
#geprüft
#Maßstab
#Ausgabedatum
#Aktenzeichen
# Seitenzahl nur bei Atlas-Layout # Seitenzahl nur bei Atlas-Layout
if is_atlas: if is_atlas:
@@ -197,10 +297,14 @@ class Layout:
height_mm: float | None = None, height_mm: float | None = None,
html_mode: bool = False, html_mode: bool = False,
expression_enabled: bool = False, expression_enabled: bool = False,
object_name: str | None = None,
) -> Any: ) -> Any:
template = self._OBJECT_TEMPLATES[template_name] template = self._OBJECT_TEMPLATES[template_name]
label = QgsLayoutItemLabel(layout) label = QgsLayoutItemLabel(layout)
label.setId(template["id"]) label.setId(template["id"])
set_object_name = getattr(label, "setObjectName", None)
if callable(set_object_name):
set_object_name(object_name or template.get("object_name", template["id"]))
label.setText(text) label.setText(text)
if html_mode: if html_mode:
@@ -245,6 +349,52 @@ class Layout:
layout.addLayoutItem(label) layout.addLayoutItem(label)
return label return label
def _create_rectangle_box_item(
self,
layout: Any,
object_name: str,
x_mm: float,
y_mm: float,
width_mm: float,
height_mm: float,
stroke_width_mm: float = 0.3,
) -> Any:
box = QgsLayoutItemLabel(layout)
box.setId(object_name)
set_object_name = getattr(box, "setObjectName", None)
if callable(set_object_name):
set_object_name(object_name)
box.setText("")
set_reference_point = getattr(box, "setReferencePoint", None)
lower_left = getattr(getattr(QgsLayoutItem, "ReferencePoint", object), "LowerLeft", None)
if callable(set_reference_point) and lower_left is not None:
set_reference_point(lower_left)
box.attemptMove(QgsLayoutPoint(x_mm, y_mm, MM))
box.attemptResize(QgsLayoutSize(width_mm, height_mm, MM))
set_frame_enabled = getattr(box, "setFrameEnabled", None)
if callable(set_frame_enabled):
try:
set_frame_enabled(True)
except Exception:
pass
self._set_item_frame_stroke_width(box, stroke_width_mm)
set_background_enabled = getattr(box, "setBackgroundEnabled", None)
if callable(set_background_enabled):
try:
set_background_enabled(False)
except Exception:
pass
layout.addLayoutItem(box)
return box
def create_single_page_layout( def create_single_page_layout(
self, self,
name: str, name: str,
@@ -335,7 +485,7 @@ class Layout:
set_frame_stroke_width = getattr(hauptkarte, "setFrameStrokeWidth", None) set_frame_stroke_width = getattr(hauptkarte, "setFrameStrokeWidth", None)
if callable(set_frame_stroke_width): if callable(set_frame_stroke_width):
try: try:
set_frame_stroke_width(0.5) self._set_item_frame_stroke_width(hauptkarte, 0.5)
print(f"[Layout] Rahmenstrichbreite auf 0.5 mm gesetzt") print(f"[Layout] Rahmenstrichbreite auf 0.5 mm gesetzt")
except Exception as exc: except Exception as exc:
print(f"[Layout] WARN: setFrameStrokeWidth(0.5) fehlgeschlagen: {exc}") print(f"[Layout] WARN: setFrameStrokeWidth(0.5) fehlgeschlagen: {exc}")
@@ -383,34 +533,6 @@ class Layout:
self._setup_layout_objects(kartenfenster_untere_rechte_ecke_mm, is_atlas=False) self._setup_layout_objects(kartenfenster_untere_rechte_ecke_mm, is_atlas=False)
#Kartenschild-Box
#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) layout_manager.addLayout(layout)
print("[Layout] Layout zum LayoutManager hinzugefügt") print("[Layout] Layout zum LayoutManager hinzugefügt")
self._current_layout = None self._current_layout = None
@@ -531,7 +653,7 @@ class Layout:
set_frame_stroke_width = getattr(hauptkarte, "setFrameStrokeWidth", None) set_frame_stroke_width = getattr(hauptkarte, "setFrameStrokeWidth", None)
if callable(set_frame_stroke_width): if callable(set_frame_stroke_width):
try: try:
set_frame_stroke_width(0.5) self._set_item_frame_stroke_width(hauptkarte, 0.5)
except Exception: except Exception:
pass pass