#Creazione del software per la manipolazione e gestione dei Tensori Narrativi (Narrative Tensors) di Luigi Usai
# versione iniziale 0.0.0.5
# per ora i tensori sono generati random: bisogna implementare l’algoritmo corretto di creazione tensore narrativo.
import sys import os import json import numpy as np import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QFileDialog, QMessageBox, QTextEdit, QLabel, QVBoxLayout, QDialog from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt from docx import Document import PyPDF2 class TensoreNarrativoApp(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("Interfaccia Tensore Narrativo") self.setGeometry(300, 300, 800, 500) self.text_edit = QTextEdit(self) self.setCentralWidget(self.text_edit) self.file_path = None self.tensore_path = "Tensori_Salvati/" if not os.path.exists(self.tensore_path): os.makedirs(self.tensore_path) # Creazione del menu menu_bar = self.menuBar() file_menu = menu_bar.addMenu("File") about_menu = menu_bar.addMenu("About") file_menu.addAction(QAction("Apri File", self, triggered=self.load_file)) file_menu.addAction(QAction("Salva File", self, triggered=self.save_file)) file_menu.addAction(QAction("Crea Tensore da Testo", self, triggered=self.create_tensor)) file_menu.addAction(QAction("Carica Tensore Esistente", self, triggered=self.load_existing_tensor)) file_menu.addAction(QAction("Visualizza Tensore", self, triggered=self.visualize_tensor)) about_menu.addAction(QAction("Informazioni", self, triggered=self.show_about)) def load_file(self): file_path, _ = QFileDialog.getOpenFileName(self, "Seleziona un File", "", "Text Files (*.txt);;Word Files (*.docx);;PDF Files (*.pdf)") if file_path: self.file_path = file_path self.text_edit.setText(self.read_file(file_path)) def read_file(self, file_path): try: if file_path.endswith(".txt"): with open(file_path, "r", encoding="utf-8") as f: return f.read() elif file_path.endswith(".docx"): doc = Document(file_path) return "\n".join([para.text for para in doc.paragraphs]) elif file_path.endswith(".pdf"): with open(file_path, "rb") as f: reader = PyPDF2.PdfReader(f) return "\n".join([page.extract_text() for page in reader.pages]) except Exception as e: QMessageBox.warning(self, "Errore di lettura", f"Impossibile aprire il file: {str(e)}") return "" def save_file(self): if self.file_path: with open(self.file_path, "w", encoding="utf-8") as f: f.write(self.text_edit.toPlainText()) QMessageBox.information(self, "Salvataggio", "Il file è stato salvato con successo!") else: QMessageBox.warning(self, "Errore", "Nessun file caricato, impossibile salvare.") def create_tensor(self): if not self.file_path: QMessageBox.warning(self, "Errore", "Carica prima un file!") return text = self.text_edit.toPlainText() tensore = self.generate_tensor(text) tensor_filename = os.path.join(self.tensore_path, os.path.basename(self.file_path) + "_tensor.json") with open(tensor_filename, "w", encoding="utf-8") as f: json.dump(tensore, f, indent=4) QMessageBox.information(self, "Tensore Generato", f"Tensore salvato con successo in {tensor_filename}") def generate_tensor(self, text): """Crea un tensore narrativo con valori normalizzati.""" np.random.seed(42) # Per risultati coerenti return { "Dimensione Tematica": round(np.random.uniform(0, 1), 2), "Dimensione Linguaggio e Stile": round(np.random.uniform(0, 1), 2), "Dimensione Struttura Temporale e Ritmo": round(np.random.uniform(0, 1), 2), "Dimensione Evoluzione Personaggi": round(np.random.uniform(0, 1), 2), "Dimensione Tonalità ed Emozioni": round(np.random.uniform(0, 1), 2) } def visualize_tensor(self): """Genera una visualizzazione grafica del Tensore Narrativo.""" tensor_data = self.generate_tensor(self.text_edit.toPlainText()) labels = list(tensor_data.keys()) values = list(tensor_data.values()) fig, ax = plt.subplots(figsize=(6, 6)) ax.pie(values, labels=labels, autopct=' ax.axis("equal") plt.title("Distribuzione delle Dimensioni del Tensore Narrativo") plt.show() def load_existing_tensor(self): tensor_file, _ = QFileDialog.getOpenFileName(self, "Carica Tensore", self.tensore_path, "JSON Files (*.json)") if tensor_file: with open(tensor_file, "r", encoding="utf-8") as f: tensor_data = json.load(f) QMessageBox.information(self, "Tensore Caricato", f"Tensore:\n{json.dumps(tensor_data, indent=4)}") def show_about(self): """Mostra la finestra About con informazioni sul software.""" about_window = QDialog(self) about_window.setWindowTitle("Informazioni") about_window.setGeometry(400, 400, 400, 300) layout = QVBoxLayout() image_label = QLabel() pixmap = QPixmap("luigiusai.jpg") # Assicurati che l'immagine esista nella directory del programma image_label.setPixmap(pixmap) layout.addWidget(image_label) text_label = QLabel("Software Tensori Narrativi\nAutore: Dr. Luigi Usai\nCreato il: 13 Maggio 2025 a Quartucciu") layout.addWidget(text_label) about_window.setLayout(layout) about_window.exec_() # Usa exec_() per mantenere la finestra aperta if __name__ == "__main__": app = QApplication(sys.argv) window = TensoreNarrativoApp() window.show() sys.exit(app.exec_())