Skip to content
Snippets Groups Projects
MainWindow.py 4.09 KiB
Newer Older
Djalim Simaila's avatar
Djalim Simaila committed
import os
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QFileDialog
from utils.files.input import ScannedObject
from utils.gui.pyqt.main_window.UI_MainWindow import Ui_MainWindow
Djalim Simaila's avatar
Djalim Simaila committed
from utils.gui.pyqt.main_window.Workers.AnalyseWorker import AnalyseWorker
from utils.gui.pyqt.main_window.Canvas.Mesh3DCanvas import Mesh3DCanvas
from utils.gui.pyqt.main_window.Canvas.CrossSection2DCanvas import CrossSection2DCanvas
Djalim Simaila's avatar
Djalim Simaila committed
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    """
    Main window of the application
    """

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        # Retrieve the UI
        self.setupUi(self)
        # Setup buttons listeners
        self.start_analyse_button.clicked.connect(self.start_analyse)
        self.input_file_choose_btn.clicked.connect(self.select_file)
        self.output_folder_choose_btn.clicked.connect(self.select_folder)
Djalim Simaila's avatar
Djalim Simaila committed
        #CanvasWrapper(ScannedObject.from_obj_file("/Users/djalim/Documents/DevStuff/AnalyseMorphologique/datasets/Barette/1 - BARETTE.obj")).canvas.native
Djalim Simaila's avatar
Djalim Simaila committed
        self.completed = 0

    def select_file(self):
        """
        Open a file dialog to select the input file
        """
        file = QFileDialog.getOpenFileName()[0]
        self.input_file_path.setPlainText(file)
        self.output_file_prefix.setText(os.path.splitext(os.path.basename(file))[0])

    def select_folder(self):
        """
        Open a file dialog to select the output folder
        """
        self.output_folder_path.setPlainText(
            QFileDialog.getExistingDirectory())

    def start_analyse(self):
        """
        Start the analyse
        """
        if not self.check_input_file():
            self.input_file_path.setPlainText("Invalid file path")
            return
        if not self.check_output_folder():
            self.output_folder_path.setPlainText("Invalid folder path")
            return

        # Create the thread to run the analyse
        self.thread = QThread()
Djalim Simaila's avatar
Djalim Simaila committed
        self.worker = AnalyseWorker(self.input_file_path.toPlainText(),
Djalim Simaila's avatar
Djalim Simaila committed
                             self.output_folder_path.toPlainText(),
                             self.output_file_prefix.text(),
                             self.discretisation_value_selector.value())
        self.worker.moveToThread(self.thread)

        # Connect the signals
        # Start
        self.thread.started.connect(self.worker.run)
        # Progress
        self.worker.status.connect(self.set_status)
Djalim Simaila's avatar
Djalim Simaila committed
        self.worker.progress.connect(self.update_progress_bar)
        self.worker.render.connect(self.show_graph)
Djalim Simaila's avatar
Djalim Simaila committed
        # Finished
        self.worker.finished.connect(self.finish_analyse)
        self.worker.finished.connect(self.thread.quit)
        self.worker.finished.connect(self.worker.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)

        # Start the thread
        self.thread.start()
        self.start_analyse_button.setEnabled(False)

    def set_status(self, status:str):
        """
        Set the status of the analyse
        """
        self.status_text.setText(status)

Djalim Simaila's avatar
Djalim Simaila committed
    def show_graph(self, obj:ScannedObject):
        """
        Show the graph
        """
        self.slot0.addWidget(Mesh3DCanvas(obj).canvas.native)
        self.slot1.addWidget(CrossSection2DCanvas(obj.get_x(),obj.get_z(),"Coupe X").canvas.native)
        self.slot2.addWidget(CrossSection2DCanvas(obj.get_y(),obj.get_z(),"Coupe Y").canvas.native)
Djalim Simaila's avatar
Djalim Simaila committed
    def finish_analyse(self):
        """
        Finish the analyse
        """
        self.start_analyse_button.setEnabled(True)

Djalim Simaila's avatar
Djalim Simaila committed
    def check_input_file(self):
        """
        Check if the input file is valid
        """
        if os.path.isfile(self.input_file_path.toPlainText()):
            return True

    def check_output_folder(self):
        """
        Check if the output folder is valid
        """
        if os.path.isdir(self.output_folder_path.toPlainText()):
            return True

    def update_progress_bar(self, value):
        """
        Update the progress bar
        """
        self.analyse_progress_bar.setValue(value)