Testkatalog-Klassifizierung in Docstrings festgehalten

43 als "vernachlässigbar" eingestufte Funktionen (dialog_wrapper.py,
message_wrapper.py, os_wrapper.py, qgisui_wrapper.py, qt_wrapper.py,
DataGrabber.py, LayerLoader.py, Pruefmanager.py, navigation.py,
print_tab.py) tragen jetzt den Vermerk "von Test abgesehen, weil
vernachlässigbar; HD 18.09.2026". Fehlalarme der Testkatalog-Heuristik
(Dateipruefer._ist_leer/_handle_leere_eingabe, linkpruefer.py komplett,
Pruefmanager._handle_datei_existiert) und der als Bug erfasste tote Code
(Pruefmanager._ask_use_or_replace_pufferlayer, #60) bleiben unangetastet.

41 Funktionen im zur Grundüberarbeitung anstehenden Print-Bereich
(print_logic.py, print_layout.py, print_layout_baufreigabe.py) tragen den
Vermerk "Test ausgesetzt, zunächst Refactor".

Reine Dokumentationsänderung, kein Verhalten geändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-18 11:51:57 +02:00
co-authored by Claude Sonnet 5
parent 0dd64cbe2e
commit 36e4780b9f
14 changed files with 127 additions and 11 deletions
+1
View File
@@ -1,3 +1,4 @@
- Testkatalog-Klassifizierung in Docstrings festgehalten: 43 als „vernachlässigbar" eingestufte Funktionen tragen jetzt den Vermerk „von Test abgesehen, weil vernachlässigbar", 41 Print-Bereich-Funktionen (`print_logic.py`, `print_layout.py`, `print_layout_baufreigabe.py`) den Vermerk „Test ausgesetzt, zunächst Refactor" – keine Verhaltensänderung
- Tests für weitere zentrale Funktionen ergänzt: Verfahrensgebiet-Zustandsverwaltung, Dock-Verwaltung, Pruefmanager-/Dateipruefer-Entscheidungswege, Fundament-Wrapper (Pfade, Landkreise, Nachrichten, Layer-Existenz/-Stil, GPKG-Layer-Prüfung, QGIS-3/4-Geometriekompatibilität) und Projekteigenschaften-Tab (#65)
- Tests für die Kernpipeline ergänzt: Datenabruf (WFS/REST/OGR-URL-Bau, Raumfilter), Datenschreiber (GPKG-Schreiben, Laden, Log), LayerLoader (CRS-Transformation, Raum-/Geometriefilter) und excel_importer (Linklisten-Import) waren zuvor ohne Testdatei (#63)
- Bugfix: `get_plugin_root()` löst keine Symlinks/Junctions mehr auf – im per `link_qgis_profile.py` verknüpften Dev-Setup zeigte die Funktion sonst auf den Workspace-Root statt auf den QGIS-Plugin-Ordner, wodurch Assets von Fachplugins (z. B. QML-Stile in sn_verfahrensgebiet/sn_plan41) nicht gefunden wurden (Verfahrensgebiet #50)
+20 -1
View File
@@ -43,6 +43,8 @@ def show_info_dialog(title: str, message: str, parent: Any = None) -> None:
"""
Zeigt einen modalen Info-Dialog mit OK-Button.
Blockiert bis der Nutzer bestätigt.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
try:
if QT_VERSION == 0: # Mock-Modus
@@ -59,7 +61,10 @@ def ask_text(
default_text: str = "",
parent: Any = None,
) -> tuple[str, bool]:
"""Zeigt einen modalen Texteingabe-Dialog und gibt Text + OK-Status zurück."""
"""Zeigt einen modalen Texteingabe-Dialog und gibt Text + OK-Status zurück.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
try:
if QT_VERSION == 0: # Mock-Modus
print(f"Mock-Modus: ask_text('{title}') -> '{default_text}'")
@@ -154,6 +159,8 @@ def ask_ergaenzen_entfernen_ersetzen_abbrechen(
-------
Literal["ergaenzen", "entfernen", "ersetzen", "abbrechen"]
Genaue Entscheidung des Nutzers.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
if QT_VERSION == 0: # Mock-Modus
print(f"Mock-Modus: ask_ergaenzen_entfernen_ersetzen_abbrechen('{title}') → abbrechen")
@@ -207,6 +214,8 @@ def ask_detailpruefung_oder_vg_laden(
-------
Literal["detailpruefung", "als_vg_laden", "abbrechen"]
Genaue Entscheidung des Nutzers.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
if QT_VERSION == 0: # Mock-Modus
print(f"Mock-Modus: ask_detailpruefung_oder_vg_laden('{title}') → abbrechen")
@@ -256,6 +265,8 @@ def ask_detailpruefung_oder_abbrechen(
-------
Literal["detailpruefung", "abbrechen"]
Genaue Entscheidung des Nutzers.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
if QT_VERSION == 0: # Mock-Modus
print(f"Mock-Modus: ask_detailpruefung_oder_abbrechen('{title}') → abbrechen")
@@ -326,6 +337,7 @@ class ProgressDialog:
pass
def set_total(self, total: int) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
self.total = max(total, 1)
if QT_VERSION == 0:
return
@@ -334,6 +346,7 @@ class ProgressDialog:
self._dlg.setMaximum(self.total)
def set_value(self, value: int) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if QT_VERSION == 0:
self.value = value
return
@@ -346,6 +359,7 @@ class ProgressDialog:
QCoreApplication.processEvents()
def set_label(self, text: str) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if QT_VERSION == 0:
self.label = text
return
@@ -355,6 +369,7 @@ class ProgressDialog:
QCoreApplication.processEvents()
def is_canceled(self) -> bool:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if QT_VERSION == 0:
return self._canceled
@@ -364,6 +379,7 @@ class ProgressDialog:
return self._canceled
def close(self) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if QT_VERSION == 0:
return
@@ -375,6 +391,8 @@ class ProgressDialog:
Wird aufgerufen, nachdem ein modaler Subdialog (z. B. Auswahlbox)
geschlossen wurde und der Fortschrittsdialog wieder sichtbar sein soll.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
if QT_VERSION == 0:
return
@@ -388,5 +406,6 @@ class ProgressDialog:
def create_progress_dialog(total: int, title: str = "Fortschritt", label: str = "Verarbeite...") -> ProgressDialog:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
return ProgressDialog(total, title, label)
+3
View File
@@ -65,6 +65,7 @@ def push_message(
def info(title: str, text: str, duration: int = 5):
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
level = Qgis.MessageLevel.Info
return push_message(level, title, text, duration)
@@ -75,10 +76,12 @@ def warning(title: str, text: str, duration: int = 5):
def error(title: str, text: str, duration: int = 5):
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
level = Qgis.MessageLevel.Critical
return push_message(level, title, text, duration)
def success(title: str, text: str, duration: int = 5):
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
level = Qgis.MessageLevel.Success
return push_message(level, title, text, duration)
+16 -3
View File
@@ -43,6 +43,8 @@ _PathLike = Union[str, Path]
def normalize_path(path: _PathLike) -> Path:
"""
Normalisiert einen Pfad OS-unabhängig.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
try:
return Path(path).expanduser().resolve()
@@ -53,12 +55,17 @@ def normalize_path(path: _PathLike) -> Path:
def get_home_dir() -> Path:
"""
Liefert das Home-Verzeichnis des aktuellen Users.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
return Path.home()
def is_absolute_path(path: _PathLike) -> bool:
"""Prüft, ob ein Pfad absolut ist."""
"""Prüft, ob ein Pfad absolut ist.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
try:
return Path(path).is_absolute()
except Exception:
@@ -66,7 +73,10 @@ def is_absolute_path(path: _PathLike) -> bool:
def basename(path: _PathLike) -> str:
"""Gibt den finalen Namen des Pfades zurück (Dateiname oder Ordner)."""
"""Gibt den finalen Namen des Pfades zurück (Dateiname oder Ordner).
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
try:
return Path(path).name
except Exception:
@@ -94,7 +104,10 @@ def is_case_sensitive_fs() -> bool:
def path_suffix(path: _PathLike) -> str:
"""Gibt die Dateiendung eines Pfades zurück (inklusive Punkt)."""
"""Gibt die Dateiendung eines Pfades zurück (inklusive Punkt).
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
try:
return Path(path).suffix
except Exception:
+5
View File
@@ -129,6 +129,7 @@ except Exception:
# ---------------------------------------------------------
def get_main_window():
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
try:
return iface.mainWindow()
except Exception:
@@ -147,6 +148,7 @@ def open_layout_designer(layout: Any) -> Any:
# ---------------------------------------------------------
def add_dock_widget(area, dock: Any) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
try:
iface.addDockWidget(area, dock)
except Exception:
@@ -154,6 +156,7 @@ def add_dock_widget(area, dock: Any) -> None:
def remove_dock_widget(dock: Any) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
try:
iface.removeDockWidget(dock)
except Exception:
@@ -199,6 +202,7 @@ def remove_menu(menu):
# ---------------------------------------------------------
def add_toolbar(toolbar: Any) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
try:
iface.addToolBar(toolbar)
except Exception:
@@ -206,6 +210,7 @@ def add_toolbar(toolbar: Any) -> None:
def remove_toolbar(toolbar: Any) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
try:
iface.removeToolBar(toolbar)
except Exception:
+8 -2
View File
@@ -58,11 +58,17 @@ QIcon: Type[Any] = object
def exec_dialog(dialog: Any) -> Any:
"""Führt Dialog modal aus (Qt6: exec(), Qt5: exec_(), Mock: YES)"""
"""Führt Dialog modal aus (Qt6: exec(), Qt5: exec_(), Mock: YES)
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
raise NotImplementedError("Qt nicht initialisiert")
def debug_qt_status() -> None:
"""Debug: Zeigt Qt-Status für Troubleshooting."""
"""Debug: Zeigt Qt-Status für Troubleshooting.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
print(f"🔍 QT_VERSION: {QT_VERSION}")
print(f"🔍 QMessageBox Typ: {getattr(QMessageBox, '__name__', type(QMessageBox).__name__)}")
print(f"🔍 YES Wert: {YES} (Typ: {type(YES) if YES is not None else 'None'})")
+6 -1
View File
@@ -66,7 +66,10 @@ class DataGrabber:
# Öffentliche API
# ------------------------------------------------------------------
def set_source(self, source: str) -> None:
"""Setzt die aktuell zu untersuchende Rohquelle."""
"""Setzt die aktuell zu untersuchende Rohquelle.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
self._source = source
SourceType = str # "excel" | "datenbank" | "dienst" | "unbekannt"
@@ -309,6 +312,7 @@ class DataGrabber:
def _process_database_source(
self, db_path: str
) -> Tuple[SourceDict, List[pruef_ergebnis]]:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
print(f"[DataGrabber] Debug: _process_database_source called, db_path={db_path}")
source_dict: SourceDict = {}
results: List[pruef_ergebnis] = []
@@ -320,6 +324,7 @@ class DataGrabber:
def _process_service_source(
self, link: str
) -> Tuple[SourceDict, List[pruef_ergebnis]]:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
source_dict: SourceDict = {}
results: List[pruef_ergebnis] = []
return source_dict, results
+2
View File
@@ -40,6 +40,7 @@ class LayerLoader:
_LAYER_TIMEOUT_MS = 30_000 # 30 Sekunden
def _was_canceled(self, cancel_callback: Optional[Any]) -> bool:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if not callable(cancel_callback):
return False
try:
@@ -48,6 +49,7 @@ class LayerLoader:
return False
def _process_events(self) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
try:
if hasattr(qt, "QCoreApplication") and hasattr(qt.QCoreApplication, "processEvents"):
qt.QCoreApplication.processEvents()
+5 -1
View File
@@ -43,6 +43,7 @@ class Pruefmanager:
warning(thema, meldung)
def report_summary(self, summary: dict) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
geladen = summary.get("geladen", [])
fehler = summary.get("fehler", {})
ausserhalb = summary.get("ausserhalb", [])
@@ -60,7 +61,10 @@ class Pruefmanager:
# Allgemeine Nutzerinteraktionen
# ------------------------------------------------------------------
def zeige_hinweis(self, titel: str, meldung: str) -> None:
"""Zeigt eine modale Hinweismeldung mit OK-Button."""
"""Zeigt eine modale Hinweismeldung mit OK-Button.
von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
"""
from sn_basis.functions.dialog_wrapper import show_info_dialog
show_info_dialog(titel, meldung, parent=self.parent)
+11
View File
@@ -105,6 +105,7 @@ class PrintLayout:
height_mm: float,
object_name: str | None = None,
) -> Any:
"""Test ausgesetzt, zunächst Refactor"""
template = self._OBJECT_TEMPLATES[template_name]
map_item = QgsLayoutItemMap(layout)
map_item.setId(template["id"])
@@ -117,6 +118,7 @@ class PrintLayout:
return map_item
def _set_item_frame_stroke_width(self, item: Any, stroke_width_mm: float) -> None:
"""Test ausgesetzt, zunächst Refactor"""
set_frame_stroke_width = getattr(item, "setFrameStrokeWidth", None)
if not callable(set_frame_stroke_width):
return
@@ -152,6 +154,7 @@ class PrintLayout:
pass
def _fit_extent_to_map_item(self, extent: Any, map_width_mm: float, map_height_mm: float) -> Any:
"""Test ausgesetzt, zunächst Refactor"""
if extent is None:
return extent
if map_width_mm <= 0 or map_height_mm <= 0:
@@ -222,6 +225,7 @@ class PrintLayout:
object_name: str | None = None,
v_align: str = "top",
) -> Any:
"""Test ausgesetzt, zunächst Refactor"""
if self._current_layout is None:
raise RuntimeError("Kein Layout aktiv. Bitte create_single_page_layout() aufrufen.")
return self._create_label_item(
@@ -247,6 +251,7 @@ class PrintLayout:
map_height_mm: float,
kartenname_auswahl: str = "",
) -> None:
"""Test ausgesetzt, zunächst Refactor"""
if self._current_layout is None:
raise RuntimeError("Kein Layout aktiv.")
@@ -389,6 +394,7 @@ class PrintLayout:
object_name: str | None = None,
v_align: str = "top",
) -> Any:
"""Test ausgesetzt, zunächst Refactor"""
template = self._OBJECT_TEMPLATES[template_name]
label = QgsLayoutItemLabel(layout)
item_id = object_name or template["id"]
@@ -468,6 +474,7 @@ class PrintLayout:
return label
def _resolve_visible_map_layers(self, map_item: Any) -> list[Any]:
"""Test ausgesetzt, zunächst Refactor"""
layers_method = getattr(map_item, "layers", None)
if callable(layers_method):
try:
@@ -789,12 +796,14 @@ class PrintLayout:
pass
def _apply_grid_common_settings(self, grid: Any) -> None:
"""Test ausgesetzt, zunächst Refactor"""
self._safe_grid_call(grid, "setEnabled", True)
self._safe_grid_call(grid, "setUnits", MAP_GRID_UNIT_MAP_UNIT)
self._safe_grid_call(grid, "setIntervalX", self._GRID_INTERVAL_MAP_UNITS)
self._safe_grid_call(grid, "setIntervalY", self._GRID_INTERVAL_MAP_UNITS)
def _safe_grid_call(self, grid: Any, method_name: str, *args: Any) -> None:
"""Test ausgesetzt, zunächst Refactor"""
if any(arg is None for arg in args):
return
method = getattr(grid, method_name, None)
@@ -806,6 +815,7 @@ class PrintLayout:
pass
def _apply_grid_annotation_text_style(self, grid: Any) -> None:
"""Test ausgesetzt, zunächst Refactor"""
if QgsTextFormat is object:
self._safe_grid_call(
grid,
@@ -915,6 +925,7 @@ class PrintLayout:
height_mm: float,
stroke_width_mm: float = 0.3,
) -> Any:
"""Test ausgesetzt, zunächst Refactor"""
box = QgsLayoutItemLabel(layout)
box.setId(object_name)
+9 -2
View File
@@ -116,6 +116,8 @@ class PrintLayoutBaufreigabe(PrintLayout):
Raises:
ValueError: Falls Name bereits existiert oder Format ungültig ist
Test ausgesetzt, zunächst Refactor
"""
# Seitenformat auswählen (nur A3/A4 im Querformat)
if din_format == "DIN A3":
@@ -267,8 +269,10 @@ class PrintLayoutBaufreigabe(PrintLayout):
map_height_mm: float,
) -> None:
"""Erstellt Legende, Quellenangabe und Kartenschild für Baufreigabe-Layout.
Angepasst für 80mm Kartenschild statt 180mm.
Test ausgesetzt, zunächst Refactor
"""
if self._current_layout is None:
raise RuntimeError("Kein Layout aktiv.")
@@ -392,7 +396,10 @@ class PrintLayoutBaufreigabe(PrintLayout):
)
def _calc_atlas_margin_percent(self, map_width_mm: float, map_height_mm: float) -> float:
"""Berechnet Atlas-Margin in Prozent, sodass etwa 10 mm Rand sichtbar bleiben."""
"""Berechnet Atlas-Margin in Prozent, sodass etwa 10 mm Rand sichtbar bleiben.
Test ausgesetzt, zunächst Refactor
"""
margin_mm = self._ATLAS_FRAME_MARGIN_MM
if map_width_mm <= 2 * margin_mm or map_height_mm <= 2 * margin_mm:
return 5.0
+32 -1
View File
@@ -121,9 +121,11 @@ class PrintLogic:
self._previous_map_tool: Any | None = None
def _failed_result(self) -> dict:
"""Test ausgesetzt, zunächst Refactor"""
return {"ok": False, "switch_to_tab_a": False, "atlas_seiten": 0}
def _show_target_size_too_small(self) -> dict:
"""Test ausgesetzt, zunächst Refactor"""
self.pruefmanager.zeige_hinweis(
"Zielgröße zu klein",
"Die gewählte Zielgröße reicht für den Einzelblatt-Druck nicht aus.",
@@ -131,11 +133,13 @@ class PrintLogic:
return self._failed_result()
def _is_enabled_flag(self, raw_value: Any) -> bool:
"""Test ausgesetzt, zunächst Refactor"""
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:
"""Test ausgesetzt, zunächst Refactor"""
project = QgsProject.instance()
# Primär: neue zentrale Variable aus sn_verfahrensgebiet_manager
layer_id = (get_variable("verfahrensgebiet_layer", scope="project") or "").strip()
@@ -156,6 +160,7 @@ class PrintLogic:
return None
def _resolve_active_layer(self) -> object | None:
"""Test ausgesetzt, zunächst Refactor"""
active_layer_fn = getattr(iface, "activeLayer", None)
if not callable(active_layer_fn):
return None
@@ -165,6 +170,7 @@ class PrintLogic:
return None
def _get_druckpuffer_cm(self) -> int:
"""Test ausgesetzt, zunächst Refactor"""
raw_value = get_variable(DRUCKPUFFER_VAR, scope="project")
try:
value = int(str(raw_value).strip())
@@ -173,9 +179,11 @@ class PrintLogic:
return max(0, value)
def _get_druckpuffer_m(self, plotmassstab: float) -> float:
"""Test ausgesetzt, zunächst Refactor"""
return (self._get_druckpuffer_cm() * 10.0 * plotmassstab) / 1000.0
def _import_qgis_symbol(self, module_name: str, symbol_name: str) -> Any | None:
"""Test ausgesetzt, zunächst Refactor"""
try:
module = importlib.import_module(module_name)
except Exception:
@@ -183,6 +191,7 @@ class PrintLogic:
return getattr(module, symbol_name, None)
def _build_rectangle(self, x_min: float, y_min: float, x_max: float, y_max: float) -> Any | None:
"""Test ausgesetzt, zunächst Refactor"""
qgs_rectangle = self._import_qgis_symbol("qgis.core", "QgsRectangle")
if qgs_rectangle is None:
return None
@@ -192,6 +201,7 @@ class PrintLogic:
return None
def _clone_extent(self, extent: Any) -> Any | None:
"""Test ausgesetzt, zunächst Refactor"""
if extent is None:
return None
@@ -258,6 +268,7 @@ class PrintLogic:
return expanded or extent
def _get_existing_layer_by_name(self, layer_name: str) -> object | None:
"""Test ausgesetzt, zunächst Refactor"""
project = QgsProject.instance()
map_layers_by_name = getattr(project, "mapLayersByName", None)
if not callable(map_layers_by_name):
@@ -271,6 +282,7 @@ class PrintLogic:
return matches[0]
def _create_druckrechteck_layer(self, reference_layer: object | None) -> object | None:
"""Test ausgesetzt, zunächst Refactor"""
existing_layer = self._get_existing_layer_by_name(DRUCKRECHTECK_LAYER_NAME)
if existing_layer is not None:
return existing_layer
@@ -299,6 +311,7 @@ class PrintLogic:
return layer
def _clear_layer_features(self, layer: object) -> None:
"""Test ausgesetzt, zunächst Refactor"""
get_features = getattr(layer, "getFeatures", None)
data_provider = getattr(layer, "dataProvider", lambda: None)()
if not callable(get_features) or data_provider is None:
@@ -330,6 +343,8 @@ class PrintLogic:
Returns:
(created_layer, layer_id) oder (None, "") bei Fehler
Test ausgesetzt, zunächst Refactor
"""
# Source-Layer bestimmen
if source_layer is None:
@@ -475,6 +490,8 @@ class PrintLogic:
Wird nach erfolgreicher Baufreigabe-Layout-Erstellung aufgerufen.
Setzt den Coverage-Layer (aus sn_abdeckungslayer Variable) und konfiguriert den Atlas
mit allen Optionen aus der AtlasConfig.
Test ausgesetzt, zunächst Refactor
"""
try:
if atlas_config is None:
@@ -612,6 +629,7 @@ class PrintLogic:
return False
def _store_druckrechteck(self, layer: object, rectangle: Any) -> bool:
"""Test ausgesetzt, zunächst Refactor"""
qgs_feature = self._import_qgis_symbol("qgis.core", "QgsFeature")
qgs_geometry = self._import_qgis_symbol("qgis.core", "QgsGeometry")
if qgs_feature is None or qgs_geometry is None:
@@ -660,6 +678,7 @@ class PrintLogic:
return True
def activate_druckrechteck_capture(self, reference_layer: object | None = None) -> bool:
"""Test ausgesetzt, zunächst Refactor"""
layer = self._create_druckrechteck_layer(reference_layer)
if layer is None:
self.pruefmanager.zeige_hinweis(
@@ -790,6 +809,7 @@ class PrintLogic:
return True
def _resolve_selection_layer(self, fallback_layer: object | None) -> object | None:
"""Test ausgesetzt, zunächst Refactor"""
active_layer = self._resolve_active_layer()
if active_layer is not None:
selected_count = getattr(active_layer, "selectedFeatureCount", None)
@@ -803,6 +823,7 @@ class PrintLogic:
return fallback_layer
def _get_selected_extent(self, layer: object | None) -> Any | None:
"""Test ausgesetzt, zunächst Refactor"""
if layer is None:
return None
@@ -959,10 +980,12 @@ class PrintLogic:
return self._buffer_extent(extent, plotmassstab), resolved_layer
def set_kartenname_for_auswahl(self, auswahl: str) -> None:
"""Test ausgesetzt, zunächst Refactor"""
kartenname = KARTENNAME_BY_AUSWAHL.get(auswahl, "")
set_variable(KARTENNAME_VAR, kartenname, scope="project")
def set_plotmassstab_for_auswahl(self, auswahl: str, aktueller_massstab: float | None = None) -> None:
"""Test ausgesetzt, zunächst Refactor"""
if auswahl == MASSSTAB_WIE_KARTENFENSTER:
if aktueller_massstab and aktueller_massstab > 0:
set_variable(PLOTMASSSTAB_VAR, str(int(round(aktueller_massstab))), scope="project")
@@ -974,15 +997,18 @@ class PrintLogic:
set_variable(PLOTMASSSTAB_VAR, value, scope="project")
def set_view_for_auswahl(self, auswahl: str) -> None:
"""Test ausgesetzt, zunächst Refactor"""
if auswahl == THEMA_WIE_KARTENFENSTER:
set_variable(VIEW_VAR, "aktuell", scope="project")
return
set_variable(VIEW_VAR, auswahl or "", scope="project")
def set_zielgroesse_for_auswahl(self, auswahl: str) -> None:
"""Test ausgesetzt, zunächst Refactor"""
set_variable(ZIELGROESSE_VAR, auswahl if auswahl in DIN_GROESSEN else DIN_STANDARD, scope="project")
def set_formfaktor(self, endlosrolle: bool) -> None:
"""Test ausgesetzt, zunächst Refactor"""
set_variable(FORMFAKTOR_VAR, "Endlosrolle" if endlosrolle else "Blatt", scope="project")
def set_druckbereich_for_auswahl(self, auswahl: str) -> None:
@@ -1056,10 +1082,14 @@ class PrintLogic:
fixed_width_mm: float,
fixed_height_mm: float,
) -> tuple[float, float]:
"""Test ausgesetzt, zunächst Refactor"""
return map_width_mm + fixed_width_mm, map_height_mm + fixed_height_mm
def _get_required_map_dimensions_mm(self, extent: Any, plotmassstab: float) -> tuple[float, float]:
"""Berechnet die benötigte Kartenfenstergröße in mm für Extent und Maßstab."""
"""Berechnet die benötigte Kartenfenstergröße in mm für Extent und Maßstab.
Test ausgesetzt, zunächst Refactor
"""
if extent is None or not isinstance(plotmassstab, (int, float)) or plotmassstab <= 0:
return 0.0, 0.0
@@ -1167,6 +1197,7 @@ class PrintLogic:
formfaktor: bool,
druckbereich_auswahl: str,
) -> dict:
"""Test ausgesetzt, zunächst Refactor"""
resolved_layer = layer or self._resolve_layer_from_project()
if kartenname_auswahl not in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE):
+1
View File
@@ -31,6 +31,7 @@ class Navigation:
def init_ui(self):
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
print(">>> Navigation.init_ui() CALLED")
main_window = get_main_window()
+8
View File
@@ -332,6 +332,7 @@ class PrintTab(QWidget):
self._restore_atlas_layer_selection()
def _on_kartenname_changed(self, value: str) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if value in (KARTENNAME_38, KARTENNAME_41, KARTENNAME_BAUFREIGABE):
set_variable(KARTENNAME_VAR, value, scope="project")
else:
@@ -345,27 +346,32 @@ class PrintTab(QWidget):
self.logic.set_kartenname_for_auswahl(value)
def _on_massstab_changed(self, value: str) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
set_variable(MASSSTAB_VAR, value, scope="project")
if self.logic:
self.logic.set_plotmassstab_for_auswahl(value, self._get_current_canvas_scale())
def _on_thema_changed(self, value: str) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
set_variable(THEMA_VAR, value, scope="project")
if self.logic:
self.logic.set_view_for_auswahl(value)
def _on_zielgroesse_changed(self, value: str) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
set_variable(ZIELGROESSE_UI_VAR, value, scope="project")
if self.logic:
self.logic.set_zielgroesse_for_auswahl(value)
def _on_formfaktor_changed(self, state: int) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
checked = bool(state)
set_variable(FORMFAKTOR_UI_VAR, "Endlosrolle" if checked else "Blatt", scope="project")
if self.logic:
self.logic.set_formfaktor(checked)
def _on_druckbereich_changed(self, value: str) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
if value not in DRUCKBEREICH_OPTIONEN:
value = DRUCKBEREICH_VERFAHRENSGEBIET
set_variable(DRUCKBEREICH_VAR, value, scope="project")
@@ -423,6 +429,7 @@ class PrintTab(QWidget):
self._druckpuffer_button.setText(self._format_druckpuffer_label(puffer_value))
def _format_druckpuffer_label(self, value_cm: int) -> str:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
return f"{value_cm} cm"
def _on_vorlage_erstellen(self) -> None:
@@ -480,6 +487,7 @@ class PrintTab(QWidget):
pass
def _on_project_changed(self, *args) -> None:
"""von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"""
_ = args
self._disconnect_theme_collection_signals()
self._theme_signal_connected = False