MTM Universal Interface - Py
MTM Universal Interface - Py
import os
import re
from PyQt5.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton,
QLineEdit, QTextEdit, QFileDialog, QTabWidget, QMessageBox, QGroupBox
)
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from MTM_Extract_Function import extraire_donnees_use_case, generer_tableau_html
class ReportGenerator(QThread):
progress_update = pyqtSignal(str)
report_generated = pyqtSignal(str, str)
error_occurred = pyqtSignal(str)
def run(self):
try:
if self.uc_number:
self.progress_update.emit(f"Extraction UC {self.uc_number}...")
donnees = extraire_donnees_use_case(self.data_file, self.uc_number)
html = generer_tableau_html(donnees, chemin_test=self.data_file)
path = f"Rapport_MTM_UC{self.uc_number}.html"
with open(path, "w", encoding="utf-8") as f:
f.write(html)
self.report_generated.emit(str(self.uc_number), path)
elif self.dat_file:
match = re.search(r'UC(\d+)', os.path.basename(self.dat_file))
if not match:
self.error_occurred.emit("Numéro UC non détecté dans le nom du
fichier")
return
uc_number = int(match.group(1))
self.progress_update.emit(f"UC {uc_number} détecté")
donnees = extraire_donnees_use_case(self.data_file, uc_number)
html = generer_tableau_html(donnees, chemin_test=self.dat_file)
path = f"Rapport_Auto_UC{uc_number}.html"
with open(path, "w", encoding="utf-8") as f:
f.write(html)
self.report_generated.emit(str(uc_number), path)
except Exception as e:
self.error_occurred.emit(str(e))
class MTMUniversalInterface(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("MTM Universal Interface - Générateur de Rapports")
self.setGeometry(100, 100, 700, 500)
self.setStyleSheet("background-color: #f7f9fc;")
self.data_file = None
self.dat_file = None
layout = QVBoxLayout()
tabs = QTabWidget()
tabs.setStyleSheet("QTabBar::tab { background: #e0e0e0; padding: 10px; }
QTabBar::tab:selected { background: #005BAC; color: white; }")
manual_tab = QWidget()
manual_layout = QVBoxLayout()
auto_tab = QWidget()
auto_layout = QVBoxLayout()
group_auto = QGroupBox("Génération automatique depuis fichier DAT")
group_auto_layout = QVBoxLayout()
self.dat_label = QLabel("Aucun fichier DAT sélectionné")
self.dat_label.setStyleSheet("color: #333; font-weight: bold;")
dat_btn = QPushButton("Sélectionner fichier .dat")
dat_btn.setStyleSheet("background-color: #ff9800; color: white; padding:
8px; border-radius: 5px;")
dat_btn.clicked.connect(self.select_dat)
auto_btn = QPushButton("Générer rapport auto")
auto_btn.setStyleSheet("background-color: #9b59b6; color: white; padding:
8px; border-radius: 5px;")
auto_btn.clicked.connect(self.generate_auto)
group_auto_layout.addWidget(dat_btn)
group_auto_layout.addWidget(self.dat_label)
group_auto_layout.addWidget(auto_btn)
group_auto.setLayout(group_auto_layout)
auto_layout.addWidget(group_auto)
auto_tab.setLayout(auto_layout)
self.setLayout(layout)
def select_excel(self):
path, _ = QFileDialog.getOpenFileName(self, "Excel", "", "Excel Files
(*.xlsx *.xls)")
if path:
self.data_file = path
self.excel_label.setText(os.path.basename(path))
self.status.append(f"Excel sélectionné : {path}")
def select_dat(self):
path, _ = QFileDialog.getOpenFileName(self, "DAT", "", "DAT Files (*.dat)")
if path:
self.dat_file = path
self.dat_label.setText(os.path.basename(path))
self.status.append(f"Fichier DAT sélectionné : {path}")
def generate_manual(self):
if not self.data_file:
QMessageBox.warning(self, "Erreur", "Veuillez sélectionner un fichier
Excel.")
return
if not self.uc_input.text().isdigit():
QMessageBox.warning(self, "Erreur", "Veuillez entrer un numéro UC
valide.")
return
uc = int(self.uc_input.text())
self.worker = ReportGenerator(self.data_file, uc_number=uc)
self.connect_worker()
def generate_auto(self):
if not self.dat_file:
QMessageBox.warning(self, "Erreur", "Veuillez sélectionner un fichier
DAT.")
return
if not self.data_file:
QMessageBox.warning(self, "Erreur", "Veuillez d'abord sélectionner un
fichier Excel dans l'onglet manuel.")
return
self.worker = ReportGenerator(self.data_file, dat_file=self.dat_file)
self.connect_worker()
def connect_worker(self):
self.worker.progress_update.connect(self.status.append)
self.worker.report_generated.connect(self.show_report)
self.worker.error_occurred.connect(self.show_error)
self.worker.start()
def main():
app = QApplication(sys.argv)
window = MTMUniversalInterface()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()