🚀 feat(MainWindow.py, PreProcessWorker.py, Settings.py, UI_Settings.py, settings.ui): add support for verticalising scanned objects

 feat(Settings.py, UI_Settings.py, settings.ui): add checkbox to enable/disable verticalisation of scanned objects
The changes add support for verticalising scanned objects before processing them. A new checkbox has been added to the settings UI to enable/disable this feature.

🔧 refactor(SettingManager.py): add default settings dictionary and refactor createInitialSettings method
 feat(SettingManager.py): add new settings to the config file if they are not present
The `default_settings` dictionary is added to the `SettingManager` class to store the default values for the settings. The `createInitialSettings` method is refactored to use the `default_settings` dictionary to set the initial values of the settings. If new settings are added to the `default_settings` dictionary, they are added to the config file if they are not already present. The `remove_changed` method is added to remove the `has_changed` flag.
This commit is contained in:
Djalim Simaila 2023-05-12 09:44:20 +02:00
parent 914d6bb7cb
commit 5a6be4717b
6 changed files with 120 additions and 73 deletions

View File

@ -205,13 +205,15 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
return
if not self.check_output_folder():
return
settings = SettingManager.get_instance()
self.clear_graphs()
self.completed_tasks = 0
if not self.has_changed and self.old_discretisation_value == self.discretisation_value_selector.value():
if not self.has_changed and self.old_discretisation_value == self.discretisation_value_selector.value() and not settings.has_changed:
self.completed_tasks = self.total_tasks -1
self.finish_analyse()
return
settings.has_changed = False
self.has_changed = False
self.old_discretisation_value = self.discretisation_value_selector.value()

View File

@ -9,6 +9,7 @@ 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
from utils.settings.SettingManager import SettingManager
class PreProcessWorker(Worker):
"""
@ -47,8 +48,9 @@ class PreProcessWorker(Worker):
self.update_progress(5)
# Verticalise the object
self.set_status("Verticalising object...")
verticalise(obj)
if SettingManager.get_instance().get_setting("should_verticalise"):
self.set_status("Verticalising object...")
verticalise(obj)
self.update_progress(5)
# Normalise the object

View File

@ -28,6 +28,8 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings):
self.extention.setText(settings.get_setting('output_file_extension'))
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'))
#Connect to onchanged actions
self.discretisation_method.currentTextChanged.connect(self.accept)
@ -36,6 +38,7 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings):
self.extention.textChanged.connect(self.accept)
self.separator.textChanged.connect(self.accept)
self.prettify.stateChanged.connect(self.accept)
self.should_verticalise.stateChanged.connect(self.accept)
def accept(self):
@ -51,4 +54,5 @@ class Settings(QtWidgets.QMainWindow,Ui_Settings):
settings.set_setting('output_file_separator', '\t')
else:
settings.set_setting('output_file_separator', self.separator.text())
settings.set_setting('pretiffy_output_file', self.prettify.isChecked())
settings.set_setting('pretiffy_output_file', self.prettify.isChecked())
settings.set_setting('should_verticalise', self.should_verticalise.isChecked())

View File

@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Settings(object):
def setupUi(self, Settings):
Settings.setObjectName("Settings")
Settings.resize(712, 213)
Settings.resize(712, 226)
self.centralwidget = QtWidgets.QWidget(Settings)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
@ -24,40 +24,47 @@ class Ui_Settings(object):
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.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, 1, 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, 1, 1, 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, 2, 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, 2, 1, 1, 1)
self.extention_label = QtWidgets.QLabel(self.centralwidget)
self.extention_label.setObjectName("extention_label")
self.gridLayout_2.addWidget(self.extention_label, 3, 0, 1, 1)
self.extention = QtWidgets.QLineEdit(self.centralwidget)
self.extention.setObjectName("extention")
self.gridLayout_2.addWidget(self.extention, 3, 1, 1, 1)
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, 4, 0, 1, 1)
self.separator = QtWidgets.QLineEdit(self.centralwidget)
self.separator.setObjectName("separator")
self.gridLayout_2.addWidget(self.separator, 4, 1, 1, 1)
self.prettify_label = QtWidgets.QLabel(self.centralwidget)
self.prettify_label.setObjectName("prettify_label")
self.gridLayout_2.addWidget(self.prettify_label, 5, 0, 1, 1)
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, 5, 1, 1, 1)
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.separator = QtWidgets.QLineEdit(self.centralwidget)
self.separator.setObjectName("separator")
self.gridLayout_2.addWidget(self.separator, 5, 1, 1, 1)
self.should_verticalise_label = QtWidgets.QLabel(self.centralwidget)
self.should_verticalise_label.setObjectName("should_verticalise_label")
self.gridLayout_2.addWidget(self.should_verticalise_label, 1, 0, 1, 1)
self.should_verticalise = QtWidgets.QCheckBox(self.centralwidget)
self.should_verticalise.setText("")
self.should_verticalise.setObjectName("should_verticalise")
self.gridLayout_2.addWidget(self.should_verticalise, 1, 1, 1, 1)
self.gridLayout.addLayout(self.gridLayout_2, 0, 0, 1, 1)
Settings.setCentralWidget(self.centralwidget)
@ -69,7 +76,8 @@ class Ui_Settings(object):
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.separator_label.setText(_translate("Settings", "Separateur de colone"))
self.prettify_label.setText(_translate("Settings", "Aligner les colones"))
self.should_verticalise_label.setText(_translate("Settings", "Mettre l\'objet droit"))

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>712</width>
<height>213</height>
<height>226</height>
</rect>
</property>
<property name="windowTitle">
@ -24,50 +24,54 @@
</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="1" column="0">
<item row="4" column="1">
<widget class="QLineEdit" name="extention"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="raw_data_suffix_label">
<property name="text">
<string>Suffixe des fichiers de données brutes</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="raw_data_suffix"/>
</item>
<item row="2" 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="2" column="1">
<widget class="QLineEdit" name="discrete_data_suffix"/>
</item>
<item row="3" 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="1">
<widget class="QLineEdit" name="extention"/>
</item>
<item row="4" column="0">
<item row="5" column="0">
<widget class="QLabel" name="separator_label">
<property name="text">
<string>Separateur de colone</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="separator"/>
<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">
<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">
<string>Aligner les colones</string>
@ -75,7 +79,17 @@
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="prettify">
<widget class="QLineEdit" name="separator"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="should_verticalise_label">
<property name="text">
<string>Mettre l'objet droit</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="should_verticalise">
<property name="text">
<string/>
</property>

View File

@ -20,6 +20,21 @@ class SettingManager:
"""
instance = None
version = "1.2.0"
default_settings = {
'name':'Analyse Morphologique',
'authors':['Djalim Simaila <djalim.simaila@inrae.fr>','Alexis Doghmane <alexis@doghmane.fr>'],
'description':"""Analyse Morphologique est un outil conçu pour extraire des informations \ndétaillées et précises à partir d'un scan 3D. Il permet aux utilisateurs\nd'analyser des objets 3D à partir d'un point de vue morphologique,\nc'est-à-dire en analysant la forme et la structure de l'objet.""",
'repo':'https://forgemia.inra.fr/scanner3d/analysemorphologique',
'lastGraph':["Aucun" for i in range(11)],
'discretisation_method':'Z0-Zi >= DeltaZ', # 'Z0-Zi < DeltaZ'
'discretisation_methods': ['Z0-Zi >= DeltaZ', 'Z0-Zi < DeltaZ'],
'raw_data_suffix':'_delta_{delta_z}_analyse_brute',
'discrete_data_suffix':'_delta_{delta_z}_analyse_rayon',
'output_file_extension':'.txt',
'output_file_separator':'\t',
'pretiffy_output_file':True,
"should_verticalise":True,
}
def __init__(self):
try:
@ -28,9 +43,15 @@ class SettingManager:
if self.settings['version'] != self.version:
self.settings['version'] = self.version
self.save()
# if new settings are added, add them to the config file
for key,value in self.default_settings.items():
if key not in self.settings:
self.settings[key] = value
self.save()
except FileNotFoundError:
self.settings = {}
self.createInitialSettings()
self.has_changed = False
@staticmethod
def get_instance()->'SettingManager':
@ -48,23 +69,19 @@ class SettingManager:
"""
Save the settings to the config file
"""
self.has_changed = True
with open('config.yml', 'w') as f:
f.write(dump(self.settings, Dumper=Dumper))
def remove_changed(self):
"""
Remove the changed flag
"""
self.has_changed = False
def createInitialSettings(self):
self.settings = self.default_settings
self.settings['version'] = self.version
self.settings['name'] = 'Analyse Morphologique'
self.settings['authors'] = ['Djalim Simaila <djalim.simaila@inrae.fr>','Alexis Doghmane <alexis@doghmane.fr>']
self.settings['description'] = """Analyse Morphologique est un outil conçu pour extraire des informations \ndétaillées et précises à partir d'un scan 3D. Il permet aux utilisateurs\nd'analyser des objets 3D à partir d'un point de vue morphologique,\nc'est-à-dire en analysant la forme et la structure de l'objet."""
self.settings['repo'] = 'https://forgemia.inra.fr/scanner3d/analysemorphologique'
self.settings['lastGraph'] = ["Aucun" for i in range(11)]
self.settings['discretisation_method'] = 'Z0-Zi >= DeltaZ' # 'Z0-Zi < DeltaZ'
self.settings['discretisation_methods'] = ['Z0-Zi >= DeltaZ', 'Z0-Zi < DeltaZ']
self.settings['raw_data_suffix'] = '_delta_{delta_z}_analyse_brute'
self.settings['discrete_data_suffix'] = '_delta_{delta_z}_analyse_rayon'
self.settings['output_file_extension'] = '.txt'
self.settings['output_file_separator'] = '\t'
self.settings['pretiffy_output_file'] = True
self.save()
def get_last_graph(self, graph_number)->str: