34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
|
|
"""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)
|