graph gui almost done
This commit is contained in:
parent
ac4f4410a2
commit
dc412bb8e8
1
app.py
1
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
|
||||
|
||||
|
||||
13
utils/gui/pyqt/main_window/Canvas/CrossSection2DCanvas.py
Normal file
13
utils/gui/pyqt/main_window/Canvas/CrossSection2DCanvas.py
Normal file
@ -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)
|
||||
30
utils/gui/pyqt/main_window/Canvas/Mesh3DCanvas.py
Normal file
30
utils/gui/pyqt/main_window/Canvas/Mesh3DCanvas.py
Normal file
@ -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)
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
</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">
|
||||
<widget class="QWidget" name="MainSettings" native="true">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>331</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<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="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/>
|
||||
|
||||
@ -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)
|
||||
|
||||
92
utils/gui/pyqt/main_window/Workers/AnalyseWorker.py
Normal file
92
utils/gui/pyqt/main_window/Workers/AnalyseWorker.py
Normal file
@ -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)
|
||||
Loading…
Reference in New Issue
Block a user