npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

courbe-amont-aval

v1.0.10

Published

Cette librairie est installé via [Angular CLI](https://github.com/angular/angular-cli) version 15.2.0.

Readme

CourbeAmontAval

Cette librairie est installé via Angular CLI version 15.2.0.

🖥️ Installation du package

npm i courbe-amont-aval

OU

(préférence pour )

yarn add courbe-amont-aval

=> Ou Si vous avez reçu le fichier de la librarie ,il suffit de l'inclure dans votre application

et d'installer le package dans la librairie en vous dirigeant vers le repertoire

cd projects\courbe-amont-aval\

Dans ce même script executé la commande ci-dessous

yarn install

✨ Inclure dans votre Module

Veuillez mettre dans votre module la ligne (Soit module principal app.module.ts) Soit celui qui va utiliser votre composant


...
import { CourbeAmontAvalModule } from 'courbe-amont-aval';

imports:[
    ...
    CourbeAmontAvalModule
]


};

🚀 Utilisation

Code Html : Par défaut l'accès se fait sur le http://localhost:51000/Acquisition Un paramètrage d'ip sera surement nécessaire mais vous pourrez déjà voir un message de ce type

Alt text

    <CourbeAmontAval></CourbeAmontAval>

Champs Input:

| Input  | Valeur Défaut     |
| ------- | ---------------- |
| NomBobine    | (Vide)      |
| AdresseIP    | 172.0.0.1   |
| Port         | 51000       |
| ControllerBaseUrl | Acquisition       |
| colorErreur  | #FF3A43     |
| colorSchemeAval  | {
    name: 'myScheme',
    selectable: true,
    group: ScaleType.Ordinal,
     domain: ['#40112e', '#7aa3e5','#a8385d']
   }     |
colorSchemeAmont  | {
    name: 'myScheme2',
    selectable: true,
    group: ScaleType.Ordinal,
    domain: ['#a8385d', '#7aa3e5','#40112e']
  }  |  

📶 API Angular

NomBobine

Le nom de la bobine doit être mappé comme cela:

    <CourbeAmontAval [NomBobine]="MaBobine"></CourbeAmontAval>

Il est préférable d'affecter le nom via une fonction A chaque changement du paramètre, un appel API est effectué pour recharger

{
    public MaBobine:string ="123456";


    // Va permettre de changer la bobine en cours par celle demandé de l'api
    ChangementDeBobine(bobine) {
        this.MaBobine = bobine;
    }
}

Renseigner la bonne api

Vous avez la possibilité de changer l'api pour que la route soit bien adapté

Il suffit d'ajouter des inputs directement

    <CourbeAmontAval [AdresseIP]="'192.168.1.10'" [Port]="51000" [ControllerBaseUrl]="'api/Acquisition'" ></CourbeAmontAval>

==> appelle effectué avec cette exemple http://192.168.1.10:51000/api/Acquisition/[ROUTE] OU

via des variables

   <CourbeAmontAval [AdresseIP]="AdresseIP" [Port]="Port" [ControllerBaseUrl]="ControllerBaseUrl" ></CourbeAmontAval>

Et intégrer dans la partie typescript

{
    public AdresseIP:string ="192.168.1.10";
    public Port:number=51000;
    public ControllerBaseUrl:string="api/Acquisition";


    // Va permettre de changer la bobine en cours par celle demandé de l'api
    ChangementDeBobine(bobine) {
        this.MaBobine = bobine;
    }
}

En sachant que deux routes sont attendu sur un protocole GET:

  [HttpGet]
  [Route("TraitementData/{NomBobine}")]

ET

    [HttpGet]
    [Route("Parametres")]

Changement couleur Courbe

Pour changer la couleur des erreurs qui par défaut à l'hexa : #FF3A43 Alt text

<CourbeAmontAval [colorErreur]="'#123456'"></CourbeAmontAval>

OU via une variable

<CourbeAmontAval [colorErreur]="CouleurErreur"></CourbeAmontAval>

et via le typescript du composant

{
    public CouleurErreur:string ="#123456";
}

======================================================================================================

Pour changer les autres couleurs amont et aval qui est séparé en trois partie Tête, Corps et Queue

<CourbeAmontAval [colorSchemeAval]="schemeAval" [colorSchemeAmont]="schemeAmont"></CourbeAmontAval>

import { Color } from '@swimlane/ngx-charts';

{
    public CouleurErreur:string =
    
    schemeAval:Color =  {
    name: 'myScheme',
    selectable: true,
    group: ScaleType.Ordinal,
     domain: ['#40112e', '#7aa3e5','#a8385d'] // Partie des hexa à changer pour la couleur allant de gauche à droite
   };

   schemeAmont:Color =  {
    name: 'myScheme2',
    selectable: true,
    group: ScaleType.Ordinal,
     domain: ['#40112e', '#7aa3e5','#a8385d'] // Partie des hexa à changer pour la couleur allant de gauche à droite
   };
}

Attention car l'ordre change selon si on est amont ou en aval Aval => Queue,Corp,Aval Amont => Tete,Corp,Queue

Montrer/Cacher les titres Amont/Aval

Par défaut ils sont montré

Cacher

<CourbeAmontAval [DisplayTitre]="false" ></CourbeAmontAval>

Montrer

<CourbeAmontAval [DisplayTitre]="true" ></CourbeAmontAval>

Alt text

Redimenssionner les graphiques en px

Par défaut les graphiques prendront le maximum de place dans une div Il est possible de leur définir à chacun une taille (Mettre 0 si vous voulez mettre la valeur par défaut)

<CourbeAmontAval [viewAval]="viewAval" [viewAmont]="viewAval" ></CourbeAmontAval>

{
    viewAval = [400,300]; // Largeur,Hauteur en px
    viewAmont = [400,300];
}

Output Donnée bobine

Lorsque vous changez votre bobine, un appel Api se fera automatiquement, il peut-être intéréssant de récupérer le données de la bobine lu des calculs affectés

Vous pouvez alors ajouter l'output BobineRecu

<CourbeAmontAval (BobineRecu)="ReceptionBobine($event)" ></CourbeAmontAval>
import { TraitementData } from 'courbe-amont-aval/lib/Model/TraitementData';

{
    /// Récupération des données dans traitement data
    ReceptionBobine(event:TraitementData) {
        
    }
}

Voici un exemple de json reçu

{
    "resultatProfil": {
        "QueueAval": {
            "indexDebutRegion": 4,
            "indexFinRegion": 2331,
            "ecartType": 6.2660403,
            "hmoy": 0,
            "hmax": 0,
            "hmin": 0,
            "nbDesserrage": 0,
            "lgDesserage": 0,
            "nbDecalage": 0,
            "lstIndexDesserage": [],
            "lstIndexDecalage": [],
            "isFinDesserage": false
        },
        "CorpAval": {
            "indexDebutRegion": 2332,
            "indexFinRegion": 6718,
            "ecartType": 1.2477196,
            "hmoy": 0,
            "hmax": 0,
            "hmin": 0,
            "nbDesserrage": 0,
            "lgDesserage": 0,
            "nbDecalage": 0,
            "lstIndexDesserage": [],
            "lstIndexDecalage": [],
            "isFinDesserage": false
        },
        "TeteAval": {
            "indexDebutRegion": 6719,
            "indexFinRegion": 9046,
            "ecartType": 0.5329925,
            "hmoy": 0,
            "hmax": 0,
            "hmin": 0,
            "nbDesserrage": 0,
            "lgDesserage": 0,
            "nbDecalage": 0,
            "lstIndexDesserage": [],
            "lstIndexDecalage": [],
            "isFinDesserage": false
        },
        "TeteAmont": {
            "indexDebutRegion": 11486,
            "indexFinRegion": 13813,
            "ecartType": 0.82115024,
            "hmoy": 1.1887555,
            "hmax": 3.2056901,
            "hmin": -1.3047545,
            "nbDesserrage": 0,
            "lgDesserage": 0,
            "nbDecalage": 3,
            "lstIndexDesserage": [],
            "lstIndexDecalage": [
                {
                    "indexDebut": 11486,
                    "indexFin": 12262
                },
                {
                    "indexDebut": 13266,
                    "indexFin": 13291
                },
                {
                    "indexDebut": 13371,
                    "indexFin": 13388
                }
            ],
            "isFinDesserage": false
        },
        "CorpAmont": {
            "indexDebutRegion": 13814,
            "indexFinRegion": 15602,
            "ecartType": 1.0244002,
            "hmoy": 1.7684081,
            "hmax": 2.1652849,
            "hmin": -1.8102629,
            "nbDesserrage": 0,
            "lgDesserage": 0,
            "nbDecalage": 1,
            "lstIndexDesserage": [],
            "lstIndexDecalage": [
                {
                    "indexDebut": 14452,
                    "indexFin": 14537
                }
            ],
            "isFinDesserage": false
        },
        "QueueAmont": {
            "indexDebutRegion": 15603,
            "indexFinRegion": 17928,
            "ecartType": 8.179386,
            "hmoy": 2.8047452,
            "hmax": 70.14379,
            "hmin": -2.935118,
            "nbDesserrage": 0,
            "lgDesserage": 0,
            "nbDecalage": 6,
            "lstIndexDesserage": [],
            "lstIndexDecalage": [
                {
                    "indexDebut": 15539,
                    "indexFin": 15612
                },
                {
                    "indexDebut": 16126,
                    "indexFin": 16355
                },
                {
                    "indexDebut": 16379,
                    "indexFin": 16659
                },
                {
                    "indexDebut": 17844,
                    "indexFin": 17853
                },
                {
                    "indexDebut": 17879,
                    "indexFin": 17880
                },
                {
                    "indexDebut": 17906,
                    "indexFin": 17907
                }
            ],
            "isFinDesserage": false
        }
    },
    "largeurOeil": 104.91998,
    "largeurMeplat": 0,
    "penteBobine": 0.23223895,
    "lstIndexMax": [
        {
            "isEmpty": false,
            "x": 621.4359,
            "y": 1.8798218
        },
        etc liste des max par zone détecté
    ],
    "isMeplat": false,
    "indexMeplat": {
        "indexDebut": 17926,
        "indexFin": 0
    },
    "ecartPointX": 0.042999998, // Ecart entre deux points
    "nomBobine": "123456Rapport.txt", // nomfichier
    "dataOrdonnee": [
        {
            "isEmpty": false,
            "x": 0,
            "y": 280
        },
        {
            "isEmpty": false,
            "x": 0.042999994,
            "y": 280
        }
        Liste de tous les points du graphique
      
    ],
    "largeurExterieur": 665.8119,
    "totalDesserage": 0,
    "totalDecalage": 10
}

📶 API C#

Voici le code nécéssaire à implémenter

Code des Models qui doit être transmis

Classe TraitementData


public class TraitementData
{
 
        // ===========================================================
        // Propriétés des calculs sur le profil
        public Dictionary<EnumRegionData, RegionData> ResultatProfil { get; set; } = new Dictionary<EnumRegionData, RegionData>();

        /// <summary>
        /// Largeur de l'oeil calculé
        /// </summary>
        public float LargeurOeil { get; set; }

        /// <summary>
        /// Largeur du meplat
        /// </summary>
        public float LargeurMeplat { get; set; } = 0.0f;

        /// <summary>
        /// Pente sur la bobine
        /// </summary>
        public float PenteBobine { get; set; } = 0.0f;


        /// <summary>
        /// Liste des Max pour le calcul de la pente
        /// </summary>
        public List<PointF> LstIndexMax { get; set; } = new List<PointF>();

        /// <summary>
        /// Détection si largeur méplat
        /// </summary>
        public bool IsMeplat { get; set; } = false;

        /// <summary>
        /// Liste des index où se trouve le méplat
        /// </summary>
        public DoubleIndex IndexMeplat { get; set; } = new DoubleIndex();

        /// <summary>
        /// Ecart des x par rapport à l'index
        /// </summary>
        public float EcartPointX { get; set; } = 0.0f;

        /// <summary>
        /// Nom de la Bobine
        /// </summary>
        public string NomBobine { get; set; } = "";



        /// <summary>
        /// Liste des points
        /// </summary>
        public List<PointF> DataOrdonnee { get; private set; } = new List<PointF>();

        /// <summary>
        /// Largeur Exterieur de la bobine (sans le noyau)
        /// </summary>
        public float LargeurExterieur { get;  set; }

        /// <summary>
        /// Total desserage trouvé sur la bobine
        /// </summary>
        public int TotalDesserage { get; set; }

        /// <summary>
        /// Total decalage trouvé sur la bobine
        /// </summary>
        public int TotalDecalage { get; set; }

        /// <summary>
        /// Valeur limite à fond  du capteur 
        /// </summary>
        public float ValeurMaxFondCapteur = 500.0f;

        /// <summary>
        /// 
        /// </summary>
        public DateTime dateTraitement = DateTime.MinValue;

}


    public class RegionData
    {
        /// <summary>
        /// Index Où se trouve l'index de début de région sur la List<PointF> reçu
        /// </summary>
        public int IndexDebutRegion { get; set; }

        /// <summary>
        /// Index Où se trouve l'index de fin de région sur la List<PointF> reçu
        /// </summary>
        public int IndexFinRegion { get; set; }

        /// <summary>
        /// Ecart Type de la Zone
        /// </summary>
        public float EcartType { get; set; }

        /// <summary>
        /// Il s’agit de la moyenne des distances en Y mesurées dans la zone.
        /// </summary>
        public float Hmoy { get; set; }

        /// <summary>
        /// La formule est distance maxi mesurée – la moyenne Corp (Hmoyc).
        /// </summary>
        public float Hmax { get; set; }

        /// <summary>
        /// La formule est la distance mini mesuré – la moyenne Corp
        /// </summary>
        public float Hmin { get; set; }

        /// <summary>
        /// Nombre de fois où l'on a détecté des absences de mesure supérieures ou égales à 1 mm
        /// </summary>
        public int NbDesserrage { get; set; }

        /// <summary>
        /// Cumul des longueurs unitaires de chaque desserrage.
        /// </summary>
        public float LgDesserage { get; set; }

        /// <summary>
        /// Nombre de fois ou le rapport H/L est supérieur à 0.5
        /// Ces décalages peuvent générer un risque de pliures ou de dégradations des spires et ce que ce soit en face supérieure ou inférieure.
        /// </summary>
        public int NbDecalage { get; set; }

        /// <summary>
        /// Index des Desserage de la zone 
        /// Permettant de les retrouvés 
        /// </summary>
        public List<DoubleIndex> LstIndexDesserage { get; set; } = new List<DoubleIndex>();


        /// <summary>
        /// Zone dans lequelle on a détecté un décalage
        /// </summary>
        public List<DoubleIndex> LstIndexDecalage { get; set; } = new List<DoubleIndex>();


        /// <summary>
        /// IsFinDesserage permet de savoir si à la fin on ne détecte pas un desserage entre deux zone
        /// </summary>
        public bool IsFinDesserage { get; set; }

     
       



        /// <summary>
        /// Constructeur Vide par défaut les valeurs sont 0
        /// </summary>
        public RegionData() { 
        }
    }


    public class DoubleIndex
    {
        public int IndexDebut { get; set; }

        public int IndexFin { get; set; }
    }

    public enum EnumRegionData
    {
        QueueAval,
        CorpAval,
        TeteAval,
        TeteAmont,
        CorpAmont,
        QueueAmont
    }

Classe Paramètre : Deux paramètres seront néccessairement créé


 public class Parametre
 {

     public Parametre(string Nom,string NomCode, string description,float Valeur,string DefaultValeur, string Icone,string Limite)
     {
         this.Nom = Nom;
         this.Valeur = Valeur;
         this.Icone = Icone;
         this.Description = description;
         this.DefaultValeur  = DefaultValeur;
         this.Limite = Limite;
         this.NomCode = NomCode;

     }

     /// <summary>
     /// Id auto généré du parametre
     /// </summary>
     public int IdParametre { get; set; }

     /// <summary>
     /// Nom du parametre
     /// </summary>
     public string Nom { get; set;}

     /// <summary>
     /// Nom du parametre dans le code
     /// </summary>
     public string NomCode { get; set; }

     /// <summary>
     /// Valeur du parametre
     /// </summary>
     public float Valeur { get; set;}

     /// <summary>
     /// Icone du parametre affichage
     /// </summary>
     public string Icone { get; set; }

     public string Description { get; set; }

     public string DefaultValeur { get; set; }  

     public string Limite { get; set;}

     /// <summary>
     /// Date et heure de la dernière modification 
     /// </summary>
     public DateTime DateModification { get; set; } = DateTime.Now;
 }

Et enfin à implémenté dans vos Controller (Exemple de controller)

  [Route("[controller]")]
  [ApiController]
  public class AcquisitionController : ControllerBase
  {


  }

📶 Route Paramètres

Première Route Api à indiquer Elle permet de limiter l'affichage en y, il faut indiquer la valeur maximum et la valeur minimum qu'on souhaite imposer

        /// <summary>
        /// Permet d'affecter la valeur max et la valeur minimum à afficher sur le graphique
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("Parametres")]
        public JsonResult GetParametre() // nom de fonction changeable
        {

            List<Parametre> lstParam = new();

            //                                                                                       =====> Changer cette valeur pour l'affichage du bas des y
            Parametre paramMinimumYDisplay = new Parametre("MinimumYDisplay", "MinimumYDisplay", "", -10.0f, "", "", ""); // Paramètre a modifier

            //                                                                                       =====> Changer cette valeur pour l'affichage du haut des y
            Parametre paramMaximumYDisplay = new Parametre("MaximumYDisplay", "MaximumYDisplay", "", 35.0f, "", "", ""); // Paramètre a modifier

            //Ajout des parametres dans la liste qu'on renvoit
            lstParam.Add(paramMinimumYDisplay);
            lstParam.Add(paramMaximumYDisplay);


            return new JsonResult(lstParam);
           

        }

📶 Route TraitementData

Deuxième route à faire


   /// <summary>
   /// Récupération du dernier traitement d'analyse de bobine
   /// </summary>
   /// <param name="traitementData"></param>
   /// <returns></returns>
   [HttpGet]
   [Route("TraitementData/{NomBobine}")]
   public JsonResult GetTraitementByName(String NomBobine)
   {
        var retour = null;

        if(retour == null)
        {
           
            // recherche du fichier
            string contenuFichierTraitementData = RechercheFichier(nomBobine);

            // Si le retour de la fonction nous donne bien du contenu dans le fichier
            if (contenuFichierTraitementData != "")
            {
                try
                {
                    // On va essayer de déserialisé la donnée
                    var lstParam = contenuFichierTraitementData.Split(Environment.NewLine); // La décomposition du fichier la première ligne possède la plupart des caractéristiques 

                    var DonneesBrute = lstParam[0];

                    // Serialisation des divers données de la bobine
                    TraitementData data = JsonConvert.DeserializeObject<TraitementData>(DonneesBrute);

                    
                    // Affectation du fichier de points
                    for (int i = 2; i < lstParam.Length; i++)
                    {
                        var Coordonnee = lstParam[i].Split(";"); // Décomposition des coordonnée pour chaque ligne
                        var x = 0.0f;
                        var y = 0.0f;
                        Single.TryParse(Coordonnee[0],out x); 
                        Single.TryParse(Coordonnee[1], out y);

                        data.DataOrdonnee.Add(new PointF(x,y));

                    }

                    retour = data;


                }
                catch(Exception ex)
                {
                    // Erreur lors de la décomposition
                    // Mettre trace içi

                    // retour null par défaut
                }
            } else
            {
                // Sinon on retourne null la bobine demandé n'existe pas
                // Inséré trace içi bobine non trouvé
            }


        
        }

        return new JsonResult(retour);
   }

Chargement de fichier

Une fonction sera à écrire pour finir l'implantation

    /// <summary>
    /// Fonction a implémenter où l'on doit aller lire tout le contenu du fichier
    /// </summary>
    /// <returns></returns>
    private string RechercheFichier(String NomBobine)
    {
        return "";
    }

🍬 CSS

Width prendre toute la largeur avec les deux courbes

il faut pour cela jouer avec les deep (Faire attention à l'encapsulation) Exemple en dessous

::ng-deep .flexrow{
    margin-top: 0;
    width: 49%;
}