"""Ejecución del motor en segundo plano. El motor puede tardar varios segundos en reconstruir una pieza. Si se llamara desde el hilo de la interfaz, la ventana se quedaría congelada mientras tanto, así que se ejecuta en un QThread y el resultado vuelve a la ventana mediante señales. """ from __future__ import annotations from pathlib import Path from PySide6.QtCore import QThread, Signal from motor.api import Opciones, procesar class HiloProcesado(QThread): """Procesa un plano con motor.api.procesar sin bloquear la interfaz.""" terminado = Signal(object) # motor.api.Resultado fallido = Signal(str) # mensaje de error para el usuario def __init__(self, ruta: Path, opciones: Opciones | None = None, parent=None): super().__init__(parent) self.ruta = ruta self.opciones = opciones or Opciones() def run(self) -> None: try: resultado = procesar(self.ruta, self.opciones) except Exception as error: # cualquier fallo del motor se muestra al usuario self.fallido.emit(f"{type(error).__name__}: {error}") else: self.terminado.emit(resultado)