🐛 fix(data_processing.py): add missing computation of L in get_advanced_data function

 feat(data_processing.py): add raw_data parameter to get_advanced_data function to improve flexibility
The L variable was not being computed in the get_advanced_data function, which is necessary for the calculation of the tortuosity. The raw_data parameter was added to the get_advanced_data function to improve flexibility and allow for more advanced calculations to be performed.

🐛 fix(input.py): add filename attribute to ScannedObject class
The filename attribute was not being set in the ScannedObject class, which is necessary for generating the output file headers.

 feat(output.py): add function to generate headers for output file
The generate_headers function was added to generate the headers for the output file. The headers include the filename, date, version, discretisation method, and whether the data was verticalised.

🚀 chore(MainWindow.py): enable process_advanced_data function

🎨 style(MainWindow.ui, UI_MainWindow.py): adjust GUI layout and label text for better user experience
The GUI layout has been adjusted to improve the user experience. The window width has been reduced from 1419 to 1336 pixels to better fit the screen. The minimum and maximum sizes of the MainSettings widget have been increased from 518 to 600 pixels to allow for more space for the labels. The labels have been updated to include the units of measurement to improve clarity.

🐛 fix(AdvancedDataWorker.py): add raw_data parameter to __init__ method
 feat(AdvancedDataWorker.py): add support for raw data processing in get_advanced_data method
The AdvancedDataWorker class now has a raw_data parameter in its __init__ method, which is used in the get_advanced_data method. This allows for raw data processing in addition to the existing discrete data processing.

🐛 fix(DiscreteDataWorker.py): generate headers before formatting data
 feat(DiscreteDataWorker.py): add support for generating headers in output file
The DiscreteDataWorker class now generates headers for the output file if the add_headers setting is enabled. The headers are generated before formatting the data to ensure that the headers are included in the output file.

🐛 fix(PreProcessWorker.py): set filename of ScannedObject
The PreProcessWorker class now sets the filename of the ScannedObject to the basename

🎨 style(UI_Settings.py): reorganize widgets in the settings UI for better readability
🐛 fix(data_extraction.py): fix standard deviation calculation to use unbiased estimator
🔧 chore(SettingManager.py): add "add_headers" setting with default value of True
The changes in UI_Settings.py are purely cosmetic and do not affect the functionality of the code. The fix in data_extraction.py corrects the standard deviation calculation to use the unbiased estimator. The addition of the "add_headers" setting in SettingManager.py allows for the addition of headers to output files.
This commit is contained in:
Djalim Simaila 2023-05-26 13:38:18 +02:00
parent 3b809b3881
commit f0de315d30
15 changed files with 243 additions and 150 deletions

View File

@ -107,7 +107,7 @@ def get_discrete_data(obj:ScannedObject, ndigits:int, delta_z:float=1, update_pr
progress += 1
return data
def get_advanced_data(discrete_data:dict, V_scan = 0, update_progress_bar= progressbar_placeholder)->dict:
def get_advanced_data(discrete_data:dict, raw_data:dict, V_scan = 0, update_progress_bar= progressbar_placeholder)->dict:
"""
Calculates morphological indicators from the given discrete data
@ -117,6 +117,15 @@ def get_advanced_data(discrete_data:dict, V_scan = 0, update_progress_bar= progr
- Z moy (en mm) : list of z mean values
- Rayon moyen (en mm) : list of mean radius values
- Rayon ecart type (en mm) : list of radius standard deviation values
:param raw_data: dict(str:list) with the following keys:
- X (en mm) : list of x values
- Y (en mm) : list of y values
- Z (en mm) : list of z values
- theta (en rad) : list of theta values
- rayon (en mm) : list of radius values
- Xi-Xmoy : list of Xi-Xmoy values
- Yi-Ymoy : list of Yi-Ymoy values/
:param V_scan: the volume given by the scanner software
:param update_progress_bar: Function to update the progress bar
:return: dict with the following keys:
- Tortuosite
@ -148,26 +157,29 @@ def get_advanced_data(discrete_data:dict, V_scan = 0, update_progress_bar= progr
discrete_data["Z moy (en mm)"]))
for index in range(len(vertices)-1):
l += de.get_distance_between_two_vertices(vertices[index], vertices[index+1])
l += discrete_data["Discretisation(en mm)"][-1] /2 + discrete_data["Discretisation(en mm)"][0] /2
L = de.get_distance_between_two_vertices(vertices[0], vertices[-1]) + discrete_data["Discretisation(en mm)"][-1] /2 + discrete_data["Discretisation(en mm)"][0] /2
T = l/L
update_progress_bar(10)
# Volume and surface
H = discrete_data["Z moy (en mm)"][-1] - discrete_data["Z moy (en mm)"][0]
H = raw_data["Z (en mm)"][-1] - raw_data["Z (en mm)"][0]
R_mean = de.get_mean(all_R)
R2_mean = de.get_mean([np.power(r,2) for r in all_R])
V = np.pi * R2_mean * H
S = 2 * np.pi * R2_mean * H
S = 2 * np.pi * R_mean * H
update_progress_bar(30)
# Morphological indicators
R_mean = de.get_mean(all_R)
R_mean_std = de.get_standard_deviation(all_R)
mean_sigma_r_squared = de.get_mean([np.power(r,2) for r in discrete_data["Rayon ecart type (en mm)"]])
sigma_r_tot = np.sqrt(np.power(R_mean_std,2) + mean_sigma_r_squared )
MI_l = R_mean_std/R_mean
MI_p = np.sqrt(mean_sigma_r_squared)/R_mean
R_max = max(all_R)
R_max = max(raw_data["Z (en mm)"])
R_in = 40
MI_mR = R_max/R_mean
MI_mH = R_max/H

View File

@ -63,6 +63,7 @@ class ScannedObject:
self.old_delta = None
self.old_discrete = None
self.old_discrete_type = None
self.filename = "N/A"
self.x = np.asarray([vertex[0] for vertex in vertices])
self.y = np.asarray([vertex[1] for vertex in vertices])
self.z = np.asarray([vertex[2] for vertex in vertices])
@ -453,6 +454,10 @@ class ScannedObject:
string+="\n"
save_output_file(file_path,string)
def set_filename(self,filename):
"""
"""
self.filename = filename
def parse_result_file(file_path: str, separator: str = "\t")-> tuple:
"""

View File

@ -5,8 +5,25 @@ Created on Mon Apr 17 2023
@auth: Djalim Simaila
@e-mail: djalim.simaila@inrae.fr
"""
import datetime
from utils.settings.SettingManager import SettingManager
def generate_headers(filename:str):
"""
"""
headers = f"""##############################
Analyse Morphologique
version :{SettingManager.get_instance().get_setting("version")}
filename : {filename}
date : {datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")}
discretisation : {SettingManager.get_instance().get_setting("discretisation_method")}
had been veticalised : {"yes" if SettingManager.get_instance().get_setting("should_verticalise") else "no"}
##############################
"""
return headers
def format_data(data:dict, separator:str, selected_columns:list = None) -> str:
"""
Format the data to be saved in the output file.

View File

@ -288,7 +288,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
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)
self.processdiscrete_worker.processedData.connect(self.process_advanced_data)
#self.processdiscrete_worker.processedData.connect(self.process_advanced_data)
# Finished
self.processdiscrete_worker.finished.connect(self.finish_analyse)
self.processdiscrete_worker.finished.connect(self.processdiscrete_thread.quit)
@ -298,13 +298,14 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
# Start the thread
self.processdiscrete_thread.start()
def process_advanced_data(self, discrete_data:dict, refresh:bool = False):
def process_advanced_data(self, discrete_data:dict, raw_data:dict, refresh:bool = False):
"""
Start the analyse, create the thread and connect the signals.
"""
self.advanced_data_thread = QThread()
self.advanced_data_worker = AdvancedDataWorker("AdvancedDataProcessWorker",
discrete_data,
raw_data,
self.V_scan.value())
self.advanced_data_worker.moveToThread(self.advanced_data_thread)
# Connect the signals
@ -542,6 +543,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
Finish the analyse
"""
self.completed_tasks += 1
if self.completed_tasks == 2:
if self.discrete_data is None:
return
if self.raw_data is None:
return
self.process_advanced_data(self.discrete_data,self.raw_data)
if self.completed_tasks == self.total_tasks:
self.status_text.setText("Done")
self.analyse_progress_bar.setValue(100)

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1419</width>
<width>1336</width>
<height>842</height>
</rect>
</property>
@ -24,13 +24,13 @@
</property>
<property name="minimumSize">
<size>
<width>518</width>
<width>600</width>
<height>794</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>518</width>
<width>600</width>
<height>16777215</height>
</size>
</property>
@ -194,8 +194,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>431</width>
<height>907</height>
<width>513</width>
<height>887</height>
</rect>
</property>
<property name="sizePolicy">
@ -230,7 +230,7 @@
<item row="2" column="0">
<widget class="QLabel" name="interval_size_label">
<property name="text">
<string>Taille de l'intervale</string>
<string>Taille de l'intervale en mm</string>
</property>
</widget>
</item>
@ -256,7 +256,7 @@
<item row="3" column="0">
<widget class="QLabel" name="x_mean_label">
<property name="text">
<string>X moyen</string>
<string>X moyen en mm</string>
</property>
</widget>
</item>
@ -282,7 +282,7 @@
<item row="4" column="0">
<widget class="QLabel" name="y_mean_label">
<property name="text">
<string>Y Moyen</string>
<string>Y Moyen en mm</string>
</property>
</widget>
</item>
@ -308,7 +308,7 @@
<item row="5" column="0">
<widget class="QLabel" name="z_mean_label">
<property name="text">
<string>Z Moyen</string>
<string>Z Moyen en mm</string>
</property>
</widget>
</item>
@ -334,7 +334,7 @@
<item row="6" column="0">
<widget class="QLabel" name="r_mean_label">
<property name="text">
<string>Rayon moyen</string>
<string>Rayon moyen en mm</string>
</property>
</widget>
</item>
@ -360,7 +360,7 @@
<item row="7" column="0">
<widget class="QLabel" name="sigma_r_label">
<property name="text">
<string>Ecart type des rayons (σR)</string>
<string>Ecart type des rayons (σR) en rad</string>
</property>
</widget>
</item>
@ -386,7 +386,7 @@
<item row="9" column="0">
<widget class="QLabel" name="tortuosity_label">
<property name="text">
<string>Tortuosité</string>
<string>Tortuosité : T</string>
</property>
</widget>
</item>
@ -412,7 +412,7 @@
<item row="10" column="0">
<widget class="QLabel" name="volume_label">
<property name="text">
<string>Volume en mm³</string>
<string>Volume (en mm³) : V</string>
</property>
</widget>
</item>
@ -438,7 +438,7 @@
<item row="11" column="0">
<widget class="QLabel" name="surface_label">
<property name="text">
<string>Surface en mm²</string>
<string>Surface (en mm²) : S</string>
</property>
</widget>
</item>
@ -464,7 +464,7 @@
<item row="12" column="0">
<widget class="QLabel" name="mean_r_mean_label">
<property name="text">
<string>Moyenne des rayons moyens <R></string>
<string>Moyenne des rayons moyens (en mm) : 〈R〉</string>
</property>
</widget>
</item>
@ -490,7 +490,7 @@
<item row="13" column="0">
<widget class="QLabel" name="sigma_r_mean_label">
<property name="text">
<string>Ecart type des rayons moyens σ<R></string>
<string>Ecart type des rayons moyens (en rad) : σ〈R〉</string>
</property>
</widget>
</item>
@ -516,7 +516,7 @@
<item row="14" column="0">
<widget class="QLabel" name="sigma_r_tot_label">
<property name="text">
<string>σ<R>^tot</string>
<string>Dispertion totale : σ〈R〉^tot</string>
</property>
</widget>
</item>
@ -601,7 +601,7 @@
<item row="23" column="0">
<widget class="QLabel" name="R_h_label">
<property name="text">
<string>Rayon hydraulique R_h</string>
<string>Rayon hydraulique (en mm): R_h</string>
</property>
</widget>
</item>
@ -731,7 +731,7 @@
<item row="21" column="0">
<widget class="QLabel" name="R_V_scan_label">
<property name="text">
<string>R_V_scan</string>
<string>Rayon volume scan (en mm) : R_V_scan</string>
</property>
</widget>
</item>
@ -757,7 +757,7 @@
<item row="22" column="0">
<widget class="QLabel" name="S_V_scan_label">
<property name="text">
<string>S_V_scan</string>
<string>Surface volume scan (en mm²) : S_V_scan</string>
</property>
</widget>
</item>
@ -783,7 +783,7 @@
<item row="20" column="0">
<widget class="QLabel" name="V_scan_label">
<property name="text">
<string>V_scan</string>
<string>Volume donné par hp scanner(en mm³): V_scan</string>
</property>
</widget>
</item>
@ -1083,7 +1083,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1419</width>
<width>1336</width>
<height>22</height>
</rect>
</property>

View File

@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1419, 842)
MainWindow.resize(1336, 842)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
@ -23,8 +23,8 @@ class Ui_MainWindow(object):
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.MainSettings = QtWidgets.QWidget(self.centralwidget)
self.MainSettings.setEnabled(True)
self.MainSettings.setMinimumSize(QtCore.QSize(518, 794))
self.MainSettings.setMaximumSize(QtCore.QSize(518, 16777215))
self.MainSettings.setMinimumSize(QtCore.QSize(600, 794))
self.MainSettings.setMaximumSize(QtCore.QSize(600, 16777215))
self.MainSettings.setObjectName("MainSettings")
self.gridLayout_2 = QtWidgets.QGridLayout(self.MainSettings)
self.gridLayout_2.setObjectName("gridLayout_2")
@ -114,7 +114,7 @@ class Ui_MainWindow(object):
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 431, 907))
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 513, 887))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
@ -567,7 +567,7 @@ class Ui_MainWindow(object):
self.gridLayout.addLayout(self.horizontalLayout_4, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 1419, 22))
self.menuBar.setGeometry(QtCore.QRect(0, 0, 1336, 22))
self.menuBar.setObjectName("menuBar")
self.menuRichier = QtWidgets.QMenu(self.menuBar)
self.menuRichier.setObjectName("menuRichier")
@ -614,28 +614,28 @@ class Ui_MainWindow(object):
self.SettingsTab.setTabText(self.SettingsTab.indexOf(self.parameters), _translate("MainWindow", "Parametres"))
self.refresh_morphological_indicators.setText(_translate("MainWindow", "Recalculer les indicateurs morphologiques"))
self.layer_label.setText(_translate("MainWindow", "Numero de la couche a traiter :"))
self.interval_size_label.setText(_translate("MainWindow", "Taille de l\'intervale"))
self.x_mean_label.setText(_translate("MainWindow", "X moyen"))
self.y_mean_label.setText(_translate("MainWindow", "Y Moyen"))
self.z_mean_label.setText(_translate("MainWindow", "Z Moyen"))
self.r_mean_label.setText(_translate("MainWindow", "Rayon moyen"))
self.sigma_r_label.setText(_translate("MainWindow", "Ecart type des rayons (σR)"))
self.tortuosity_label.setText(_translate("MainWindow", "Tortuosité"))
self.volume_label.setText(_translate("MainWindow", "Volume en mm³"))
self.surface_label.setText(_translate("MainWindow", "Surface en mm²"))
self.mean_r_mean_label.setText(_translate("MainWindow", "Moyenne des rayons moyens <R>"))
self.sigma_r_mean_label.setText(_translate("MainWindow", "Ecart type des rayons moyens σ<R>"))
self.sigma_r_tot_label.setText(_translate("MainWindow", "σ<R>^tot"))
self.interval_size_label.setText(_translate("MainWindow", "Taille de l\'intervale en mm"))
self.x_mean_label.setText(_translate("MainWindow", "X moyen en mm"))
self.y_mean_label.setText(_translate("MainWindow", "Y Moyen en mm"))
self.z_mean_label.setText(_translate("MainWindow", "Z Moyen en mm"))
self.r_mean_label.setText(_translate("MainWindow", "Rayon moyen en mm"))
self.sigma_r_label.setText(_translate("MainWindow", "Ecart type des rayons (σR) en rad"))
self.tortuosity_label.setText(_translate("MainWindow", "Tortuosité : T"))
self.volume_label.setText(_translate("MainWindow", "Volume (en mm³) : V"))
self.surface_label.setText(_translate("MainWindow", "Surface (en mm²) : S"))
self.mean_r_mean_label.setText(_translate("MainWindow", "Moyenne des rayons moyens (en mm) : 〈R〉"))
self.sigma_r_mean_label.setText(_translate("MainWindow", "Ecart type des rayons moyens (en rad) : σ〈R〉"))
self.sigma_r_tot_label.setText(_translate("MainWindow", "Dispertion totale : σ〈R〉^tot"))
self.MI_p_label.setText(_translate("MainWindow", "MI_p"))
self.MI_l_label.setText(_translate("MainWindow", "MI_l"))
self.R_h_label.setText(_translate("MainWindow", "Rayon hydraulique R_h"))
self.R_h_label.setText(_translate("MainWindow", "Rayon hydraulique (en mm): R_h"))
self.HI_label.setText(_translate("MainWindow", "HI"))
self.MI_mR_label.setText(_translate("MainWindow", "MI_mR"))
self.MI_mH_label.setText(_translate("MainWindow", "MI_mH"))
self.MI_mR_in_label.setText(_translate("MainWindow", "MI_mR_in"))
self.R_V_scan_label.setText(_translate("MainWindow", "R_V_scan"))
self.S_V_scan_label.setText(_translate("MainWindow", "S_V_scan"))
self.V_scan_label.setText(_translate("MainWindow", "V_scan"))
self.R_V_scan_label.setText(_translate("MainWindow", "Rayon volume scan (en mm) : R_V_scan"))
self.S_V_scan_label.setText(_translate("MainWindow", "Surface volume scan (en mm²) : S_V_scan"))
self.V_scan_label.setText(_translate("MainWindow", "Volume donné par hp scanner(en mm³): V_scan"))
self.export_advanced_metrics.setText(_translate("MainWindow", "Exporter les variables"))
self.SettingsTab.setTabText(self.SettingsTab.indexOf(self.values), _translate("MainWindow", "Valeurs"))
self.GraphTabs.setTabText(self.GraphTabs.indexOf(self.graph_pane_1), _translate("MainWindow", "1"))

View File

@ -15,15 +15,18 @@ class AdvancedDataWorker(Worker):
:param name: The name of the worker
:param discrete_data: The discrete data to process
:param raaw_data: The raw data to process
:ivar processedData: Signal emitted when the data is processed
:ivar discrete_data: The discrete data to process
:ivar raw_data: the raw data to process
"""
processedData = pyqtSignal(dict)
def __init__(self,name:str, discrete_data:dict, V_scan:float):
def __init__(self,name:str, discrete_data:dict,raw_data:dict, V_scan:float):
super().__init__(name)
self.discrete_data = discrete_data
self.raw_data = raw_data
self.V_scan = V_scan
@ -41,7 +44,7 @@ class AdvancedDataWorker(Worker):
- MI_p
"""
self.set_status("Calculating advanced data...")
advanced_data = get_advanced_data(self.discrete_data, self.V_scan, self.update_progress)
advanced_data = get_advanced_data(self.discrete_data,self.raw_data, self.V_scan, self.update_progress)
self.processedData.emit(advanced_data)
self.set_status("Done")
self.finished.emit()

View File

@ -7,7 +7,7 @@ Created on Wed Apr 26 2023
"""
from PyQt5.QtCore import pyqtSignal
from utils.files.input import ScannedObject
from utils.files.output import save_output_file, format_data
from utils.files.output import save_output_file, format_data, generate_headers
from utils.gui.pyqt.main_window.Workers.Worker import Worker
from utils.data_processing.data_processing import get_discrete_data
from utils.settings.SettingManager import SettingManager
@ -62,14 +62,19 @@ class DiscreteDataProcessWorker(Worker):
suffix = SettingManager.get_instance().get_setting('discrete_data_suffix').replace('{delta_z}',str(self.delta_z))
extension = SettingManager.get_instance().get_setting('output_file_extension')
separator = SettingManager.get_instance().get_setting('output_file_separator')
save_output_file(f'{self.output_path}/{self.output_file_prefix}{suffix}{extension}',
format_data(discrete_data,
output = ""
add_headers = SettingManager.get_instance().get_setting("add_headers")
if add_headers:
output += generate_headers(self.obj.filename)
output += format_data(discrete_data,
separator,
["X moy (en mm)",
"Y moy (en mm)",
"Z moy (en mm)",
"Discretisation(en mm)",
"Rayon moyen (en mm)",
"Rayon ecart type (en mm)"]))
"Rayon ecart type (en mm)"])
save_output_file(f'{self.output_path}/{self.output_file_prefix}{suffix}{extension}', output)
self.set_status("Done !")
self.finished.emit()

View File

@ -5,6 +5,7 @@ Created on Wed Apr 26 2023
@auth: Djalim Simaila
@e-mail: djalim.simaila@inrae.fr
"""
import os
from utils.gui.pyqt.main_window.Workers.Worker import Worker
from PyQt5.QtCore import pyqtSignal
from utils.files.input import ScannedObject
@ -45,6 +46,7 @@ class PreProcessWorker(Worker):
# Read the file
self.set_status("Loading file...")
obj = ScannedObject.from_file(self.objpath)
obj.set_filename(os.path.basename(self.objpath))
self.update_progress(5)
# Verticalise the object

View File

@ -7,7 +7,7 @@ Created on Wed Apr 26 2023
"""
from PyQt5.QtCore import pyqtSignal
from utils.files.input import ScannedObject
from utils.files.output import save_output_file, format_data
from utils.files.output import save_output_file, format_data, generate_headers
from utils.gui.pyqt.main_window.Workers.Worker import Worker
from utils.data_processing.data_processing import get_raw_data
from utils.settings.SettingManager import SettingManager
@ -58,8 +58,11 @@ class RawDataProcessWorker(Worker):
suffix = SettingManager.get_instance().get_setting('raw_data_suffix').replace('{delta_z}',str(self.delta_z))
extension = SettingManager.get_instance().get_setting('output_file_extension')
separator = SettingManager.get_instance().get_setting('output_file_separator')
save_output_file(f'{self.output_path}/{self.output_file_prefix}{suffix}{extension}',
format_data(raw_data,
output = ""
add_headers = SettingManager.get_instance().get_setting("add_headers")
if add_headers:
output += generate_headers(self.obj.filename)
output += format_data(raw_data,
separator,
["X (en mm)",
"Y (en mm)",
@ -67,6 +70,8 @@ class RawDataProcessWorker(Worker):
"theta (en rad)",
"rayon (en mm)",
"Xi-Xmoy",
"Yi-Ymoy"] ))
"Yi-Ymoy"])
save_output_file(f'{self.output_path}/{self.output_file_prefix}{suffix}{extension}',output)
self.set_status("Done !")
self.finished.emit()

View File

@ -29,6 +29,7 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings):
self.separator.setText(settings.get_setting('output_file_separator'))
self.prettify.setChecked(settings.get_setting('pretiffy_output_file'))
self.should_verticalise.setChecked(settings.get_setting('should_verticalise'))
self.add_headers.setChecked(settings.get_setting("add_headers"))
#Connect to onchanged actions
@ -39,6 +40,7 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings):
self.separator.textChanged.connect(self.accept)
self.prettify.stateChanged.connect(self.accept)
self.should_verticalise.stateChanged.connect(self.accept)
self.add_headers.stateChanged.connect(self.accept)
def accept(self):
@ -56,3 +58,4 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings):
settings.set_setting('output_file_separator', self.separator.text())
settings.set_setting('pretiffy_output_file', self.prettify.isChecked())
settings.set_setting('should_verticalise', self.should_verticalise.isChecked())
settings.set_setting("add_headers", self.add_headers.isChecked())

View File

@ -14,47 +14,25 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Settings(object):
def setupUi(self, Settings):
Settings.setObjectName("Settings")
Settings.resize(712, 226)
Settings.resize(712, 250)
self.centralwidget = QtWidgets.QWidget(Settings)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.discretisation_method_label = QtWidgets.QLabel(self.centralwidget)
self.discretisation_method_label.setObjectName("discretisation_method_label")
self.gridLayout_2.addWidget(self.discretisation_method_label, 0, 0, 1, 1)
self.raw_data_suffix = QtWidgets.QLineEdit(self.centralwidget)
self.raw_data_suffix.setObjectName("raw_data_suffix")
self.gridLayout_2.addWidget(self.raw_data_suffix, 2, 1, 1, 1)
self.discretisation_method = QtWidgets.QComboBox(self.centralwidget)
self.discretisation_method.setObjectName("discretisation_method")
self.gridLayout_2.addWidget(self.discretisation_method, 0, 1, 1, 1)
self.extention = QtWidgets.QLineEdit(self.centralwidget)
self.extention.setObjectName("extention")
self.gridLayout_2.addWidget(self.extention, 4, 1, 1, 1)
self.raw_data_suffix_label = QtWidgets.QLabel(self.centralwidget)
self.raw_data_suffix_label.setObjectName("raw_data_suffix_label")
self.gridLayout_2.addWidget(self.raw_data_suffix_label, 2, 0, 1, 1)
self.separator_label = QtWidgets.QLabel(self.centralwidget)
self.separator_label.setObjectName("separator_label")
self.gridLayout_2.addWidget(self.separator_label, 5, 0, 1, 1)
self.discrete_data_suffix_label = QtWidgets.QLabel(self.centralwidget)
self.discrete_data_suffix_label.setObjectName("discrete_data_suffix_label")
self.gridLayout_2.addWidget(self.discrete_data_suffix_label, 3, 0, 1, 1)
self.discrete_data_suffix = QtWidgets.QLineEdit(self.centralwidget)
self.discrete_data_suffix.setObjectName("discrete_data_suffix")
self.gridLayout_2.addWidget(self.discrete_data_suffix, 3, 1, 1, 1)
self.extention_label = QtWidgets.QLabel(self.centralwidget)
self.extention_label.setObjectName("extention_label")
self.gridLayout_2.addWidget(self.extention_label, 4, 0, 1, 1)
self.prettify = QtWidgets.QCheckBox(self.centralwidget)
self.prettify.setText("")
self.prettify.setObjectName("prettify")
self.gridLayout_2.addWidget(self.prettify, 6, 1, 1, 1)
self.prettify_label = QtWidgets.QLabel(self.centralwidget)
self.prettify_label.setObjectName("prettify_label")
self.gridLayout_2.addWidget(self.prettify_label, 6, 0, 1, 1)
self.discrete_data_suffix = QtWidgets.QLineEdit(self.centralwidget)
self.discrete_data_suffix.setObjectName("discrete_data_suffix")
self.gridLayout_2.addWidget(self.discrete_data_suffix, 3, 1, 1, 1)
self.separator = QtWidgets.QLineEdit(self.centralwidget)
self.separator.setObjectName("separator")
self.gridLayout_2.addWidget(self.separator, 5, 1, 1, 1)
@ -65,6 +43,36 @@ class Ui_Settings(object):
self.should_verticalise.setText("")
self.should_verticalise.setObjectName("should_verticalise")
self.gridLayout_2.addWidget(self.should_verticalise, 1, 1, 1, 1)
self.prettify = QtWidgets.QCheckBox(self.centralwidget)
self.prettify.setText("")
self.prettify.setObjectName("prettify")
self.gridLayout_2.addWidget(self.prettify, 6, 1, 1, 1)
self.extention_label = QtWidgets.QLabel(self.centralwidget)
self.extention_label.setObjectName("extention_label")
self.gridLayout_2.addWidget(self.extention_label, 4, 0, 1, 1)
self.discrete_data_suffix_label = QtWidgets.QLabel(self.centralwidget)
self.discrete_data_suffix_label.setObjectName("discrete_data_suffix_label")
self.gridLayout_2.addWidget(self.discrete_data_suffix_label, 3, 0, 1, 1)
self.separator_label = QtWidgets.QLabel(self.centralwidget)
self.separator_label.setObjectName("separator_label")
self.gridLayout_2.addWidget(self.separator_label, 5, 0, 1, 1)
self.discretisation_method_label = QtWidgets.QLabel(self.centralwidget)
self.discretisation_method_label.setObjectName("discretisation_method_label")
self.gridLayout_2.addWidget(self.discretisation_method_label, 0, 0, 1, 1)
self.raw_data_suffix = QtWidgets.QLineEdit(self.centralwidget)
self.raw_data_suffix.setObjectName("raw_data_suffix")
self.gridLayout_2.addWidget(self.raw_data_suffix, 2, 1, 1, 1)
self.discretisation_method = QtWidgets.QComboBox(self.centralwidget)
self.discretisation_method.setObjectName("discretisation_method")
self.gridLayout_2.addWidget(self.discretisation_method, 0, 1, 1, 1)
self.add_headers_label = QtWidgets.QLabel(self.centralwidget)
self.add_headers_label.setObjectName("add_headers_label")
self.gridLayout_2.addWidget(self.add_headers_label, 7, 0, 1, 1)
self.add_headers = QtWidgets.QCheckBox(self.centralwidget)
self.add_headers.setText("")
self.add_headers.setChecked(True)
self.add_headers.setObjectName("add_headers")
self.gridLayout_2.addWidget(self.add_headers, 7, 1, 1, 1)
self.gridLayout.addLayout(self.gridLayout_2, 0, 0, 1, 1)
Settings.setCentralWidget(self.centralwidget)
@ -74,10 +82,11 @@ class Ui_Settings(object):
def retranslateUi(self, Settings):
_translate = QtCore.QCoreApplication.translate
Settings.setWindowTitle(_translate("Settings", "Préférences"))
self.discretisation_method_label.setText(_translate("Settings", "Methode de discretisation"))
self.raw_data_suffix_label.setText(_translate("Settings", "Suffixe des fichiers de données brutes"))
self.separator_label.setText(_translate("Settings", "Separateur de colone"))
self.discrete_data_suffix_label.setText(_translate("Settings", "Suffixe des fichiers de données discretisées"))
self.extention_label.setText(_translate("Settings", "Extensions des fichiers de sorties"))
self.prettify_label.setText(_translate("Settings", "Aligner les colones"))
self.should_verticalise_label.setText(_translate("Settings", "Mettre l\'objet droit"))
self.extention_label.setText(_translate("Settings", "Extensions des fichiers de sorties"))
self.discrete_data_suffix_label.setText(_translate("Settings", "Suffixe des fichiers de données discretisées"))
self.separator_label.setText(_translate("Settings", "Separateur de colone"))
self.discretisation_method_label.setText(_translate("Settings", "Methode de discretisation"))
self.add_headers_label.setText(_translate("Settings", "Ajouter des en-têtes"))

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>712</width>
<height>226</height>
<height>250</height>
</rect>
</property>
<property name="windowTitle">
@ -17,19 +17,6 @@
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="discretisation_method_label">
<property name="text">
<string>Methode de discretisation</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="raw_data_suffix"/>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="discretisation_method"/>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="extention"/>
</item>
@ -40,37 +27,6 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="separator_label">
<property name="text">
<string>Separateur de colone</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="discrete_data_suffix_label">
<property name="text">
<string>Suffixe des fichiers de données discretisées</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="discrete_data_suffix"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="extention_label">
<property name="text">
<string>Extensions des fichiers de sorties</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="prettify">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="prettify_label">
<property name="text">
@ -78,6 +34,9 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="discrete_data_suffix"/>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="separator"/>
</item>
@ -95,6 +54,64 @@
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="prettify">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="extention_label">
<property name="text">
<string>Extensions des fichiers de sorties</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="discrete_data_suffix_label">
<property name="text">
<string>Suffixe des fichiers de données discretisées</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="separator_label">
<property name="text">
<string>Separateur de colone</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="discretisation_method_label">
<property name="text">
<string>Methode de discretisation</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="raw_data_suffix"/>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="discretisation_method"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="add_headers_label">
<property name="text">
<string>Ajouter des en-têtes</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QCheckBox" name="add_headers">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@ -32,7 +32,14 @@ def get_standard_deviation(values:list):
>>> get_standard_deviation([1,2,3,4,5])
1.4142135623730951
"""
return np.std(values)
mean = get_mean(values)
sum = 0
for i in values:
sum += np.power(i - mean,2)
sum /= len(values) - 1
return np.sqrt(sum)
def get_x_y_z_mean(discrete_values:list):
"""

View File

@ -34,6 +34,7 @@ class SettingManager:
'output_file_separator':'\t',
'pretiffy_output_file':True,
"should_verticalise":True,
"add_headers": True
}
def __init__(self):