Public Class clsCiment
    Private _Type As Integer = 1
    Private _Clinker As Integer = 1
    Private _Constituant As Integer = 1
    Private _ClasseResistance As Double = 42.5
    Private _Prise As Integer = 1
    Private _fcE As Integer = 50
    Private _fcE325 As Integer = 39
    Private _fcE425 As Integer = 51
    Private _fcE525 As Integer = 63
    Private _Densite As Double = 3.15


    ''' <summary>
    '''Type de Variété du ciment utilisé pour confectionner le béton - 1=CEM I / 2 = CEM II  / 3 = CEM III
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Type As Integer
        Get
            Type = _Type
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du type du ciment n'est pas numérique.")
            ElseIf value < 1 OrElse value > 3 Then
                Throw New ArgumentException("La valeur du type de ciment doit être comprise entre 1 et 3. La valeur est égale à " & value.ToString)
            Else
                _Type = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Teneur en clinker du ciment utilisé pour confectionner le béton - A(=1) ou B(=2) pour CEM II / A, B ou C(=3) = CEM III
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Clinker As Integer
        Get
            Clinker = _Clinker
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la teneur en clinker n'est pas numérique.")
            ElseIf value < 1 OrElse value > 3 Then
                Throw New ArgumentException("La valeur de la teneur en clinker doit être comprise entre 1 et 3.")
            Else
                _Clinker = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Teneur en Constituant du ciment utilisé pour confectionner le béton - 1=S (laitier)/2=D (fumée silice)/3=P (pouzolane naturelle)/4=Q(pouzolane naturelle calcinée)/5=V (cendre volante siliceuse)/6=W(cendre volante calcique)/
    '''7=T (schites calcinés)/8=L (calcaire)/9=LL(calcaire)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Constituant As Integer
        Get
            Constituant = _Constituant
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la teneur pour le constituant en second n'est pas numérique.")
            ElseIf value < 1 OrElse value > 9 Then
                Throw New ArgumentException("La valeur de la teneur pour le constituant en second doit être comprise entre 1 et 9.")
            Else
                _Constituant = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Classe de Resistance du ciment utilisé pour confectionner le béton - 32.5 / 42.5 / 52.5
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ClasseResistance As Double
        Get
            ClasseResistance = _ClasseResistance
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la Classe de Resistance n'est pas numérique.")
            ElseIf value <> 32.5 And value <> 42.5 And value <> 52.5 Then
                Throw New ArgumentException("La valeur de la Classe de Resistance doit être égale à 32.5 ou 42.5 ou 52.5.")
            Else
                _ClasseResistance = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Vitesse de Prise du ciment utilisé pour confectionner le béton - 1= Normal / 2 = Rapide
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Prise As Integer
        Get
            Prise = _Prise
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la prise n'est pas numérique.")
            ElseIf value < 1 OrElse value > 2 Then
                Throw New ArgumentException("La valeur de la prise doit être comprise entre 1 et 2.")
            Else
                _Prise = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Caractéristique de la classe vrai du ciment utilisé pour confectionner le béton suivant valeurs types - TRUE si valeur type / FALSE dans le cas contraire
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ValeurType As Boolean = True

    ''' <summary>
    '''Classe vrai du ciment utilisé pour confectionner le béton - Unité: MPa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FcE As Integer
        Get
            FcE = _fcE
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment n'est pas numérique.")
            ElseIf value < 30 OrElse value > 70 Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment doit être comprise entre 30 et 70 MPa.")
            Else
                _fcE = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Classe vrai du ciment 32.5 utilisé pour confectionner le béton - Unité: MPa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FcE325 As Integer
        Get
            FcE325 = _fcE325
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment n'est pas numérique.")
            ElseIf value < 30 OrElse value > 70 Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment doit être comprise entre 30 et 70 MPa.")
            Else
                _fcE325 = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Classe vrai du ciment 42.5 utilisé pour confectionner le béton - Unité: MPa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FcE425 As Integer
        Get
            FcE425 = _fcE425
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment n'est pas numérique.")
            ElseIf value < 30 OrElse value > 70 Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment doit être comprise entre 30 et 70 MPa.")
            Else
                _fcE425 = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Classe vrai du ciment 52.5 utilisé pour confectionner le béton - Unité: MPa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FcE525 As Integer
        Get
            FcE525 = _fcE525
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment n'est pas numérique.")
            ElseIf value < 30 OrElse value > 70 Then
                Throw New ArgumentException("La valeur de la classe vrai du ciment doit être comprise entre 30 et 70 MPa.")
            Else
                _fcE525 = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du ciment composant le béton, par défaut 3,1 T/m3 - Unité: T/m3  
    ''' </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 ciment n'est pas numérique.")
            ElseIf value < 2 Then
                Throw New ArgumentException("La valeur de la densité du ciment doit être supérieure à 2 T/m3.")
            Else
                _Densite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du ciment CEM I, par défaut 3,15 T/m3 - Unité: T/m3  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite_CEM_I As Double = 3.15
    ''' <summary>
    '''Densité du ciment CEM II et CEM III générique, par défaut 3,15 T/m3 - Unité: T/m3  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite_CEM_II_III As Double = 3.15
    ''' <summary>
    '''Densité du ciment CEM II/A-L, CEM II/B-L, CEM II/A-LL, CEM II/B-LL, par défaut 3,07 T/m3 - Unité: T/m3  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite_CEM_II_L As Double = 3.07
    ''' <summary>
    '''Densité du ciment CEM II/A-V, CEM II/B-V, CEM II/A-W, CEM II/B-W, par défaut 3 T/m3 - Unité: T/m3  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite_CEM_II_VW As Double = 3
    ''' <summary>
    '''Densité du ciment CEM II/A-S, CEM II/B-S,  par défaut 3,1 T/m3 - Unité: T/m3  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite_CEM_II_S As Double = 3.1
    ''' <summary>
    '''Densité du ciment CEM II/A-D  par défaut 3,06 T/m3 - Unité: T/m3  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite_CEM_II_D As Double = 3.06


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