''' <summary>
''' Classe encapsulant toutes les caractéristiques des gravillons
''' </summary>
<Serializable()> Public Class clsGravillon
    Private _NomGravillon As String = "Gravillon 10/25"
    Private _G_Vg As Integer
    Private _Vol As Integer
    Private _Masse As Integer
    Private _MasseHumide As Integer
    Dim _Qualite As Integer = 1
    Dim _Petrographie As Integer = 1
    Private _Type_Granulat As Integer = 1
    Private _Humidite As Double = 0.03
    Private _Wabs As Double = 0.0015
    Private _Densite As Double = 2.7
    Private _Mg As Double = 500
    Private _dg As Double = 10
    Private _Dmg As Double = 25
    Private _Choix_mesureGranulo As Integer = 0
    Private _Affichage_CourbeGranulo As Integer = 0
    ''' <summary>
    ''' nom du gravillon
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NomGravillon As String
        Get
            NomGravillon = _NomGravillon
        End Get
        Set(value As String)
            If Not IsString(value) Then
                Throw New ArgumentException("La valeur du nom du gravillon n'est pas une chaine de caractères.")
            Else
                _NomGravillon = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Répartition en % de gravillon dans le volume de granulats rentrant dans la composition du béton - Unité: %
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property G_Vg As Integer
        Get
            G_Vg = _G_Vg
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de répartition en % de gravillon n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de répartition en % de gravillon dans le volume de granulats ne peut être négative. La valeur indiquée est " & value.ToString & " %.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de répartition en % de gravillon dans le volume de granulats ne peut pas être supérieure à 100%. La valeur indiquée est " & value.ToString & " %.")
            Else
                _G_Vg = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Masse totale de l'échantillon de gravillon - Unité: g
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Mg As Double
        Get
            Mg = _Mg
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse totale de l'échantillon de gravillon n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de la masse totale de l'échantillon de gravillon doit être positif.")
            Else
                _Mg = value
            End If
        End Set
    End Property

    ''' <summary>
    '''classe granulaire: dmini - unité: mm
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property dg As Double
        Get
            dg = _dg
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La Valeur de la classe granulaire du Gravillon dmini n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La Valeur de la classe granulaire du Gravillon dmini doit être positive.")
            Else
                _dg = value
            End If
        End Set
    End Property

    ''' <summary>
    '''classe granulaire: D Maxi - unité: mm
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Dmg As Double
        Get
            Dmg = _Dmg
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La Valeur de la classe granulaire du Gravillon D Maxi n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La Valeur de la classe granulaire du Gravillon D Maxi doit être positive.")
            Else
                _Dmg = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Type du gravillon - Unité: 1 = granulat concassé / 2 = granulat roulé 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Forme As Integer
        Get
            Forme = _Type_Granulat
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du type de Gravillon n'est pas numérique.")
            ElseIf value <> 1 AndAlso value <> 2 Then
                Throw New ArgumentException("La valeur du type de Gravillon doit être égale à 1 ou 2. Or, elle a été renseignée égale à " & value.ToString)
            Else
                _Type_Granulat = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Qualité du gravillon - Suivant NF EN 12620+A1 et P18-545 : 1 = caractéristiques indicées A / 2 = caractéristiques indicées B / 3 = caractéristiques indicées C / 4 = caractéristiques indicées D
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Qualite As Integer
        Get
            Qualite = _Qualite
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la Qualité du gravillon n'est pas numérique.")
            ElseIf value <> 1 AndAlso value <> 2 AndAlso value <> 3 AndAlso value <> 4 Then
                Throw New ArgumentException("La valeur de la Qualité du gravillon doit être égale à 1, 2, 3 ou 4. Or, elle a été renseignée égale à " & value.ToString)
            Else
                _Qualite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Pétrographie du gravillon - Unité: 1 = Siliceux légèrement altéré / 2 = siliceux roulés / 3 = calcaire durs
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Petrographie As Integer
        Get
            Petrographie = _Petrographie
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la Pétrographie du Gravillon n'est pas numérique.")
            ElseIf value <> 1 AndAlso value <> 2 AndAlso value <> 3 Then
                Throw New ArgumentException("La valeur de la Qualité du gravillon doit être égale à 1, 2 ou 3. Or, elle a été renseignée égale à " & value.ToString)
            Else
                _Petrographie = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du gravillon - Unité: kg/dm3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite As Double
        Get
            Densite = _Densite
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité du gravillon n'est pas numérique.")
            ElseIf value < 2 OrElse value > 4 Then
                Throw New ArgumentException("La valeur de la densité du gravillon doit être comprise entre 2 et 4.")
            Else
                _Densite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Humidité du gravillon - Unité: SO - compris entre 0 et 0.5
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Humidite As Double
        Get
            Humidite = _Humidite
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de l'Humidite du gravillon n'est pas numérique.")
            ElseIf value < 0.001 OrElse value > 0.1 Then
                Throw New ArgumentException("La valeur de l'Humidite du gravillon doit être comprise entre 0% et 10%." & Environment.NewLine & "La valeur obtenue est égale à " & (value * 100).ToString("#0") & " %.")
            Else
                _Humidite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Coefficient d'absorption d'eau du gravillon - Unité: % - compris entre 0.0001 et 0.02 soit entre 0,01% et 2 %
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Wabs As Double
        Get
            Wabs = _Wabs
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Coefficient d'absorption d'eau du gravillon n'est pas numérique.")
            ElseIf value < 0.00001 OrElse value > 0.02 Then
                Throw New ArgumentException("La valeur du Coefficient d'absorption d'eau du gravillon doit être comprise entre 0,01% et 2%." & Environment.NewLine & "La valeur obtenue est égale à " & (value * 100).ToString("#0") & " %.")
            Else
                _Wabs = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Volume de gravillon rentrant dans la composition d'1 m3 de béton - Unité: L (ou dm3)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Vol As Integer
        Get
            Vol = _Vol
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du volume de gravillon n'est pas numérique.")
            ElseIf value < 1 OrElse value > 850 Then
                Throw New ArgumentException("La valeur du volume de gravillon doit être comprise entre 1 et 850.")
            Else
                _Vol = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Masse de gravillon rentrant dans la composition d'1 m3 de béton - Unité: L (ou dm3)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Masse As Integer
        Get
            Masse = _Masse
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse de gravillon n'est pas numérique.")
            ElseIf value < 1 OrElse value > 4000 Then
                Throw New ArgumentException("La valeur de la masse de gravillon doit être comprise entre 10 et 4000.")
            Else
                _Masse = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Masse de gravillon humide rentrant dans la composition d'1 m3 de béton - Unité: kg
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property MasseHumide As Integer
        Get
            MasseHumide = _Massehumide
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse de gravillon n'est pas numérique.")
            ElseIf value < 1 OrElse value > 4000 Then
                Throw New ArgumentException("La valeur de la masse de gravillon doit être comprise entre 10 et 4000.")
            Else
                _Massehumide = value
            End If
        End Set
    End Property



    ''' <summary>
    '''Choix du mode de mesure granulométrique - Unité: 0 = refus en g / 1 = refus cumulé en g / 2 = refus cumulé en % / 3 = tamisat cumulé en g / 4 = tamisat cumulé en % 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Choix_mesureGranulo As Integer
        Get
            Choix_mesureGranulo = _Choix_mesureGranulo
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Choix du mode de mesure granulométrique n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur du Choix du mode de mesure granulométrique doit être comprise entre 0 et 4.")
            ElseIf value > 4 Then
                Throw New ArgumentException("La valeur du Choix du mode de mesure granulométrique doit être comprise entre 0 et 4.")
            Else
                _Choix_mesureGranulo = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Choix du gravillon affiché dans la courbe granulométrique - Unité: 0 = aucune courbe/ 1 = affichage de la courbe
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Affichage_CourbeGranulo As Integer
        Get
            Affichage_CourbeGranulo = _Affichage_CourbeGranulo
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Choix de la courbe granulométrique n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur du Choix de la courbe granulométrique doit être comprise entre 0 et 1.")
            ElseIf value > 1 Then
                Throw New ArgumentException("La valeur du Choix de la courbe granulométrique doit être comprise entre 0 et 1.")
            Else
                _Affichage_CourbeGranulo = value
            End If
        End Set
    End Property

    ''' <summary>
    ''' Tamis normalisé pour établir les courbes granulométriques des composants du béton pour le gravillon - unité: mm
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property Disponibilite_Tamis As New Dictionary(Of Double, Boolean) From {{1, False}, {1.25, True}, {1.6, False}, {2, False}, {2.5, True}, {3.15, False}, {4, False}, {5, True}, {6.3, False}, {8, False},
                                                                                                                {10, True}, {12.5, False}, {16, False}, {20, False}, {25, False}, {31.5, False}, {40, False}, {50, False}, {63, False}, {80, False}}
    ''' <summary>
    ''' Tamis normalisé pour établir les courbes granulométriques des composants du béton pour le gravillon - unité: en valeurs booléennes
    ''' </summary>
    Public Property Disponibilite_Tamis_Bool As New List(Of Boolean)

    ''' <summary>
    '''Refus - Clé: dimension du tamis - Valeur: refus en g
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Refus As New Dictionary(Of Double, Double) From {{1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}, {12.5, 0}, {16, 0}, {20, 0}, {25, 0}, {31.5, 0}, {40, 0}, {50, 0}, {63, 0}, {80, 0}}

    ''' <summary>
    '''Refus cumulé en g - Clé: dimension du tamis - Valeur: refus en g
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public RefusCumule_g As New Dictionary(Of Double, Double) From {{1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}, {12.5, 0}, {16, 0}, {20, 0}, {25, 0}, {31.5, 0}, {40, 0}, {50, 0}, {63, 0}, {80, 0}}

    ''' <summary>
    '''Refus cumulé en % - Clé: dimension du tamis - Valeur: refus en %
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public RefusCumule_Pourcent As New Dictionary(Of Double, Double) From {{1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}, {12.5, 0}, {16, 0}, {20, 0}, {25, 0}, {31.5, 0}, {40, 0}, {50, 0}, {63, 0}, {80, 0}}

    ''' <summary>
    '''Tamisat cumulé en g - Clé: dimension du tamis - Valeur: Tamisat en g
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public TamisatCumule_g As New Dictionary(Of Double, Double) From {{1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}, {12.5, 0}, {16, 0}, {20, 0}, {25, 0}, {31.5, 0}, {40, 0}, {50, 0}, {63, 0}, {80, 0}}

    ''' <summary>
    '''Tamisat cumulé en % - Clé: dimension du tamis - Valeur: Tamisat en %
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public TamisatCumule_Pourcent As New Dictionary(Of Double, Double) From {{1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}, {12.5, 0}, {16, 0}, {20, 0}, {25, 0}, {31.5, 0}, {40, 0}, {50, 0}, {63, 0}, {80, 0}}

    ''' <summary>
    '''Valeurs Tamisat ou Refus, cumulé ou pas, en % ou grammes suivant la valeur du Choix du mode de mesure granulométrique - Unité: 0 = refus en g / 1 = refus cumulé en g / 2 = refus cumulé en % / 3 = tamisat cumulé en g / 4 = tamisat cumulé en % 
    ''' </summary>
    Public Val_Tamisat_Refus As New List(Of Double)

    ''' <summary>Programme de calcul des tamisats de l'échantillon de gravillon</summary>
    '''  <param name="i_Tamisat">0= refus / 1= refus cumulé g refus cumulé %  tamisat cumulé g  tamisat cumulé %</param>
    Public Sub CalculTamisat(ByVal i_Tamisat As Integer)
        Dim Som As Double
        Select Case i_Tamisat
            Case 0 'refus
                If Disponibilite_Tamis(80) = True Then RefusCumule_g.Item(80) = Refus(80)
                If Disponibilite_Tamis(63) = True Then RefusCumule_g(63) = Refus.Item(80) + Refus.Item(63)
                If Disponibilite_Tamis(50) = True Then RefusCumule_g.Item(50) = Refus.Item(80) + Refus.Item(63) + Refus(50)
                If Disponibilite_Tamis(40) = True Then RefusCumule_g(40) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40)
                If Disponibilite_Tamis(31.5) = True Then RefusCumule_g(31.5) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5)
                If Disponibilite_Tamis(25) = True Then RefusCumule_g.Item(25) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25)
                If Disponibilite_Tamis(20) = True Then RefusCumule_g.Item(20) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20)
                If Disponibilite_Tamis(16) = True Then RefusCumule_g(16) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20) + Refus.Item(16)
                If Disponibilite_Tamis(12.5) = True Then RefusCumule_g(12.5) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20) + Refus.Item(16) + Refus.Item(12.5)
                If Disponibilite_Tamis(10) = True Then RefusCumule_g.Item(10) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20) + Refus.Item(16) + Refus.Item(12.5) + Refus(10)
                If Disponibilite_Tamis(8) = True Then RefusCumule_g(8) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20) + Refus.Item(16) + Refus.Item(12.5) + Refus(10) + Refus.Item(8)
                If Disponibilite_Tamis(6.3) = True Then RefusCumule_g(6.3) = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20) + Refus.Item(16) + Refus.Item(12.5) + Refus(10) + Refus.Item(8) + Refus.Item(6.3)
                Som = Refus.Item(80) + Refus.Item(63) + Refus(50) + Refus.Item(40) + Refus.Item(31.5) + Refus(25) + Refus(20) + Refus.Item(16) + Refus.Item(12.5) + Refus(10) + Refus.Item(8) + Refus.Item(6.3)
                If Disponibilite_Tamis(5) = True Then RefusCumule_g.Item(5) = Som + Refus(5)
                If Disponibilite_Tamis(4) = True Then RefusCumule_g.Item(4) = Som + Refus(5) + Refus(4)
                If Disponibilite_Tamis(3.15) = True Then RefusCumule_g.Item(3.15) = Som + Refus(5) + Refus(4) + Refus(3.15)
                If Disponibilite_Tamis(2.5) = True Then RefusCumule_g.Item(2.5) = Som + Refus(5) + Refus(4) + Refus(3.15) + Refus(2.5)
                If Disponibilite_Tamis(2) = True Then RefusCumule_g(2) = Som + Refus(5) + Refus(4) + Refus(3.15) + Refus(2.5) + Refus(2)
                If Disponibilite_Tamis(1.6) = True Then RefusCumule_g(1.6) = Som + Refus(5) + Refus(4) + Refus(3.15) + Refus(2.5) + Refus(1.6)
                If Disponibilite_Tamis(1.25) = True Then RefusCumule_g(1.25) = Som + Refus(5) + Refus(4) + Refus(3.15) + Refus(2.5) + Refus(1.6) + Refus(1.25)
                If Disponibilite_Tamis(1) = True Then RefusCumule_g(1) = Som + Refus(5) + Refus(4) + Refus(3.15) + Refus(2.5) + Refus(1.6) + Refus(1.25) + Refus(1)

                'Tamisat cumulé en g
                Call TamisatCumuleG()
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
            Case 1 'refus cumulé g
                'Tamisat cumulé en g
                Call TamisatCumuleG()
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
            Case 2 'refus cumulé %
                If Disponibilite_Tamis(1) = True Then RefusCumule_g(1) = RefusCumule_Pourcent(1) * Mg / 100 Else RefusCumule_g(1) = 0
                If Disponibilite_Tamis(1.25) = True Then RefusCumule_g(1.25) = RefusCumule_Pourcent(1.25) * Mg / 100 Else RefusCumule_g(1.25) = 0
                If Disponibilite_Tamis(1.6) = True Then RefusCumule_g(1.6) = RefusCumule_Pourcent(1.6) * Mg / 100 Else RefusCumule_g(1.6) = 0
                If Disponibilite_Tamis(2) = True Then RefusCumule_g(2) = RefusCumule_Pourcent(2) * Mg / 100 Else RefusCumule_g(2) = 0
                If Disponibilite_Tamis(2.5) = True Then RefusCumule_g(2.5) = RefusCumule_Pourcent(2.5) * Mg / 100 Else RefusCumule_g(2.5) = 0
                If Disponibilite_Tamis(3.15) = True Then RefusCumule_g(3.15) = RefusCumule_Pourcent(3.15) * Mg / 100 Else RefusCumule_g(3.15) = 0
                If Disponibilite_Tamis(4) = True Then RefusCumule_g(4) = RefusCumule_Pourcent(4) * Mg / 100 Else RefusCumule_g(4) = 0
                If Disponibilite_Tamis(5) = True Then RefusCumule_g(5) = RefusCumule_Pourcent(5) * Mg / 100 Else RefusCumule_g(5) = 0
                If Disponibilite_Tamis(6.3) = True Then RefusCumule_g(6.3) = RefusCumule_Pourcent(6.3) * Mg / 100 Else RefusCumule_g(6.3) = 0
                If Disponibilite_Tamis(8) = True Then RefusCumule_g(8) = RefusCumule_Pourcent(8) * Mg / 100 Else RefusCumule_g(8) = 0
                If Disponibilite_Tamis(10) = True Then RefusCumule_g(10) = RefusCumule_Pourcent(10) * Mg / 100 Else RefusCumule_g(10) = 0
                If Disponibilite_Tamis(12.5) = True Then RefusCumule_g(12.5) = RefusCumule_Pourcent(12.5) * Mg / 100 Else RefusCumule_g(12.5) = 0
                If Disponibilite_Tamis(16) = True Then RefusCumule_g(16) = RefusCumule_Pourcent(16) * Mg / 100 Else RefusCumule_g(16) = 0
                If Disponibilite_Tamis(20) = True Then RefusCumule_g(20) = RefusCumule_Pourcent(20) * Mg / 100 Else RefusCumule_g(20) = 0
                If Disponibilite_Tamis(25) = True Then RefusCumule_g(25) = RefusCumule_Pourcent(25) * Mg / 100 Else RefusCumule_g(25) = 0
                If Disponibilite_Tamis(31.5) = True Then RefusCumule_g(31.5) = RefusCumule_Pourcent(31.5) * Mg / 100 Else RefusCumule_g(31.5) = 0
                If Disponibilite_Tamis(40) = True Then RefusCumule_g(40) = RefusCumule_Pourcent(40) * Mg / 100 Else RefusCumule_g(40) = 0
                If Disponibilite_Tamis(50) = True Then RefusCumule_g(50) = RefusCumule_Pourcent(50) * Mg / 100 Else RefusCumule_g(50) = 0
                If Disponibilite_Tamis(63) = True Then RefusCumule_g(63) = RefusCumule_Pourcent(63) * Mg / 100 Else RefusCumule_g(63) = 0
                If Disponibilite_Tamis(80) = True Then RefusCumule_g(80) = RefusCumule_Pourcent(80) * Mg / 100 Else RefusCumule_g(80) = 0
                'Tamisat cumulé en g
                Call TamisatCumuleG()
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
            Case 3 'tamisat cumulé g
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
            Case 4 ' tamisat cumulé %
                'rien à faire - les données de la courbe granulométrique sont en tamisat cumulé %
        End Select
    End Sub

    ''' <summary>
    ''' Programme de calcul du tamisat cumulé en % de l'échantillon de gravillon
    ''' </summary>
    Private Sub TamisatCumulePourcent()
        If Disponibilite_Tamis(1) = True Then TamisatCumule_Pourcent(1) = TamisatCumule_g(1) * 100 / Mg
        If Disponibilite_Tamis(1.25) = True Then TamisatCumule_Pourcent(1.25) = TamisatCumule_g(1.25) * 100 / Mg
        If Disponibilite_Tamis(1.6) = True Then TamisatCumule_Pourcent(1.6) = TamisatCumule_g(1.6) * 100 / Mg
        If Disponibilite_Tamis(2) = True Then TamisatCumule_Pourcent(2) = TamisatCumule_g(2) * 100 / Mg
        If Disponibilite_Tamis(2.5) = True Then TamisatCumule_Pourcent(2.5) = TamisatCumule_g(2.5) * 100 / Mg
        If Disponibilite_Tamis(3.15) = True Then TamisatCumule_Pourcent(3.15) = TamisatCumule_g(3.15) * 100 / Mg
        If Disponibilite_Tamis(4) = True Then TamisatCumule_Pourcent(4) = TamisatCumule_g(4) * 100 / Mg
        If Disponibilite_Tamis(5) = True Then TamisatCumule_Pourcent(5) = TamisatCumule_g(5) * 100 / Mg
        If Disponibilite_Tamis(6.3) = True Then TamisatCumule_Pourcent(6.3) = TamisatCumule_g(6.3) * 100 / Mg
        If Disponibilite_Tamis(8) = True Then TamisatCumule_Pourcent(8) = TamisatCumule_g(8) * 100 / Mg
        If Disponibilite_Tamis(10) = True Then TamisatCumule_Pourcent(10) = TamisatCumule_g(10) * 100 / Mg
        If Disponibilite_Tamis(12.5) = True Then TamisatCumule_Pourcent(12.5) = TamisatCumule_g(12.5) * 100 / Mg
        If Disponibilite_Tamis(16) = True Then TamisatCumule_Pourcent(16) = TamisatCumule_g(16) * 100 / Mg
        If Disponibilite_Tamis(20) = True Then TamisatCumule_Pourcent(20) = TamisatCumule_g(20) * 100 / Mg
        If Disponibilite_Tamis(25) = True Then TamisatCumule_Pourcent(25) = TamisatCumule_g(25) * 100 / Mg
        If Disponibilite_Tamis(31.5) = True Then TamisatCumule_Pourcent(31.5) = TamisatCumule_g(31.5) * 100 / Mg
        If Disponibilite_Tamis(40) = True Then TamisatCumule_Pourcent(40) = TamisatCumule_g(40) * 100 / Mg
        If Disponibilite_Tamis(50) = True Then TamisatCumule_Pourcent(50) = TamisatCumule_g(50) * 100 / Mg
        If Disponibilite_Tamis(63) = True Then TamisatCumule_Pourcent(63) = TamisatCumule_g(63) * 100 / Mg
        If Disponibilite_Tamis(80) = True Then TamisatCumule_Pourcent(80) = TamisatCumule_g(80) * 100 / Mg
    End Sub

    ''' <summary>
    ''' Programme de calcul du tamisat cumulé en g de l'échantillon de gravillon
    ''' </summary>
    Private Sub TamisatCumuleG()
        If Disponibilite_Tamis(1) = True Then TamisatCumule_g(1) = Mg - RefusCumule_g(1)
        If Disponibilite_Tamis(1.25) = True Then TamisatCumule_g(1.25) = Mg - RefusCumule_g(1.25)
        If Disponibilite_Tamis(1.6) = True Then TamisatCumule_g(1.6) = Mg - RefusCumule_g(1.6)
        If Disponibilite_Tamis(2) = True Then TamisatCumule_g(2) = Mg - RefusCumule_g(2)
        If Disponibilite_Tamis(2.5) = True Then TamisatCumule_g(2.5) = Mg - RefusCumule_g(2.5)
        If Disponibilite_Tamis(3.15) = True Then TamisatCumule_g(3.15) = Mg - RefusCumule_g(3.15)
        If Disponibilite_Tamis(4) = True Then TamisatCumule_g(4) = Mg - RefusCumule_g(4)
        If Disponibilite_Tamis(5) = True Then TamisatCumule_g(5) = Mg - RefusCumule_g(5)
        If Disponibilite_Tamis(6.3) = True Then TamisatCumule_g(6.3) = Mg - RefusCumule_g(6.3)
        If Disponibilite_Tamis(8) = True Then TamisatCumule_g(8) = Mg - RefusCumule_g(8)
        If Disponibilite_Tamis(10) = True Then TamisatCumule_g(10) = Mg - RefusCumule_g(10)
        If Disponibilite_Tamis(12.5) = True Then TamisatCumule_g(12.5) = Mg - RefusCumule_g(12.5)
        If Disponibilite_Tamis(16) = True Then TamisatCumule_g(16) = Mg - RefusCumule_g(16)
        If Disponibilite_Tamis(20) = True Then TamisatCumule_g(20) = Mg - RefusCumule_g(20)
        If Disponibilite_Tamis(25) = True Then TamisatCumule_g(25) = Mg - RefusCumule_g(25)
        If Disponibilite_Tamis(31.5) = True Then TamisatCumule_g(31.5) = Mg - RefusCumule_g(31.5)
        If Disponibilite_Tamis(40) = True Then TamisatCumule_g(40) = Mg - RefusCumule_g(40)
        If Disponibilite_Tamis(50) = True Then TamisatCumule_g(50) = Mg - RefusCumule_g(50)
        If Disponibilite_Tamis(63) = True Then TamisatCumule_g(63) = Mg - RefusCumule_g(63)
        If Disponibilite_Tamis(80) = True Then TamisatCumule_g(80) = Mg - RefusCumule_g(80)
    End Sub

    ''' <summary>
    ''' Fonction permettant de vérifier que la valeur transmise est bien numérique
    ''' </summary>
    ''' <returns>TRUE si la valeur est bien numérique sinon FALSE</returns>
    ''' <remarks></remarks>
    Private Function IsNumeric(Expression As Object) As Boolean
        Dim isNum As Boolean 'Variable to collect the Return value of the TryParse method.
        Dim retNum As Double ' Define variable to collect out parameter of the TryParse method. If the conversion fails, the out parameter Is zero.

        '// The TryParse method converts a string in a specified style And culture-specific format to its double-precision floating point number equivalent.
        '// The TryParse method does Not generate an exception if the conversion fails. If the conversion passes, True Is returned. If it does Not, False Is returned.
        isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, retNum)
        Return isNum
    End Function

    ''' <summary>
    ''' Fonction permettant de vérifier que la valeur transmise est bien une chaine de caractères
    ''' </summary>
    ''' <returns>TRUE si la valeur est bien une chaine de caractères sinon FALSE</returns>
    ''' <remarks></remarks>
    Private Function IsString(Expression As Object) As Boolean
        Dim isStr As Boolean 'Variable to collect the Return value of the Convert.ToString method.
        Dim retStr As String '  
        '// The Convert.ToString method does Not generate an exception if the conversion fails. If the conversion passes, True Is returned. If it does Not, False Is returned.
        retStr = Convert.ToString(Expression)
        If retStr = "" Then
            isStr = False
        Else
            isStr = True
        End If
        Return isStr
    End Function
End Class
