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:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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'})")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
@@ -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):
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user