''' <summary>
''' Classe encapsulant toutes les caractéristiques des bétons
''' </summary>
<Serializable()> Public Class clsBeton
    Private _NomBeton As String = "Beton BCS01"
    Private _Formulation As Integer = 1
    Private _Dreux_TabKdg As Integer = 3
    Private _Dreux_TabE As Integer = 3
    Private _NbSable As Integer = 1
    Private _NbGravillon As Integer = 1
    Private _Fck As Integer = 20
    Private _FcmCoef As Double = 1.2
    Private _Fcm As Integer
    'Dim _FcEN206 As Boolean = False
    Private _Slump As Integer = 15
    Private _Fabrication As Integer = 1
    Private _Densite As Integer = 0
    Private _Temperature As Integer = 20
    Private _Delai As Integer = 0
    Private _C As Integer = 300
    Private _Eau As Integer
    Private _Air As Integer
    Private _Vibration As Integer = 3
    Private _EN206 As Integer = 2
    'Formulaire Adjuvant
    Private _Plastifiant As Boolean = False
    Private _PlastifiantReduc As Double = 0.1
    Private _PlastifiantDosage As Double = 0.005
    Private _PlastifiantExtraitSec As Double = 0.3
    Private _PlastifiantDensite As Double = 1.17
    Private _MajFines As Boolean = False
    Private _AdjType As Integer = 0
    '
    Private _S_Vs As Integer
    Private _Kg_Direct As Boolean = False
    Private _Kg As Double = 0.5

    Private _XO, _YO, _XA, _YA, _XB, _YB As Double

#Region "Données du formulaire Exigences"
    ''' <summary>
    ''' nom du béton
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NomBeton As String
        Get
            NomBeton = _NomBeton
        End Get
        Set(value As String)
            If Not IsString(value) Then
                Throw New ArgumentException("La valeur du nom du béton n'est pas une chaine de caractères.")
            Else
                _NomBeton = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Formulation adoptée pour déterminer la composition du béton - Unité: 1 = Dreux-Gorisse / 2 = Baron-Ollivier / 3 = ...
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Formulation As Integer
        Get
            Formulation = _Formulation
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("Le Numéro de la méthode de composition du béton n'est pas numérique.")
            ElseIf value <= 0 OrElse value > 3 Then
                Throw New ArgumentException("Le Numéro de la méthode de composition du béton doit être compris entre 1 et 3.")
            Else
                _Formulation = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Choix du tableau de la valeur Kdg - 1 = tableau Dreux-Gorisse / 2 = Tableau ENS / 3 = tableau composé (choix de base) / 4 = coef Kdg Direct
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Dreux_TabKdg As Integer
        Get
            Dreux_TabKdg = _Dreux_TabKdg
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du choix du tableau de la valeur Kdg n'est pas numérique.")
            ElseIf value < 1 OrElse value > 4 Then
                Throw New ArgumentException("La valeur du choix du tableau de la valeur Kdg doit être comprise entre 1 et 4. Valeur = " & value.ToString)
            Else
                _Dreux_TabKdg = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Choix du tableau de la quantité d'eau - 1 = tableau Dreux-Gorisse / 2 = Tableau ENS / 3 = tableau composé (choix de base) 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Dreux_TabE As Integer
        Get
            Dreux_TabE = _Dreux_TabE
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du choix du tableau de la quantité d'eau n'est pas numérique.")
            ElseIf value < 1 OrElse value > 3 Then
                Throw New ArgumentException("La valeur du choix du tableau de la quantité d'eau doit être comprise entre 1 et 3. Valeur = " & value.ToString)
            Else
                _Dreux_TabE = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Amendement concernant la majoration pour la pate à ciment pour la méthode Dreux - Gorisse : TRUE si le projeteur demande la prise en compte de cette majoration / FALSE dans le cas contraire
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Dreux_MajPateCiment As Boolean = True

    ''' <summary>
    '''Composition pondérale humide: TRUE si le projeteur demande la composition pondérale humide / FALSE si le projeteur ne demande pas la composition pondérale humide
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property CompPondHumide As Boolean = False
    ''' <summary>
    '''Résistance à la compression du béton sur éprouvette cylindrique - Unité: MPa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Fck As Integer
        Get
            Fck = _Fck
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la Résistance à la compression du béton n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de la Résistance à la compression du béton doit être positive.")
            Else
                _Fck = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Coefficient de majoration pour passage de Fck à Fcm - Unité: SO
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>Le coefficient doit être supérieur à 1</remarks>
    Public Property FcmCoef As Double
        Get
            FcmCoef = _FcmCoef
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du coefficient de majoration n'est pas numérique.")
            ElseIf value < 1 Then
                Throw New ArgumentException("La valeur du coefficient de majoration doit être supérieure à 1.")
            Else
                _FcmCoef = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Ouvrabilité du béton frais au cone d'abrams Slump test - Unité: Méthode Dreux-Gorisse: valeurs 1 à 23 par pas de 0,5cm soit (x+1).0.5 pour avoir la valeur de l'affaissement, l'affaissement commence à 1 cm.
    ''' Méthode Baron-Ollivier : valeurs de 1 à 4 = S1 ou S2 ou S3 ou S4 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Slump As Integer
        Get
            Slump = _Slump
        End Get
        Set(value As Integer)
            Dim msg As String = String.Empty
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du slump test n'est pas numérique.")
            ElseIf Verification_Ouvrabilite(value, msg) = False Then
                Throw New ArgumentException(msg)
            Else
                _Slump = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Vibration du béton frais - Unité: 1 pour vibration légère / 2 pour vibration Faible / 3 pour vibration Normale / 4 pour vibration Puissante
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Vibration As Integer
        Get
            Vibration = _Vibration
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du mode de vibration n'est pas numérique.")
            ElseIf value < 1 OrElse value > 4 Then
                Throw New ArgumentException("La valeur du mode de vibration doit être comprise entre 1 et 4. Valeur = " & value.ToString)
            Else
                _Vibration = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Température du béton frais - Unité: °C
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Temperature As Integer
        Get
            Temperature = _Temperature
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la Temperature n'est pas numérique.")
            ElseIf value < 5 OrElse value > 35 Then
                Throw New ArgumentException("La valeur de la Temperature doit être comprise entre 5°C et 35°C.")
            Else
                _Temperature = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Délai de transport et de mise en oeuvre du béton - Unité: 0 pour moins de 30 minutes / 1 pour plus de 30 minutes
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Delai As Integer
        Get
            Delai = _Delai
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du délai du béton n'est pas numérique.")
            ElseIf value < 0 OrElse value > 1 Then
                Throw New ArgumentException("La valeur du délai doit être comprise entre 0 (<30 minutes) et 1 (>30 minutes).")
            Else
                _Delai = value
            End If
        End Set
    End Property

    ''' <summary>
    '''type de Fabrication du béton - 1 =En centrale/ 2 =sur chantier / 3 =renseignement direct de Fcm (résistance moyenne cible)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Fabrication As Integer
        Get
            Fabrication = _Fabrication
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la proprété Fabrication n'est pas numérique.")
            ElseIf value < 1 Then
                Throw New ArgumentException("La valeur de la proprété Fabrication doit être comprise entre 1 et 3.")
            ElseIf value > 3 Then
                Throw New ArgumentException("La valeur de la proprété Fabrication doit être comprise entre 1 et 3.")
            Else
                _Fabrication = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Valeur de la résistance moyenne Fcm - Unité: MPa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks> </remarks>
    Public Property Fcm As Integer
        Get
            Fcm = _Fcm
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la résistance moyenne Fcm n'est pas numérique.")
            ElseIf value < 10 AndAlso value > 60 Then
                Throw New ArgumentException("La valeur de la résistance moyenne Fcm doit être supérieure à 10 MPa et inférieure à 60 MPa.")
            Else
                _Fcm = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Indique si le béton dispose d'un affaissement correspondant à une qualité pompable : TRUE si OK / FALSE dans le cas contraire
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Pompe As Boolean = False

    ''' <summary>
    '''Densité du ferraillage du béton - Méthode Baron-Ollivier - Unité: 0 pour béton non armé / 1 pour béton avec densité inf 80kg/m3 / 2 pour béton avec densité sup 80kg/m3 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property DensiteFerraillage As Integer
        Get
            DensiteFerraillage = _Densite
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité de ferraillage n'est pas numérique.")
            ElseIf value > 2 OrElse value < 0 Then
                Throw New ArgumentException("L'item numérique qualifiant la densité de ferraillage doit être compris entre 0 et 2.")
            Else
                _Densite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Méthode Baron-Ollivier - correcion de l'ordonnée de A suivant mf du sable : TRUE si correction / FALSE si non correction
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Correction_Ks As Boolean = False

    ''' <summary>
    '''Conformité du béton vis à vis des classes de résistance à la compression de l'EN 206: TRUE si conforme / FALSE si non conforme
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property EN206_Fc As Boolean = True

    ''' <summary>
    '''Conformité du béton vis à vis des valeurs limites de l'EN 206: 0 = pas de prise en compte de l'EN206-1 / 1 = prise en compte de l'EN206-1 : 2000 / 2 = prise en compte de l'EN206-1 : 2022
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property EN206 As Integer
        Get
            EN206 = _EN206
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la Conformité du béton vis à vis des valeurs limites de l'EN 206 n'est pas numérique.")
            ElseIf value <> 2 AndAlso value <> 1 AndAlso value <> 0 Then
                Throw New ArgumentException("L'item numérique qualifiant la Conformité du béton vis à vis des valeurs limites de l'EN 206 doit être égal à 0, 1 ou 2. Il est actuellement égal à " & value.ToString)
            Else
                _EN206 = value
            End If
        End Set
    End Property
#End Region

#Region "Données du formulaire Adjuvant"
    ''' <summary>
    '''Indique si la formulation du béton comprend un plastifiant, superplastifiant ou réducteur d'eau : Vrai si c'est le cas / Faux dans le cas inverse</summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Plastifiant As Boolean
        Get
            Plastifiant = _Plastifiant
        End Get
        Set(value As Boolean)
            If value <> True And value <> False Then
                Throw New ArgumentException("La valeur de la propriété SuperPlastifiant n'est pas booléenne.")
            Else
                _Plastifiant = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Taux de réduction en eau grace au plastifiant en % - Unité: compris entre 0 et 0.3 soit entre 0% et 30% de réduction d'eau
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PlastifiantReduc As Double
        Get
            PlastifiantReduc = _PlastifiantReduc
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du taux de réduction du plastifiant n'est pas numérique.")
            ElseIf value <= 0 OrElse value > 0.3 Then
                Throw New ArgumentException("La valeur du taux de réduction du plastifiant doit être comprise entre 0% et 30%.")
            Else
                _PlastifiantReduc = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Dosage exprimé en % de masse de liant sur la base de la quantité d'extrait sec de l'adjuvant - Unité: compris entre 0.02 et 1% soit entre 0% et 1% de la masse de ciment, erreur au delà de 2%
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PlastifiantDosage As Double
        Get
            PlastifiantDosage = _PlastifiantDosage
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du dosage du plastifiant n'est pas numérique.")
            ElseIf value <= 0 OrElse value > 0.02 Then
                Throw New ArgumentException("La valeur du dosage du plastifiant doit être comprise entre 0.01% et 2%.")
            Else
                _PlastifiantDosage = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Extrait sec massique de l'adjuvant en % par rapport à sa masse totale - Unité: compris entre 0.01 et 0.5 soit entre 1% et 50%  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PlastifiantExtraitSec As Double
        Get
            PlastifiantExtraitSec = _PlastifiantExtraitSec
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de l'Extrait sec de l'adjuvant n'est pas numérique.")
            ElseIf value < 0.01 OrElse value > 0.5 Then
                Throw New ArgumentException("La valeur de l'Extrait sec de l'adjuvant doit être comprise entre 1% et 50%.")
            Else
                _PlastifiantExtraitSec = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Densité du plastifiant - Unité: Kg/L ou T/m3, compris entre 0.5 et 3 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PlastifiantDensite As Double
        Get
            PlastifiantDensite = _PlastifiantDensite
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité du plastifiant n'est pas numérique.")
            ElseIf value < 0.5 OrElse value > 3 Then
                Throw New ArgumentException("La valeur de la densité du plastifiant doit être comprise entre 0.5 et 3.")
            Else
                _PlastifiantDensite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Indique si l'adjuvant utilisé majore la teneur en fines : Vrai si c'est le cas / Faux dans le cas inverse</summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PlastifiantMajFines As Boolean
        Get
            PlastifiantMajFines = _MajFines
        End Get
        Set(value As Boolean)
            If value <> True And value <> False Then
                Throw New ArgumentException("La valeur de la propriété Majoration Fines n'est pas booléenne.")
            Else
                _MajFines = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Type d'adjuvant utilisé - Unité: 1 = Plastifiant / 2 = Superplastifiant / 3 = réducteur d'eau
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PlastifiantAdjType As Integer
        Get
            PlastifiantAdjType = _AdjType
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du type d'adjuvant n'est pas numérique.")
            ElseIf value < 0 OrElse value > 3 Then
                Throw New ArgumentException("La valeur du type d'adjuvant doit être comprise entre 0 et 3.")
            Else
                _AdjType = value
            End If
        End Set
    End Property
#End Region

    ''' <summary>
    ''' EN206-1 - Indique si le béton est formulé pour un ouvrage contenant des armatures de précontrainte en acier : Vrai si ouvrage BP / Faux si ouvrage BA</summary>
    Public Property OuvrageBP As Boolean = False

    ''' <summary>
    ''' EN206-1 - Indique si le béton peut être attaqué par des sulfates dans le cas de la classe d'exposition XA : Vrai si attaque Sulfate / Faux dans le cas inverse</summary>
    Public Property Sulfates As Boolean = False

#Region "Classe d'exposition"

    ''' <summary>Vrai si le béton est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property X0_ClassExpo As Boolean = False

    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XC1 As Boolean = True
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XC2 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XC3 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XC4 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XD1 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XD2 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XD3 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XS1 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XS2 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XS3 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XF1 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XF2 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XF3 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XF4 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XA1 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XA2 As Boolean = False
    ''' <summary>Vrai si la poutre est dans cette classe d'exposition / Faux si c'est l'inverse</summary>
    Public Property XA3 As Boolean = False
#End Region

#Region "Valeurs limites EN206-1"
    ''' <summary>EN206-1 - rapport E/C</summary>
    Public Property EN206_EC As Double = 1 'valeurs initiales EC = 1
    ''' <summary>EN206-1 - classe de réistance à la compression</summary>
    Public Property EN206_Cl As Double = 0 'valeurs initiales   = 0
    ''' <summary>EN206-1 - teneur minimal en liant équivalent (kg/m3)</summary>
    Public Property EN206_TeneurLiant As Double = 0 'valeurs initiales   = 0
    ''' <summary>EN206-1 - teneur minimal en air (%)</summary>
    Public Property EN206_TeneurAir As Double = 0 'valeurs initiales   = 0
    ''' <summary>EN206-1 - teneur maximale en ions chlorure (%)</summary>
    Public Property EN206_TeneurChlorure As Double = 0.4 'valeurs initiales   = 0.40

#Region "EN206-1 - Rapport maximal A/(A+C)"

#Region "Pour CEM I"
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour la Cendre volante pour ciment CEMI/A (2004 ou 2024)</summary>
    Public Property EN206_A_AC_CV As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour la Fumée de silice pour ciment CEMI/A (2004 ou 2024)</summary>
    Public Property EN206_A_AC_FS As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour le laitier moulu pour ciment CEMI/A (2004 ou 2024)</summary>
    Public Property EN206_A_AC_LM As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour Addition Calcaire pour ciment CEMI/A (2004)</summary>
    Public Property EN206_A_AC_Cal As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour Addition Siliceuse de minéralogie QZ pour ciment CEMI/A (2004 ou 2024)</summary>
    Public Property EN206_A_AC_Sil As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour le Metakaolin type A pour ciment CEMI/A (2024)</summary>
    Public Property EN206_A_AC_MK As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour Addition Calcaire type A pour ciment CEMI/A (2024)</summary>
    Public Property EN206_A_AC_Cal_A As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour Addition Calcaire type B pour ciment CEMI/A (2024)</summary>
    Public Property EN206_A_AC_Cal_B As Double = 1 'valeurs initiales   = 1
#End Region

#Region "Pour CEM II"
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour la Cendre volante pour ciment CEMII/A + addition</summary>
    Public Property EN206_A_AC_CV_CEMII As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour la Fumée de silice pour ciment CEMII/A + addition</summary>
    Public Property EN206_A_AC_FS_CEMII As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour le laitier moulu pour ciment CEMII/A + addition</summary>
    Public Property EN206_A_AC_LM_CEMII As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour Addition Siliceuse de minéralogie QZ pour ciment CEMII/A + addition</summary>
    Public Property EN206_A_AC_Sil_CEMII As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour le Metakaolin type A pour ciment CEMII/A + addition</summary>
    Public Property EN206_A_AC_MK_CEMII As Double = 1 'valeurs initiales   = 1
    ''' <summary>EN206-1 - Rapport maximal A/(A+C) pour Addition Calcaire type A pour ciment CEMII/A + addition</summary>
    Public Property EN206_A_AC_Cal_A_CEMII As Double = 1 'valeurs initiales   = 1
#End Region

#End Region


#End Region

    ''' <summary>
    '''Caractéristiques du ciment composant le béton
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Ciment As New clsCiment

    ''' <summary>
    '''Caractéristiques de l'Addition ajouté au béton
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Addition As New clsAddition

    ''' <summary>
    '''Quantité de ciment par m3 rentrant dans la composition du béton - Unité: kg/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property C As Integer
        Get
            C = _C
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La quantité de ciment par m3 de béton n'est pas numérique.")
            ElseIf value < 50 OrElse value > 1000 Then
                Throw New ArgumentException("La quantité de ciment par m3 de béton doit être normalement comprise entre 200 et 450 kg/m3. La valeur indiquée est " & value.ToString & " kg/m3.")
            Else
                _C = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Quantité d'eau de gachage par m3 rentrant dans la composition du béton - Unité: L/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Eau As Integer
        Get
            Eau = _Eau
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La quantité d'eau par m3 de béton n'est pas numérique.")
            ElseIf value < 50 Then
                Throw New ArgumentException("La quantité d'eau par m3 de béton est trop petite. La valeur indiquée est " & value.ToString & " L/m3.")
            ElseIf value > 300 Then
                Throw New ArgumentException("La quantité d'eau par m3 de béton est trop grande. La valeur indiquée est " & value.ToString & " L/m3.")
            Else
                _Eau = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Quantité d'air par m3 de béton - Unité: L/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Air As Integer
        Get
            Air = _Air
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La quantité d'Air par m3 de béton n'est pas numérique.")
            ElseIf value < 1 Then
                Throw New ArgumentException("La quantité d'Air par m3 de béton est trop petite. La valeur indiquée est " & value.ToString & " L/m3.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La quantité d'Air par m3 de béton est trop grande. La valeur indiquée est " & value.ToString & " L/m3.")
            Else
                _Air = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Répartition en % de sable 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 S_Vs As Integer
        Get
            S_Vs = _S_Vs
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La quantité de sable par m3 de béton n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de répartition en % de sable 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 sable dans le volume de granulats ne peut pas être supérieure à 100%. La valeur indiquée est " & value.ToString & " %.")
            Else
                _S_Vs = value
            End If
        End Set
    End Property


#Region "Données pour le Squelette Granulaire du béton"
    ''' <summary>
    '''Nombre de sables rentrant dans la composition du béton - Unité: U
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NbSable As Integer
        Get
            NbSable = _NbSable
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("Le Nombre de sables rentrant dans la composition du béton n'est pas numérique.")
            ElseIf value <= 0 Then
                Throw New ArgumentException("Le Nombre de sables rentrant dans la composition du béton doit être positive.")
            Else
                _NbSable = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Nombre de gravillon rentrant dans la composition du béton - Unité: U
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NbGravillon As Integer
        Get
            NbGravillon = _NbGravillon
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("Le Nombre de Gravillons rentrant dans la composition du béton n'est pas numérique.")
            ElseIf value <= 0 Then
                Throw New ArgumentException("Le Nombre de Gravillons rentrant dans la composition du béton doit être positive.")
            Else
                _NbGravillon = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Indique si le coefficient granulaire Kb est renseigné directement ou pas : TRUE si renseigné directement / FALSE dans le cas contraire 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Kg_Direct As Boolean
        Get
            Kg_Direct = _Kg_Direct
        End Get
        Set(value As Boolean)
            If value <> True And value <> False Then
                Throw New ArgumentException("La valeur de la propriété Kg_Direct de la classe beton n'est pas booléenne.")
            Else
                _Kg_Direct = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Coefficient de granularité - Unité: sans objet - compris entre 0.34 et 0.66
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Kg As Double
        Get
            Kg = _Kg
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de Kg n'est pas numérique.")
            ElseIf value < 0.35 Then
                Throw New ArgumentException("La valeur de Kg doit être supérieure ou égale à 0,35.")
            ElseIf value > 0.65 Then
                Throw New ArgumentException("La valeur de Kg doit être inférieure ou égale à 0,65.")
            Else
                _Kg = value
            End If
        End Set
    End Property

    ''' <summary>
    '''abscisse du point origine O - Unité:  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property XO As Double
        Get
            XO = _XO
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de XO n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de XO doit être positive.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de XO doit être inférieure à  .")
            Else
                _XO = value
            End If
        End Set
    End Property

    ''' <summary>
    '''ordonnée du point origine O - Unité:  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property YO As Double
        Get
            YO = _YO
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de YO n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de YO doit être positive.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de YO doit être inférieure à  .")
            Else
                _YO = value
            End If
        End Set
    End Property

    ''' <summary>
    '''abscisse du point A - Unité:  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property XA As Double
        Get
            XA = _XA
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de XA n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de XA doit être positive.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de XA doit être inférieure à  .")
            Else
                _XA = value
            End If
        End Set
    End Property

    ''' <summary>
    '''ordonnée du point A - Unité: en % soit 50% par exemple
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property YA As Double
        Get
            YA = _YA
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de YA n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de YA doit être positive.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de YA doit être inférieure à  .")
            Else
                _YA = value
            End If
        End Set
    End Property

    ''' <summary>
    '''abscisse du point B - Unité:  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property XB As Double
        Get
            XB = _XB
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de XB n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de XB doit être positive.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de XB doit être inférieure à  .")
            Else
                _XB = value
            End If
        End Set
    End Property

    ''' <summary>
    '''ordonnée du point B - Unité:  
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property YB As Double
        Get
            YB = _YB
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de YB n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de YB doit être positive.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de YB doit être inférieure à  .")
            Else
                _YB = value
            End If
        End Set
    End Property

    ''' <summary>
    ''' Valeur du module pour la dimension de Tamis normalisé - unité: mm/ entier
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public ReadOnly Property Module_Tamis As New Dictionary(Of Double, Integer) From {{0.063, 19}, {0.08, 20}, {0.1, 21}, {0.125, 22}, {0.16, 23}, {0.2, 24}, {0.25, 25}, {0.315, 26}, {0.4, 27},
        {0.5, 28}, {0.63, 29}, {0.8, 30}, {1, 31}, {1.25, 32}, {1.6, 33}, {2, 34}, {2.5, 35}, {3.15, 36}, {4, 37}, {5, 38}, {6.3, 39}, {8, 40}, {10, 41}, {12.5, 42}, {16, 43}, {20, 44}, {25, 45}, {31.5, 46}, {40, 47}, {50, 48}, {63, 49}, {80, 50}}
#End Region

#Region "Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 200 kg à 450kg de ciment/m3"
    ''' <summary>
    ''' Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 200 kg de ciment/m3
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property C200 As New Dictionary(Of Integer, Double) From {{1, 1.2}, {2, 1.15}, {3, 1.1}, {4, 1.06}, {5, 1.03}, {6, 1}, {7, 0.98}, {8, 0.97}, {9, 0.95},
        {10, 0.94}, {11, 0.93}, {12, 0.92}}
    ''' <summary>
    ''' Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 250 kg de ciment/m3
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property C250 As New Dictionary(Of Integer, Double) From {{1, 1.5}, {2, 1.43}, {3, 1.38}, {4, 1.32}, {5, 1.28}, {6, 1.25}, {7, 1.22}, {8, 1.21}, {9, 1.2},
        {10, 1.19}, {11, 1.18}, {12, 1.17}}
    ''' <summary>
    ''' Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 300 kg de ciment/m3
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property C300 As New Dictionary(Of Integer, Double) From {{1, 1.8}, {2, 1.7}, {3, 1.65}, {4, 1.6}, {5, 1.55}, {6, 1.52}, {7, 1.5}, {8, 1.47}, {9, 1.44},
        {10, 1.42}, {11, 1.4}, {12, 1.39}}
    ''' <summary>
    ''' Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 350 kg de ciment/m3
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property C350 As New Dictionary(Of Integer, Double) From {{1, 2.07}, {2, 2}, {3, 1.93}, {4, 1.88}, {5, 1.83}, {6, 1.78}, {7, 1.73}, {8, 1.7}, {9, 1.68},
        {10, 1.66}, {11, 1.64}, {12, 1.62}}
    ''' <summary>
    ''' Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 400 kg de ciment/m3
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property C400 As New Dictionary(Of Integer, Double) From {{1, 2.38}, {2, 2.28}, {3, 2.18}, {4, 2.1}, {5, 2.05}, {6, 2}, {7, 1.97}, {8, 1.93}, {9, 1.9},
        {10, 1.88}, {11, 1.85}, {12, 1.82}}
    ''' <summary>
    ''' Méthode Dreux-Gorisse - Abaque estimatif quantité de ciment - Courbe 450 kg + superplastifiant de ciment/m3
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property C450 As New Dictionary(Of Integer, Double) From {{1, 2.65}, {2, 2.54}, {3, 2.41}, {4, 2.33}, {5, 2.28}, {6, 2.23}, {7, 2.18}, {8, 2.15}, {9, 2.12},
        {10, 2.1}, {11, 2.09}, {12, 2.08}}
#End Region

    Private Function Verification_Ouvrabilite(ByVal value As Double, ByRef msg As String) As Boolean
        Dim Test As Boolean = True
        'Select Case Formulation
        '    Case 1
        If value < 1 OrElse value > 23 Then Test = False : msg = "La valeur du slump test doit être comprise entre 1 et 23."
        '    Case 2
        '        If value < 1 OrElse value > 4 Then Test = False : msg = "La valeur de l'ouvrabilité doit être comprise entre 1 (S1) et 4 (S4)."
        'End Select
        Return Test
    End Function

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