Public Class clsAddition
    Private _L_dens As Double = 2.7
    Private _L_k As Double = 0.25
    Private _LL_dens As Double = 2.7
    Private _LL_k As Double = 0.25
    Private _S_dens As Double = 3.1
    Private _S_k As Double = 0.9
    Private _V_dens As Double = 3
    Private _V_k As Double = 0.5
    Private _W_dens As Double = 3
    Private _W_k As Double = 0.5
    Private _D_dens As Double = 3.06
    Private _D_k As Double = 2
    Private _MK_dens As Double = 2.5
    Private _MK_k As Double = 1
    Private _U_dens As Double = 2.7
    Private _U_k As Double = 0.25
    Private _Addition As Integer = 0
    Private _Addition_MV As Double = 0.2
    Private _Addition_k As Double = 1
    Private _QuantiteImpose As Integer = 0
    Private _Quantite As Integer = 0
#Region "Valeurs génériques"

    ''' <summary>
    '''Addition de fines au béton - Unité: 0 pour aucune addition / 1 pour Fines Calcaires catégorie A/ 2 pour Fines Calcaires catégorie B  / 3 pour Cendres volantes siliceuses / 4 pour Laitier vitrifié / 5 pour fumées de silice
    '''6 pour Addition siliceuse de minéralogie QZ / 7 pour Fines Métakaolin
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Addition As Integer
        Get
            Addition = _Addition
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de l'Addition n'est pas numérique.")
            ElseIf value < 0 OrElse value > 7 Then
                Throw New ArgumentException("La valeur de l'Addition doit être comprise entre 0 et 7.")
            Else
                _Addition = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Masse Volumique de l'Addition de fines au béton - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property MV As Double
        Get
            MV = _Addition_MV
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse volumique de l'Addition n'est pas numérique.")
            ElseIf value < 0.1 Then
                Throw New ArgumentException("La valeur de la masse volumique de l'Addition ne peut être inférieure à 0,1 T/m3.")
            Else
                _Addition_MV = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Coefficient k de l'Addition de fines au béton - Unité:  SO
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property k As Double
        Get
            k = _Addition_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k de l'Addition n'est pas numérique.")
            ElseIf value < 0.1 OrElse value > 2 Then
                Throw New ArgumentException("La valeur du coefficient k de l'Addition doit être comprise entre 0,1 et 2.")
            Else
                _Addition_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Quantité d'Addition de fines au béton - Unité: kg/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Quantite As Integer
        Get
            Quantite = _Quantite
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la quantité en kg/m3 de l'Addition n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de la quantité en kg/m3 de l'Addition doit être positive.")
            Else
                _Quantite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Les caractéristiques de l'Addition sont identiques aux valeurs types (voir formulaire de configuration) - Unité: True pour valeur type / False si valeurs différentes
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ValType As Boolean = True

    ''' <summary>
    '''Addition venant Exclusivement, en complément au volume de fines pour atteindre le volume optimal - Unité: True si c'est le cas / False dans le cas contraire
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ComplementFines As Boolean = False

    ''' <summary>
    '''Indique si le projeteur impose une quantité d'Addition - Unité: True si c'est le cas / False dans le cas contraire
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Q_Impose As Boolean = False

    ''' <summary>
    '''Quantité d'Addition imposée - Unité: kg/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property QuantiteImpose As Integer
        Get
            QuantiteImpose = _QuantiteImpose
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la quantité en kg/m3 de l'Addition n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de la quantité en kg/m3 de l'Addition doit être positive.")
            Else
                _QuantiteImpose = value
            End If
        End Set
    End Property

#End Region

#Region "Caractéristiques des additions de type calcaire, fumée de silice, cendre volante, etc. ..."

    ''' <summary>
    '''Densité du calcaire de type L - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property L_dens As Double
        Get
            L_dens = _L_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2 OrElse value > 3.5 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2 et 3,5.")
            Else
                _L_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k du calcaire de type L - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property L_k As Double
        Get
            L_k = _L_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0 OrElse value > 1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0 et 1.")
            Else
                _L_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du calcaire de type LL - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property LL_dens As Double
        Get
            LL_dens = _LL_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2 OrElse value > 3.5 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2 et 3,5.")
            Else
                _LL_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k du calcaire de type LL - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property LL_k As Double
        Get
            LL_k = _LL_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0 OrElse value > 1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0 et 1.")
            Else
                _LL_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du laitier vitrifiés moulus de haut-fourneau - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property S_dens As Double
        Get
            S_dens = _S_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2 OrElse value > 3.5 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2 et 3,5.")
            Else
                _S_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k du laitier vitrifiés moulus de haut-fourneau - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property S_k As Double
        Get
            S_k = _S_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0.5 OrElse value > 1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0.5 et 1.")
            Else
                _S_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité de la cendre volante siliceuse - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property V_dens As Double
        Get
            V_dens = _V_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2 OrElse value > 3.5 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2 et 3,5.")
            Else
                _V_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k de la cendre volante siliceuse - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property V_k As Double
        Get
            V_k = _V_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0.35 OrElse value > 1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0.35 et 1.")
            Else
                _V_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité de la cendre volante calcique - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property W_dens As Double
        Get
            W_dens = _W_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2 OrElse value > 3.5 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2 et 3,5.")
            Else
                _W_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k de la cendre volante calcique - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property W_k As Double
        Get
            W_k = _W_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0.35 OrElse value > 1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0.35 et 1.")
            Else
                _W_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité de la fumée de silice - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property D_dens As Double
        Get
            D_dens = _D_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2.5 OrElse value > 3.5 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2.5 et 3,5.")
            Else
                _D_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k de la fumée de silice - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property D_k As Double
        Get
            D_k = _D_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0.9 OrElse value > 2.1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0,9 et 2,1.")
            Else
                _D_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du métakaolin de type A - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property MK_dens As Double
        Get
            MK_dens = _MK_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2.4 OrElse value > 2.8 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2,4 et 2,8.")
            Else
                _MK_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k du métakaolin de type A - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property MK_k As Double
        Get
            MK_k = _MK_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0.9 OrElse value > 1.1 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0,9 et 1,1.")
            Else
                _MK_k = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité d'Addition siliceuse de minéralogie QZ - Unité: T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property U_dens As Double
        Get
            U_dens = _U_dens
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité volumique n'est pas numérique.")
            ElseIf value < 2.4 OrElse value > 2.8 Then
                Throw New ArgumentException("La valeur de la densité volumique doit être comprise entre 2,4 et 2,8.")
            Else
                _U_dens = value
            End If
        End Set
    End Property

    ''' <summary>
    '''coefficient k d'Addition siliceuse de minéralogie QZ - Unité: sans objet
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property U_k As Double
        Get
            U_k = _U_k
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient k n'est pas numérique.")
            ElseIf value < 0.2 OrElse value > 0.3 Then
                Throw New ArgumentException("La valeur du coefficient k doit être comprise entre 0,2 et 0,3.")
            Else
                _U_k = value
            End If
        End Set
    End Property

#End Region

    ''' <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
End Class
