diff --git a/utils/data_processing/data_processing.py b/utils/data_processing/data_processing.py index 7e8fa57..00e519a 100644 --- a/utils/data_processing/data_processing.py +++ b/utils/data_processing/data_processing.py @@ -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 diff --git a/utils/files/input.py b/utils/files/input.py index 9f59ac8..7301b76 100644 --- a/utils/files/input.py +++ b/utils/files/input.py @@ -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: """ diff --git a/utils/files/output.py b/utils/files/output.py index 0b82477..9f7bcf7 100644 --- a/utils/files/output.py +++ b/utils/files/output.py @@ -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. diff --git a/utils/gui/pyqt/main_window/MainWindow.py b/utils/gui/pyqt/main_window/MainWindow.py index 8e3f9d9..fe3e547 100644 --- a/utils/gui/pyqt/main_window/MainWindow.py +++ b/utils/gui/pyqt/main_window/MainWindow.py @@ -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) diff --git a/utils/gui/pyqt/main_window/MainWindow.ui b/utils/gui/pyqt/main_window/MainWindow.ui index 7770457..64d7106 100644 --- a/utils/gui/pyqt/main_window/MainWindow.ui +++ b/utils/gui/pyqt/main_window/MainWindow.ui @@ -6,7 +6,7 @@ 0 0 - 1419 + 1336 842 @@ -24,13 +24,13 @@ - 518 + 600 794 - 518 + 600 16777215 @@ -194,8 +194,8 @@ 0 0 - 431 - 907 + 513 + 887 @@ -230,7 +230,7 @@ - Taille de l'intervale + Taille de l'intervale en mm @@ -256,7 +256,7 @@ - X moyen + X moyen en mm @@ -282,7 +282,7 @@ - Y Moyen + Y Moyen en mm @@ -308,7 +308,7 @@ - Z Moyen + Z Moyen en mm @@ -334,7 +334,7 @@ - Rayon moyen + Rayon moyen en mm @@ -360,7 +360,7 @@ - Ecart type des rayons (σR) + Ecart type des rayons (σR) en rad @@ -386,7 +386,7 @@ - Tortuosité + Tortuosité : T @@ -412,7 +412,7 @@ - Volume en mm³ + Volume (en mm³) : V @@ -438,7 +438,7 @@ - Surface en mm² + Surface (en mm²) : S @@ -464,7 +464,7 @@ - Moyenne des rayons moyens + Moyenne des rayons moyens (en mm) : 〈R〉 @@ -490,7 +490,7 @@ - Ecart type des rayons moyens σ + Ecart type des rayons moyens (en rad) : σ〈R〉 @@ -516,7 +516,7 @@ - σ^tot + Dispertion totale : σ〈R〉^tot @@ -601,7 +601,7 @@ - Rayon hydraulique R_h + Rayon hydraulique (en mm): R_h @@ -731,7 +731,7 @@ - R_V_scan + Rayon volume scan (en mm) : R_V_scan @@ -757,7 +757,7 @@ - S_V_scan + Surface volume scan (en mm²) : S_V_scan @@ -783,7 +783,7 @@ - V_scan + Volume donné par hp scanner(en mm³): V_scan @@ -1083,7 +1083,7 @@ 0 0 - 1419 + 1336 22 diff --git a/utils/gui/pyqt/main_window/UI_MainWindow.py b/utils/gui/pyqt/main_window/UI_MainWindow.py index d31e1dd..27db967 100644 --- a/utils/gui/pyqt/main_window/UI_MainWindow.py +++ b/utils/gui/pyqt/main_window/UI_MainWindow.py @@ -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 ")) - self.sigma_r_mean_label.setText(_translate("MainWindow", "Ecart type des rayons moyens σ")) - self.sigma_r_tot_label.setText(_translate("MainWindow", "σ^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")) diff --git a/utils/gui/pyqt/main_window/Workers/AdvancedDataWorker.py b/utils/gui/pyqt/main_window/Workers/AdvancedDataWorker.py index 993ebea..0d9a4fa 100644 --- a/utils/gui/pyqt/main_window/Workers/AdvancedDataWorker.py +++ b/utils/gui/pyqt/main_window/Workers/AdvancedDataWorker.py @@ -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() \ No newline at end of file diff --git a/utils/gui/pyqt/main_window/Workers/DiscreteDataWorker.py b/utils/gui/pyqt/main_window/Workers/DiscreteDataWorker.py index 0e31011..a3bdc13 100644 --- a/utils/gui/pyqt/main_window/Workers/DiscreteDataWorker.py +++ b/utils/gui/pyqt/main_window/Workers/DiscreteDataWorker.py @@ -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, - 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)"])) + + 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)"]) + save_output_file(f'{self.output_path}/{self.output_file_prefix}{suffix}{extension}', output) self.set_status("Done !") self.finished.emit() \ No newline at end of file diff --git a/utils/gui/pyqt/main_window/Workers/PreProcessWorker.py b/utils/gui/pyqt/main_window/Workers/PreProcessWorker.py index d64ac74..035c94c 100644 --- a/utils/gui/pyqt/main_window/Workers/PreProcessWorker.py +++ b/utils/gui/pyqt/main_window/Workers/PreProcessWorker.py @@ -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 diff --git a/utils/gui/pyqt/main_window/Workers/RawDataWorker.py b/utils/gui/pyqt/main_window/Workers/RawDataWorker.py index f077051..035408c 100644 --- a/utils/gui/pyqt/main_window/Workers/RawDataWorker.py +++ b/utils/gui/pyqt/main_window/Workers/RawDataWorker.py @@ -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,15 +58,20 @@ 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, - separator, - ["X (en mm)", - "Y (en mm)", - "Z (en mm)", - "theta (en rad)", - "rayon (en mm)", - "Xi-Xmoy", - "Yi-Ymoy"] )) + 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)", + "Z (en mm)", + "theta (en rad)", + "rayon (en mm)", + "Xi-Xmoy", + "Yi-Ymoy"]) + + save_output_file(f'{self.output_path}/{self.output_file_prefix}{suffix}{extension}',output) self.set_status("Done !") self.finished.emit() \ No newline at end of file diff --git a/utils/gui/pyqt/settings/Settings.py b/utils/gui/pyqt/settings/Settings.py index 4819535..1c93963 100644 --- a/utils/gui/pyqt/settings/Settings.py +++ b/utils/gui/pyqt/settings/Settings.py @@ -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): @@ -55,4 +57,5 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings): else: 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()) \ No newline at end of file + settings.set_setting('should_verticalise', self.should_verticalise.isChecked()) + settings.set_setting("add_headers", self.add_headers.isChecked()) \ No newline at end of file diff --git a/utils/gui/pyqt/settings/UI_Settings.py b/utils/gui/pyqt/settings/UI_Settings.py index 0452613..7d90a86 100644 --- a/utils/gui/pyqt/settings/UI_Settings.py +++ b/utils/gui/pyqt/settings/UI_Settings.py @@ -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")) diff --git a/utils/gui/pyqt/settings/settings.ui b/utils/gui/pyqt/settings/settings.ui index e8b6185..80da527 100644 --- a/utils/gui/pyqt/settings/settings.ui +++ b/utils/gui/pyqt/settings/settings.ui @@ -7,7 +7,7 @@ 0 0 712 - 226 + 250 @@ -17,19 +17,6 @@ - - - - Methode de discretisation - - - - - - - - - @@ -40,37 +27,6 @@ - - - - Separateur de colone - - - - - - - Suffixe des fichiers de données discretisées - - - - - - - - - - Extensions des fichiers de sorties - - - - - - - - - - @@ -78,6 +34,9 @@ + + + @@ -95,6 +54,64 @@ + + + + + + + + + + + Extensions des fichiers de sorties + + + + + + + Suffixe des fichiers de données discretisées + + + + + + + Separateur de colone + + + + + + + Methode de discretisation + + + + + + + + + + + + + Ajouter des en-têtes + + + + + + + + + + true + + + diff --git a/utils/math/data_extraction.py b/utils/math/data_extraction.py index 51c9275..000df0c 100644 --- a/utils/math/data_extraction.py +++ b/utils/math/data_extraction.py @@ -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): """ diff --git a/utils/settings/SettingManager.py b/utils/settings/SettingManager.py index 5ba8343..59881a1 100644 --- a/utils/settings/SettingManager.py +++ b/utils/settings/SettingManager.py @@ -34,6 +34,7 @@ class SettingManager: 'output_file_separator':'\t', 'pretiffy_output_file':True, "should_verticalise":True, + "add_headers": True } def __init__(self):