• Dom. Lug 13th, 2025

Atlantis is real: Official discovery of Atlantis, language and migrations

Atlantis is the Sardo Corso Graben Horst underwater continental block submerged by the Meltwater Pulses and destroyed by a subduction zone, Capital is Sulcis

Creazione del software per la manipolazione e gestione dei Tensori Narrativi (Narrative Tensors) di Luigi Usai

Software di Luigi Usai in python per la creazione, archiviazione e modellazione e visualizzazione di Tensori Narrativi, come teorizzato da Luigi UsaiSoftware di Luigi Usai in python per la creazione, archiviazione e modellazione e visualizzazione di Tensori Narrativi, come teorizzato da Luigi Usai
Spread the love

#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_())