Télécharger le fichier « MyViz.py »


# -*- coding: utf-8 -*-
"""
Auteur : David Fournier
"""

from os.path import isfile

def lectureFichier(nomFichier):
    """
    Cette fonction permet de convertir les données de n'importe quel fichier exporté de l'environnement MyViz en données utilisables dans l'environnement Python.

    Entrée  :   nomFichier      # adresse du fichier à lire
    Sortie  :   var             # liste des listes des données mesurées                      
    """

    if isfile(nomFichier):
        # Ouvrir le fichier en mode lecture
        fichier = open(nomFichier, 'r')

        # Lire les lignes
        lignes = fichier.readlines()

        # Traiter la première ligne
        nbrVar = len(lignes[0].rstrip('\n').split(','))

        # Déclaration des listes de variables
        var = [[] for _ in range(nbrVar)]

        # Traiter les lignes une à une sauf la première
        for ligne in lignes[1:]:
            # Séparer les données
            ligne = ligne.rstrip('\n').split(',')

            if len(ligne) == nbrVar:
                try:
                    # Vérifier les données
                    for i in range(len(ligne)):
                        ligne[i] = float(ligne[i])
                    # Récuperer les données vérifiées
                    for i in range(len(ligne)):
                        var[i].append(ligne[i])
                except:
                    print('ligne exclue (donnée incompatible) : '+str(ligne))
            else:
                print('ligne exclue (ligne incompatible) : '+str(ligne))

        # Fermer le fichier
        fichier.close()
    else:
        print('Avertissement : Fichier "',nomFichier,'" non trouvé !')
        var = []

    return var


def commandeEnTensionSerie(nomFichier):
    """
    Cette fonction permet de convertir les données de l'environnement " Commande en tension (série) " de MyViz en données utilisables dans l'environnement Python.
    
    Entrée  :   nomFichier      # adresse du fichier à lire
    Sortie  :   inst   = var[0] # Temps (s)
                conMot = var[1] # Consigne tension (V)
                conGen = var[2] # Tension commande générateur (V)
                vitMot = var[3] # Vitesse motoreducteur (rad/s)
                couMot = var[4] # Courant moteur (A)
                couGen = var[5] # Courant générateur (A)
                                # Couple moteur (N.m)
                                # Couple générateur (N.m)
    """

    var = lectureFichier(nomFichier)

    if len(var) == 8:
        # suppression des données inutiles
        del var[7]
        del var[6]

        return var
    else:
        return [[] for _ in range(6)]


def asservissementEnVitesseSerie(nomFichier):
    """
    Cette fonction permet de convertir les données de l'environnement " Asservissement en vitesse (série) " de MyViz en données utilisables dans l'environnement Python.
    
    Entrée  :   nomFichier      # adresse du fichier à lire
    Sortie  :   inst   = var[0] # Temps (s)
                conMot = var[1] # Consigne vitesse (rad/s),
                vitMot = var[2] # Vitesse motoreducteur (rad/s)
                comMot = var[3] # Tension commande moteur (V),
                couMot = var[4] # Courant moteur (A)
                comGen = var[5] # Tension commande générateur (V)
                couGen = var[6] # Courant générateur (A)
    """

    var = lectureFichier(nomFichier)

    if len(var) == 7:
        return var
    else:
        return [[] for _ in range(7)]


def asservissementEnVitesseReseau(nomFichier):
    """
    Cette fonction permet de convertir les données de l'environnement " Asservissement en vitesse (série) " de MyViz en données utilisables dans l'environnement Python.
    
    Entrée  :   nomFichier      # adresse du fichier à lire
    Sortie  :   inst   = var[0] # Temps (s)
                conMot = var[1] # Consigne vitesse (rad/s),
                vitMot = var[2] # Vitesse motoreducteur (rad/s)
                comMot = var[3] # Tension commande moteur (V),
                couMot = var[4] # Courant moteur (A)
                                # Couple motoréducteur (N.m)
                comGen = var[6] # Tension commande générateur (V)
                couGen = var[7] # Courant générateur (A)
                                # Couple extérieur au motoréducteur (N.m)
                                # Couple externe (N.m)
    """

    var = lectureFichier(nomFichier)

    if len(var) == 10 :
        # suppression des données inutiles
        del var[9]
        del var[8]
        del var[5]

        return var
    else:
        return [[] for _ in range(7)]


from matplotlib.pyplot import figure, plot, xlabel, ylabel, legend, title, show

def afficher(xy, abscisse='', titre='', fig=(5, 3)):
    """
    Cette procédure permet d\'afficher les variables " ys " en fonction de " x "
        Entrée  :   xy          # liste de tuples contenant
                                    * une liste d'abscisses
                                    * une liste d'ordonnées
        ou encore
        Entrée  :   xy          # liste de tuples contenant
                                    * une liste d'abscisses
                                    * une liste d'ordonnées
                                    * une option mesure (mes) ou modèle (mod)
                                    * une chaine de caractères pour un commentaire
                    abscisse    # chaine de caractères
                    titre       # chaine de caractères
                    fig         # tuple de deux entiers
    """

    for i in range(len(xy)):
        if len(xy[i]) == 2:
            xy[i] = (xy[i][0], xy[i][1], 'mes', 'Courbe '+str(i))

    figure(figsize=fig)

    for x, y, opt, texte in xy:
        if opt == 'mes':
            opt = '.'
        else:
            opt = '-'
        plot(x, y, opt, label=texte)

    if (len(xy) > 1):
        xlabel(abscisse)
        ylabel('Voir étiquette')
        legend(loc='best')
    else:
        xlabel(abscisse)
        ylabel(texte)

    title(titre)
    show()


from numpy import format_float_scientific

def arrondir(x, precision = 2, exp_digits=1):
    """
    Cette fonction permet d'arrondir un nombre.
    Entrée :    x           # Nombre à arrondir
                precision   # pour spécifier le nombre total de chiffres décimaux
                exp_digits  # pour dire combien de chiffres sont nécessaires dans la notation exponentielle.
    Sortie :    une chaine de caractère du nombre arrondi
    """
    return format_float_scientific(x, precision, exp_digits)

#def arrondir(x):
#    """
#    Cette fonction permet d'arrondir un nombre.
#    """
#    return format(x,'.2E')


from numpy import unique, array

def signalCarre(var):
    """
    Cette fonction permet de savoir si le signal étudié est un signal carré.
    Entrée :    var     # Liste
    Sortie :    booléen
    """
    return len(unique(array(var)))==2


from numpy import mean

def moyenneMobile(l, n):
    # Taille de la liste
    taille = len (l)
    # Créer une liste aussi grande que les données
    resultat = [ None ]* taille
    for i in range ( taille ):
       # chercher les bornes de la sous liste dont on doit faire la moyenne
       a, b = i - n, i + n + 1
       # les bornes doivent compatible avec la liste
       a, b = max (0, a), min(b, taille )
       # Faire la moyenne
       resultat [i] = mean (l[a:b])
    return resultat

def rechercheRegimePermament(liste, pourcent = 5):
    pourcent /= 100

    ind = len(liste) - 1
    moy = liste[ind]
    ind -= 1
    while (ind>=0 and (1-pourcent)*moy <= liste[ind] <= (1+pourcent)*moy):
        ind -= 1
        moy = mean(liste[ind:])

    if ind == len(liste) - 1:
        return None
    else: 
        #print(moy, ind, len(liste))
        return ind

def regimePermanent(liste, ind):
    return mean(liste[ind:])


##########################################
# Fonctions non testées et non utilisées #
##########################################

import numpy as np

def traiterSignalCarre(var, num, first = True, last = True, info=False):
    """
    Cette fonction permet
        de retirer le premier créneau : first = True
        de retirer le dernier créneau : last = True
        d'afficher éventuellement quelques informations sur les créneaux : info = True
    Il faut spécifier le canal étudié au travers du paramètre **num**.
    Entrée :    var     # Liste de liste
                num     # indice de la liste ayant le signal carré
    """
    assert num < len(var)

    if not signalCarre(var[num]):
        if info:
            print('Le signal n\'est pas carré')
    else:
        # Convertir la liste éventuelle en tableau
        var = np.array(var)

        # Chercher les deux valeurs du créneaux
        mini = np.ndarray.min(var[num])
        maxi = np.ndarray.max(var[num])

        # Retirer le premier creneau
        if first:
            while(len(var[num])>0 and var[num][0] == mini):
                var = np.delete(var, np.s_[0], axis=1) 
            while(len(var[num])>0 and var[num][0] == maxi):
                var = np.delete(var, np.s_[0], axis=1)    

        # retirer le dernier créneau
        if last:
            while(len(var[num])>0 and var[num][-1] == maxi):
                var = np.delete(var, np.s_[-1], axis=1)    
            while(len(var[num])>0 and var[num][-1] == mini):
                var = np.delete(var, np.s_[-1], axis=1) 

        if (info and len(var[num])>0):
            # compter le nombre de fronts montant et descendant
            compteur = 0
            for i in range(len(var[num])-1):
                if var[num][i] != var[num][i+1]:
                    compteur += 1

            # compter le nombre de créneaux entiers
            compteur = (compteur+1)//2

            print('Il y a ',compteur,' creneau','' if compteur <= 1 else 'x',sep='',end='')
            print(' avec une valeur inférieure de "',mini,'" et une valeur supérieure de "',maxi,'"',sep='',end='')

            i = 0
            while i < len(var[num])-2 and var[num][i] == var[num][i+1]:
                decalage = var[0][i+1]
                i += 1

            print(' avec un décalage du premier font de ',decalage,' seconde','' if decalage < 2 else 's',sep='',end='')
    
    return var

Télécharger le fichier « MyViz.py »