diff --git a/ui/tab_a_logic.py b/ui/tab_a_logic.py index f94aa75..a99e27f 100644 --- a/ui/tab_a_logic.py +++ b/ui/tab_a_logic.py @@ -22,11 +22,15 @@ from sn_basis.functions.variable_wrapper import ( from sn_basis.functions.sys_wrapper import file_exists from sn_basis.functions.ly_existence_wrapper import layer_exists from sn_basis.functions.ly_metadata_wrapper import get_layer_type +from sn_basis.functions.qgisui_wrapper import QgsFileWidget # Prรผfer-Typen from sn_basis.modules.Pruefmanager import Pruefmanager from sn_basis.modules.linkpruefer import Linkpruefer from sn_basis.modules.stilpruefer import Stilpruefer +from sn_basis.modules.Dateipruefer import Dateipruefer +from sn_basis.modules.pruef_ergebnis import pruef_ergebnis +from sn_basis.modules.DataGrabber import DataGrabber, SourceType, SourceDict Row = Dict[str, Any] DataDict = Dict[str, List[Row]] @@ -34,13 +38,14 @@ DataDict = Dict[str, List[Row]] class TabALogic: """ Kapselt die Fachlogik von Tab A. Verfahrens-DB wird **nicht** bei Pfad-Auswahl, - sondern erst beim ersten Layer-Schreiben angelegt (alte Logik). + sondern erst beim ersten Layer-Schreiben angelegt. """ def __init__(self, pruefmanager: Pruefmanager, link_pruefer: Linkpruefer, stil_pruefer: Stilpruefer) -> None: self.pruefmanager = pruefmanager self.link_pruefer = link_pruefer self.stil_pruefer = stil_pruefer + self.data_grabber: Optional[DataGrabber] = None # ------------------------------- # Verfahrens-Datenbank (Pfad-Management) @@ -163,3 +168,83 @@ class TabALogic: layer_type = get_layer_type(layer) return layer_type == "vector" + + # === PIPELINE === + def _on_run_pipeline(self,source: str) -> None: + """DEBUG: Pipeline mit maximaler Ausgabe.""" + print("\n" + "="*60) + print("๐Ÿš€ _on_run_pipeline GESTARTET") + print("="*60) + # ๐Ÿ”ฅ DEBUG QT STATUS + from sn_basis.functions import qt_wrapper + qt_wrapper.debug_qt_status() # โ† Zeigt Version an + + + + # 1. Services prรผfen + print(f"pruefmanager: {self.pruefmanager is not None}") + print(f"data_grabber: {self.data_grabber is not None}") + print(f"logic: {hasattr(self, 'logic')}") + + if not self.pruefmanager: + print("โŒ FEHLER: self.pruefmanager fehlt!") + return + if not self.data_grabber: + print("โŒ FEHLER: self.data_grabber fehlt!") + return + + print("โœ… Services OK") + + # 2. FileWidget + #source = self.file_widget.filePath() + print(f"๐Ÿ“ Eingabe: '{source}' (len={len(source or '')})") + + # 3. Dateipruefer + print("๐Ÿ” Dateipruefer starte...") + try: + pruefer = Dateipruefer( + source, + basis_pfad="", + leereingabe_erlaubt=False, + standarddatei=None, + temporaer_erlaubt=True, # โœ… Explizit True + verfahrens_db_modus=True # โœ… Keyword-only + ) + ergebnis1 = pruefer.pruefe() + print(f" โ†’ ok={ergebnis1.ok}, aktion='{ergebnis1.aktion}', kontext={ergebnis1.kontext}") + except Exception as e: + print(f"๐Ÿ’ฅ Dateipruefer FEHLER: {e}") + import traceback + traceback.print_exc() + return + + # 4. Pruefmanager + print("๐Ÿค– Pruefmanager starte...") + try: + ergebnis2 = self.pruefmanager.verarbeite(ergebnis1) + + print(f" โ†’ ok={ergebnis2.ok}, aktion='{ergebnis2.aktion}', kontext={ergebnis2.kontext}") + except Exception as e: + print(f"๐Ÿ’ฅ Pruefmanager FEHLER: {e}") + import traceback + traceback.print_exc() + return + + # 5. Entscheidung + weiter = ergebnis2.ok + print(f"โžก๏ธ Weiter? {weiter} (aktion='{ergebnis2.aktion}')") + + if weiter: + final_pfad = ergebnis2.kontext if ergebnis2.kontext else source + print(f"๐Ÿš€ DataGrabber mit: '{final_pfad}'") + try: + self.data_grabber.run(final_pfad) + print("โœ… DataGrabber aufgerufen!") + except Exception as e: + print(f"๐Ÿ’ฅ DataGrabber FEHLER: {e}") + import traceback + traceback.print_exc() + else: + print("โน๏ธ Pipeline gestoppt (erwartet bei leerem Pfad)") + + print("="*60 + "\n") diff --git a/ui/tab_a_ui.py b/ui/tab_a_ui.py index 7d31c8a..eeaea03 100644 --- a/ui/tab_a_ui.py +++ b/ui/tab_a_ui.py @@ -31,6 +31,8 @@ from sn_basis.modules.Pruefmanager import Pruefmanager from sn_basis.modules.DataGrabber import DataGrabber from sn_basis.modules.Dateipruefer import Dateipruefer from sn_plan41.ui.tab_a_logic import TabALogic +from sn_basis.modules.linkpruefer import Linkpruefer +from sn_basis.modules.stilpruefer import Stilpruefer # Konstanten RAUMFILTER_VAR = "Raumfilter" @@ -65,7 +67,7 @@ class TabA(QWidget): # Services (werden von DockWidget gesetzt) self.pruefmanager: Optional[Pruefmanager] = None - self.data_grabber: Optional[DataGrabber] = None + self.logic: Optional[TabALogic] = None # UI-State @@ -89,6 +91,14 @@ class TabA(QWidget): """ self.pruefmanager = pruefmanager self.data_grabber = data_grabber + self.logic = TabALogic( + pruefmanager=self.pruefmanager, + link_pruefer=Linkpruefer(), + stil_pruefer=Stilpruefer(), + ) + + # DataGrabber in die Logik injizieren + self.logic.data_grabber = self.data_grabber def _build_ui(self) -> None: """Erstellt die komplette UI-Hierarchie mit allen Gruppen.""" @@ -175,7 +185,7 @@ class TabA(QWidget): # === PIPELINE-STEUERUNG === self.btn_pipeline = QPushButton("Fachdaten laden") self.btn_pipeline.setToolTip("Starte Pipeline: Linkliste โ†’ DataGrabber โ†’ Datenschreiber โ†’ Log") - self.btn_pipeline.clicked.connect(self._on_run_pipeline) + self.btn_pipeline.clicked.connect(self._on_load_fachdaten) main_layout.addWidget(self.btn_pipeline) @@ -264,92 +274,14 @@ class TabA(QWidget): def _update_group_color(self) -> None: """Visuelles Feedback fรผr Verfahrens-DB-Status.""" if self.verfahrens_db: - self.group_button.setStyleSheet("font-weight: bold; background-color: #e0f7e0;") + self.group_button.setStyleSheet("font-weight: bold; background-color: ##d7a8ff;") else: self.group_button.setStyleSheet("font-weight: bold;") - # === PIPELINE === - def _on_run_pipeline(self) -> None: - """DEBUG: Pipeline mit maximaler Ausgabe.""" - print("\n" + "="*60) - print("๐Ÿš€ _on_run_pipeline GESTARTET") - print("="*60) - # ๐Ÿ”ฅ DEBUG QT STATUS - from sn_basis.functions import qt_wrapper - qt_wrapper.debug_qt_status() # โ† Zeigt EXAKT was lรคuft! - - - - # 1. Services prรผfen - print(f"pruefmanager: {self.pruefmanager is not None}") - print(f"data_grabber: {self.data_grabber is not None}") - print(f"logic: {hasattr(self, 'logic')}") - - if not self.pruefmanager: - print("โŒ FEHLER: self.pruefmanager fehlt!") - return - if not self.data_grabber: - print("โŒ FEHLER: self.data_grabber fehlt!") - return - - print("โœ… Services OK") - - # 2. FileWidget - source = self.file_widget.filePath() - print(f"๐Ÿ“ Eingabe: '{source}' (len={len(source or '')})") - - # 3. Dateipruefer - print("๐Ÿ” Dateipruefer starte...") - try: - pruefer = Dateipruefer( - source, - basis_pfad="", - leereingabe_erlaubt=False, - standarddatei=None, - temporaer_erlaubt=True, # โœ… Explizit True - verfahrens_db_modus=True # โœ… Keyword-only - ) - ergebnis1 = pruefer.pruefe() - print(f" โ†’ ok={ergebnis1.ok}, aktion='{ergebnis1.aktion}', kontext={ergebnis1.kontext}") - except Exception as e: - print(f"๐Ÿ’ฅ Dateipruefer FEHLER: {e}") - import traceback - traceback.print_exc() - return - - # 4. Pruefmanager - print("๐Ÿค– Pruefmanager starte...") - try: - ergebnis2 = self.pruefmanager.verarbeite(ergebnis1) - - print(f" โ†’ ok={ergebnis2.ok}, aktion='{ergebnis2.aktion}', kontext={ergebnis2.kontext}") - except Exception as e: - print(f"๐Ÿ’ฅ Pruefmanager FEHLER: {e}") - import traceback - traceback.print_exc() - return - - # 5. Entscheidung - weiter = ergebnis2.ok - print(f"โžก๏ธ Weiter? {weiter} (aktion='{ergebnis2.aktion}')") - - if weiter: - final_pfad = ergebnis2.kontext if ergebnis2.kontext else source - print(f"๐Ÿš€ DataGrabber mit: '{final_pfad}'") - try: - self.data_grabber.run(final_pfad) - print("โœ… DataGrabber aufgerufen!") - except Exception as e: - print(f"๐Ÿ’ฅ DataGrabber FEHLER: {e}") - import traceback - traceback.print_exc() - else: - print("โน๏ธ Pipeline gestoppt (erwartet bei leerem Pfad)") - - print("="*60 + "\n") - + def _on_load_fachdaten(self) -> None: """Kompatibilitรคts-Handler โ†’ neue Pipeline.""" - self._on_run_pipeline() + source=self.file_widget.filePath() + self.logic._on_run_pipeline(source)