## création des fichiers essai à partir des fichier uhing
#renommage des fichiers et remplacement Rampe par Trapeze et encodage utf8 et suppression de la fin de la mesure sans consigne et suppression du dernier saut à la ligne pour ne pas avoir une dernière ligne vide
from os import chdir, getcwd

rep_init="D:\\TP fichier dictionnaire\\essais_init\\"
rep_final="D:\\TP fichier dictionnaire\\essais\\"

for i in range(1,21):
    nom1=rep_init+"uhing_"+str(50*i)+".txt"
    nom2=rep_final+"essai"+str(i)+".txt"
    fichier1=open(nom1,"r")
    fichier2=open(nom2,"w",encoding="utf-8")
    texte=""
    for ligne in fichier1:
        liste=ligne.split("\t")
        if "Rampe" in liste:
            ligne="Type Pilotage\tTrapeze\t\t\t\t\t\t\t\t\n"
        if liste[1]!="": #pour ne pas tenir compte de la fin de la mesure sans consigne
            texte=texte+ligne
    fichier1.close()

    fichier2.write(texte)
    fichier2.close()


## Debut du corrigé

from os import chdir, getcwd

print(getcwd())
repertoire="D:\\TP fichier dictionnaire\\essais"
chdir(repertoire)
print(getcwd())


## affichage des 20 premières lignes du premier essai : essai1.txt

nom_fichier="essai1.txt"

fichier=open(nom_fichier,"r")
for i in range(0,20):
    ligne=fichier.readline()
    print(ligne)
fichier.close()



##remplacer les , par des .
def remplace_virgule_par_point(chaine):
    """
    fonction qui remplace les virgules par des points dans une chaine de caractères
    Arguments en entrée et sortie : chaine de caractères (str)
    """
    chaine2=""
    for c in chaine:
        if c==",":
            chaine2=chaine2+"."
        else:
            chaine2=chaine2+c
    return chaine2

#test de la fontion
chaine="0,0080	1,500	1,122	-2,241	0,012	4,395	0,068	2,308	0,002	3,622"
print(chaine)
print(remplace_virgule_par_point(chaine))

## extraction résulats des essais

def extraction_resultats_essai(chemin_fichier):
    """
    fonction qui extrait les données numériques de temps, de consigne, de vitesse et de courant d'un fichier texte issu d'un essai sur le système de trancanage.
    Arguments :
        -entrée : chemin du fichier texte à traiter, chaine de caractères (str)
        -sortie : dictionnaire contenant les listes de données extraites associée aux clefs : temps, consigne, vitesse et courant.
    """
    #initilisation des listes vides
    L_temps=[]
    L_consigne=[]
    L_vitesse=[]
    L_courant=[]
    fichier=open(chemin_fichier,"r")
    #pour passer les 13 premières lignes
    for i in range(13):
        ligne=fichier.readline()
    #pour traiter les lignes suivantes
    for ligne in fichier:
        ligne2=remplace_virgule_par_point(ligne) #On remplace les virgules par des points sur la ligne
        liste=ligne2.split("\t") #on sépare les éléments d'une ligne  avec la tabulation "\t"
        #remplissage des données en transformant les str en float
        L_temps.append(float(liste[0]))
        L_consigne.append(float(liste[1]))
        L_vitesse.append(float(liste[2]))
        L_courant.append(float(liste[4]))
    fichier.close()
    #mise en forme du résultat avec un dictionnaire
    dico={"temps":L_temps,"consigne":L_consigne,"vitesse":L_vitesse,"courant":L_courant}
    return dico


#test sur un fichier
donnees=extraction_resultats_essai("essai3.txt")
print(donnees["temps"])

## affichage des courbes et des données de l'essai
import matplotlib.pyplot as plt

def affichage(chemin_fichier):
    """
    Procédure qui permet d'afficher les courbes de consigne, de vitesse
    et de courant en fonction du temps, à partir du chemin d'un
    fichier texte issu d'une acquisition sur le système de trancanage.

    Arg : chemin_fichier (chaine de caractère) : chemin du fichier à analyser
    """
    resultat=extraction_resultats_essai(chemin_fichier)
    fig=plt.figure(chemin_fichier)
    plt.subplot(2,1,1)#sous figure des vitesses (
    plt.plot(resultat["temps"],resultat["consigne"],'k',label="consigne")
    plt.plot(resultat["temps"],resultat["vitesse"],'r',label="vitesse réelle")
    plt.xlabel("temps (s)"); plt.ylabel("vitesse de rotation (tr/min)")
    plt.legend(loc="best")
    plt.grid()
    plt.subplot(2,1,2)#sous figure du courant
    plt.plot(resultat["temps"],resultat["courant"],'b',label="courant")
    plt.xlabel("temps (s)")
    plt.ylabel("courant (A)")
    plt.grid()
    plt.show()

affichage("essai15.txt")

##

def moyenne_sur_intervalle(L,deb,fin):
    S=0
    for i in range(deb,fin):
        S=S+L[i]
    return S/(fin-deb)



##couple résistant pour l'essai 15
K=0.13 #Nm/A
resultat=extraction_resultats_essai("essai15.txt")
ind_deb=round(0.5/0.001)
ind_fin=round(0.7/0.001)+1
I=moyenne_sur_intervalle(resultat["courant"],ind_deb,ind_fin)
N=moyenne_sur_intervalle(resultat["vitesse"],ind_deb,ind_fin)
Cr=I*K
print("pour l'essai 15, le couple résistant est de(Nm.A) :",Cr)




##parcourir l'entête et enregistrement des informations d'un essai

def extraction_infos_essai(nom_fichier):
    dico={}
    fichier=open(nom_fichier,"r")
    for i in range(12):
        ligne=fichier.readline()
        liste=ligne.split("\t")
        dico[liste[0]]=liste[1]
    fichier.close()
    return dico

donnees=extraction_infos_essai("essai1.txt")
print(donnees)

##verification même conditions pour les essais

verif = True
for i in range(1,21):
    nom_fichier="essai"+str(i)+".txt"
    donnees=extraction_infos_essai(nom_fichier)

    if not(donnees['Type Pilotage']=='Trapeze' and donnees['Duree acceleration (s)']== '0,30' and donnees['Temps maintien (s)']== '0,50' and donnees[' Duree deceleration (s)']== '0,30'):
        print("L'essai correspondant à "+nom_fichier+" n'est pas conforme.")
        verif =False
if verif:
    print ("l'ensemble des essais est conforme.")


## détermination couple résistant et vitesse l'ensemble des essais

K=0.13 #Nm/A
moyenne_courant=[]
moyenne_vitesse=[]
couple_resistant=[]
for i in range(1,21):
    nom_fichier="essai"+str(i)+".txt"
    resultat=extraction_resultats_essai(nom_fichier)
    ind_deb=round(0.5/0.001)
    ind_fin=round(0.7/0.001)+1
    I=moyenne_sur_intervalle(resultat["courant"],ind_deb,ind_fin)
    N=moyenne_sur_intervalle(resultat["vitesse"],ind_deb,ind_fin)
    Cr=I*K
    moyenne_courant.append(I)
    moyenne_vitesse.append(N)
    couple_resistant.append(Cr)

print(couple_resistant)
print(moyenne_vitesse)
## enregistrement des données


fichier=open("resultats.txt","w")
fichier.write("Vitesse du moteur (tr/min)\tCouple resistant (Nm)\n")
for i in range(len(couple_resistant)):
    fichier.write(str(moyenne_vitesse[i])+"\t"+str(couple_resistant[i])+"\n")

fichier.close()



## affichage de la courbe


plt.figure("")
plt.plot(moyenne_vitesse,couple_resistant,"o",label="essais")
plt.xlabel("vitesse de rotation N (tr/min)")
plt.ylabel("couple résistant Cr (Nm)")
plt.grid()
plt.xlim([0,700])
plt.ylim([0,0.15])
plt.show()


## modèle associé
# on peut modéliser par une droite d'équation Cr=a*N+b (N=vitesse de rotation en tr/min)

import numpy as np

(a,b)=np.polyfit(moyenne_vitesse,couple_resistant,1) #méthode des moindres carré
print("Cr=a*N+b")
print("a=",a,"Nm/(tr/min)")
print("b=",b," Nm")

plt.plot([0,700],[b,b+700*a], label="modèle")
plt.legend(loc="best")
plt.draw()



##
def affichage_avec_info(nom_fichier):
    info=extraction_infos_essai(nom_fichier)
    resultat=extraction_resultats_essai(nom_fichier)

    fig=plt.figure(nom_fichier+" bis")
    plt.subplot(2,3,(1,2))#sous figure des vitesses
    plt.plot(resultat["temps"],resultat["consigne"],'k',label="consigne")
    plt.plot(resultat["temps"],resultat["vitesse"],'r',label="vitesse")
    plt.xlabel("temps (s)"); plt.ylabel("vitesse de rotation (tr/min)")
    plt.legend(loc="best")
    plt.grid()
    plt.subplot(2,3,(4,5))#sous figure du courant
    plt.plot(resultat["temps"],resultat["courant"],'b',label="courant")
    plt.xlabel("temps (s)")
    plt.ylabel("courant (A)")
    plt.grid()
    plt.subplot(2,3,(3,6))#sous figure des informations de l'essai
    x=0.;y=0.95
    for cle in info:
        plt.annotate(cle+" : "+info[cle],(x,y))
        y=y-0.05
    plt.axis("off")
    plt.show()


affichage_avec_info("essai15.txt")
