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