IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

votre avis sur comment créer une fonctionalité de calculs


Sujet :

Windows Forms

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 014
    Points
    2 014
    Par défaut votre avis sur comment créer une fonctionalité de calculs
    Bonjour

    Je développe une application dont le but est d'interpréter des données issues de capteurs et rangées dans un fichier CSV.
    Une première partie consiste à afficher les données de manière chronologique (tracer des courbes), de pouvoir zoomer, détailler => pas de problème.
    Je dois ensuite faire des statistiques sur ces données (20% du temps avec capteur1 à 1, 24% du temps avec ca ET ca, 30% du temps avec la température qui est non conforme etc etc) => pas de problème.

    Maintenant je souhaite pouvoir ajouter des séries de données calculées afin de les afficher et de pouvoir les ajouter comme des "règles" de stat. Cela revient à créer des nouvelles séries de data à partir de calculs sur les datas déjà disponibles.
    Exemple, si au départ j'ai en data temperature1, température 2, état (1ou 0) du capteur 1, état du capteur 2, état du capteur 3...), je souhaite pouvoir créer une autre série de données qui POURRAIT être PAR EXEMPLE :
    puissance = (temperature1 - température 2)*constante
    mode "AllGood" = capteur 1 et 2 à un ET température 1 >34°
    etc etc
    J'ai donc besoin d'une certaine flexibilité pour faire des calculs logiques ou mathématiques DEFINIS PAR L'UTILISATEUR.
    Les séries de data peuvent atteindre plusieurs centaines de milliers (X00 000) de points.

    Là je ne sais pas comment faire...
    J'ai pensé à de l'automation avec EXCEL mais ne connaissant pas je suis dans le vague.

    Quel serait selon vous les solutions possibles pour faire cela en C# ?

    Merci par avance pour vos avis et conseils.
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut stat sur excel,fonction UDF COM
    Bonjour petitours
    Fonctions plus ou moins personnalisees sur Excel en Com avec necessairrement stockage des donnees de base(fichiers .CSV sur Excel
    Limitation d'excel:
    Office 2003
    ------------
    1/maximum de lignes:65536
    2/maximum de colonnnes: 256

    Office 2010
    ------------
    1/maximum de lignes:1048576 COLONNES
    2/maximum de colonnnes:16384
    Si ces limitations ne te genent pas voici un exemple de ce qu'il est possible de faire en vb.net ou c# avec une interface com et une classe de base qu'on peut etendre à souhait pour "generer" d'autres series et stocker les resultats dans excel bien entendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    'INFORMATION SITE MICROSOFT:
    'OFFICE 2003
    'MAXIMUM FEUILLES  SUR UN CLASSEUR OUVERT:LIMITE PAR PAR MEMOIRE DISPONIBLE
    'CAPACITE D'UNE FEUILLE:65536 LIGNES X 256 COLONNES
    'OFFICE 2010
    'MAXIMUM FEUILLES  SUR UN CLASSEUR OUVERT
    'CAPACITE D'UNE FEUILLE:1048576 LIGNES X 16384 COLONNES
     
    '1/Noter qu'il ne s'agit que de fonctions utilisateurs UDF(user defined function)
    '2/les UDF necessitent un enregistrement avec utilitaire Regasm.exe sur la machine client.   
    '3/Si l'on veut des Sub on utilise l'Add-In VSTO ou un Document Classeur  VSTO
    Option Explicit On
    Option Strict Off
    Option Compare Text
    Imports System
    Imports System.Windows.Forms
    Imports System.Runtime.InteropServices
    Imports Microsoft.Win32
    Imports Microsoft.Office.Interop
     
    'Interface Publique Com
    Public Interface IStatFonctions
        Function SeriesDeltaTemp(ByVal TargetRange1 As Excel.Range, ByVal TargetRange2 As Excel.Range) As Object(,)
        Function seriesPuissance(ByVal TargetDeltaTemp As Excel.Range, ByVal TargetCapt1Mode As Excel.Range, ByVal TargetCapt2Mode As Excel.Range, ByVal CondTemp As Double) As Object(,)
        Function EchoInput(ByVal v1 As Integer) As String
        Function DiviserParDeux(ByVal D As Double) As Double
        Function DivideParQuatre(ByVal D As Double) As Double
        Function ProduitTableau(ByVal nRow As Integer, ByVal nColumn As Integer) As Double(,)
    End Interface
    'Classe Com Fonction implementant l'interface Publique Com
    <ComDefaultInterface(GetType(IStatFonctions))> _
    Public Class StatCom
        Implements IStatFonctions
     
     
     
    #Region "GUID COM"
        ' Ces GUID fournissent l'identité COM pour cette classe 
        ' et ses interfaces COM. Si vous les modifiez, les clients 
        ' existants ne pourront plus accéder à la classe.
        Public Const ClassId As String = "6b03181b-ecd7-4588-8779-ee92e5f78277"
        Public Const InterfaceId As String = "866864a1-6689-452b-9068-44ff1be7a46f"
        Public Const EventsId As String = "2de8dfe3-de61-4f32-8fca-8d8e29fa871c"
    #End Region
     
        ' Une classe COM pouvant être créée doit avoir Public Sub New() 
        ' sans paramètre, sinon, la classe ne sera pas 
        ' inscrite dans le Registre COM et ne pourra pas être créée 
        ' via CreateObject.
     
        Public Sub New()
            MyBase.New()
        End Sub
        'fonction chaine
        Public Function EchoInput1(ByVal v1 As Integer) As String Implements IStatFonctions.EchoInput
            Return "You entered " & v1.ToString
        End Function
        'fonction numerique 1
        Public Function DiviserParDeux1(ByVal D As Double) As Double Implements IStatFonctions.DiviserParDeux
            Return D / 2
        End Function
        'fonction numerique 2
        Public Function DivideParQuatre1(ByVal D As Double) As Double Implements IStatFonctions.DivideParQuatre
            Return D / 4
        End Function
        'fonction numerique 3
        Public Function ProduitTableau(ByVal nRow As Integer, ByVal nColumn As Integer) As Double(,) Implements IStatFonctions.ProduitTableau
            Dim V1(,) As Double
            Dim V2(,) As Double
            Dim Produit(,) As Double
            ReDim V1(nRow, nColumn)
            ReDim V2(nRow, nColumn)
            ReDim Produit(nRow, nColumn)
            For I As Integer = 0 To nRow - 1
                For J As Integer = 0 To nColumn - 1
                    V1(I, J) = 50.5 + I
                    V2(I, J) = 105.2 + J
                    Produit(I, J) = V1(I, J) * V2(I, J)
                Next
            Next I
            Return Produit
        End Function
        Public Function SeriesDeltaTemp(ByVal TargetRange1 As Excel.Range, ByVal TargetRange2 As Excel.Range) As Object(,) Implements IStatFonctions.SeriesDeltaTemp
     
            Dim resultatDeltaTemps(TargetRange1.Rows.Count, TargetRange1.Columns.Count) As Object
            For I As Integer = 1 To TargetRange1.Rows.Count
                For J As Integer = 1 To TargetRange1.Columns.Count
                    resultatDeltaTemps(I - 1, J - 1) = TargetRange1(I, J).value - TargetRange2(I, J).value
                Next
     
            Next
            Return resultatDeltaTemps
        End Function
        Public Function seriesPuissance(ByVal TargetDeltaTemp As Excel.Range, ByVal TargetCapt1Mode As Excel.Range, ByVal TargetCapt2Mode As Excel.Range, ByVal CondTemp As Double) As Object(,) Implements IStatFonctions.seriesPuissance
            Dim resultatPuissTemp(TargetDeltaTemp.Rows.Count, TargetDeltaTemp.Columns.Count) As Object
            For I As Integer = 1 To TargetDeltaTemp.Rows.Count
                For J As Integer = 1 To TargetDeltaTemp.Columns.Count
                    If TargetCapt1Mode(I, J).value = "AllGood" And TargetCapt2Mode(I, J).value = "AllGood" Then
                        If CondTemp > 34.0 Then
                            resultatPuissTemp(I - 1, J - 1) = 100.0 * TargetDeltaTemp(I, J).value
                        End If
                    End If
                Next
            Next
     
            Return resultatPuissTemp
        End Function
        <ComRegisterFunctionAttribute()> _
          Public Shared Sub RegisterFunction(ByVal type As Type)
            Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type))
     
        End Sub
        <ComUnregisterFunctionAttribute()> _
        Public Shared Sub UnregisterFunction(ByVal type As Type)
            Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type))
     
        End Sub
        Private Shared Function GetSubKeyName(ByVal type As Type) As String
     
            Dim s As String = "CLSID\\{" + type.GUID.ToString().ToUpper() + "}\\Programmable"
            Return s
        End Function
     
     
    End Class
    1/Projet librairie Normal.
    2/Ajouter une classe
    3/Cocher inscrire pour COM avant de generer.
    4/Apres generation
    -lancer Excel
    -faire Outils->Macro Complementaires->Automatisation->Boite Dialogue Serveur Automation :recherche ta dll (elle apparait ainsi :
    NomFichierDll.NameSpace).
    -cliker Ok au message du wrapper mscoree.dll
    -Revenir à excel.
    -Faire Inser Fonction et rechercher les fonctions sous les noms declares.

    Bien entendu tu peux aussi utiliser un classeur VSTO Excel du genre Template te que tu donnes à chaque utilisateur avec les donnees .
    Que tu personnalises avec des menus et des fenetres pour les fonctions en C# sharp pour chaque feuille (le template est accompage d'une dll que tu auras genere dans le classeur modele).
    bon code...

    -


    piece jointe :Fichier Excel de cet exemple.

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut excel udf com ,vsto et series statistiques
    Bonjour petitours
    pardon j'ai oublie le fichier excel en ci-joint.

    bonne soiree

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    J'ai donc besoin d'une certaine flexibilité pour faire des calculs logiques ou mathématiques DEFINIS PAR L'UTILISATEUR.
    Là je ne sais pas comment faire...
    Quel serait selon vous les solutions possibles pour faire cela en C# ?
    La solution consiste à utiliser la compilation automatique de code (CODEDOM), ce qui laisse ) à l'utilisateur la possibilité de définir un bout du code à exécuter, par exemple cette condition : "(Capteur [1]==1 && Capteur[2]==1) && Temperature[1]>34" que tu peux intégrer dans le code compilé dynamiquement puis exécuter.

    Voir : http://vincentlaine.developpez.com/tuto/dotnet/codedom/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Graffito Voir le message
    La solution consiste à utiliser la compilation automatique de code (CODEDOM)
    ...
    Voir : http://vincentlaine.developpez.com/tuto/dotnet/codedom/
    On peut rajouter à cela l'exemple "calcul par compilation dynamique de formule" que j'avais posté il y a ... un certain temps :

    http://www.developpez.net/forums/d47...ion-dynamique/

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 014
    Points
    2 014
    Par défaut
    Bonjour

    Je reviens dire merci...
    Vos réponses sont super mais je suis un peu short pour les traiter rapidement.
    A tel point que j'ai peur de passer pour un ingrat avant de revenir vers vous !
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

Discussions similaires

  1. Votre avis sur une proposition de job
    Par plex dans le forum Emploi
    Réponses: 7
    Dernier message: 18/01/2007, 10h11
  2. Votre avis sur une bannière animée developpez.com
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 14
    Dernier message: 02/02/2005, 07h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo