finished graphs

This commit is contained in:
Djalim Simaila 2023-04-26 15:30:37 +02:00
parent bbe7a04d2c
commit d3136a12b6
15 changed files with 707 additions and 251 deletions

View File

@ -51,7 +51,7 @@ def main():
["X moy (en mm)",
"Y moy (en mm)",
"Z moy (en mm)",
"Delta z(en mm)",
"Discretisation(en mm)",
"Rayon moyen (en mm)",
"Rayon ecart type (en mm)"] ))
print("Data saved in {} seconds".format(time.time()-t))

View File

@ -54,7 +54,7 @@ def get_discrete_data(obj:ScannedObject, ndigits:int, delta_z:float=1, update_pr
- Rayon moyen (en mm) : list of mean radius values
- Rayon ecart type (en mm) : list of radius standard deviation values
"""
colones = ["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)"]
colones = ["X moy (en mm)", "Y moy (en mm)", "Z moy (en mm)","Discretisation(en mm)","Rayon moyen (en mm)","Rayon ecart type (en mm)"]
data = {}
for colone in colones:
data[colone] = []
@ -67,7 +67,7 @@ def get_discrete_data(obj:ScannedObject, ndigits:int, delta_z:float=1, update_pr
data["Z moy (en mm)"].append(round(z, ndigits))
first = discrete_values[0]
last = discrete_values[-1]
data["Delta z(en mm)"].append(round(last[2]-first[2],ndigits))
data["Discretisation(en mm)"].append(round(last[2]-first[2],ndigits))
data["Rayon moyen (en mm)"].append(round(data_extraction.get_mean_radius(discrete_values), ndigits))
data["Rayon ecart type (en mm)"].append(round(data_extraction.get_radius_std(discrete_values), ndigits))
update_progress_bar(int(progress/len(discrete_vertices)*100))

View File

@ -97,9 +97,11 @@ class ScannedObject:
if line.startswith('f'):
if "//" in line:
triangles.append([int(line.split()[1].split("//")[0])-1, int(line.split()[2].split("//")[0])-1, int(line.split()[3].split("//")[0])-1])
elif "/" in line:
triangles.append([int(line.split()[1].split("/")[0])-1, int(line.split()[2].split("/")[0])-1, int(line.split()[3].split("/")[0])-1])
else:
triangles.append([int(line.split()[1])-1, int(line.split()[2])-1, int(line.split()[3])-1])
elif line.startswith('v'):
elif line.startswith('v '):
x.append(float(line.split()[1]) * ratio)
y.append(float(line.split()[2]) * ratio)
z.append(float(line.split()[3]) * ratio)

View File

@ -1,28 +1,33 @@
import vispy.plot as vp
import numpy as np
def render2D(values:list):
def render2D(values:list,title:str,show:bool=True):
"""
Render a 2D plot using vispy
:param values: A list with the values
"""
fig = vp.Fig(size=(600, 500), show=False)
plotwidget = fig[0, 0]
fig.title = "bollu"
plotwidget.plot(values)
plotwidget.colorbar(position="top", cmap="autumn")
fig.show(run=True)
fig.title = title
plotwidget.plot(values,marker_size=0, width=2,title=title)
if show:
fig.show(run=True)
else:
return fig
def cross_section(x_values:list, y_values:list):
def cross_section(x_values:list, y_values:list,title:str, show:bool=True ):
"""
Render a 2D cross section using vispy
:param x: A list with the x values
:param y: A list with the y values
"""
color = (0.3, 0.5, 0.8)
color = (0.3, 0.5, 0.8,.8)
fig = vp.Fig(show=False)
line = fig[0:4, 0:4].plot(np.column_stack((x_values,y_values)), symbol='o', width=0,
face_color=color + (0.02,), edge_color=None,
marker_size=8)
line = fig[0:4, 0:4].plot(np.column_stack((x_values,y_values)), symbol='disc', width=0,
face_color=color, edge_color=None,
marker_size=8,title=title)
line.set_gl_state(depth_test=False)
fig.show(run=True)
if show:
fig.show(run=True)
else:
return fig

View File

@ -5,7 +5,7 @@ from vispy.visuals.filters import ShadingFilter, WireframeFilter
from utils.files.input import ScannedObject
def render3D(obj:ScannedObject):
def render3D(obj:ScannedObject,show:bool=True):
"""
Render a 3D model using vispy
:param obj: A ScannedObject to be rendered
@ -16,7 +16,8 @@ def render3D(obj:ScannedObject):
view = canvas.central_widget.add_view()
view.camera = 'arcball'
view.camera.depth_value = 1e3
mesh = Mesh(vertices, faces, color=(.5, .7, .5, 1))
color = (0.3, 0.5, 0.8)
mesh = Mesh(vertices, faces, color=color)
view.add(mesh)
wireframe_filter = WireframeFilter(width=0)
shading_filter = ShadingFilter(shininess=0)
@ -32,5 +33,8 @@ def render3D(obj:ScannedObject):
transform = view.camera.transform
shading_filter.light_dir = transform.map(initial_light_dir)[:3]
attach_headlight(view)
canvas.show()
app.run()
if show:
canvas.show()
app.run()
else:
return canvas

View File

@ -1,13 +0,0 @@
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)

View File

@ -1,30 +0,0 @@
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)

View File

@ -1,12 +1,14 @@
import os
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QFileDialog, QWidget
from utils.files.input import ScannedObject
from utils.graph2D.visplot_render import cross_section, render2D
from utils.graph3D.visplot_render import render3D
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
from utils.gui.pyqt.main_window.Workers.DiscreteDataWorker import DiscreteDataProcessWorker
from utils.gui.pyqt.main_window.Workers.PreProcessWorker import PreProcessWorker
from utils.gui.pyqt.main_window.Workers.RawDataWorker import RawDataProcessWorker
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
"""
Main window of the application
@ -17,12 +19,61 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
# Retrieve the UI
self.setupUi(self)
# Setup buttons listeners
self.start_analyse_button.clicked.connect(self.start_analyse)
self.start_analyse_button.clicked.connect(self.start_preprocess)
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
self.show_graph_checkbox.stateChanged.connect(self.toggle_graphs)
self.graphType = [
"Aucun",
"Mesh3D",
"CoupeXZ",
"CoupeYZ",
"EvolutionRayon",
]
self.obj = None
self.raw_data= None
self.discrete_data = None
self.completed = 0
self.total = 2
self.comboBoxes = [
self.slot0ComboBox,
self.slot1ComboBox,
self.slot2ComboBox,
self.slot3ComboBox,
self.slot4ComboBox,
self.slot5ComboBox,
self.slot6ComboBox,
self.slot7ComboBox
]
for cb in self.comboBoxes:
cb.addItems(self.graphType)
self.slots = [
[self.slot0,None],
[self.slot1,None],
[self.slot2,None],
[self.slot3,None],
[self.slot4,None],
[self.slot5,None],
[self.slot6,None],
[self.slot7,None]
]
self.threads = []
###############################################################################
# #
# #
# Input/Setting Management #
# #
# #
###############################################################################
def select_file(self):
"""
Open a file dialog to select the input file
@ -35,67 +86,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
"""
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
"""
if not self.show_graph_checkbox.checked:
return
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)
self.output_folder_path.setPlainText(QFileDialog.getExistingDirectory())
def check_input_file(self):
"""
@ -111,8 +102,180 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
if os.path.isdir(self.output_folder_path.toPlainText()):
return True
###############################################################################
# #
# #
# Data Processing #
# #
# #
###############################################################################
def start_preprocess(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
for count,_ in enumerate(self.slots):
self.slots[count][1] = self.comboBoxes[count].currentText()
self.clear_graphs()
self.completed = 0
# Create the thread to run the analyse
self.preprocess_thread = QThread()
self.preprocess_worker = PreProcessWorker("PreProcessWorker",self.input_file_path.toPlainText())
self.preprocess_worker.moveToThread(self.preprocess_thread)
# Connect the signals
# Start
self.preprocess_thread.started.connect(self.preprocess_worker.run)
# Progress
self.preprocess_worker.status.connect(self.set_status)
self.preprocess_worker.progress.connect(self.update_progress_bar)
self.preprocess_worker.processed_obj.connect(self.set_obj)
self.preprocess_worker.processed_obj.connect(self.process_raw_data)
self.preprocess_worker.processed_obj.connect(self.process_discrete_data)
# Finished
self.preprocess_worker.finished.connect(self.preprocess_thread.quit)
self.preprocess_worker.finished.connect(self.preprocess_worker.deleteLater)
self.preprocess_thread.finished.connect(self.preprocess_thread.deleteLater)
# Start the thread
self.preprocess_thread.start()
self.start_analyse_button.setEnabled(False)
def process_raw_data(self, obj:ScannedObject):
self.processrawdata_thread = QThread()
self.processraw_worker = RawDataProcessWorker("RawDataProcessWorker",
obj,
self.output_folder_path.toPlainText(),
self.output_file_prefix.text(),
self.discretisation_value_selector.value())
self.processraw_worker.moveToThread(self.processrawdata_thread)
# Connect the signals
# Start
self.processrawdata_thread.started.connect(self.processraw_worker.run)
# Progress
self.processraw_worker.status.connect(self.set_status)
self.processraw_worker.progress.connect(self.update_progress_bar)
self.processraw_worker.processedData.connect(self.set_raw_data)
# Finished
self.processraw_worker.finished.connect(self.finish_analyse)
self.processraw_worker.finished.connect(self.processrawdata_thread.quit)
self.processraw_worker.finished.connect(self.processraw_worker.deleteLater)
self.processrawdata_thread.finished.connect(self.processrawdata_thread.deleteLater)
# Start the thread
self.processrawdata_thread.start()
def process_discrete_data(self, obj:ScannedObject):
self.processdiscrete_thread = QThread()
self.processdiscrete_worker = DiscreteDataProcessWorker("DiscreteDataProcessWorker",
obj,
self.output_folder_path.toPlainText(),
self.output_file_prefix.text(),
self.discretisation_value_selector.value())
self.processdiscrete_worker.moveToThread(self.processdiscrete_thread)
# Connect the signals
# Start
self.processdiscrete_thread.started.connect(self.processdiscrete_worker.run)
# Progress
self.processdiscrete_worker.status.connect(self.set_status)
self.processdiscrete_worker.progress.connect(self.update_progress_bar)
self.processdiscrete_worker.processedData.connect(self.set_discrete_data)
# Finished
self.processdiscrete_worker.finished.connect(self.finish_analyse)
self.processdiscrete_worker.finished.connect(self.processdiscrete_thread.quit)
self.processdiscrete_worker.finished.connect(self.processdiscrete_worker.deleteLater)
self.processdiscrete_thread.finished.connect(self.processdiscrete_thread.deleteLater)
# Start the thread
self.processdiscrete_thread.start()
def set_obj(self,obj:ScannedObject):
self.obj = obj
def set_discrete_data(self,discrete_data:dict):
self.discrete_data = discrete_data
def set_raw_data(self,raw_data:dict):
self.raw_data = raw_data
###############################################################################
# #
# #
# Graphs management #
# #
# #
###############################################################################
def toggle_graphs(self):
"""
Show or hide the graphs
"""
if self.show_graph_checkbox.isChecked():
self.Graphs.show()
else:
self.Graphs.hide()
def renderGraphs(self,obj:ScannedObject,raw_data:dict,discrete_data:dict):
if not self.show_graph_checkbox.isChecked():
return
for slot in self.slots:
current_slot = slot[0]
graph_type = slot[1]
if graph_type == "Mesh3D":
current_slot.addWidget(render3D(obj,False).native)
if graph_type == "CoupeX":
current_slot.addWidget(cross_section(obj.get_x(),obj.get_z(),"Coupe X",False).native)
if graph_type == "CoupeY":
current_slot.addWidget(cross_section(obj.get_y(),obj.get_z(),"Coupe Y",False).native)
if graph_type == "EvolutionRayon":
current_slot.addWidget(render2D(list(zip(discrete_data['Z moy (en mm)'],discrete_data['Rayon moyen (en mm)'])),"Evolution du rayon moyen",False).native)
def clear_graphs(self):
"""
Clear the graphs
"""
if not self.show_graph_checkbox.isChecked():
return
for slot,_ in self.slots:
for i in reversed(range(slot.count())):
slot.itemAt(i).widget().setParent(None)
###############################################################################
# #
# #
# User interface updates #
# #
# #
###############################################################################
def finish_analyse(self):
"""
Finish the analyse
"""
self.completed += 1
if self.completed == self.total:
self.status_text.setText("Done")
self.analyse_progress_bar.setValue(100)
self.renderGraphs(self.obj,self.raw_data,self.discrete_data)
self.start_analyse_button.setEnabled(True)
def update_progress_bar(self, value):
"""
Update the progress bar
"""
self.analyse_progress_bar.setValue(value)
self.analyse_progress_bar.setValue(value)
def set_status(self, status:str):
"""
Set the status of the analyse
"""
self.status_text.setText(status)

View File

@ -122,6 +122,9 @@
<property name="text">
<string>afficher les graphes</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
@ -145,6 +148,9 @@
</item>
<item>
<widget class="QWidget" name="Graphs" native="true">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>700</width>
@ -153,20 +159,175 @@
</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>
<widget class="QTabWidget" name="tabWidget">
<property name="enabled">
<bool>true</bool>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<property name="enabled">
<bool>true</bool>
</property>
<attribute name="title">
<string>1</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="1">
<widget class="QFrame" name="slot1_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_10">
<item row="1" column="0">
<layout class="QGridLayout" name="slot1"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot1ComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QFrame" name="slot2_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_11">
<item row="1" column="0">
<layout class="QGridLayout" name="slot2"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot2ComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="1">
<widget class="QFrame" name="slot3_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_12">
<item row="1" column="0">
<layout class="QGridLayout" name="slot3"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot3ComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QFrame" name="slot0_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<item row="1" column="0">
<layout class="QGridLayout" name="slot0"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot0ComboBox"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>2</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_13">
<item row="0" column="1">
<widget class="QFrame" name="slot5_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_18">
<item row="1" column="0">
<layout class="QGridLayout" name="slot5"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot5ComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QFrame" name="slot4_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_17">
<item row="1" column="0">
<layout class="QGridLayout" name="slot4"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot4ComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QFrame" name="slot6_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_19">
<item row="1" column="0">
<layout class="QGridLayout" name="slot6"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot6ComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="1">
<widget class="QFrame" name="slot7_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_20">
<item row="1" column="0">
<layout class="QGridLayout" name="slot7"/>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="slot7ComboBox"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>

View File

@ -76,6 +76,7 @@ class Ui_MainWindow(object):
self.analyse_progress_bar.setObjectName("analyse_progress_bar")
self.MainSettingsLayout.addWidget(self.analyse_progress_bar)
self.show_graph_checkbox = QtWidgets.QCheckBox(self.MainSettings)
self.show_graph_checkbox.setChecked(True)
self.show_graph_checkbox.setObjectName("show_graph_checkbox")
self.MainSettingsLayout.addWidget(self.show_graph_checkbox, 0, QtCore.Qt.AlignHCenter)
self.start_analyse_button = QtWidgets.QPushButton(self.MainSettings)
@ -88,30 +89,136 @@ class Ui_MainWindow(object):
self.gridLayout_2.addLayout(self.MainSettingsLayout, 0, 0, 1, 1)
self.horizontalLayout_4.addWidget(self.MainSettings)
self.Graphs = QtWidgets.QWidget(self.centralwidget)
self.Graphs.setEnabled(True)
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.tabWidget = QtWidgets.QTabWidget(self.Graphs)
self.tabWidget.setEnabled(True)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setEnabled(True)
self.tab.setObjectName("tab")
self.gridLayout_5 = QtWidgets.QGridLayout(self.tab)
self.gridLayout_5.setObjectName("gridLayout_5")
self.slot1_frame = QtWidgets.QFrame(self.tab)
self.slot1_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot1_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot1_frame.setObjectName("slot1_frame")
self.gridLayout_10 = QtWidgets.QGridLayout(self.slot1_frame)
self.gridLayout_10.setObjectName("gridLayout_10")
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.gridLayout_10.addLayout(self.slot1, 1, 0, 1, 1)
self.slot1ComboBox = QtWidgets.QComboBox(self.slot1_frame)
self.slot1ComboBox.setObjectName("slot1ComboBox")
self.gridLayout_10.addWidget(self.slot1ComboBox, 0, 0, 1, 1)
self.gridLayout_5.addWidget(self.slot1_frame, 0, 1, 1, 1)
self.slot2_frame = QtWidgets.QFrame(self.tab)
self.slot2_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot2_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot2_frame.setObjectName("slot2_frame")
self.gridLayout_11 = QtWidgets.QGridLayout(self.slot2_frame)
self.gridLayout_11.setObjectName("gridLayout_11")
self.slot2 = QtWidgets.QGridLayout()
self.slot2.setObjectName("slot2")
self.gridLayout_11.addLayout(self.slot2, 1, 0, 1, 1)
self.slot2ComboBox = QtWidgets.QComboBox(self.slot2_frame)
self.slot2ComboBox.setObjectName("slot2ComboBox")
self.gridLayout_11.addWidget(self.slot2ComboBox, 0, 0, 1, 1)
self.gridLayout_5.addWidget(self.slot2_frame, 1, 0, 1, 1)
self.slot3_frame = QtWidgets.QFrame(self.tab)
self.slot3_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot3_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot3_frame.setObjectName("slot3_frame")
self.gridLayout_12 = QtWidgets.QGridLayout(self.slot3_frame)
self.gridLayout_12.setObjectName("gridLayout_12")
self.slot3 = QtWidgets.QGridLayout()
self.slot3.setObjectName("slot3")
self.gridLayout_12.addLayout(self.slot3, 1, 0, 1, 1)
self.slot3ComboBox = QtWidgets.QComboBox(self.slot3_frame)
self.slot3ComboBox.setObjectName("slot3ComboBox")
self.gridLayout_12.addWidget(self.slot3ComboBox, 0, 0, 1, 1)
self.gridLayout_5.addWidget(self.slot3_frame, 1, 1, 1, 1)
self.slot0_frame = QtWidgets.QFrame(self.tab)
self.slot0_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot0_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot0_frame.setObjectName("slot0_frame")
self.gridLayout_8 = QtWidgets.QGridLayout(self.slot0_frame)
self.gridLayout_8.setObjectName("gridLayout_8")
self.slot0 = QtWidgets.QGridLayout()
self.slot0.setObjectName("slot0")
self.gridLayout_8.addLayout(self.slot0, 1, 0, 1, 1)
self.slot0ComboBox = QtWidgets.QComboBox(self.slot0_frame)
self.slot0ComboBox.setObjectName("slot0ComboBox")
self.gridLayout_8.addWidget(self.slot0ComboBox, 0, 0, 1, 1)
self.gridLayout_5.addWidget(self.slot0_frame, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.gridLayout_13 = QtWidgets.QGridLayout(self.tab_2)
self.gridLayout_13.setObjectName("gridLayout_13")
self.slot5_frame = QtWidgets.QFrame(self.tab_2)
self.slot5_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot5_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot5_frame.setObjectName("slot5_frame")
self.gridLayout_18 = QtWidgets.QGridLayout(self.slot5_frame)
self.gridLayout_18.setObjectName("gridLayout_18")
self.slot5 = QtWidgets.QGridLayout()
self.slot5.setObjectName("slot5")
self.gridLayout_18.addLayout(self.slot5, 1, 0, 1, 1)
self.slot5ComboBox = QtWidgets.QComboBox(self.slot5_frame)
self.slot5ComboBox.setObjectName("slot5ComboBox")
self.gridLayout_18.addWidget(self.slot5ComboBox, 0, 0, 1, 1)
self.gridLayout_13.addWidget(self.slot5_frame, 0, 1, 1, 1)
self.slot4_frame = QtWidgets.QFrame(self.tab_2)
self.slot4_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot4_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot4_frame.setObjectName("slot4_frame")
self.gridLayout_17 = QtWidgets.QGridLayout(self.slot4_frame)
self.gridLayout_17.setObjectName("gridLayout_17")
self.slot4 = QtWidgets.QGridLayout()
self.slot4.setObjectName("slot4")
self.gridLayout_17.addLayout(self.slot4, 1, 0, 1, 1)
self.slot4ComboBox = QtWidgets.QComboBox(self.slot4_frame)
self.slot4ComboBox.setObjectName("slot4ComboBox")
self.gridLayout_17.addWidget(self.slot4ComboBox, 0, 0, 1, 1)
self.gridLayout_13.addWidget(self.slot4_frame, 0, 0, 1, 1)
self.slot6_frame = QtWidgets.QFrame(self.tab_2)
self.slot6_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot6_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot6_frame.setObjectName("slot6_frame")
self.gridLayout_19 = QtWidgets.QGridLayout(self.slot6_frame)
self.gridLayout_19.setObjectName("gridLayout_19")
self.slot6 = QtWidgets.QGridLayout()
self.slot6.setObjectName("slot6")
self.gridLayout_19.addLayout(self.slot6, 1, 0, 1, 1)
self.slot6ComboBox = QtWidgets.QComboBox(self.slot6_frame)
self.slot6ComboBox.setObjectName("slot6ComboBox")
self.gridLayout_19.addWidget(self.slot6ComboBox, 0, 0, 1, 1)
self.gridLayout_13.addWidget(self.slot6_frame, 1, 0, 1, 1)
self.slot7_frame = QtWidgets.QFrame(self.tab_2)
self.slot7_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.slot7_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.slot7_frame.setObjectName("slot7_frame")
self.gridLayout_20 = QtWidgets.QGridLayout(self.slot7_frame)
self.gridLayout_20.setObjectName("gridLayout_20")
self.slot7 = QtWidgets.QGridLayout()
self.slot7.setObjectName("slot7")
self.gridLayout_20.addLayout(self.slot7, 1, 0, 1, 1)
self.slot7ComboBox = QtWidgets.QComboBox(self.slot7_frame)
self.slot7ComboBox.setObjectName("slot7ComboBox")
self.gridLayout_20.addWidget(self.slot7ComboBox, 0, 0, 1, 1)
self.gridLayout_13.addWidget(self.slot7_frame, 1, 1, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout_3.addWidget(self.tabWidget, 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.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
@ -125,3 +232,5 @@ class Ui_MainWindow(object):
self.discretisation_label.setText(_translate("MainWindow", "Discretisation (en mm)"))
self.show_graph_checkbox.setText(_translate("MainWindow", "afficher les graphes"))
self.start_analyse_button.setText(_translate("MainWindow", "Analyser le fichier"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "2"))

View File

@ -1,92 +0,0 @@
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)

View File

@ -0,0 +1,41 @@
from PyQt5.QtCore import pyqtSignal
from utils.files.input import ScannedObject
from utils.files.output import save_output_file, format_data
from utils.gui.pyqt.main_window.Workers.Worker import Worker
from utils.data_processing.data_processing import get_discrete_data
class DiscreteDataProcessWorker(Worker):
"""
Worker to run the analyse in a thread
"""
processedData = pyqtSignal(dict)
def __init__(self,name:str, obj:ScannedObject,output_path:str,output_file_prefix:str,delta_z:float):
super().__init__(name)
self.obj = obj
self.delta_z = delta_z
self.output_path = output_path
self.output_file_prefix = output_file_prefix
def run(self):
"""
Run the analyse
"""
self.set_status("Calculating discrete data...")
discrete_data = get_discrete_data(self.obj, 6,self.delta_z,self.update_progress)
self.processedData.emit(discrete_data)
self.set_weight(100)
self.set_status("Saving data...")
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)",
"Discretisation(en mm)",
"Rayon moyen (en mm)",
"Rayon ecart type (en mm)"] ))
self.set_status("Done !")
self.finished.emit()

View File

@ -0,0 +1,35 @@
from utils.gui.pyqt.main_window.Workers.Worker import Worker
from PyQt5.QtCore import pyqtSignal
from utils.files.input import ScannedObject
from utils.math.position_manipulation import verticalise
class PreProcessWorker(Worker):
"""
Worker to run the analyse in a thread
"""
processed_obj = pyqtSignal(ScannedObject)
def __init__(self,name:str, objpath:str):
super().__init__(name)
self.objpath = objpath
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.processed_obj.emit(obj)
self.finished.emit()

View File

@ -0,0 +1,40 @@
from PyQt5.QtCore import pyqtSignal
from utils.files.input import ScannedObject
from utils.files.output import save_output_file, format_data
from utils.gui.pyqt.main_window.Workers.Worker import Worker
from utils.data_processing.data_processing import get_raw_data
class RawDataProcessWorker(Worker):
"""
Worker to run the analyse in a thread
"""
processedData = pyqtSignal(dict)
def __init__(self,name:str, obj:ScannedObject,output_path:str,output_file_prefix:str,delta_z:float):
super().__init__(name)
self.obj = obj
self.delta_z = delta_z
self.output_path = output_path
self.output_file_prefix = output_file_prefix
def run(self):
"""
Run the analyse
"""
self.set_status("Calculating raw data...")
raw_data = get_raw_data(self.obj, 6,self.delta_z,self.update_progress)
self.processedData.emit(raw_data)
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.set_status("Done !")
self.finished.emit()

View File

@ -0,0 +1,31 @@
from PyQt5.QtCore import pyqtSignal, QObject
class Worker(QObject):
finished = pyqtSignal()
progress = pyqtSignal(int)
status = pyqtSignal(str)
def __init__(self,name:str):
super().__init__()
self.name = name
self.progress_value = 0
self.progress_weight = 100
def set_status(self, status:str):
"""
Set the weight of the progress bar
"""
self.status.emit(f"[{self.name}]: {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)