New Data Base 2
New Data Base 2
class InitialWindow:
def open_new_process_window(self):
# Ouvrir la fenêtre de création d'un nouveau processus en appelant la
classe SPCApplication
new_process_window = tk.Toplevel(self.root)
app = SPCApplication(new_process_window)
def open_existing_process_window(self):
# Créer une nouvelle fenêtre pour afficher la liste des processus
existing_process_window = tk.Toplevel(self.root)
existing_process_window.title("Existing Processes")
processus_treeview.pack(padx=10, pady=10)
class SPCApplication:
self.sample_size = tk.StringVar()
self.tolerance_min = tk.DoubleVar()
self.target_value = tk.DoubleVar()
self.tolerance_max = tk.DoubleVar()
self.d2_constant = tk.DoubleVar()
self.reference_produit = tk.StringVar()
self.reference_machine = tk.StringVar()
self.id_parametre = tk.StringVar()
self.fichier_csv = tk.StringVar()
self.fichier_pickle = tk.StringVar()
def create_widgets(self):
def creer_fenetre_creation_produit(self):
def ajouter_produit():
nom = nom_entry.get()
reference = reference_entry.get()
client = client_entry.get()
if nom and reference and client :
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('INSERT INTO produit (reference_produit,nom,
client) VALUES (?,?,?)', (reference, nom, client ))
conn.commit()
conn.close()
messagebox.showinfo("Succès", "Produit ajouté avec succès !")
fenetre_creation_produit.destroy()
else:
messagebox.showerror("Erreur", "Veuillez remplir tous les champs
!")
fenetre_creation_produit =tk.Toplevel(self.root)
fenetre_creation_produit.title("Création produit")
fenetre_creation_produit.geometry("400x400")
def creer_fenetre_creation_machine(self):
def ajouter_machine():
reference = reference_entry.get()
nom = nom_entry.get()
section = section_entry.get()
if nom and reference and section :
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('INSERT INTO machine (reference_machine,
nom, section) VALUES (?,?,?)', (reference, nom, section ))
conn.commit()
conn.close()
messagebox.showinfo("Succès", "Machine ajouté avec succès !")
fenetre_creation_machine.destroy()
else:
messagebox.showerror("Erreur", "Veuillez remplir tous les champs
!")
fenetre_creation_machine =tk.Toplevel(self.root)
fenetre_creation_machine.title("Création Machine")
fenetre_creation_machine.geometry("400x300")
reference_label = tk.Label(fenetre_creation_machine, text="reference:")
reference_label.grid(row=2, column=0)
reference_entry = tk.Entry(fenetre_creation_machine)
reference_entry.grid(row=2, column=1)
def creer_fenetre_creation_parametre(self):
def ajouter_parametre():
id_parametre=id_entry.get()
nom = nom_entry.get()
mesurande = mesurande_entry.get()
instrument = instrument_entry.get()
unite = unite_entry.get()
fenetre_creation_parametre = tk.Toplevel(self.root)
fenetre_creation_parametre.title("Création d'un Paramètre")
fenetre_creation_parametre.geometry("400x300")
instrument_label = tk.Label(fenetre_creation_parametre,
text="Instrument:")
instrument_label.grid(row=4, column=0)
instrument_entry = tk.Entry(fenetre_creation_parametre)
instrument_entry.grid(row=4, column=1)
def mettre_a_jour_liste_elements(self):
# Récupérer la liste des produits, des machines et des instruments
depuis la base de données
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('SELECT reference_produit FROM produit')
produits = cursor.fetchall()
cursor.execute('SELECT reference_machine FROM machine')
machines = cursor.fetchall()
cursor.execute('SELECT id_parametre FROM parametre')
parametres= cursor.fetchall()
conn.close()
# Mettre à jour les combobox des produits, des machines et des
instruments
self.produit_combobox['values'] = [produit[0] for produit in produits]
self.machine_combobox['values'] = [machine[0] for machine in machines]
self.parametre_combobox ['values'] = [parametre[0] for parametre in
parametres ]
def supprimer_produit(self):
selected_product = self.produit_combobox.get()
if selected_product != "Sélectionner":
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('DELETE FROM produit WHERE reference_produit=?',
(selected_product,))
conn.commit()
conn.close()
messagebox.showinfo("Succès", "Produit supprimé avec succès !")
self.mettre_a_jour_liste_elements()
def supprimer_machine(self):
selected_machine = self.machine_combobox.get()
if selected_machine != "Sélectionner":
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('DELETE FROM machine WHERE reference_machine=?',
(selected_machine,))
conn.commit()
conn.close()
messagebox.showinfo("Succès", "Machine supprimée avec succès !")
self.mettre_a_jour_liste_elements()
def supprimer_parametre(self):
selected_parametre = self.parametre_combobox.get()
if selected_parametre != "Sélectionner":
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('DELETE FROM parametre WHERE id_parametre=?',
(selected_parametre,))
conn.commit()
conn.close()
messagebox.showinfo("Succès", "Parametre supprimée avec succès !")
self.mettre_a_jour_liste_elements()
def afficher_liste_produits(self):
# Création de la fenêtre pour afficher la liste des produits
fenetre_liste_produits = tk.Toplevel(self.root)
fenetre_liste_produits.title("Liste des Produits")
# Récupérer tous les produits depuis la base de données
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('SELECT reference_produit, nom , client FROM produit')
produits = cursor.fetchall()
conn.close()
# Afficher le tableau
tableau_produits.pack(expand=True, fill="both")
def afficher_liste_machines(self):
# Création de la fenêtre pour afficher la liste des machines
fenetre_liste_machines = tk.Toplevel(self.root)
fenetre_liste_machines.title("Liste des Machines")
# Afficher le tableau
tableau_machines.pack(expand=True, fill="both")
def afficher_liste_parametres(self):
# Création de la fenêtre pour afficher la liste des paramètres
fenetre_liste_parametres = tk.Toplevel(self.root)
fenetre_liste_parametres.title("Liste des Paramètres")
# Afficher le tableau
tableau_parametres.pack(expand=True, fill="both")
def enregistrer_processus(self):
# Récupérer les données saisies par l'utilisateur
reference_produit = self.reference_produit.get()
reference_machine = self.reference_machine.get()
id_parametre = self.id_parametre.get()
sample_size = self.sample_size.get()
tolerance_inf = self.tolerance_min.get()
tolerance_sup = self.tolerance_max.get()
valeur_cible = self.target_value.get()
if existing_processus:
# Si le processus existe déjà, ouvrir la fenêtre MeasureWindow
correspondante
nom_fichier =
f"{reference_produit}_{reference_machine}_{id_parametre}_{sample_size}.csv"
nom_fichier_pickle =
f"{reference_produit}_{reference_machine}_{id_parametre}_{sample_size}.pickle"
nom_fichier_text =
f"{reference_produit}_{reference_machine}_{id_parametre}_{sample_size}.text"
measure_window = MeasureWindow(self, nom_fichier, nom_fichier_pickle,
nom_fichier_text,reference_produit, reference_machine, id_parametre,
sample_size, tolerance_inf, tolerance_sup, valeur_cible)
self.measure_windows.append(measure_window)
measure_window.charger_mesures_depuis_csv()
else:
# Si le processus n'existe pas encore, l'insérer dans la base de
données
conn = sqlite3.connect('ma_base_de_donnees0.db')
cursor = conn.cursor()
cursor.execute('''INSERT INTO processus (reference_produit,
reference_machine, id_parametre,
sample_size, tolerance_inf, tolerance_sup,
sample_size)
VALUES (?, ?, ?, ?, ?, ?, ?)''',
(reference_produit, reference_machine, id_parametre,
sample_size, tolerance_inf,
tolerance_sup, valeur_cible))
conn.commit()
conn.close()
self.measure_windows.append(measure_window)
# Mettre à jour les informations du processus dans la fenêtre
MeasureWindow
measure_window = MeasureWindow(self, nom_fichier, nom_fichier_pickle,
nom_fichier_text, reference_produit, reference_machine, id_parametre,
sample_size, tolerance_inf, tolerance_sup, valeur_cible)
# 2 eme fenetre
class MeasureWindow:
def supprimer_mesure(self):
# Récupérer l'ID de la ligne sélectionnée dans le Treeview
selected_id = self.data_tree.selection()[0]
# Supprimer la ligne sélectionnée du Treeview
self.data_tree.delete(selected_id)
def charger_mesures_depuis_csv(self):
# Obtenir le chemin complet du fichier CSV
file_path = self.nom_fichier_csv
try:
with open(file_path, newline='') as file:
reader = csv.reader(file)
# Lire les en-têtes
headers = next(reader)
def sauvegarder_mesures_dans_csv(self):
# Récupérer les en-têtes des colonnes du tableau
# columns = self.data_tree['columns']
#headers = ['Echantillon', 'Date', 'Heure'] +
[self.data_tree.heading(column)['text'] for column in columns]
headers = ["Echantillon", "Date", "Heure", *range(1,
int(self.spc_app.sample_size.get()) + 1), "Moyenne", "Etendue"]
def sauvegarder_mesures_dans_pickle(self):
# Obtenir le chemin complet du fichier pickle
file_path = self.nom_fichier_pickle
def charger_mesures_depuis_pickle(self):
# Obtenir le chemin complet du fichier pickle
file_path = self.nom_fichier_pickle
try:
# Charger les données des courbes à partir du fichier pickle
with open(file_path, 'rb') as curve_file:
curve_data = pickle.load(curve_file)
self.averages = curve_data['averages']
self.ranges = curve_data['ranges']
except FileNotFoundError:
# Gérer le cas où le fichier n'existe pas encore
pass
#print("Le fichier pickle n'existe pas. Aucune mesure chargée.")
self.nom_fichier_pickle = nom_fichier_pickle
self.nom_fichier_csv = nom_fichier_csv
self.nom_fichier_text = nom_fichier_text
self.spc_app = spc_app
self.averages = [] # Liste pour stocker les moyennes
self.ranges = []
self.current_row_index = 1
self.tree_frame = ttk.Frame(self.measure_window)
self.tree_frame.pack()
self.data_tree = ttk.Treeview(self.tree_frame,
columns=["Echantillon","Date", "Heure", *range(1,
int(self.spc_app.sample_size.get()) +1), "Moyenne", "Etendue"])
self.data_tree.heading("#1", text="Echantillon")
self.data_tree.heading("Date", text="Date")
self.data_tree.heading("Heure", text="Heure")
for i in range(1, int(self.spc_app.sample_size.get()) + 1):
self.data_tree.heading(f"{i}", text=f"Mesure {i}")
self.data_tree.heading("Moyenne", text="Moyenne")
self.data_tree.heading("Etendue", text="Etendue")
self.data_tree.pack(expand=True, fill="both")
self.yscrollbar.config(command=self.data_tree.yview)
self.data_tree.config(yscrollcommand=self.yscrollbar.set)
# Créez les labels Cp, Pp, Cpk et Ppk avec leurs noms et valeurs initiales
(vides)
self.cp_label = tk.Label(self.button_frame, text="Cp: ")
self.cp_label.pack(side=tk.LEFT)
self.cp_value = tk.StringVar()
self.cp_value.set("")
self.cp_value_label = tk.Label(self.button_frame,
textvariable=self.cp_value)
self.cp_value_label.pack(side=tk.LEFT)
self.pp_value_label = tk.Label(self.button_frame,
textvariable=self.pp_value)
self.pp_value_label.pack(side=tk.LEFT)
self.cpk_value_label = tk.Label(self.button_frame,
textvariable=self.cpk_value)
self.cpk_value_label.pack(side=tk.LEFT)
# Entrées pour saisir les mesures/ cases pour saisir les données
self.measure_entries = []
for i in range(int(self.spc_app.sample_size.get())):
measure_entry = tk.Entry(self.measure_window)
measure_entry.pack()
self.measure_entries.append(measure_entry)
self.charger_mesures_depuis_csv()
self.charger_mesures_depuis_pickle()
# Tracer les courbes initiales
self.plot_curves()
def add_measures(self):
measure_values = self.get_measure_values()
measures = [f"Mesure {i + 1}" for i in
range(int(self.spc_app.sample_size.get()))]
n = int(self.spc_app.sample_size.get())
d2_constants = {
2: 1.128,
3: 1.693,
4: 2.059,
5: 2.326,
6: 2.534,
7: 2.704,
8: 2.847,
9: 2.970,
10: 3.078
}
d2_value = d2_constants.get(n, 0.0)
self.spc_app.d2_constant.set(d2_value)
def calculate_cp(self):
# Récupérer toutes les valeurs des étendues pour calculer l'étendue
moyenne
range_values = []
for item in self.data_tree.get_children():
values = self.data_tree.item(item, 'values')
range_value = float(values[-1]) # Récupérer la dernière valeur qui
correspond à l'étendue
range_values.append(range_value)
# Calculer la tolérance
tolerance_sup = self.spc_app.tolerance_max.get()
tolerance_inf = self.spc_app.tolerance_min.get()
# Calculer Cp
cp_value = (tolerance_sup - tolerance_inf) * d2_value / (6 *
average_range)
# Afficher la valeur de Cp
self.cp_value.set(f"{cp_value:.2f}")
def calculate_pp(self):
# Récupérer les valeurs des mesures pour calculer l'écart type
measure_values = [float(self.data_tree.item(item, 'values')[i + 3]) for
item in self.data_tree.get_children() for i in
range(int(self.spc_app.sample_size.get()))]
# Calcul de Pp
pp = (tolerance_sup - tolerance_inf) / (6 * sigma)
# Affichage de la valeur de Pp
self.pp_value.set(f"{pp:.2f}")
def calculate_Ppk(self):
# Récupérer les valeurs des mesures pour calculer l'écart type
measure_values = [float(self.data_tree.item(item, 'values')[i + 3]) for
item in self.data_tree.get_children() for i in
range(int(self.spc_app.sample_size.get()))]
# Calcul de Pp
ppk = min((tolerance_sup - process_mean) / (3 * sigma), (process_mean -
tolerance_inf) / (3 * sigma))
# Affichage de la valeur de Pp
self.ppk_value.set(f"{ppk:.2f}")
def calculate_cpk(self):
# Récupérer toutes les valeurs des étendues pour calculer l'étendue
moyenne
average_values = []
for item in self.data_tree.get_children():
values = self.data_tree.item(item, 'values')
average_value = float(values[-2]) # Récupérer la dernière valeur qui
correspond à l'étendue
average_values.append(average_value)
# Calculer la moyenne du processus
process_mean = sum(average_values) / len(average_values)
# Calculer la tolérance
tolerance_sup = self.spc_app.tolerance_max.get()
tolerance_inf = self.spc_app.tolerance_min.get()
# Calculer Cpk
cpk_value = min(abs(tolerance_sup - process_mean) / (3 * sample_std_dev),
abs(process_mean - tolerance_inf) / (3 * sample_std_dev))
def calculate_upper_control_limit_X(self):
# Calculer la limite de contrôle supérieure pour la carte X
average_range = sum(self.ranges) / len(self.ranges)
x_double_bar = sum(self.averages) / len(self.averages)
n = int(self.spc_app.sample_size.get())
a2_values = {2: 1.880, 3: 1.023, 4: 0.729, 5: 0.577, 6: 0.483, 7: 0.419,
8: 0.373, 9: 0.337, 10: 0.308}
a2 = a2_values.get(n, 0)
def calculate_lower_control_limit_X(self):
# Calculer la limite de contrôle inférieure pour la carte X
average_range = sum(self.ranges) / len(self.ranges)
x_double_bar = sum(self.averages) / len(self.averages)
n = int(self.spc_app.sample_size.get())
a2_values = {2: 1.880, 3: 1.023, 4: 0.729, 5: 0.577, 6: 0.483, 7: 0.419,
8: 0.373, 9: 0.337, 10: 0.308}
a2 = a2_values.get(n, 0)
def calculate_lower_control_limit_R(self):
n = int(self.spc_app.sample_size.get())
d3_constants = {
7: 0.076,
8: 0.136,
9: 0.184,
10: 0.223
}
d3_value = d3_constants.get(n, 0.0)
average_range = sum(self.ranges) / len(self.ranges)
lower_control_limit_R = d3_value * average_range
self.lower_control_limit_R_label.config(text=f"{lower_control_limit_R:.4f
}")
def calculate_upper_control_limit_R(self):
n = int(self.spc_app.sample_size.get())
d4_constants = {
2: 3.267,
3: 2.574,
4: 2.282,
5: 2.114,
6: 2.004,
7: 1.924,
8: 1.864,
9: 1.816,
10: 1.777
}
d4_value = d4_constants.get(n, 0.0)
average_range = sum(self.ranges) / len(self.ranges)
upper_control_limit_R = d4_value * average_range
self.upper_control_limit_R_label.config(text=f"{upper_control_limit_R:.4f
}")
def plot_curves(self):
# Effacer les anciennes courbes
self.ax1.clear()
self.ax2.clear()
n = int(self.spc_app.sample_size.get())
d4_constants = {
2: 3.267,
3: 2.574,
4: 2.282,
5: 2.114,
6: 2.004,
7: 1.924,
8: 1.864,
9: 1.816,
10: 1.777
}
d4_value = d4_constants.get(n, 0.0)
average_range = sum(self.ranges) / len(self.ranges)
upper_control_limit_R = d4_value * average_range
def show_histogram(self):
# Récupérer les valeurs des mesures pour construire l'histogramme
all_measure_values = []
for item in self.data_tree.get_children():
measure_values = [float(self.data_tree.item(item, 'values')[i + 3])
for i in range(int(self.spc_app.sample_size.get()))]
all_measure_values.extend(measure_values)
def clear_measure_entries(self):
for entry in self.measure_entries:
entry.delete(0, tk.END)
def get_measure_values(self):
measure_values = []
for entry in self.measure_entries:
value = entry.get().strip() # Supprime les espaces vides autour de la
valeur
if value: # Vérifie si la valeur n'est pas vide
try:
measure_values.append(float(value)) # Convertit la valeur en
float et l'ajoute à la liste
except ValueError:
# Gère le cas où la valeur ne peut pas être convertie en float
# Vous pouvez afficher un message d'erreur ici ou ignorer la
valeur incorrecte
print(f"La valeur '{value}' n'est pas un nombre valide.")
return measure_values
# def delete_selected_row(self):
# selected_item = self.data_tree.selection() # Récupère l'élément
sélectionné dans le treeview
# if selected_item: # Vérifie s'il y a un élément sélectionné
# self.data_tree.delete(selected_item) # Supprime l'élément
sélectionné du treeview
#else:
# Gère le cas où aucun élément n'est sélectionné
# print("Aucune ligne sélectionnée pour la suppression.")
if __name__ == "__main__":