Code source de palm_tracer.Tools.Utils

"""
Fichier de fonctions génériques pour la gestion des fichiers, l'affichage de messages colorés dans la console
et la manipulation d'images matricielles, comme l'ajout de grilles.

Ce module regroupe des utilitaires pour des tâches courantes et est structuré en plusieurs sections :

- Gestion de fichiers : manipulation des noms de fichiers et ajout d'extensions ou de suffixes.
- Affichage : impression de messages colorés pour les erreurs ou avertissements.
- Dessin : ajout de grilles sur des images représentées sous forme de matrices NumPy.

**Structure** :

1. **File Management**

   - :func:`add_extension` : Ajoute une extension à un fichier s'il n'en a pas.
   - :func:`add_suffix` : Ajoute un suffixe à un nom de fichier, tout en préservant l'extension.
   - :func:`get_timestamp_for_files` : Génère un horodatage au format adapté pour les noms de fichiers.
   - :func:`get_last_file` : Récupère le dernier fichier (le plus récent) d'un chemin et un pattern prédefini.

2. **Prints**

   - :func:`print_error` : Affiche un message d'erreur en rouge.
   - :func:`print_warning` : Affiche un avertissement en jaune.
   - :func:`print_success` : Affiche un message de validation en vert.

"""

import ctypes
import glob
import os
from datetime import datetime
from pathlib import Path
from typing import Optional

from colorama import Fore, Style

DLL_PATH = Path(__file__).parent.parent / "DLL"


# ==================================================
# region File Management
# ==================================================
##################################################
[docs] def add_extension(filename: str, extension: str) -> str: """ Ajoute l'extension au fichier si ce n'est pas déjà l'extension actuelle :param filename: Nom du fichier :param extension: Extension finale du fichier """ if not extension.startswith("."): extension = "." + extension # S'assurer que l'extension commence par un point if not filename.endswith(extension): filename += extension # Si le fichier n'a pas déjà l'extension, on l'ajoute return filename
##################################################
[docs] def add_suffix(filename: str, suffix: str) -> str: """ Ajoute un suffixe à un nom de fichier (gère la possibilité d'une extension ou non au nom de fichier). :param filename: Nom de fichier d'origine. :param suffix: Suffixe à ajouter. :return: Nom de fichier avec l'horodatage ajouté. """ # Insérer le suffixe avant l'extension du fichier s'il y en a une if "." in filename: name, ext = filename.rsplit(".", 1) return f"{name}{suffix}.{ext}" return f"{filename}{suffix}"
##################################################
[docs] def get_timestamp_for_files(with_hour: bool = True) -> str: """ Créé un horodatage au format -AAAAMMJJ_HHMMSS pour un nom de fichier. :param with_hour: Ajoute ou non l'heure au timestamp :return: Horodatage. """ if with_hour: return datetime.now().strftime("%Y%m%d_%H%M%S") # Formater la date et l'heure return datetime.now().strftime("%Y%m%d") # Formater la date
##################################################
[docs] def get_last_file(path: str, name: str) -> str: """ Récupère le dernier fichier (le plus récent) qui contient le paramètre `name` dans son nom dans le chemin `path`. :param path: Chemin du dossier où chercher les fichiers. :param name: Chaîne à rechercher dans les noms de fichiers. :return: Chemin complet du dernier fichier trouvé ou une chaîne vide si aucun fichier ne correspond. """ try: search_pattern = os.path.join(path, f"*{name}*") # Générer le chemin avec le filtre pour les fichiers contenant `name` files = glob.glob(search_pattern) # Récupérer tous les fichiers correspondant au motif if not files: return "" # Aucun fichier trouvé files.sort(key=os.path.getmtime, reverse=True) # Trier les fichiers par date de modification décroissante return files[0] # Retourner le fichier le plus récent except Exception as e: print(f"Erreur lors de la recherche du fichier : {e}") return ""
##################################################
[docs] def load_dll(name: str) -> Optional[ctypes.CDLL]: """Charge une DLL, si elle existe.""" dll_filename = DLL_PATH / f"PALMTracer_{name}.dll" try: return ctypes.cdll.LoadLibrary(str(dll_filename.resolve())) except OSError as e: print_warning(f"Impossible de charger la DLL '{dll_filename}':\n\t{e}") return None
# ================================================== # endregion File Management # ================================================== # ================================================== # region Prints # ================================================== ################################################## ################################################## ################################################## ##################################################
[docs] def format_time(seconds): """ Fonction pour formater le temps en secondes en HH:MM:SS. :param seconds: Temps en secondes :return: chaine de caractère representant le temps au format HH:MM:SS. """ hours = int(seconds // 3600) minutes = int((seconds % 3600) // 60) seconds = int(seconds % 60) return f"{hours:02}:{minutes:02}:{seconds:02}"
# ================================================== # endregion Prints # ==================================================