Newer
Older
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
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
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)
#CanvasWrapper(ScannedObject.from_obj_file("/Users/djalim/Documents/DevStuff/AnalyseMorphologique/datasets/Barette/1 - BARETTE.obj")).canvas.native
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()
self.worker = AnalyseWorker(self.input_file_path.toPlainText(),
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)
self.worker.progress.connect(self.update_progress_bar)
self.worker.render.connect(self.show_graph)
# 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)
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)
def finish_analyse(self):
"""
Finish the analyse
"""
self.start_analyse_button.setEnabled(True)
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)