Vous êtes sur la page 1sur 10

# Ajout de la bibliothèque tkinter

import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt

# Création de la fenêtre et des widgets


root = tk.Tk()
root.title("Analyse granulométrique")

# Saisie des données


tk.Label(root, text="Entrez le nombre de tamis :").grid(row=0, column=0)
tk_n = tk.Entry(root)
tk_n.grid(row=0, column=1)

tk_diametres = []
tk_refus = []

def create_entries():
n = int(tk_n.get())
for i in range(n):
tk.Label(root, text="Diamètre du tamis {} (en
mm) :".format(i+1)).grid(row=i+1, column=0)
tk_diametres.append(tk.Entry(root))
tk_diametres[i].grid(row=i+1, column=1)
tk.Label(root, text="Masse du refus sur le tamis {} (en
g) :".format(i+1)).grid(row=i+1, column=2)
tk_refus.append(tk.Entry(root))
tk_refus[i].grid(row=i+1, column=3)

# Callback
def analyse():
# Récupération des données
root = tk.Tk()
n = int(tk_n.get())
diametres = np.zeros(n)
refus = np.zeros(n)
for i in range(n):
diametres[i] = float(tk_diametres[i].get())
refus[i] = float(tk_refus[i].get())
# Calcul des pourcentages de refus et de passants
masses_totales = np.sum(refus)
pourcentages_refus = refus / masses_totales * 100
pourcentages_passants = 100 - np.cumsum(pourcentages_refus)
# Calcul des diamètres caractéristiques
D10_index = np.argmin(pourcentages_passants > 10)
D10 = diametres[D10_index-1] + (diametres[D10_index] - diametres[D10_index-1])
* (10 - pourcentages_passants[D10_index-1]) / (pourcentages_passants[D10_index] -
pourcentages_passants[D10_index-1])
D30_index = np.argmin(pourcentages_passants > 30)
D30 = diametres[D30_index-1] + (diametres[D30_index] - diametres[D30_index-1])
* (30 - pourcentages_passants[D30_index-1]) / (pourcentages_passants[D30_index] -
pourcentages_passants[D30_index-1])
D60_index = np.argmin(pourcentages_passants > 60)
D60 = diametres[D60_index-1] + (diametres[D60_index] - diametres[D60_index-1])
* (60 - pourcentages_passants[D60_index-1]) / (pourcentages_passants[D60_index] -
pourcentages_passants[D60_index-1])
# Calcul des coefficients de courbure et d'uniformité
Cc = (D30 ** 2) / (D10 * D60)
Cu = D60 / D10
# Tracé de la courbe granulométrique
fig, ax = plt.subplots()
ax.semilogx(diametres, pourcentages_passants, label="Courbe granulométrique")
ax.set_xlabel("Diamètre des particules (mm)")
ax.set_ylabel("Pourcentage cumulé des passants (%)")
ax.set_title("Analyse granulométrique")
ax.legend(loc="best")
# Ajout des valeurs caractéristiques
ax.scatter(D10, 10, color="red", label="D10")
ax.scatter(D30, 30, color="red", label="D30")
ax.scatter(D60, 60, color="red", label="D60")
ax.legend(loc="best")
plt.show()
# Affichage des résultats
resultats = np.vstack((pourcentages_refus, np.cumsum(pourcentages_refus),
pourcentages_passants)).round(2)

tk.Label(root, text="Diamètres caractéristiques :").grid(row=n+4, columnspan=4)


tk.Label(root, text="D10 = {:.2f} mm".format(D10)).grid(row=n+5, columnspan=4)
tk.Label(root, text="D30 = {:.2f} mm".format(D30)).grid(row=n+6, columnspan=4)
tk.Label(root, text="D60 = {:.2f} mm".format(D60)).grid(row=n+7, columnspan=4)
tk.Label(root, text="Coefficient de courbure Cc =
{:.2f}".format(Cc)).grid(row=n+8, columnspan=4)
tk.Label(root, text="Coefficient d'uniformité Cu =
{:.2f}".format(Cu)).grid(row=n+9, columnspan=4)
# Affichage des résultats
print("-" * 105)
print("|{: ^20}|{: ^20}|{: ^20}|{: ^20}|{: ^20}|".format("Diamètres (mm)",
"Refus partiels (g)", "Refus cumulés (%)", "Passants cumulés (%)", " "))
print("-" * 105)

somme_refus = 0
for i in range(n):
somme_refus += refus[i]
pourcentage_refus_partiel = round(pourcentages_refus[i], 2)
pourcentage_refus_cumule = round(pourcentages_refus[i], 2)
pourcentage_passants_cumules = round(pourcentages_passants[i], 2)
print("|{: ^20}|{: ^20}|{: ^20}|{: ^20}|{:
^20}|".format(round(diametres[i], 2), round(refus[i], 2), pourcentage_refus_cumule,
pourcentage_passants_cumules, pourcentage_refus_partiel))

print("-" * 105)
print("|{: ^20}|{: ^20}|{: ^20}|{: ^20}|{: ^20}|".format("Fonds du tamis",
round(somme_refus, 2), "100.0", "0.0", ""))
print("-" * 105)
# Calcul du pourcentage cumulé des passants sur le tamis de 0.08 mm
cumul_passants_008mm = 100 - np.sum(pourcentages_refus[diametres > 0.08])

A= 100 - cumul_passants_008mm

if A < 50 :

# Demander le nombre d'essais


n = int(input("Nombre d'essais de limites d'Atterberg effectué : "))

# Initialiser les listes de données


penetrations = []
wl = []
# Demander les données pour chaque essai
for i in range(n):
penetrations.append(float(input("Profondeur de pénétration pour l'essai
{}: ".format(i+1))))
wl.append(float(input("Limite de liquidité pour l'essai {}:
".format(i+1))))

# Tracer le nuage de points et calculer la droite de régression


a, b = np.polyfit(penetrations, wl, 1)
x = np.array([min(penetrations), max(penetrations)])
y = a*x + b

# Figure 1 - Nuage de points


fig1 = plt.figure(1)
plt.scatter(penetrations, wl)
plt.plot(x, y, color='r')
plt.xlabel("Profondeur de pénétration (mm)")
plt.ylabel("Limite de liquidité")
plt.title("Nuage de points et droite de régression")
plt.show()

# Afficher la limite de liquidité pour une profondeur de pénétration de 20


mm
wl_20 = a*20 + b
print("La limite de liquidité pour une profondeur de pénétration de 20 mm
est : {:.2f}".format(wl_20))

# Demander la limite de plasticité


wp = float(input("Entrez la limite de plasticité du sol : "))

# Calculer l'indice de plasticité pour chaque limite de liquidité


wl_range = np.arange(0, 101, 10)
Ip = 0.73*(wl_range - 20)

# Figure 2 - Droite Ip=0.73(wl-20) et point (wl, Ip)


fig2 = plt.figure(2)
plt.plot(wl_range, Ip, color='g')
plt.scatter(wl_20, wl_20 - wp, color='r')
plt.axvline(x=50, linestyle='--', color='k')
plt.xlabel("Limite de liquidité")
plt.ylabel("Indice de plasticité")
plt.title("Droite Ip=0.73(wl-20) et point (wl, Ip)")
plt.xticks(np.arange(0, 101, 10))
plt.yticks(np.arange(0, max(Ip)+1, 2))
plt.xlim(0, 100)
plt.ylim(0, max(Ip))

# Afficher les deux graphiques


plt.show()

# Déterminer la classe de plasticité du sol


if wl_20 > 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe = "argile très plastique"
elif wl_20 > 50 and (wl_20 - wp) <= 0.73*(wl_20 - 20):
classe = "limon très plastique"
elif wl_20 <= 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe = "argile peu plastique"
else:
classe = "limon peu plastique"
# Afficher la classe de plasticité du sol
print("La classe de plasticité du sol est : {}".format(classe))

if A >= 50 :

cumul_passants_2mm = 100 - np.sum(pourcentages_refus[diametres > 2])

Q1= A-cumul_passants_2mm

if Q1 > 50 :
if cumul_passants_008mm < 5 :

if Cu > 4 and 1 < Cc and Cc < 3 :


print("Notre sol est une grave propre bien gradué")
else :
print("Notre sol est une grave propre mal gradué")

if 12 < cumul_passants_008mm and cumul_passants_008mm < 50 :

# Demander le nombre d'essais


n = int(input("Nombre d'essais de limites d'Atterberg
effectué : "))

# Initialiser les listes de données


penetrations = []
wl = []

# Demander les données pour chaque essai


for i in range(n):
penetrations.append(float(input("Profondeur de pénétration
pour l'essai {}: ".format(i+1))))
wl.append(float(input("Limite de liquidité pour l'essai {}:
".format(i+1))))

# Tracer le nuage de points et calculer la droite de régression


a, b = np.polyfit(penetrations, wl, 1)
x = np.array([min(penetrations), max(penetrations)])
y = a*x + b

# Figure 1 - Nuage de points


fig1 = plt.figure(1)
plt.scatter(penetrations, wl)
plt.plot(x, y, color='r')
plt.xlabel("Profondeur de pénétration (mm)")
plt.ylabel("Limite de liquidité")
plt.title("Nuage de points et droite de régression")
plt.show()

# Afficher la limite de liquidité pour une profondeur de


pénétration de 20 mm
wl_20 = a*20 + b
print("La limite de liquidité pour une profondeur de
pénétration de 20 mm est : {:.2f}".format(wl_20))

# Demander la limite de plasticité


wp = float(input("Entrez la limite de plasticité du sol : "))
# Calculer l'indice de plasticité pour chaque limite de
liquidité
wl_range = np.arange(0, 101, 10)
Ip = 0.73*(wl_range - 20)

# Figure 2 - Droite Ip=0.73(wl-20) et point (wl, Ip)


fig2 = plt.figure(2)
plt.plot(wl_range, Ip, color='g')
plt.scatter(wl_20, wl_20 - wp, color='r')
plt.axvline(x=50, linestyle='--', color='k')
plt.xlabel("Limite de liquidité")
plt.ylabel("Indice de plasticité")
plt.title("Droite Ip=0.73(wl-20) et point (wl, Ip)")
plt.xticks(np.arange(0, 101, 10))
plt.yticks(np.arange(0, max(Ip)+1, 2))
plt.xlim(0, 100)
plt.ylim(0, max(Ip))

# Afficher les deux graphiques


plt.show()

# Déterminer la classe de plasticité du sol


if wl_20 > 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe1 = "argile très plastique"
print("Notre sol est une grave argileuse")
elif wl_20 > 50 and (wl_20 - wp) <= 0.73*(wl_20 - 20):
classe2 = "limon très plastique"
print("Notre sol est une grave limoneuse")
elif wl_20 <= 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe3 = "argile peu plastique"
print("Notre sol est une grave argileuse")
else:
classe4 = "limon peu plastique"
print("Notre sol est une grave limoneuse")

if 5 < cumul_passants_008mm and cumul_passants_008mm < 12 :

# Demander le nombre d'essais


n = int(input("Nombre d'essais de limites d'Atterberg
effectué : "))

# Initialiser les listes de données


penetrations = []
wl = []

# Demander les données pour chaque essai


for i in range(n):
penetrations.append(float(input("Profondeur de pénétration
pour l'essai {}: ".format(i+1))))
wl.append(float(input("Limite de liquidité pour l'essai {}:
".format(i+1))))

# Tracer le nuage de points et calculer la droite de régression


a, b = np.polyfit(penetrations, wl, 1)
x = np.array([min(penetrations), max(penetrations)])
y = a*x + b

# Figure 1 - Nuage de points


fig1 = plt.figure(1)
plt.scatter(penetrations, wl)
plt.plot(x, y, color='r')
plt.xlabel("Profondeur de pénétration (mm)")
plt.ylabel("Limite de liquidité")
plt.title("Nuage de points et droite de régression")
plt.show()

# Afficher la limite de liquidité pour une profondeur de


pénétration de 20 mm
wl_20 = a*20 + b
print("La limite de liquidité pour une profondeur de
pénétration de 20 mm est : {:.2f}".format(wl_20))

# Demander la limite de plasticité


wp = float(input("Entrez la limite de plasticité du sol : "))

# Calculer l'indice de plasticité pour chaque limite de


liquidité
wl_range = np.arange(0, 101, 10)
Ip = 0.73*(wl_range - 20)

# Figure 2 - Droite Ip=0.73(wl-20) et point (wl, Ip)


fig2 = plt.figure(2)
plt.plot(wl_range, Ip, color='g')
plt.scatter(wl_20, wl_20 - wp, color='r')
plt.axvline(x=50, linestyle='--', color='k')
plt.xlabel("Limite de liquidité")
plt.ylabel("Indice de plasticité")
plt.title("Droite Ip=0.73(wl-20) et point (wl, Ip)")
plt.xticks(np.arange(0, 101, 10))
plt.yticks(np.arange(0, max(Ip)+1, 2))
plt.xlim(0, 100)
plt.ylim(0, max(Ip))

# Afficher les deux graphiques


plt.show()

# Déterminer la classe de plasticité du sol

if wl_20 > 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):


classe1 = "argile très plastique"
if Cu > 4 and 1 < Cc and Cc < 3 :
print("Notre sol est une grave argileuse bien gradué")
else :
print("Notre sol est une grave argileuse mal gradué")
elif wl_20 > 50 and (wl_20 - wp) <= 0.73*(wl_20 - 20):
classe2 = "limon très plastique"
if Cu > 4 and 1 < Cc and Cc < 3 :
print("Notre sol est une grave limoneuse bien gradué")
else :
print("Notre Sol est une grave limoneuse mal gradué")
elif wl_20 <= 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe3 = "argile peu plastique"
if Cu > 4 and 1 < Cc and Cc < 3 :
print("Notre sol est une grave argileuse bien gradué")
else :
print("Notre sol est une grave argileuse mal gradué")
else:
classe4 = "limon peu plastique"
if Cu > 4 and 1 < Cc and Cc < 3 :
print("Notre sol est une grave limoneuse bien gradué")
else :
print("Notre Sol est une grave limoneuse mal gradué")

if Q1 < 50 :

if cumul_passants_008mm < 5 :
if Cu > 6 and 1 < Cc and Cc < 3 :
print("Notre sol est un sable propre bien gradué")
else :
print("Notre sol est un sable propre mal gradué")

if 12 < cumul_passants_008mm and cumul_passants_008mm < 50 :

# Demander le nombre d'essais


n = int(input("Nombre d'essais de limites d'Atterberg
effectué : "))

# Initialiser les listes de données


penetrations = []
wl = []

# Demander les données pour chaque essai


for i in range(n):
penetrations.append(float(input("Profondeur de pénétration
pour l'essai {}: ".format(i+1))))
wl.append(float(input("Limite de liquidité pour l'essai {}:
".format(i+1))))

# Tracer le nuage de points et calculer la droite de régression


a, b = np.polyfit(penetrations, wl, 1)
x = np.array([min(penetrations), max(penetrations)])
y = a*x + b

# Figure 1 - Nuage de points


fig1 = plt.figure(1)
plt.scatter(penetrations, wl)
plt.plot(x, y, color='r')
plt.xlabel("Profondeur de pénétration (mm)")
plt.ylabel("Limite de liquidité")
plt.title("Nuage de points et droite de régression")
plt.show()

# Afficher la limite de liquidité pour une profondeur de


pénétration de 20 mm
wl_20 = a*20 + b
print("La limite de liquidité pour une profondeur de
pénétration de 20 mm est : {:.2f}".format(wl_20))

# Demander la limite de plasticité


wp = float(input("Entrez la limite de plasticité du sol : "))

# Calculer l'indice de plasticité pour chaque limite de


liquidité
wl_range = np.arange(0, 101, 10)
Ip = 0.73*(wl_range - 20)
# Figure 2 - Droite Ip=0.73(wl-20) et point (wl, Ip)
fig2 = plt.figure(2)
plt.plot(wl_range, Ip, color='g')
plt.scatter(wl_20, wl_20 - wp, color='r')
plt.axvline(x=50, linestyle='--', color='k')
plt.xlabel("Limite de liquidité")
plt.ylabel("Indice de plasticité")
plt.title("Droite Ip=0.73(wl-20) et point (wl, Ip)")
plt.xticks(np.arange(0, 101, 10))
plt.yticks(np.arange(0, max(Ip)+1, 2))
plt.xlim(0, 100)
plt.ylim(0, max(Ip))

# Afficher les deux graphiques


plt.show()

# Déterminer la classe de plasticité du sol


if wl_20 > 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe = "argile très plastique"
print("Notre Sol est un sable argileux")
elif wl_20 > 50 and (wl_20 - wp) <= 0.73*(wl_20 - 20):
classe = "limon très plastique"
print("Notre Sol est un sable limoneux")
elif wl_20 <= 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe = "argile peu plastique"
print("Notre Sol est un sable argileux")
else:
classe = "limon peu plastique"
print("Notre Sol est un sable limoneux")

if 5 < cumul_passants_008mm and cumul_passants_008mm < 12 :

# Demander le nombre d'essais


n = int(input("Nombre d'essais de limites d'Atterberg effectué :
"))

# Initialiser les listes de données


penetrations = []
wl = []

# Demander les données pour chaque essai


for i in range(n):
penetrations.append(float(input("Profondeur de pénétration pour
l'essai {}: ".format(i+1))))
wl.append(float(input("Limite de liquidité pour l'essai {}:
".format(i+1))))

# Tracer le nuage de points et calculer la droite de régression


a, b = np.polyfit(penetrations, wl, 1)
x = np.array([min(penetrations), max(penetrations)])
y = a*x + b

# Figure 1 - Nuage de points


fig1 = plt.figure(1)
plt.scatter(penetrations, wl)
plt.plot(x, y, color='r')
plt.xlabel("Profondeur de pénétration (mm)")
plt.ylabel("Limite de liquidité")
plt.title("Nuage de points et droite de régression")
plt.show()

# Afficher la limite de liquidité pour une profondeur de


pénétration de 20 mm
wl_20 = a*20 + b
print("La limite de liquidité pour une profondeur de pénétration de
20 mm est : {:.2f}".format(wl_20))

# Demander la limite de plasticité


wp = float(input("Entrez la limite de plasticité du sol : "))

# Calculer l'indice de plasticité pour chaque limite de liquidité


wl_range = np.arange(0, 101, 10)
Ip = 0.73*(wl_range - 20)

# Figure 2 - Droite Ip=0.73(wl-20) et point (wl, Ip)


fig2 = plt.figure(2)
plt.plot(wl_range, Ip, color='g')
plt.scatter(wl_20, wl_20 - wp, color='r')
plt.axvline(x=50, linestyle='--', color='k')
plt.xlabel("Limite de liquidité")
plt.ylabel("Indice de plasticité")
plt.title("Droite Ip=0.73(wl-20) et point (wl, Ip)")
plt.xticks(np.arange(0, 101, 10))
plt.yticks(np.arange(0, max(Ip)+1, 2))
plt.xlim(0, 100)
plt.ylim(0, max(Ip))

# Afficher les deux graphiques


plt.show()

# Déterminer la classe de plasticité du sol


if wl_20 > 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe = "argile très plastique"
if Cu > 6 and 1 < Cc and Cc < 3 :
print("Notre Sol est un sable argileux bien gradué")
else :
print("Notre sol est un sable argileux mal gradué")
elif wl_20 > 50 and (wl_20 - wp) <= 0.73*(wl_20 - 20):
classe = "limon très plastique"
if Cu > 6 and 1 < Cc and Cc < 3 :
print("Notre Sol est un sable limoneux bien gradué")
else :
print("Notre Sol est un sable limoneux mal gradué")
elif wl_20 <= 50 and (wl_20 - wp) > 0.73*(wl_20 - 20):
classe = "argile peu plastique"
if Cu > 6 and 1 < Cc and Cc < 3 :
print("Notre Sol est un sable argileux bien gradué")
else :
print("Notre sol est un sable argileux mal gradué")
else:
classe = "limon peu plastique"
if Cu > 6 and 1 < Cc and Cc < 3 :
print("Notre Sol est un sable limoneux bien gradué")
else :
print("Notre Sol est un sable limoneux mal gradué")

# Boutons
tk.Button(root, text="Créer les entrées", command=create_entries).grid(row=0,
column=3)
tk.Button(root, text="Analyser", command=analyse).grid(row=0, column=4)

# Boucle principale
root.mainloop()

Vous aimerez peut-être aussi