diff --git a/app.py b/app.py index 507135b2fcdfbb57e24d4510c956bcce71627ecd..71c72d9900060ecd65e005f4c1a7a899e9bcee97 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,4 @@ import sys -from PyQt5 import uic from PyQt5.QtWidgets import QApplication from utils.gui.pyqt.main_window.MainWindow import MainWindow diff --git a/utils/gui/pyqt/main_window/Canvas/CrossSection2DCanvas.py b/utils/gui/pyqt/main_window/Canvas/CrossSection2DCanvas.py new file mode 100644 index 0000000000000000000000000000000000000000..c3ff1987a61458364c449edce03ecb8a202999c6 --- /dev/null +++ b/utils/gui/pyqt/main_window/Canvas/CrossSection2DCanvas.py @@ -0,0 +1,13 @@ +import vispy.plot as vp +import numpy as np +from utils.files.input import ScannedObject + + +class CrossSection2DCanvas: + def __init__(self,x_values:list, y_values:list,title:str): + color = (0.3, 0.5, 0.8) + self.canvas = vp.Fig(show=False,size=(500, 500)) + line = self.canvas[0,0].plot(np.column_stack((x_values,y_values)), symbol='o', width=0, + face_color=color + (0.02,), edge_color=None, + marker_size=8,title=title) + line.set_gl_state(depth_test=False) \ No newline at end of file diff --git a/utils/gui/pyqt/main_window/Canvas/Mesh3DCanvas.py b/utils/gui/pyqt/main_window/Canvas/Mesh3DCanvas.py new file mode 100644 index 0000000000000000000000000000000000000000..88315191dba4d6ecb5115c43c2d53c384c377d0f --- /dev/null +++ b/utils/gui/pyqt/main_window/Canvas/Mesh3DCanvas.py @@ -0,0 +1,30 @@ +from vispy import scene +from vispy.scene.visuals import Mesh +from vispy.visuals.filters import ShadingFilter, WireframeFilter +from vispy.scene import SceneCanvas +from utils.files.input import ScannedObject +import numpy as np + +class Mesh3DCanvas: + def __init__(self,obj:ScannedObject): + vertices = np.asarray(obj.get_vertices()) + faces = np.asarray(obj.get_faces()) + self.canvas = scene.SceneCanvas(keys='interactive', bgcolor='white',size=(400, 400)) + view = self.canvas.central_widget.add_view() + view.camera = 'arcball' + view.camera.depth_value = 1e3 + mesh = Mesh(vertices, faces, color=(.5, .7, .5, 1)) + view.add(mesh) + wireframe_filter = WireframeFilter(width=0) + shading_filter = ShadingFilter(shininess=0) + mesh.attach(wireframe_filter) + mesh.attach(shading_filter) + def attach_headlight(view): + light_dir = (0, 1, 0, 0) + shading_filter.light_dir = light_dir[:3] + initial_light_dir = view.camera.transform.imap(light_dir) + @view.scene.transform.changed.connect + def on_transform_change(event): + transform = view.camera.transform + shading_filter.light_dir = transform.map(initial_light_dir)[:3] + attach_headlight(view) \ No newline at end of file diff --git a/utils/gui/pyqt/main_window/MainWindow.py b/utils/gui/pyqt/main_window/MainWindow.py index 96a1c6bc0c2c274d8f444e25fcba61f8ee01255b..108289276f2e830a9e970a47153309a522d8f247 100644 --- a/utils/gui/pyqt/main_window/MainWindow.py +++ b/utils/gui/pyqt/main_window/MainWindow.py @@ -1,116 +1,12 @@ -import time import os from PyQt5 import QtWidgets from PyQt5.QtCore import QThread, pyqtSignal, QObject from PyQt5.QtWidgets import QFileDialog -from main import get_discrete_data, get_raw_data -from utils.files.output import save_output_file, format_data from utils.files.input import ScannedObject -from utils.math.position_manipulation import verticalise from utils.gui.pyqt.main_window.UI_MainWindow import Ui_MainWindow - -def analyse(file_path:str,output_path:str, output_file_prefix:str, delta_z:float,set_status,update_ui,set_weight): - """ - Run the analyse - - Args: - file_path (str): Path to the file to analyse - output_path (str): Path to the output folder - delta_z (float): Delta z to use - set_status (function): Function to set the status - update_ui (function): Function to update the ui - set_weight (function): Function to set the weight - - """ - set_status("Loading file...") - obj = ScannedObject.from_obj_file(file_path) - update_ui(5) - set_status("Verticalising object...") - verticalise(obj) - update_ui(5) - set_status("Normalising object...") - obj.normalise() - update_ui(5) - set_weight(70) - set_status("Calculating raw data...") - raw_data = get_raw_data(obj, 6,delta_z,update_ui) - set_status("Calculating discrete data...") - discrete_data = get_discrete_data(obj, 6,delta_z,update_ui) - set_weight(100) - set_status("Saving data...") - save_output_file(f'{output_path}/{output_file_prefix}_delta_{delta_z}_analyse_brute.txt', - format_data(raw_data, - '\t', - ["X (en mm)", - "Y (en mm)", - "Z (en mm)", - "teta (en rad)", - "rayon (en mm)", - "Xi-Xmoy", - "Yi-Ymoy"] )) - update_ui(10) - save_output_file(f'{output_path}/{output_file_prefix}_delta_{delta_z}_analyse_rayon.txt', - format_data(discrete_data, - '\t', - ["X moy (en mm)", - "Y moy (en mm)", - "Z moy (en mm)", - "Delta z(en mm)", - "Rayon moyen (en mm)", - "Rayon ecart type (en mm)"] )) - update_ui(100) - set_status("Done !") - -class Worker(QObject): - """ - Worker to run the analyse in a thread - """ - finished = pyqtSignal() - progress = pyqtSignal(int) - status = pyqtSignal(str) - - def __init__(self, objpath,output_path,output_file_prefix,delta_z): - super().__init__() - self.objpath = objpath - self.delta_z = delta_z - self.output_path = output_path - self.output_file_prefix = output_file_prefix - self.progress_value = 0 - self.progress_weight = 100 - - def run(self): - """ - Run the analyse - """ - analyse(self.objpath, - self.output_path, - self.output_file_prefix, - self.delta_z, - self.set_status, - self.update_progress, - self.set_weight) - - self.finished.emit() - - def set_status(self, status:str): - """ - Set the weight of the progress bar - """ - self.status.emit(status) - - def set_weight(self, weight): - """ - Set the weight of the progress bar - """ - self.progress_weight = weight - - def update_progress(self, percent): - """ - Update the progress bar - """ - self.progress_value += int(percent/100*self.progress_weight) - self.progress.emit(self.progress_value) - +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 @@ -124,7 +20,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 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): @@ -155,7 +51,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # Create the thread to run the analyse self.thread = QThread() - self.worker = Worker(self.input_file_path.toPlainText(), + self.worker = AnalyseWorker(self.input_file_path.toPlainText(), self.output_folder_path.toPlainText(), self.output_file_prefix.text(), self.discretisation_value_selector.value()) @@ -165,8 +61,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # Start self.thread.started.connect(self.worker.run) # Progress - self.worker.progress.connect(self.update_progress_bar) 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) @@ -183,12 +80,20 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): """ 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 diff --git a/utils/gui/pyqt/main_window/MainWindow.ui b/utils/gui/pyqt/main_window/MainWindow.ui index 79d0239373ff4d5b480368b58f5d9fa018982b4b..fe46fcbf971628fac903c36e9cb5d02a8c46b1ac 100644 --- a/utils/gui/pyqt/main_window/MainWindow.ui +++ b/utils/gui/pyqt/main_window/MainWindow.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>529</width> - <height>567</height> + <width>1067</width> + <height>517</height> </rect> </property> <property name="windowTitle"> @@ -15,114 +15,166 @@ </property> <widget class="QWidget" name="centralwidget"> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout"> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QLabel" name="input_file_label"> - <property name="text"> - <string>Chemin du fichier .obj</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="input_file_choose_btn"> - <property name="text"> - <string>Choisir le fichier</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QPlainTextEdit" name="input_file_path"/> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QLabel" name="output_folder_label"> - <property name="text"> - <string>Repertoire de sortie</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="output_folder_choose_btn"> - <property name="text"> - <string>Choisir le repertoire</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QPlainTextEdit" name="output_folder_path"/> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QLabel" name="output_file_prefix_label"> - <property name="text"> - <string>Préfix du fichier de sortie</string> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="output_file_prefix"/> - </item> - </layout> - </item> - <item alignment="Qt::AlignHCenter"> - <widget class="QLabel" name="discretisation_label"> - <property name="text"> - <string>Discretisation (en mm)</string> - </property> - </widget> - </item> - <item> - <widget class="QDoubleSpinBox" name="discretisation_value_selector"> - <property name="minimum"> - <double>0.000000000000000</double> - </property> - <property name="value"> - <double>1.000000000000000</double> - </property> - </widget> - </item> - <item> - <widget class="QProgressBar" name="analyse_progress_bar"> - <property name="value"> - <number>0</number> + <widget class="QWidget" name="MainSettings" native="true"> + <property name="enabled"> + <bool>true</bool> </property> - </widget> - </item> - <item alignment="Qt::AlignHCenter"> - <widget class="QCheckBox" name="show_graph_checkbox"> - <property name="text"> - <string>afficher les graphes</string> + <property name="minimumSize"> + <size> + <width>331</width> + <height>0</height> + </size> </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="start_analyse_button"> - <property name="text"> - <string>Analyser le fichier</string> + <property name="maximumSize"> + <size> + <width>518</width> + <height>16777215</height> + </size> </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <layout class="QVBoxLayout" name="MainSettingsLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="input_file_label"> + <property name="text"> + <string>Chemin du fichier .obj</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="input_file_choose_btn"> + <property name="text"> + <string>Choisir le fichier</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QPlainTextEdit" name="input_file_path"/> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="output_folder_label"> + <property name="text"> + <string>Repertoire de sortie</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="output_folder_choose_btn"> + <property name="text"> + <string>Choisir le repertoire</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QPlainTextEdit" name="output_folder_path"/> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="output_file_prefix_label"> + <property name="text"> + <string>Préfix du fichier de sortie</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="output_file_prefix"/> + </item> + </layout> + </item> + <item alignment="Qt::AlignHCenter"> + <widget class="QLabel" name="discretisation_label"> + <property name="text"> + <string>Discretisation (en mm)</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="discretisation_value_selector"> + <property name="minimum"> + <double>0.000000000000000</double> + </property> + <property name="value"> + <double>1.000000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QProgressBar" name="analyse_progress_bar"> + <property name="value"> + <number>0</number> + </property> + </widget> + </item> + <item alignment="Qt::AlignHCenter"> + <widget class="QCheckBox" name="show_graph_checkbox"> + <property name="text"> + <string>afficher les graphes</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="start_analyse_button"> + <property name="text"> + <string>Analyser le fichier</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="status_text"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> </widget> </item> <item> - <widget class="QLineEdit" name="status_text"> - <property name="readOnly"> - <bool>true</bool> + <widget class="QWidget" name="Graphs" native="true"> + <property name="minimumSize"> + <size> + <width>700</width> + <height>0</height> + </size> </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <layout class="QGridLayout" name="GraphsLayout"> + <item row="0" column="0"> + <layout class="QGridLayout" name="slot0"/> + </item> + <item row="2" column="0"> + <layout class="QGridLayout" name="slot2"/> + </item> + <item row="0" column="1"> + <layout class="QGridLayout" name="slot1"/> + </item> + <item row="2" column="1"> + <layout class="QGridLayout" name="solt3"/> + </item> + </layout> + </item> + </layout> </widget> </item> </layout> </item> </layout> </widget> - <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> diff --git a/utils/gui/pyqt/main_window/UI_MainWindow.py b/utils/gui/pyqt/main_window/UI_MainWindow.py index 8f91a4260a06d0224ae9dda68acb7121dd3718f3..a65805508e16999be2cdf90d2341ff410dc8bb81 100644 --- a/utils/gui/pyqt/main_window/UI_MainWindow.py +++ b/utils/gui/pyqt/main_window/UI_MainWindow.py @@ -14,73 +14,102 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(529, 567) + MainWindow.resize(1067, 517) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.MainSettings = QtWidgets.QWidget(self.centralwidget) + self.MainSettings.setEnabled(True) + self.MainSettings.setMinimumSize(QtCore.QSize(331, 0)) + self.MainSettings.setMaximumSize(QtCore.QSize(518, 16777215)) + self.MainSettings.setObjectName("MainSettings") + self.gridLayout_2 = QtWidgets.QGridLayout(self.MainSettings) + self.gridLayout_2.setObjectName("gridLayout_2") + self.MainSettingsLayout = QtWidgets.QVBoxLayout() + self.MainSettingsLayout.setObjectName("MainSettingsLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") - self.input_file_label = QtWidgets.QLabel(self.centralwidget) + self.input_file_label = QtWidgets.QLabel(self.MainSettings) self.input_file_label.setObjectName("input_file_label") self.horizontalLayout.addWidget(self.input_file_label) - self.input_file_choose_btn = QtWidgets.QPushButton(self.centralwidget) + self.input_file_choose_btn = QtWidgets.QPushButton(self.MainSettings) self.input_file_choose_btn.setObjectName("input_file_choose_btn") self.horizontalLayout.addWidget(self.input_file_choose_btn) - self.verticalLayout.addLayout(self.horizontalLayout) - self.input_file_path = QtWidgets.QPlainTextEdit(self.centralwidget) + self.MainSettingsLayout.addLayout(self.horizontalLayout) + self.input_file_path = QtWidgets.QPlainTextEdit(self.MainSettings) self.input_file_path.setObjectName("input_file_path") - self.verticalLayout.addWidget(self.input_file_path) + self.MainSettingsLayout.addWidget(self.input_file_path) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.output_folder_label = QtWidgets.QLabel(self.centralwidget) + self.output_folder_label = QtWidgets.QLabel(self.MainSettings) self.output_folder_label.setObjectName("output_folder_label") self.horizontalLayout_2.addWidget(self.output_folder_label) - self.output_folder_choose_btn = QtWidgets.QPushButton(self.centralwidget) + self.output_folder_choose_btn = QtWidgets.QPushButton(self.MainSettings) self.output_folder_choose_btn.setObjectName("output_folder_choose_btn") self.horizontalLayout_2.addWidget(self.output_folder_choose_btn) - self.verticalLayout.addLayout(self.horizontalLayout_2) - self.output_folder_path = QtWidgets.QPlainTextEdit(self.centralwidget) + self.MainSettingsLayout.addLayout(self.horizontalLayout_2) + self.output_folder_path = QtWidgets.QPlainTextEdit(self.MainSettings) self.output_folder_path.setObjectName("output_folder_path") - self.verticalLayout.addWidget(self.output_folder_path) + self.MainSettingsLayout.addWidget(self.output_folder_path) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.output_file_prefix_label = QtWidgets.QLabel(self.centralwidget) + self.output_file_prefix_label = QtWidgets.QLabel(self.MainSettings) self.output_file_prefix_label.setObjectName("output_file_prefix_label") self.horizontalLayout_3.addWidget(self.output_file_prefix_label) - self.output_file_prefix = QtWidgets.QLineEdit(self.centralwidget) + self.output_file_prefix = QtWidgets.QLineEdit(self.MainSettings) self.output_file_prefix.setObjectName("output_file_prefix") self.horizontalLayout_3.addWidget(self.output_file_prefix) - self.verticalLayout.addLayout(self.horizontalLayout_3) - self.discretisation_label = QtWidgets.QLabel(self.centralwidget) + self.MainSettingsLayout.addLayout(self.horizontalLayout_3) + self.discretisation_label = QtWidgets.QLabel(self.MainSettings) self.discretisation_label.setObjectName("discretisation_label") - self.verticalLayout.addWidget(self.discretisation_label, 0, QtCore.Qt.AlignHCenter) - self.discretisation_value_selector = QtWidgets.QDoubleSpinBox(self.centralwidget) + self.MainSettingsLayout.addWidget(self.discretisation_label, 0, QtCore.Qt.AlignHCenter) + self.discretisation_value_selector = QtWidgets.QDoubleSpinBox(self.MainSettings) self.discretisation_value_selector.setMinimum(0.0) self.discretisation_value_selector.setProperty("value", 1.0) self.discretisation_value_selector.setObjectName("discretisation_value_selector") - self.verticalLayout.addWidget(self.discretisation_value_selector) - self.analyse_progress_bar = QtWidgets.QProgressBar(self.centralwidget) + self.MainSettingsLayout.addWidget(self.discretisation_value_selector) + self.analyse_progress_bar = QtWidgets.QProgressBar(self.MainSettings) self.analyse_progress_bar.setProperty("value", 0) self.analyse_progress_bar.setObjectName("analyse_progress_bar") - self.verticalLayout.addWidget(self.analyse_progress_bar) - self.show_graph_checkbox = QtWidgets.QCheckBox(self.centralwidget) + self.MainSettingsLayout.addWidget(self.analyse_progress_bar) + self.show_graph_checkbox = QtWidgets.QCheckBox(self.MainSettings) self.show_graph_checkbox.setObjectName("show_graph_checkbox") - self.verticalLayout.addWidget(self.show_graph_checkbox, 0, QtCore.Qt.AlignHCenter) - self.start_analyse_button = QtWidgets.QPushButton(self.centralwidget) + self.MainSettingsLayout.addWidget(self.show_graph_checkbox, 0, QtCore.Qt.AlignHCenter) + self.start_analyse_button = QtWidgets.QPushButton(self.MainSettings) self.start_analyse_button.setObjectName("start_analyse_button") - self.verticalLayout.addWidget(self.start_analyse_button) - self.status_text = QtWidgets.QLineEdit(self.centralwidget) + self.MainSettingsLayout.addWidget(self.start_analyse_button) + self.status_text = QtWidgets.QLineEdit(self.MainSettings) self.status_text.setReadOnly(True) self.status_text.setObjectName("status_text") - self.verticalLayout.addWidget(self.status_text) - self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) + self.MainSettingsLayout.addWidget(self.status_text) + self.gridLayout_2.addLayout(self.MainSettingsLayout, 0, 0, 1, 1) + self.horizontalLayout_4.addWidget(self.MainSettings) + self.Graphs = QtWidgets.QWidget(self.centralwidget) + self.Graphs.setMinimumSize(QtCore.QSize(700, 0)) + self.Graphs.setObjectName("Graphs") + self.gridLayout_3 = QtWidgets.QGridLayout(self.Graphs) + self.gridLayout_3.setObjectName("gridLayout_3") + self.GraphsLayout = QtWidgets.QGridLayout() + self.GraphsLayout.setObjectName("GraphsLayout") + self.slot0 = QtWidgets.QGridLayout() + self.slot0.setObjectName("slot0") + self.GraphsLayout.addLayout(self.slot0, 0, 0, 1, 1) + self.slot2 = QtWidgets.QGridLayout() + self.slot2.setObjectName("slot2") + self.GraphsLayout.addLayout(self.slot2, 2, 0, 1, 1) + self.slot1 = QtWidgets.QGridLayout() + self.slot1.setObjectName("slot1") + self.GraphsLayout.addLayout(self.slot1, 0, 1, 1, 1) + self.solt3 = QtWidgets.QGridLayout() + self.solt3.setObjectName("solt3") + self.GraphsLayout.addLayout(self.solt3, 2, 1, 1, 1) + self.gridLayout_3.addLayout(self.GraphsLayout, 0, 0, 1, 1) + self.horizontalLayout_4.addWidget(self.Graphs) + self.gridLayout.addLayout(self.horizontalLayout_4, 1, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) - self.statusbar = QtWidgets.QStatusBar(MainWindow) - self.statusbar.setObjectName("statusbar") - MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) diff --git a/utils/gui/pyqt/main_window/Workers/AnalyseWorker.py b/utils/gui/pyqt/main_window/Workers/AnalyseWorker.py new file mode 100644 index 0000000000000000000000000000000000000000..8a005aeed4c83cf2bb8f42582c5cc8cc6d5ac6af --- /dev/null +++ b/utils/gui/pyqt/main_window/Workers/AnalyseWorker.py @@ -0,0 +1,92 @@ +from PyQt5.QtCore import pyqtSignal, QObject +from utils.files.input import ScannedObject +from utils.files.output import save_output_file, format_data +from utils.math.position_manipulation import verticalise +from utils.data_processing.data_processing import get_discrete_data, get_raw_data + +class AnalyseWorker(QObject): + """ + Worker to run the analyse in a thread + """ + finished = pyqtSignal() + render = pyqtSignal(ScannedObject) + progress = pyqtSignal(int) + status = pyqtSignal(str) + + def __init__(self, objpath,output_path,output_file_prefix,delta_z): + super().__init__() + self.objpath = objpath + self.delta_z = delta_z + self.output_path = output_path + self.output_file_prefix = output_file_prefix + self.progress_value = 0 + self.progress_weight = 100 + + def run(self): + """ + Run the analyse + """ + self.set_status("Loading file...") + obj = ScannedObject.from_obj_file(self.objpath) + self.update_progress(5) + + self.set_status("Verticalising object...") + verticalise(obj) + self.update_progress(5) + + self.set_status("Normalising object...") + obj.normalise() + self.update_progress(5) + self.render.emit(obj) + self.set_weight(70) + + self.set_status("Calculating raw data...") + raw_data = get_raw_data(obj, 6,self.delta_z,self.update_progress) + self.set_status("Calculating discrete data...") + discrete_data = get_discrete_data(obj, 6,self.delta_z,self.update_progress) + + self.set_weight(100) + self.set_status("Saving data...") + save_output_file(f'{self.output_path}/{self.output_file_prefix}_delta_{self.delta_z}_analyse_brute.txt', + format_data(raw_data, + '\t', + ["X (en mm)", + "Y (en mm)", + "Z (en mm)", + "teta (en rad)", + "rayon (en mm)", + "Xi-Xmoy", + "Yi-Ymoy"] )) + + self.update_progress(10) + save_output_file(f'{self.output_path}/{self.output_file_prefix}_delta_{self.delta_z}_analyse_rayon.txt', + format_data(discrete_data, + '\t', + ["X moy (en mm)", + "Y moy (en mm)", + "Z moy (en mm)", + "Delta z(en mm)", + "Rayon moyen (en mm)", + "Rayon ecart type (en mm)"] )) + self.update_progress(100) + self.set_status("Done !") + self.finished.emit() + + def set_status(self, status:str): + """ + Set the weight of the progress bar + """ + self.status.emit(status) + + def set_weight(self, weight): + """ + Set the weight of the progress bar + """ + self.progress_weight = weight + + def update_progress(self, percent): + """ + Update the progress bar + """ + self.progress_value += int(percent/100*self.progress_weight) + self.progress.emit(self.progress_value) \ No newline at end of file