Imports System.Math
Imports System.IO
Module Calcul

    ''' <summary> Module général de formulation du béton</summary>
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    ''' <param name="verif"> variable prenant la valeur False si une erreur bloquante s'est produite pendant le calcul de la formulation</param>
    Public Sub Formulation(ByRef rtf As To_Rtf.RtfAnsiTextWriter, ByRef Verif As Boolean)
        Dim msg As String = String.Empty
        Dim msg1 As String = String.Empty
        Dim r As DialogResult
        With Beton
            'Prise en compte des conditions de durabilité de l'EN206-1: aucune classe définie
            If .EN206 > 0.1 AndAlso (.X0_ClassExpo = False And .XC1 = False And .XC2 = False And .XC3 = False And .XC4 = False And .XD1 = False And .XD2 = False _
                                                And .XD3 = False And .XS1 = False And .XS2 = False And .XS3 = False And .XF1 = False And .XF2 = False And .XF3 = False _
                                                And .XF4 = False And .XA1 = False And .XA2 = False And .XA3 = False) = True Then
                msg1 = "Prise en compte des conditions de durabilité de l'EN206-1: aucune classe d'exposition définie" & Environment.NewLine
                msg1 += "La formulation sera établie sans prise en compte des conditions de durabilité imposées par l'EN206-1. "
                'Affichage de la boite de dialogue pour continuer le calcul ou pas
                r = MessageBox.Show(msg1 & Environment.NewLine & "Souhaitez-vous continuer le calcul ?", "Module général de formulation du béton", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                If r = Windows.Forms.DialogResult.No Then
                    Verif = False : Exit Sub
                Else
                    .EN206 = 0
                End If
            End If
            'Prise en compte des conditions de durabilité de l'EN206-1: ouvrage BP et classe X0
            If .EN206 > 0.1 AndAlso .X0_ClassExpo = True Then '.EN206_Durabilite = True
                msg1 = "Prise en compte des conditions de durabilité de l'EN206-1 et ouvrage en béton précontraint :" & Environment.NewLine
                msg1 += "L'EN206-1 impose, en son article NA.4.1, le classement XC1 pour ce type d'ouvrage. "
                'Affichage de la boite de dialogue pour continuer le calcul ou pas
                r = MessageBox.Show(msg1 & Environment.NewLine & "Souhaitez-vous continuer le calcul avec la classe d'exposition XC1 ?", "Module général de formulation du béton", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                If r = Windows.Forms.DialogResult.No Then
                    Verif = False : Exit Sub
                Else
                    .X0_ClassExpo = False : .XC1 = True
                End If
            End If
            'Prise en compte des conditions de durabilité de l'EN206-1: résistance caractéristique
            If .EN206 > 0.1 AndAlso .Fck < .EN206_Cl Then '.EN206_Durabilite = True
                Select Case .EN206'EN206-2000 ou EN206-2022
                    Case 1
                        msg = "(2000)"
                    Case 2
                        msg = "(2022)"
                    Case Else
                        MessageBox.Show("Votre formulation demande la prise en compte des conditions de durabilité de l'EN206-1 sans préciser l'édition (2000 ou 2022)" & Environment.NewLine &
                                        "Merci de bien vouloir préciser l'édition", "Module général de formulation du béton", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Verif = False : Exit Sub
                End Select
                msg1 = "Résistance caractéristique du béton formulé : fck = " & .Fck.ToString("#0") & " MPa" & Environment.NewLine & "Exigence de l'EN 206-1 : fck"
                msg1 += " < " & .EN206_Cl.ToString("#0") & " - Résistance caractéristique trop faible, béton non conforme à l'EN206-1 " & msg
                'Affichage de la boite de dialogue pour continuer le calcul ou pas
                r = MessageBox.Show(msg1 & Environment.NewLine & "Souhaitez-vous continuer le calcul ?", "Module général de formulation du béton", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                If r = Windows.Forms.DialogResult.No Then Verif = False : Exit Sub
            End If
            'Suivant le moment ou a été fait la sauvegarde des données, un 3ième sable peut s'intégrer.
            If Beton.NbSable = 2 And Sable.Count > 2 Then Sable.RemoveAt(Sable.Count - 1)
            'Ecriture des hypothèses de calcul dans la note de calcul avec la prise en compte ou pas des conditions de durabilité de l'EN206-1 
            Call Ecriture_Hypothese_Note_de_calcul(rtf)
            'Lecture des données Sable et sortie du module Calcul sans blocage du logiciel si pb de lecture, avec affichage de l'erreur
            Call Lecture_Sable(Verif) 'Pour le cas d'un calcul direct après avoir téléchargé le fichier de données sans lecture du formulaire Sable
            If Verif = False Then Exit Sub
            'Lecture des données Gravillon et sortie du module Calcul sans blocage du logiciel si pb de lecture, avec affichage de l'erreur
            Call Lecture_Gravillon(Verif) 'Pour le cas d'un calcul direct après avoir téléchargé le fichier de données sans lecture du formulaire Gravillon
            If Verif = False Then Exit Sub
            'Branchement sur la formulation choisie
            Select Case .Formulation
                Case 1 'Dreux-Gorisse
                    Call Formulation_DreuxGorisse(rtf, Verif)
                Case 2
                    Call Formulation_BaronOllivier(rtf, Verif)
            End Select
        End With
    End Sub

    ''' <summary> Affectation de valeurs du sable tels que .Refus, .RefusCumule_g,  .RefusCumule_Pourcent,   .TamisatCumule_g,   .TamisatCumule_Pourcent qui ne sont pas affectées si le projeteur n'affiche pas le formulaire Sable</summary>
    '''<param name="verif"> variable prenant la valeur False si une erreur bloquante s'est produite pendant la lecture des valeurs Sables</param>
    Private Sub Lecture_Sable(ByRef Verif As Boolean)
        Dim iSable As Integer = 0
        Try
            With Sable.Item(0)
                iSable = 1
                Dim j As Integer
                If .Disponibilite_Tamis_Bool.Count = 23 Then
                    Dim toto(23) As Double
                    j = -1
                    For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                        j += 1 : toto(j) = kvp.Key
                    Next
                    .Disponibilite_Tamis.Clear()
                    For j = 0 To 22 '23 tamis
                        .Disponibilite_Tamis(toto(j)) = .Disponibilite_Tamis_Bool.Item(j)
                    Next
                    'Affectation des valeurs de refus ou tamisats
                    Select Case .Choix_mesureGranulo
                        Case 0 'refus en g
                            .Refus.Clear()
                            For j = 0 To 22
                                .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 1 'refus cumulé en g
                            .RefusCumule_g.Clear()
                            For j = 0 To 22
                                .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 2 'refus cumulé en %
                            .RefusCumule_Pourcent.Clear()
                            For j = 0 To 22
                                .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 3 'Tamisats cumulés en g
                            .TamisatCumule_g.Clear()
                            For j = 0 To 22
                                .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 4 'Tamisats cumulés en %
                            .TamisatCumule_Pourcent.Clear()
                            For j = 0 To 22
                                .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                    End Select
                End If
            End With
            If Sable.Count > 1 Then 'tenir compte du mélange de sable -> i = 2
                With Sable.Item(1)
                    iSable = 2
                    Dim j As Integer
                    If .Disponibilite_Tamis_Bool.Count = 23 Then
                        Dim toto(23) As Double
                        j = -1
                        For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                            j += 1 : toto(j) = kvp.Key
                        Next
                        .Disponibilite_Tamis.Clear()
                        For j = 0 To 22 '23 tamis
                            .Disponibilite_Tamis(toto(j)) = .Disponibilite_Tamis_Bool.Item(j)
                        Next
                        'Affectation des valeurs de refus ou tamisats
                        Select Case .Choix_mesureGranulo
                            Case 0 'refus en g
                                .Refus.Clear()
                                For j = 0 To 22
                                    .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 1 'refus cumulé en g
                                .RefusCumule_g.Clear()
                                For j = 0 To 22
                                    .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 2 'refus cumulé en %
                                .RefusCumule_Pourcent.Clear()
                                For j = 0 To 22
                                    .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 3 'Tamisats cumulés en g
                                .TamisatCumule_g.Clear()
                                For j = 0 To 22
                                    .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 4 'Tamisats cumulés en %
                                .TamisatCumule_Pourcent.Clear()
                                For j = 0 To 22
                                    .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                        End Select
                    End If
                End With
            End If
        Catch ex As Exception
            MessageBox.Show("Erreur lors de lecture des données du sable n°" & iSable.ToString("0") & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, "Module Lecture_Sable du module de Calcul",
                                MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Verif = False : Exit Sub
        End Try
    End Sub

    ''' <summary> Affectation de valeurs du Gravillon tels que .Refus, .RefusCumule_g,  .RefusCumule_Pourcent,   .TamisatCumule_g,   .TamisatCumule_Pourcent qui ne sont pas affectées si le projeteur n'affiche pas le formulaire Gravillon</summary>
    '''<param name="verif"> variable prenant la valeur False si une erreur bloquante s'est produite pendant la lecture des valeurs Gravillons</param>
    Private Sub Lecture_Gravillon(ByRef Verif As Boolean)
        Dim iGravillon As Integer = 0
        Try
            With Gravillon.Item(0)
                If .Disponibilite_Tamis_Bool.Count = 20 Then
                    iGravillon = 1
                    Dim j As Integer
                    Dim toto(23) As Double
                    j = -1
                    For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                        j += 1 : toto(j) = kvp.Key
                    Next
                    .Disponibilite_Tamis.Clear()
                    For j = 0 To 19 '20 tamis disponibles pour les gravillons
                        .Disponibilite_Tamis(toto(j)) = .Disponibilite_Tamis_Bool.Item(j)
                    Next
                    'Affectation des valeurs de refus ou tamisats
                    Select Case .Choix_mesureGranulo
                        Case 0 'refus en g
                            .Refus.Clear()
                            For j = 0 To 19
                                .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(0)
                        Case 1 'refus cumulé en g
                            .RefusCumule_g.Clear()
                            For j = 0 To 19
                                .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(1)
                        Case 2 'refus cumulé en %
                            .RefusCumule_Pourcent.Clear()
                            For j = 0 To 19
                                .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(2)
                        Case 3 'Tamisats cumulés en g
                            .TamisatCumule_g.Clear()
                            For j = 0 To 19
                                .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(3)
                        Case 4 'Tamisats cumulés en %
                            .TamisatCumule_Pourcent.Clear()
                            For j = 0 To 19
                                .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(4)
                    End Select
                End If
            End With
            If Gravillon.Count = 2 Then
                With Gravillon.Item(1)
                    If .Disponibilite_Tamis_Bool.Count = 20 Then
                        iGravillon = 2
                        Dim j As Integer
                        Dim toto(23) As Double
                        j = -1
                        For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                            j += 1 : toto(j) = kvp.Key
                        Next
                        .Disponibilite_Tamis.Clear()
                        For j = 0 To 19 '20 tamis disponibles pour les gravillons
                            .Disponibilite_Tamis(toto(j)) = .Disponibilite_Tamis_Bool.Item(j)
                        Next
                        'Affectation des valeurs de refus ou tamisats
                        Select Case .Choix_mesureGranulo
                            Case 0 'refus en g
                                .Refus.Clear()
                                For j = 0 To 19
                                    .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                                .CalculTamisat(0)
                            Case 1 'refus cumulé en g
                                .RefusCumule_g.Clear()
                                For j = 0 To 19
                                    .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                                .CalculTamisat(1)
                            Case 2 'refus cumulé en %
                                .RefusCumule_Pourcent.Clear()
                                For j = 0 To 19
                                    .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                                .CalculTamisat(2)
                            Case 3 'Tamisats cumulés en g
                                .TamisatCumule_g.Clear()
                                For j = 0 To 19
                                    .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                                .CalculTamisat(3)
                            Case 4 'Tamisats cumulés en %
                                .TamisatCumule_Pourcent.Clear()
                                For j = 0 To 19
                                    .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                                .CalculTamisat(4)
                        End Select
                    End If
                End With
            End If
        Catch ex As Exception
            MessageBox.Show("Erreur lors de lecture des données du gravillon n°" & iGravillon.ToString("0") & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, "Module Lecture_Gravillon du module de Calcul",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Verif = False : Exit Sub
        End Try
    End Sub

    ''' <summary> Module de formulation du béton suivant la méthode Dreux - Gorisse</summary>
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    ''' <param name="verif"> variable prenant la valeur False si une erreur bloquante s'est produite pendant le calcul de la formulation</param>
    Public Sub Formulation_DreuxGorisse(ByRef rtf As To_Rtf.RtfAnsiTextWriter, ByRef Verif As Boolean)
        Dim C_E, Dmax, fcm, Kdg As Double
        Dim i, Qualite, EauInitial, EauCorrige, Slump, ValeurprecedenteS1, ValeurPrecedenteS2 As Integer
        Dim msg As String = String.Empty
        '
        '1ière partie - Détermination du Calcul du rapport C/E - Dosage en eau et en ciment
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        'Ecriture de la note de calcul
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Bold = True
        rtf.Underline = True : rtf.WriteString("2 - Détails de la formulation") : rtf.Bold = False : rtf.FontSize = 11 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("2 - 1  Calcul du rapport C/E - Dosage en eau et en ciment") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("Les calculs sont réalisés suivant l'équation ci-dessous:") : rtf.NewLine()
            rtf.InsertImage(My.Resources.RésistanceMoyenne_Dreux)
        'Détermination du rapport C/E
        With Beton
            rtf.NewLine()
            '-->détermination fcE: suivant ciment - Voir formulaire Ciment
            rtf.WriteString("Fce la classe vrai du ciment utilisé à 28 jours : " & Beton.Ciment.FcE.ToString("#") & " MPa") : rtf.NewLine()
            'Prise en compte des conditions de durabilité de l'EN206-1: résistance caractéristique
            If .EN206 > 0.1 Then Call Verif_Fck_EN206(rtf) '.EN206_Durabilite = True
            '-->détermination fcm,exp résistance moyenne du béton à la compression à 28 jours
            fcm = .Fck * .FcmCoef
            rtf.WriteString("fcm,exp résistance moyenne du béton à la compression à 28 jours : " & fcm.ToString("#0.00") & " MPa ( coefficient de majoration = " & .FcmCoef.ToString("#0.00") & " )") : rtf.NewLine()
            '-->détermination Kdg le coefficient granulaire
            If .Dreux_TabKdg = 4 Then
                Kdg = .Kg
            Else
                Select Case Gravillon.Count
                    Case 1
                        Dmax = Gravillon.Item(0).Dmg : Qualite = Gravillon.Item(0).Qualite
                    Case 2
                        Dmax = Max(Gravillon.Item(0).Dmg, Gravillon.Item(1).Dmg) : Qualite = Gravillon.Item(0).Qualite ': Qualite = Max(Gravillon.Item(0).Qualite, Gravillon.Item(1).Qualite)
                End Select
#Region "En attente Suppression"
                'Select Case Sable.Count
                '    Case 1
                '        Qualite = Max(Qualite, Sable.Item(0).Qualite)
                '    Case 2
                '        Qualite = Max(Qualite, Max(Sable.Item(0).Qualite, Sable.Item(1).Qualite))
                'End Select
#End Region

                Select Case Qualite
                    Case 1 '  QualiteGranulat = 1 = excellente du tableau 10-8
                        Select Case .Dreux_TabKdg
                            Case 1 'Tableau Méthode Dreux-Gorisse stricte
                                If Dmax <= 16 Then
                                    Kdg = 0.55
                                ElseIf Dmax < 20 Then
                                    Kdg = Interpol_Kdg(16, 20, Dmax, 1)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/20mm- Qualité excellente). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax <= 40 Then
                                    Kdg = 0.6
                                ElseIf Dmax < 50 Then
                                    Kdg = Interpol_Kdg(40, 50, Dmax, 1)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/50mm- Qualité excellente). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.65
                                End If
                            Case 2, 3 'Tableau ENS et Tableau composé identique
                                If Dmax < 16 Then
                                    Kdg = 0.55
                                ElseIf Dmax < 25 Then
                                    Kdg = Interpol_Kdg(16, 25, Dmax, 1)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/25 mm- Qualité excellente - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax < 40 Then
                                    Kdg = 0.6
                                ElseIf Dmax < 63 Then
                                    Kdg = Interpol_Kdg(40, 63, Dmax, 1)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/63 mm- Qualité excellente - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.65
                                End If
                        End Select
                    Case 2, 3 'QualiteGranulat = 2 = bonne ou courante du tableau 10-8
                        Select Case .Dreux_TabKdg
                            Case 1 'Tableau Méthode Dreux-Gorisse stricte
                                If Dmax <= 16 Then
                                    Kdg = 0.45
                                ElseIf Dmax < 20 Then
                                    Kdg = Interpol_Kdg(16, 20, Dmax, 2)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/20mm- Qualité bonne). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax <= 40 Then
                                    Kdg = 0.5
                                ElseIf Dmax < 50 Then
                                    Kdg = Interpol_Kdg(40, 50, Dmax, 2)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/50mm- Qualité bonne). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.55
                                End If
                            Case 2 'Tableau ENS
                                If Dmax < 16 Then
                                    Kdg = 0.45
                                ElseIf Dmax < 25 Then
                                    Kdg = Interpol_Kdg(16, 25, Dmax, 2)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/25 mm- Qualité bonne - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax < 40 Then
                                    Kdg = 0.55
                                ElseIf Dmax < 63 Then
                                    Kdg = Interpol_Kdg(40, 63, Dmax, 2)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/63 mm- Qualité bonne - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.6
                                End If
                            Case 3 'Tableau composé
                                If Dmax < 16 Then
                                    Kdg = 0.45
                                ElseIf Dmax < 25 Then
                                    Kdg = Interpol_Kdg(16, 25, Dmax, 2)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/25 mm- Qualité bonne - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax < 40 Then
                                    Kdg = 0.5
                                ElseIf Dmax < 63 Then
                                    Kdg = Interpol_Kdg(40, 63, Dmax, 2)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/63 mm- Qualité bonne - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.55
                                End If
                        End Select

                    Case 4 '  QualiteGranulat = 3 = passable du tableau 10-8
                        Select Case .Dreux_TabKdg
                            Case 1 'Tableau Méthode Dreux-Gorisse stricte
                                If Dmax <= 16 Then
                                    Kdg = 0.35
                                ElseIf Dmax <= 20 Then
                                    Kdg = Interpol_Kdg(16, 20, Dmax, 3)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/20mm- Qualité passable). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax <= 40 Then
                                    Kdg = 0.4
                                ElseIf Dmax < 50 Then
                                    Kdg = Interpol_Kdg(40, 50, Dmax, 3)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/50mm- Qualité passable). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.45
                                End If
                            Case 2, 3 'Tableau ENS = Tableau composé
                                If Dmax < 16 Then
                                    Kdg = 0.35
                                ElseIf Dmax < 25 Then
                                    Kdg = Interpol_Kdg(16, 25, Dmax, 3)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 16/25 mm- Qualité passable - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                ElseIf Dmax < 40 Then
                                    Kdg = 0.4
                                ElseIf Dmax < 63 Then
                                    Kdg = Interpol_Kdg(40, 63, Dmax, 3)
                                    If Kdg = 0 Then
                                        msg = "L'interpolation pour la détermination du coefficient granulaire n'a pu être calculé (bornes 40/63 mm- Qualité passable - Amendement ENS). Calcul arrété."
                                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                                    End If
                                Else
                                    Kdg = 0.45
                                End If
                        End Select
                End Select
            End If
            rtf.WriteString("Kdg le coefficient granulaire : " & Kdg.ToString("#0.00") & " (valeur numérique sans unité - Cf. Tableau 2.2 de la notice).") : rtf.NewLine()
            If .Vibration = 1 Then
                msg = "Le mode de mise en place du béton a été renseigné comme Vibration légère. Le coefficient granulaire Kdg impose que le béton soit vibré, un piquage ou damage ne répond pas aux critères de détermination du coefficient granulaire."
                rtf.Underline = True : rtf.WriteString("Attention:") : rtf.Underline = False : rtf.NewLine()
                rtf.WriteString(msg) : rtf.NewLine()
                Aff.msg_Avertiss.Add(msg)
            End If
            '-->détermination du rapport C/E
            C_E = 0.5 + (fcm / (Kdg * Beton.Ciment.FcE))
            rtf.WriteString("Rapport C/E : " & C_E.ToString("#0.00") & " (fonctions des données ci-dessus).") : rtf.NewLine()
            rtf.WriteString("Détermination de la quantité de ciment C fonction du rapport C/E ( = " & C_E.ToString("#0.00") & " ) et de l'affaissement A ( = " & ((.Slump + 1) * 0.5).ToString("#0.00") & " cm).") : rtf.NewLine()
            rtf.WriteString("La valeur C est relevée sur l'abaque reproduite ci-dessous, comme point de rencontre des valeurs C/E et A.") : rtf.NewLine()
            '
            'Détermination des dosages en ciment et en eau
            .Plastifiant = False ' superplastifiant dans la formulation du béton
            Slump = CInt(Truncate((.Slump + 1) * 0.5)) 'Slump prendra les valeurs de 1 à 12
            If C_E > .C450(Slump) Then
                msg = "L'abaque indique pour un rapport C/E = " & C_E.ToString("#0.00") & " et un affaissement de " & ((.Slump + 1) * 0.5).ToString("#0") & " cm, un dosage en ciment supérieur à 400 kg/m3 avec superplastifiant" &
                    ", ce qui sort du cadre de la méthode Dreux-Gorisse."
                rtf.Underline = True : rtf.WriteString("Attention:") : rtf.Underline = False : rtf.NewLine()
                rtf.WriteString(msg) : rtf.NewLine()
                Aff.msg_Avertiss.Add(msg)
                .C = 400
                .Plastifiant = True ' superplastifiant dans la formulation du béton
            ElseIf C_E > .C400(Slump) Then
                .C = Interpol_CE(400, C_E, Slump)
            ElseIf C_E > .C350(Slump) Then
                .C = Interpol_CE(350, C_E, Slump)
            ElseIf C_E > .C300(Slump) Then
                .C = Interpol_CE(300, C_E, Slump)
            ElseIf C_E > .C250(Slump) Then
                .C = Interpol_CE(250, C_E, Slump)
            ElseIf C_E > .C200(Slump) Then
                .C = Interpol_CE(200, C_E, Slump)
            Else
                msg = "L'abaque indique pour un rapport C/E = " & C_E.ToString("#0.00") & " et un affaissement de " & ((.Slump + 1) * 0.5).ToString("#0.0") & " cm, un dosage en ciment inférieur à 200 kg/m3, ce qui sort du cadre de la méthode Dreux-Gorisse."
                rtf.Underline = True : rtf.WriteString("Attention:") : rtf.Underline = False : rtf.NewLine()
                rtf.WriteString(msg) : rtf.NewLine()
                Aff.msg_Avertiss.Add(msg)
                .C = 200
            End If
            .Eau = CInt(Math.Floor(.C / C_E))
            EauInitial = .Eau
            'Correction de la quantité d'eau si Dmax différent de 20 mm ou 25 mmm
            Select Case .Dreux_TabE
                Case 1 'Méthode Dreux-Gorisse stricte
                    If Dmax < 20 OrElse Dmax > 25 Then
                        If Dmax <= 5 Then
                            .Eau = CInt(Truncate(.Eau * 1.15))
                        ElseIf Dmax < 8 Then
                            .Eau = CInt(Truncate(.Eau * Interpol_Eau(15, 9, 5, 8, Dmax)))
                        ElseIf Dmax <= 10 Then
                            .Eau = CInt(Truncate(.Eau * 1.09))
                        ElseIf Dmax < 12.5 Then
                            .Eau = CInt(Truncate(.Eau * Interpol_Eau(9, 4, 10, 12.5, Dmax)))
                        ElseIf Dmax <= 16 Then
                            .Eau = CInt(Truncate(.Eau * 1.04))
                        ElseIf Dmax < 30 Then
                            .Eau = CInt(Truncate(.Eau * Interpol_Eau(0, -4, 25, 30, Dmax)))
                        ElseIf Dmax <= 40 Then
                            .Eau = CInt(Truncate(.Eau * 0.96))
                        ElseIf Dmax < 50 Then
                            .Eau = CInt(Truncate(.Eau * Interpol_Eau(-4, -8, 40, 50, Dmax)))
                        ElseIf Dmax <= 63.5 Then
                            .Eau = CInt(Truncate(.Eau * 0.92))
                        ElseIf Dmax < 80 Then
                            .Eau = CInt(Truncate(.Eau * Interpol_Eau(-8, -12, 63.5, 80, Dmax)))
                        Else
                            .Eau = CInt(Truncate(.Eau * 0.88))
                        End If
                    End If
                Case 2 'Tableau ENS
                    If Dmax <= 5 Then
                        .Eau = CInt(Truncate(.Eau * 1.15))
                    ElseIf Dmax < 10 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(15, 9, 5, 8, Dmax)))
                    ElseIf Dmax = 10 Then
                        .Eau = CInt(Truncate(.Eau * 1.09))
                    ElseIf Dmax < 16 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(9, 4, 10, 16, Dmax)))
                    ElseIf Dmax = 16 Then
                        .Eau = CInt(Truncate(.Eau * 1.04))
                    ElseIf Dmax < 25 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(4, 0, 16, 25, Dmax)))
                    ElseIf Dmax = 25 Then
                        .Eau = .Eau 'Pas de modification
                    ElseIf Dmax < 40 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(0, -4, 25, 40, Dmax)))
                    ElseIf Dmax = 40 Then
                        .Eau = CInt(Truncate(.Eau * 0.96))
                    ElseIf Dmax < 63 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(-4, -8, 40, 63, Dmax)))
                    ElseIf Dmax < 63 Then
                        .Eau = CInt(Truncate(.Eau * 0.92))
                    ElseIf Dmax < 100 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(-8, -12, 63, 100, Dmax)))
                    Else
                        .Eau = CInt(Truncate(.Eau * 0.88))
                    End If
                Case 3 'Tableau Composé
                    If Dmax <= 5 Then
                        .Eau = CInt(Truncate(.Eau * 1.15))
                    ElseIf Dmax < 10 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(15, 9, 5, 8, Dmax)))
                    ElseIf Dmax = 10 Then
                        .Eau = CInt(Truncate(.Eau * 1.09))
                    ElseIf Dmax < 12.5 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(9, 6, 10, 12.5, Dmax)))
                    ElseIf Dmax = 12.5 Then
                        .Eau = CInt(Truncate(.Eau * 1.06))
                    ElseIf Dmax < 16 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(6, 4, 12.5, 16, Dmax)))
                    ElseIf Dmax = 16 Then
                        .Eau = CInt(Truncate(.Eau * 1.04))
                    ElseIf Dmax < 20 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(4, 2, 16, 20, Dmax)))
                    ElseIf Dmax = 20 Then
                        .Eau = CInt(Truncate(.Eau * 1.02))
                    ElseIf Dmax < 25 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(2, 0, 10, 25, Dmax)))
                    ElseIf Dmax = 25 Then
                        .Eau = .Eau 'Pas de modification
                    ElseIf Dmax < 31.5 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(0, -2, 25, 31.5, Dmax)))
                    ElseIf Dmax = 31.5 Then
                        .Eau = CInt(Truncate(.Eau * 0.98))
                    ElseIf Dmax < 40 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(-2, -4, 31.5, 40, Dmax)))
                    ElseIf Dmax = 40 Then
                        .Eau = CInt(Truncate(.Eau * 0.96))
                    ElseIf Dmax < 50 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(-4, -6, 40, 50, Dmax)))
                    ElseIf Dmax = 50 Then
                        .Eau = CInt(Truncate(.Eau * 0.94))
                    ElseIf Dmax < 63 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(-6, -8, 50, 63, Dmax)))
                    ElseIf Dmax < 63 Then
                        .Eau = CInt(Truncate(.Eau * 0.92))
                    ElseIf Dmax < 100 Then
                        .Eau = CInt(Truncate(.Eau * Interpol_Eau(-8, -12, 63, 100, Dmax)))
                    Else
                        .Eau = CInt(Truncate(.Eau * 0.88))
                    End If
            End Select
            EauCorrige = .Eau
            If EauInitial <> EauCorrige AndAlso .Dreux_MajPateCiment = True Then .C = CInt(Math.Floor(.Eau * C_E) + 1) 'Conservation du rapport C/E et augmentation/diminution de la teneur en pate
        End With
        'Affichage des courbes du dosage en ciment fonction de C/E et Affaissement
        Try
            Dim myImage As Image
            myImage = My.Resources.Test530x430
            Dim g As Graphics = Graphics.FromImage(myImage)
            Call Dessin_AbaqueCE_Dreux(g, 2, 530, 430, C_E)
            myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
            g.Dispose()
            rtf.InsertImage(myImage)
            My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
        Catch ex As Exception
            msg = "Le logiciel n'a pas pu charger l'image de l'estimatif du dosage de diment en fonction du rapport C/E et de l'affaissement." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
            MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
        rtf.NewLine()
        rtf.WriteString("Suivant l'abaque ci-dessus :") : rtf.NewLine()
        With Beton
            '--> Quantité de ciment
            rtf.WriteString("  - Quantité de ciment C : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg pour 1 m3 de béton")
            If .Plastifiant = True Then rtf.WriteString(" + superplastifiant.")
            rtf.NewLine()
            '--> Quantité d'eau
            rtf.WriteString("  - Quantité d'eau E : ") : rtf.Bold = True : rtf.WriteString(EauInitial.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" L pour 1 m3 de béton") : rtf.NewLine() ' 
            If EauInitial = EauCorrige Then
                Select Case .Dreux_TabE
                    Case 1 'Tableau Dreux-Gorisse strict
                        rtf.WriteString("Le diamètre maximal du granulat est compris entre 20 et 25mm : pas de correction de la quantité d'eau.") : rtf.NewLine()
                    Case 2, 3 'Tableau ENS = Tableau composé
                        rtf.WriteString("Le diamètre maximal du granulat est égal à 25mm : pas de correction de la quantité d'eau.") : rtf.NewLine()
                End Select
            Else
                Select Case .Dreux_TabE
                    Case 1 'Tableau Dreux-Gorisse strict
                        rtf.WriteString("Le diamètre maximal du granulat n'est pas compris dans l'intervalle [20mm - 25mm] : correction de la quantité d'eau initiale par un coefficient égal à " & (EauCorrige / EauInitial).ToString("#0.00")) : rtf.NewLine()
                    Case 2, 3 'Tableau ENS = Tableau composé
                        rtf.WriteString("Le diamètre maximal du granulat est différent de 25mm : correction de la quantité d'eau initiale par un coefficient égal à " & (EauCorrige / EauInitial).ToString("#0.00")) : rtf.NewLine()
                End Select
                rtf.WriteString("  - Quantité d'eau corrigée E :" & .Eau.ToString("#0") & " L pour 1 m3 de béton") : rtf.NewLine()
            End If
            'Prise en compte de l'EN206-1
            If .EN206 > 0.1 Then '.EN206_Durabilite = True
                'EN206-2000 ou EN206-2022
                If .EN206 = 1 Then msg = "(2000)" Else msg = "(2022)"
                rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification conditions EN 206-1 " & msg & " :") : rtf.Underline = False : rtf.NewLine()
                'Vérification de la teneur mini en liant
                If .C > .EN206_TeneurLiant Then
                    rtf.WriteString("Vérification de la teneur minimale en ciment (kg/m3) : " & .C.ToString("#0") & " > " & .EN206_TeneurLiant.ToString("#0.0") & " - Satisfaisant.") : rtf.NewLine()
                Else
                    rtf.WriteString("Vérification de la teneur minimale en ciment (kg/m3) : " & .C.ToString("#0") & " < " & .EN206_TeneurLiant.ToString("#0.0") & " - Non satisfaisant.") : rtf.NewLine()
                    rtf.WriteString("Complément de ciment à ajouter (kg/m3) : " & (.EN206_TeneurLiant - .C).ToString("#0")) : rtf.NewLine()
                    .C += CInt(.EN206_TeneurLiant - .C)
                    rtf.WriteString(" C : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg pour 1 m3 de béton.") : rtf.NewLine()
                End If
                'Vérification de la teneur en eau
                rtf.WriteString("Vérification rapport E/C :") : rtf.NewLine()
                rtf.InsertTab() : rtf.WriteString("- E/C = " & (.Eau / .C).ToString("#0.00")) : rtf.NewLine()
                rtf.InsertTab() : rtf.WriteString("- Teneur limite EN206-1 : " & .EN206_EC.ToString("#0.00")) : rtf.NewLine()
                If (.Eau / .C) > .EN206_EC Then
                    rtf.InsertTab() : rtf.WriteString("- E/C = " & (.Eau / .C).ToString("#0.00") & " > " & .EN206_EC.ToString("#0.00") & " - Quantité d'eau trop importante - Non satisfaisant.") : rtf.NewLine()
                    rtf.WriteString("La quantité d'eau est trop importante par rapport au ciment. Il faut soit ajouter un plastifiant ou superplastifiant pour conserver la même ouvrabilité " &
                                           "ou augmenter la quantité de ciment au détriment de l'ouvrabilité. Le logiciel calcule sur le 2ième choix.") : rtf.NewLine()
                    rtf.WriteString("La quantité de ciment C est augmentée de " & ((.Eau / .EN206_EC) - .C).ToString("#0") & " kg/m3.") : rtf.NewLine()
                    .C += CInt(Math.Truncate((.Eau / .EN206_EC) - .C) + 1)
                    rtf.WriteString(" C : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg pour 1 m3 de béton.") : rtf.NewLine()
                Else
                    rtf.InsertTab() : rtf.WriteString("- E/C = " & (.Eau / .C).ToString("#0.00") & " < " & .EN206_EC.ToString("#0.00") & " - Satisfaisant.") : rtf.NewLine()
                End If
            End If
        End With

        '
        '2ième partie - Détermination de la répartition en % des différents granulats - Sables et Gravillons
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        Dim i_chap As Integer
        rtf.FontSize = 11 : rtf.NewLine() : rtf.Underline = True
        rtf.WriteString("2 - 2  Détermination de la répartition en % des différents granulats - Sables et Gravillons") : rtf.Underline = False : rtf.FontSize = 10 : rtf.NewLine() : rtf.NewLine()
        If Sable.Count >= 2 Then msg = "Caractéristiques des sables" Else msg = "Caractéristiques du sable"
        rtf.InsertTab() : rtf.Italic = True : i_chap = 1
        rtf.WriteString("2 - 2 . " & i_chap.ToString & " - " & msg) : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine()
        With Sable
            For i = 1 To Beton.NbSable
                If i > Sable.Count Then
                    MessageBox.Show("Pb comptage nb sable", "Formulation Dreux", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
                    rtf.WriteEndGroup() : Verif = False : Exit Sub
                End If
                rtf.NewLine()
                rtf.Underline = True : rtf.WriteString("Sable n°" & i.ToString & " :") : rtf.Underline = False : rtf.NewLine()
                With .Item(i - 1)
                    rtf.WriteString("  - Identité : " & .NomSable.ToString) : rtf.NewLine()
                    rtf.WriteString("  - Classe granulaire : " & .ds.ToString("#0") & " / " & .Dms.ToString("#0")) : rtf.NewLine()
#Region "En attente de suppression"
                    'rtf.WriteString("  - Qualité : ")
                    'Select Case .Qualite
                    '    Case 1
                    '        msg = "Caractéristiques indicées A suivant NF EN 12620 + A1 ( = Excellente suivant Dreux-Gorisse)"
                    '    Case 2
                    '        msg = "Caractéristiques indicées B suivant NF EN 12620 + A1 ( = Bonne suivant Dreux-Gorisse)"
                    '    Case 3
                    '        msg = "Caractéristiques indicées C suivant NF EN 12620 + A1 ( = Courante suivant Dreux-Gorisse)"
                    '    Case 4
                    '        msg = "Caractéristiques indicées D suivant NF EN 12620 + A1 ( = Passable suivant Dreux-Gorisse)"
                    'End Select
                    'rtf.WriteString(msg) : rtf.NewLine()
#End Region
                    rtf.WriteString("  - Forme du granulat : ")
                    Select Case .Forme
                        Case 1
                            msg = "concassé."
                        Case 2
                            msg = "roulé"
                    End Select
                    rtf.WriteString(msg) : rtf.NewLine()
                    rtf.WriteString("  - Densité sèche : " & .Densite.ToString("#0.00") & " T/m3") : rtf.NewLine()
                    If Beton.CompPondHumide = True Then
                        rtf.WriteString("  - Teneur en Humidité : " & (.Humidite * 100).ToString("#0.00") & " %") : rtf.NewLine()
                    End If
                    .ModuleFinesse(.Choix_mesureGranulo, Beton.Formulation)
                    If .Correcteur = True Then msg = " - Sable correcteur" Else msg = ""
                    rtf.WriteString("Module de finesse mf : " & .mf.ToString("#0.00") & msg) : rtf.NewLine()
                    Select Case i
                        Case 1
                            If Sable.Count = 1 Then 'Valide uniquement sans sable correcteur
                                If .mf <= 1.8 Then
                                    rtf.InsertImage(My.Resources.trafficlight_red)
                                    rtf.WriteString(" - Sable inapproprié :   mf < 1.8 ") : rtf.NewLine()
                                    rtf.WriteString("Le module de finesse est trop petit. Le sable est trop fin et la résistance du béton va chuter. Prévoir de corriger ce sable avec un autre complément plus grossier.") : rtf.NewLine()
                                    msg = "- Sable inapproprié :   mf < 1.8" & Environment.NewLine & "Le module de finesse est trop petit. Le sable est trop fin et la résistance du béton va chuter. Prévoir de corriger ce sable avec un autre complément plus grossier."
                                    Aff.msg_Avertiss.Add(msg)
                                ElseIf .mf < 2.2 Then
                                    rtf.InsertImage(My.Resources.trafficlight_yellow)
                                    rtf.WriteString(" - Sable un peu fin, le mf devrait être > 2.2") : rtf.NewLine()
                                ElseIf .mf > 2.8 Then
                                    rtf.InsertImage(My.Resources.trafficlight_yellow)
                                    rtf.WriteString(" - Sable un peu grossier, le mf devrait être < 2.8") : rtf.NewLine()
                                ElseIf .mf >= 3.2 Then
                                    rtf.InsertImage(My.Resources.trafficlight_red)
                                    rtf.WriteString(" - Sable inapproprié :   mf > 3.2 ") : rtf.NewLine()
                                    rtf.WriteString("Le module de finesse est trop gros. Le sable est trop grossier et la compacité du béton va chuter. Prévoir de corriger ce sable avec un complément plus fin.") : rtf.NewLine()
                                    msg = "- Sable inapproprié :   mf > 3.2" & Environment.NewLine & "Le module de finesse est trop gros. Le sable est trop grossier et la compacité du béton va chuter. Prévoir de corriger ce sable avec un complément plus fin."
                                    Aff.msg_Avertiss.Add(msg)
                                End If
                            End If
                        Case 2
                            rtf.WriteString("Objectif fixé pour le module de finesse avec le complément de sable n°2 : mf = " & .mfCible.ToString("#0.00")) : rtf.NewLine()
                    End Select
                    'Affichage de la courbe granulaire du sable
                    Try
                        Dim myImage As Image
                        myImage = My.Resources.Test700x400
                        Dim g As Graphics = Graphics.FromImage(myImage)
                        Call Affichage_CourbeGranulo(g, 2, 1, i - 1)
                        myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
                        g.Dispose()
                        rtf.InsertImage(myImage)
                        rtf.NewLine()
                        My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
                    Catch ex As Exception
                        msg = "Le logiciel n'a pas pu charger l'image de la courbe granulométrique du sable n°" & i.ToString & "." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End With
            Next
            '-->  Affichage de la composition des 2 sables
            If Beton.NbSable = 2 Then
                If Sable.Count >= 2 Then
                    rtf.InsertTab() : rtf.Italic = True : rtf.FontSize = 10 : i_chap += 1
                    rtf.WriteString("2 - 2 . " & i_chap.ToString & " - Composition des deux sables") : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine()
                    rtf.WriteString(" mf cible = " & .Item(1).mfCible.ToString("#0.00")) : rtf.NewLine()
                    If .Item(0).mf < .Item(1).mf Then
                        If .Item(0).mfCible > .Item(1).mf OrElse .Item(0).mfCible < .Item(0).mf Then
                            msg = "Le module de finesse cible doit être compris entre " & .Item(0).mf.ToString("#0.00") & " et " & .Item(1).mf.ToString("#0.00") & ". Or, ce n'est pas le cas. Le module de finesse cible n'est donc pas atteignable."
                            msg += Environment.NewLine & "Veuillez modifier la granulométrie des sables."
                            msg += Environment.NewLine & "Calcul arrêté."
                            MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            rtf.WriteEndGroup()
                            Verif = False : Exit Sub
                        End If
                    Else '.Item(0).mf > .Item(1).mf
                        If .Item(0).mfCible > .Item(0).mf OrElse .Item(0).mfCible < .Item(1).mf Then
                            msg = "Le module de finesse cible doit être compris entre " & .Item(1).mf.ToString("#0.00") & " et " & .Item(0).mf.ToString("#0.00") & ". Or, ce n'est pas le cas. Le module de finesse cible n'est donc pas atteignable."
                            msg += Environment.NewLine & "Veuillez modifier la granulométrie des sables."
                            msg += Environment.NewLine & "Calcul arrêté."
                            MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            rtf.WriteEndGroup()
                            Verif = False : Exit Sub
                        End If
                    End If
                    'proportion du sable 1
                    .Item(0).Mf_prop = Abs((.Item(1).mf - .Item(0).mfCible) / (.Item(1).mf - .Item(0).mf))
                    'proportion du sable 2
                    .Item(1).Mf_prop = 1 - .Item(0).Mf_prop
                    'composition du sable composé
                    rtf.WriteString("Le mélange des 2 sables sera composé de " & (.Item(0).Mf_prop * 100).ToString("#0.00") & " % de sable n°1 et de " & (.Item(1).Mf_prop * 100).ToString("#0.00") & " % de sable n°2.") : rtf.NewLine()
                    'ajout d'un 3ième sable qui sera le sable composé
                    Dim SableCompose As New clsSable
                    Dim Total As Double
                    SableCompose.Disponibilite_Tamis = .Item(0).Disponibilite_Tamis

                    For Each kvp As KeyValuePair(Of Double, Boolean) In Sable.Item(1).Disponibilite_Tamis
                        If SableCompose.Disponibilite_Tamis.ContainsKey(kvp.Key) AndAlso SableCompose.Disponibilite_Tamis(kvp.Key) = False AndAlso Sable.Item(1).Disponibilite_Tamis(kvp.Key) = True Then
                            SableCompose.Disponibilite_Tamis(kvp.Key) = True
                        End If
                    Next
                    SableCompose.TamisatCumule_Pourcent.Clear() : ValeurprecedenteS1 = 0 : ValeurPrecedenteS2 = 0
                    For Each kvp As KeyValuePair(Of Double, Boolean) In SableCompose.Disponibilite_Tamis
                        If .Item(0).TamisatCumule_Pourcent(kvp.Key) = 0 And ValeurprecedenteS1 = 100 Then .Item(0).TamisatCumule_Pourcent(kvp.Key) = 100
                        If .Item(1).TamisatCumule_Pourcent(kvp.Key) = 0 And ValeurPrecedenteS2 = 100 Then .Item(1).TamisatCumule_Pourcent(kvp.Key) = 100
                        Total = .Item(0).Mf_prop * .Item(0).TamisatCumule_Pourcent(kvp.Key) + .Item(1).Mf_prop * .Item(1).TamisatCumule_Pourcent(kvp.Key)
                        SableCompose.TamisatCumule_Pourcent.Add(kvp.Key, Total)
                        If .Item(0).TamisatCumule_Pourcent(kvp.Key) = 100 Then ValeurprecedenteS1 = 100
                        If .Item(1).TamisatCumule_Pourcent(kvp.Key) = 100 Then ValeurPrecedenteS2 = 100
                    Next
                    SableCompose.Choix_mesureGranulo = 4 'pour spécifier que pour le sable composé, la mesure est réalisée en tamisat cumulé %
                    Sable.Add(SableCompose) 'le sable composé sera le 3ième sable soit le sable n°2
                    'Affichage de la courbe granulaire du sable composé
                    Try
                        Dim myImage As Image
                        myImage = My.Resources.Test700x400
                        Dim g As Graphics = Graphics.FromImage(myImage)
                        Call Affichage_CourbeGranulo(g, 2, 1, 2)
                        myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
                        g.Dispose()
                        rtf.InsertImage(myImage)
                        rtf.NewLine()
                        My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
                    Catch ex As Exception
                        msg = "Le logiciel n'a pas pu charger l'image de la courbe granulométrique du sable composé." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                Else
                    MessageBox.Show("Pb sur nombre de sables: beton.nbsable = 2 et sable.count = " & Sable.Count.ToString("#0"), "Sub Formulation_DreuxGorisse", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
                    rtf.WriteEndGroup() : Verif = False : Exit Sub
                End If
            End If
        End With
        If Gravillon.Count = 2 Then msg = " - Caractéristiques des gravillons" Else msg = " - Caractéristiques du gravillon"
        rtf.InsertTab() : rtf.FontSize = 10 : rtf.Italic = True : i_chap += 1
        rtf.WriteString("2 - 2 . " & i_chap.ToString & msg) : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine()
        With Gravillon
            For i = 1 To Gravillon.Count
                rtf.NewLine()
                rtf.Underline = True : rtf.WriteString("Gravillon n°" & i.ToString & " :") : rtf.Underline = False : rtf.NewLine()
                With .Item(i - 1)
                    rtf.WriteString("  - Identité : " & .NomGravillon.ToString) : rtf.NewLine()
                    rtf.WriteString("  - Classe granulaire : " & .dg.ToString("#0") & " / " & .Dmg.ToString("#0")) : rtf.NewLine()
                    rtf.WriteString("  - Qualité : ")
                    Select Case .Qualite
                        Case 1
                            msg = "Caractéristiques indicées A suivant NF EN 12620 + A1 ( = Excellente suivant Dreux-Gorisse)"
                        Case 2
                            msg = "Caractéristiques indicées B suivant NF EN 12620 + A1 ( = Bonne suivant Dreux-Gorisse)"
                        Case 3
                            msg = "Caractéristiques indicées C suivant NF EN 12620 + A1 ( = Courante suivant Dreux-Gorisse)"
                        Case 4
                            msg = "Caractéristiques indicées D suivant NF EN 12620 + A1 ( = Passable suivant Dreux-Gorisse)"
                    End Select
                    rtf.WriteString(msg) : rtf.NewLine()
                    rtf.WriteString("  - Type de granulat : ")
                    Select Case .Forme
                        Case 1
                            msg = "concassé."
                        Case 2
                            msg = "roulé"
                    End Select
                    rtf.WriteString(msg) : rtf.NewLine()
                    rtf.WriteString("  - Densité sèche : " & .Densite.ToString("#0.00") & " T/m3") : rtf.NewLine()
                    If Beton.CompPondHumide = True Then
                        rtf.WriteString("  - Teneur en Humidité : " & (.Humidite * 100).ToString("#0.00") & " %") : rtf.NewLine()
                    End If
                    'Affichage de la courbe granulaire du gravillon
                    Try
                        Dim myImage As Image
                        myImage = My.Resources.Test700x400
                        Dim g As Graphics = Graphics.FromImage(myImage)
                        Call Affichage_CourbeGranulo(g, 2, 2, i - 1)
                        myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
                        g.Dispose()
                        rtf.InsertImage(myImage)
                        rtf.NewLine()
                        My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
                    Catch ex As Exception
                        msg = "Le logiciel n'a pas pu charger l'image de la courbe granulométrique du gravillon n°" & i.ToString & "." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
                        MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End With
            Next
        End With
        ''--> Composition du squeulette granulaire
        rtf.InsertTab() : rtf.FontSize = 10 : rtf.Italic = True : i_chap += 1
        rtf.WriteString("2 - 2 . " & i_chap.ToString & " - Composition du mélange de granulats sable + gravillon") : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        rtf.Underline = True
        rtf.WriteString("Détermination de la droite brisée de référence OAB pour le mélange granulaire :") : rtf.Underline = False : rtf.NewLine()
        rtf.WriteEndGroup()
        Call DroitebriseeOAB_DreuxGorisse(Verif, rtf)
        rtf.WriteStartGroup() : rtf.FontSize = 12 : rtf.FontSize = 9 : rtf.Underline = True
        rtf.WriteString("Affichage de la composition du mélange granulaire Sable(s) + Gravillon(s) :") : rtf.Underline = False : rtf.NewLine()
        'Affichage de la composition du mélange granulaire
        Try
            Dim myImage As Image
            myImage = My.Resources.Test700x400
            Dim g As Graphics = Graphics.FromImage(myImage)
            Call Affichage_CourbeGranulo(g, 2, 3,, Verif)
            myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
            g.Dispose()
            rtf.InsertImage(myImage)
            rtf.NewLine()
            My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
        Catch ex As Exception
            msg = "Le logiciel n'a pas pu charger l'image de la composition granulaire." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
            MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
        'Test en cas de problème de calcul du point d'intersection droite OAB et droite X95%-X05%
        If Verif = False Then
            rtf.WriteEndGroup() : Verif = True : Exit Sub
        End If

        rtf.WriteString("La répartition en % entre le Sable et le Gravillon est la suivante :") : rtf.NewLine()
        If Beton.NbSable = 1 Then
            Sable.Item(0).S_Vs = Beton.S_Vs
            rtf.WriteString("  - Sable : " & Sable.Item(0).S_Vs.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        Else
            'mélange des 2 sables sera composé de " & (prop1 * 100).ToString("#0.00") & " % de sable n°1 et de " & (prop2 * 100).ToString("#0.00") & " % de sable n°2."
            Sable.Item(0).S_Vs = CInt(Floor(Sable.Item(0).Mf_prop * Beton.S_Vs))
            Sable.Item(1).S_Vs = Beton.S_Vs - Sable.Item(0).S_Vs
            rtf.WriteString("  ▸ % Total de Sable dans la composition granulaire du béton : " & Beton.S_Vs.ToString("#0") & " % avec la répartition suivante :") : rtf.NewLine()
            rtf.WriteString("       - Sable n°1 : " & Sable.Item(0).S_Vs.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
            rtf.WriteString("       - Sable n°2 : " & Sable.Item(1).S_Vs.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        End If
        If Beton.NbGravillon = 1 Then
            rtf.WriteString("  - Gravillon : " & Gravillon.Item(0).G_Vg.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        Else
            rtf.WriteString("  ▸ % Total de Gravillon dans la composition granulaire du béton : " & (100 - Beton.S_Vs).ToString("#0") & " % avec la répartition suivante :") : rtf.NewLine()
            rtf.WriteString("       - Gravillon n°1 : " & Gravillon.Item(0).G_Vg.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
            rtf.WriteString("       - Gravillon n°2 : " & Gravillon.Item(1).G_Vg.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        End If
        '
        '3ième partie - Détermination des volumes de granulats - Sables et Gravillons
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Bold = True
        rtf.Underline = True : rtf.WriteString("3 - Répartition volumique de la formulation") : rtf.Bold = False : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        Dim γ As Double 'coef de compacité
        Dim Vc As Double 'Volume de ciment
        Dim Vag As Double 'volume absolu de l'ensemble des granulats
        Call Compacite(Dmax, γ)
        rtf.WriteString("Coefficient de compacité : γ =" & γ.ToString("#0.000") & " pour des granulats roulés.") : rtf.NewLine()

        'Correctif de compacité (voir notice)
        If (Beton.NbSable = 1 And Sable.Item(0).Forme = 1) OrElse (Beton.NbSable = 2 AndAlso (Sable.Item(0).Forme = 1 OrElse Sable.Item(1).Forme = 1)) Then
            '1 ou 2 Sable concassé
            If (Beton.NbGravillon = 1 And Gravillon.Item(0).Forme = 1) OrElse (Beton.NbGravillon = 2 AndAlso (Gravillon.Item(0).Forme = 1 OrElse Gravillon.Item(1).Forme = 1)) Then
                'Gravillon concassé
                γ -= 0.03
                rtf.WriteString("Coefficient de compacité corrigé par Sable concassé et Gravillon concassé par un coefficient égal à -0,03 soit γ = " & γ.ToString("#0.000")) : rtf.NewLine()
            End If
        ElseIf ((Beton.NbGravillon = 1 And Gravillon.Item(0).Forme = 1) OrElse (Beton.NbGravillon = 2 AndAlso (Gravillon.Item(0).Forme = 1 OrElse Gravillon.Item(1).Forme = 1))) Then '1 sable roulé ou 2 sables roulés + 
            'Sable roulé (sinon je suis dans la condition au dessus) + 1 ou 2 Gravillon concassé
            γ -= 0.01
            rtf.WriteString("Coefficient de compacité corrigé par Sable roulé et Gravillon concassé par un coefficient égal à -0,01 soit γ = " & γ.ToString("#0.000")) : rtf.NewLine()
        End If
        Vc = Beton.C / Beton.Ciment.Densite
        rtf.WriteString("Volume du ciment = Vc (= quantité de ciment / densité ciment) : Vc =" & Beton.C.ToString("#0") & " /  " & Beton.Ciment.Densite.ToString("#0.00") & " =  " & Vc.ToString("#0.00") & " L (= dm3) ") : rtf.NewLine()
        Vag = 1000 * γ - Vc
        rtf.WriteString("Volume absolu de l'ensemble des granulats :") : rtf.NewLine()
        rtf.WriteString("Vag = 1000.γ - Vc") : rtf.NewLine()
        rtf.WriteString("Vag = " & Vag.ToString("#0.00") & " L (= dm3) avec la répartition suivante :") : rtf.NewLine()
        Sable.Item(0).Vol = CInt(Floor(Sable.Item(0).S_Vs * Vag / 100))
        rtf.WriteString("   - Sable n° 1 : " & Sable.Item(0).S_Vs.ToString("#0") & " % du volume global Vag soit " & Sable.Item(0).Vol.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
        If Beton.NbSable = 2 Then
            Sable.Item(1).Vol = CInt(Floor(Sable.Item(1).S_Vs * Vag / 100))
            rtf.WriteString("   - Sable n° 2 : " & Sable.Item(1).S_Vs.ToString("#0") & " % du volume global Vag soit " & Sable.Item(1).Vol.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
        End If
        Gravillon.Item(0).Vol = CInt(Floor(Gravillon.Item(0).G_Vg * Vag / 100))
        rtf.WriteString("   - Gravillon n° 1 : " & (Gravillon.Item(0).G_Vg).ToString("#0") & " % du volume global Vag soit " & Gravillon.Item(0).Vol.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
        If Beton.NbGravillon = 2 Then
            Gravillon.Item(1).Vol = CInt(Floor(Gravillon.Item(1).G_Vg * Vag / 100))
            rtf.WriteString("   - Gravillon n° 2 : " & (Gravillon.Item(1).G_Vg).ToString("#0") & " % du volume global Vag soit " & Gravillon.Item(1).Vol.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
        End If
        rtf.WriteString("Volume d'eau : " & Beton.Eau.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
        '
        '4ième partie - Détermination des masses de granulats - Sables et Gravillons
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Bold = True
        rtf.Underline = True : rtf.WriteString("4 - Répartition pondérale de la formulation") : rtf.Bold = False : rtf.FontSize = 11 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("4 - 1  Dosage en matériaux sec") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        With Sable
            With .Item(0)
                rtf.WriteString("Sable n° 1 : ") : rtf.NewLine()
                rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                .Masse = CInt(Truncate(.Vol * .Densite))
                rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
            End With
            If Beton.NbSable = 2 Then
                With .Item(1)
                    rtf.WriteString("Sable n° 2 : ") : rtf.NewLine()
                    rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                    .Masse = CInt(Truncate(.Vol * .Densite))
                    rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
                End With
            End If
        End With

        With Gravillon
            With .Item(0)
                rtf.WriteString("Gravillon n° 1 : ") : rtf.NewLine()
                rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                .Masse = CInt(Truncate(.Vol * .Densite))
                rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
            End With
            If Beton.NbSable = 2 Then
                With .Item(1)
                    rtf.WriteString("Gravillon n° 2 : ") : rtf.NewLine()
                    rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                    .Masse = CInt(Truncate(.Vol * .Densite))
                    rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
                End With
            End If
        End With
        Dim TotalSec As Double = 0
        rtf.NewLine() : rtf.Underline = True
        rtf.WriteString("Composition pondérale matériaux secs : ") : rtf.Underline = False : rtf.NewLine()
        With Beton
            rtf.WriteString("  - Ciment : " & .C & " kg.") : rtf.NewLine()
            rtf.WriteString("  - Eau : " & .Eau & " L.") : rtf.NewLine()
            rtf.WriteString("  - Sable n°1 : " & Sable.Item(0).Masse.ToString("#0") & " kg.") : rtf.NewLine()
            TotalSec = .C + .Eau + Sable.Item(0).Masse
            If .NbSable = 2 Then rtf.WriteString("  - Sable n°2 : " & Sable.Item(1).Masse.ToString("#0") & " kg.") : rtf.NewLine() : TotalSec += Sable.Item(1).Masse
            rtf.WriteString("  - Gravillon n°1 : " & Gravillon.Item(0).Masse.ToString("#0") & " kg.") : rtf.NewLine()
            TotalSec += Gravillon.Item(0).Masse
            If .NbGravillon = 2 Then rtf.WriteString("  - Gravillon n°2 : " & Gravillon.Item(1).Masse.ToString("#0") & " kg.") : rtf.NewLine() : TotalSec += Gravillon.Item(1).Masse
        End With
        rtf.WriteString("--------------------------------------") : rtf.NewLine()
        rtf.WriteString("Total Général : " & TotalSec.ToString("#0") & " kg.") : rtf.NewLine()
        'Dosage en matériaux humide
        If Beton.CompPondHumide = True Then
            rtf.NewLine() : rtf.Underline = True : rtf.FontSize = 11
            rtf.WriteString("4 - 2  Dosage en matériaux humide") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
            With Sable
                With .Item(0)
                    rtf.WriteString("Sable n° 1 : ") : rtf.NewLine()
                    rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                    rtf.WriteString("  - Apport en eau à la masse de sable : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                    .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                    rtf.WriteString("  - Masse totale du sable humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                End With
                If Beton.NbSable = 2 Then
                    With .Item(1)
                        rtf.WriteString("Sable n° 2 : ") : rtf.NewLine()
                        rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                        rtf.WriteString("  - Apport en eau à la masse de sable : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                        .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                        rtf.WriteString("  - Masse totale du sable humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                    End With
                End If
            End With
            With Gravillon
                With .Item(0)
                    rtf.WriteString("Gravillon n° 1 : ") : rtf.NewLine()
                    rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                    rtf.WriteString("  - Apport en eau à la masse de Gravillon : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                    .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                    rtf.WriteString("  - Masse totale du Gravillon humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                End With
                If Beton.NbSable = 2 Then
                    With .Item(1)
                        rtf.WriteString("Gravillon n° 2 : ") : rtf.NewLine()
                        rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                        rtf.WriteString("  - Apport en eau à la masse de Gravillon : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                        .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                        rtf.WriteString("  - Masse totale du Gravillon humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                    End With
                End If
            End With
            Dim qtiteEauS As Double = 0
            Dim qtiteEauG As Double = 0
            rtf.WriteString("Eau : ") : rtf.NewLine()
            rtf.WriteString("  - Correction sur la quantité d'eau totale : ") : rtf.NewLine()
            rtf.WriteString("  - Quantité d'eau apportée par le sable : ")
            For i = 1 To Beton.NbSable
                With Sable.Item(i - 1)
                    qtiteEauS += .Masse * .Humidite
                End With
            Next
            rtf.WriteString(qtiteEauS.ToString("#0.0") & " L.") : rtf.NewLine()
            rtf.WriteString("  - Quantité d'eau apportée par le gravillon : ")
            For i = 1 To Beton.NbGravillon
                With Gravillon.Item(i - 1)
                    qtiteEauG += .Masse * .Humidite
                End With
            Next
            rtf.WriteString(qtiteEauG.ToString("#0.0") & " L.") : rtf.NewLine()
            Beton.Eau = CInt(Floor(Beton.Eau - qtiteEauG - qtiteEauS))
            Dim TotalHumide As Double = 0
            rtf.WriteString("  - Quantité d'eau après correction : " & Beton.Eau.ToString("#0.0") & " L.") : rtf.NewLine() : rtf.NewLine() : rtf.Underline = True
            rtf.WriteString("Composition pondérale humide : ") : rtf.Underline = False : rtf.NewLine()
            With Beton
                rtf.WriteString("  - Ciment : " & .C & " kg.") : rtf.NewLine()
                rtf.WriteString("  - Eau : " & .Eau & " L.") : rtf.NewLine()
                rtf.WriteString("  - Sable n°1 : " & Sable.Item(0).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine()
                TotalHumide = .C + .Eau + Sable.Item(0).MasseHumide
                If .NbSable = 2 Then rtf.WriteString("  - Sable n°2 : " & Sable.Item(1).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine() : TotalHumide += Sable.Item(1).MasseHumide
                rtf.WriteString("  - Gravillon n°1 : " & Gravillon.Item(0).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine()
                TotalHumide += Gravillon.Item(0).MasseHumide
                If .NbGravillon = 2 Then rtf.WriteString("  - Gravillon n°2 : " & Gravillon.Item(1).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine() : TotalHumide += Gravillon.Item(1).MasseHumide
            End With
            rtf.WriteString("--------------------------------------") : rtf.NewLine()
            rtf.WriteString("Total Général : " & TotalHumide.ToString("#0") & " kg.") : rtf.NewLine()
        End If
        '
        '5ième partie - Avertissements
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Underline = True : rtf.Bold = True
        rtf.WriteString("5 - Avertissements") : rtf.Underline = False : rtf.Bold = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        If Aff.msg_Avertiss.Count = 0 Then
            rtf.WriteString("Aucun avertissement.") : rtf.NewLine()
        Else
            With Aff
                For i = 1 To .msg_Avertiss.Count
                    rtf.WriteString(.msg_Avertiss(i - 1).ToString) : rtf.NewLine()
                Next
            End With
        End If
        rtf.WriteEndGroup()
    End Sub

    ''' <summary>Fonction d'interpolation pour la valeur de Kdg à partir du tableau 10.8</summary>
    ''' <param name="b1">borne inférieure</param>
    ''' <param name="b2">borne supérieure</param>
    ''' <param name="Dmax">diamètre maximum du granulat utilisé</param>
    ''' <param name="QualiteGranulat">qualité du granulat suivant le tableau 10-8 de la méthode Dreux - Gorisse</param>
    Private Function Interpol_Kdg(ByVal b1 As Double, ByVal b2 As Double, ByVal Dmax As Double, ByVal QualiteGranulat As Integer) As Double
        Select Case QualiteGranulat
            Case 1 'excellente
                Select Case b1
                    Case 16
                        Interpol_Kdg = 0.55 + 0.05 * (Dmax - b1) / (b2 - b1)
                    Case 40
                        Interpol_Kdg = 0.6 + 0.05 * (Dmax - b1) / (b2 - b1)
                End Select
            Case 2 'bonne, courante
                Select Case Beton.Dreux_TabKdg
                    Case 1, 3 'Tableau Méthode Dreux-Gorisse stricte = tableau composé à la borne b2 près mais cela ne change pas l'algorithme
                        Select Case b1
                            Case 16
                                Interpol_Kdg = 0.45 + 0.05 * (Dmax - b1) / (b2 - b1)
                            Case 40
                                Interpol_Kdg = 0.5 + 0.05 * (Dmax - b1) / (b2 - b1)
                        End Select
                    Case 2 'Tableau ENS
                        Select Case b1
                            Case 16
                                Interpol_Kdg = 0.45 + 0.1 * (Dmax - b1) / (b2 - b1)
                            Case 40
                                Interpol_Kdg = 0.55 + 0.05 * (Dmax - b1) / (b2 - b1)
                        End Select
                End Select
            Case 3 'Passable
                Select Case b1
                    Case 16
                        Interpol_Kdg = 0.35 + 0.05 * (Dmax - b1) / (b2 - b1)
                    Case 40
                        Interpol_Kdg = 0.4 + 0.05 * (Dmax - b1) / (b2 - b1)
                End Select
        End Select
        Interpol_Kdg = (Truncate(Interpol_Kdg * 100)) / 100 'arrondi au centième inférieur
    End Function

    ''' <summary>Fonction d'interpolation pour la valeur de la quantité de ciment par m3 à partir de l'abaque X-14</summary>
    ''' <param name="Cmin">dosage mini en ciment</param>
    ''' <param name="C_E">rapport C/E</param>
    ''' <param name="Slump">Affaissement en cm, cm par cm</param>
    Private Function Interpol_CE(ByVal Cmin As Integer, ByVal C_E As Double, ByVal Slump As Integer) As Integer
        Dim CEmax, CEmin, CE As Double
        With Beton
            Select Case Cmin
                Case 400
                    CEmax = .C450(Slump) : CEmin = .C400(Slump)
                    CE = 400 + 50 * (C_E - CEmin) / (CEmax - CEmin)
                Case 350
                    CEmax = .C400(Slump) : CEmin = .C350(Slump)
                    CE = 350 + 50 * (C_E - CEmin) / (CEmax - CEmin)
                Case 300
                    CEmax = .C350(Slump) : CEmin = .C300(Slump)
                    CE = 300 + 50 * (C_E - CEmin) / (CEmax - CEmin)
                Case 250
                    CEmax = .C300(Slump) : CEmin = .C250(Slump)
                    CE = 250 + 50 * (C_E - CEmin) / (CEmax - CEmin)
                Case 200
                    CEmax = .C250(Slump) : CEmin = .C200(Slump)
                    CE = 200 + 50 * (C_E - CEmin) / (CEmax - CEmin)
            End Select
        End With
        Interpol_CE = CInt(Floor(CE))
    End Function

    ''' <summary>Fonction d'interpolation pour la valeur de la quantité d'eau en L par m3 à partir du tableau</summary>
    ''' <param name="b1">borne 1 % eau</param>
    ''' <param name="b2">borne 2 % eau</param>
    Private Function Interpol_Eau(ByVal b1 As Double, ByVal b2 As Double, ByVal dMax1 As Double, ByVal dMax2 As Double, ByVal Dmax As Double) As Double
        Interpol_Eau = b2 + (((b1 - b2) / (dMax2 - dMax1)) * (dMax2 - Dmax))
        Interpol_Eau = Interpol_Eau / 100
        Interpol_Eau = 1 + Interpol_Eau
    End Function

    ''' <summary> Affichage des courbes de dosage de ciment par m3 sur support variés: écran, image ou imprimante </summary>
    ''' <param name="g">handle graphique </param>
    ''' <param name="support">type de support: 1=écran / 2 =image / 3 = imprimante</param>
    ''' <param name="Largeur">largeur du support : en pixel pour les supports 1=écran et 2 =image / en mm pour le support 3 = imprimante</param>
    ''' <param name="Hauteur">hauteur du support : en pixel pour les supports 1=écran et 2 =image / en mm pour le support 3 = imprimante</param>
    ''' <param name="C_E">valeur du rapport C/E pour l'affaissement demandé dans la formulation</param>
    Private Sub Dessin_AbaqueCE_Dreux(ByVal g As Graphics, ByVal Support As Integer, ByVal Largeur As Integer, ByVal Hauteur As Integer, ByVal C_E As Double)
        Dim msg As String = String.Empty
        Dim w As SizeF
        Dim i, pasV, pasH As Integer
        Dim X, Y, Y1, oriX, oriY As Single
        'création des stylos
        Dim myPen As New Pen(Color.Black, 1)
        Dim myFont As New Font("Times New Roman", 8, FontStyle.Regular)

        'support = 1 -> écran, =2 ->image, =3 ->imprimante
        Select Case Support
            Case 1 'écran

            Case 2 'image dans note de calcul -  image 530 x 430 pixels
                oriX = 50 : oriY = 380 : pasV = 19 : pasH = 26 '1 pasH = 1 cm et 26 pixels divisible par 2
                myPen = New Pen(Color.Black, 1)
            Case 3 'imprimante - Format A4
                oriX = 15 : oriY = 5
                myPen = New Pen(Color.Black, 0.1)
                'myPenblack1 = New Pen(Color.Black, 0.2)
                'myPenblue2 = New Pen(Color.Blue, 0.4)
                'myPenLblue1 = New Pen(Color.LightSkyBlue, 0.2)
        End Select
        'Axe X
        myPen.EndCap = Drawing2D.LineCap.ArrowAnchor
        g.DrawLine(myPen, oriX, oriY, oriX + 13 * pasH, oriY)
        'Axe Y
        g.DrawLine(myPen, oriX, oriY, oriX, oriY - 19 * pasV)
        'ligne de graduation verticale - Aff
        myPen = New Pen(Color.LightSkyBlue, 1)
        myPen.EndCap = Drawing2D.LineCap.NoAnchor
        i = 0
        For k = 1 To 13
            i = i + pasH
            g.DrawLine(myPen, oriX + i, oriY, oriX + i, oriY - 19 * pasV)
        Next
        'ligne de graduation horizontale - C/E
        i = 0
        For k = 1 To 19
            i = i + pasV
            g.DrawLine(myPen, oriX, oriY - i, oriX + 13 * pasH, oriY - i)
        Next
        'Valeurs de C/E
        Dim GradV() As String = {"1.0", "1.2", "1.4", "1.6", "1.8", "2.0", "2.2", "2.4", "2.6"}
        i = 0
        For k = 0 To 8
            i = i + 2 * pasV : w = g.MeasureString(GradV(k), myFont)
            g.DrawString(GradV(k), myFont, Brushes.DarkGreen, oriX - w.Width, oriY - i - w.Height / 2)
        Next
        msg = "C/E"
        w = g.MeasureString(msg, myFont)
        g.DrawString(msg, myFont, Brushes.DarkGreen, oriX - w.Width, oriY - i - pasV - w.Height)
        'Valeurs de Affaissement
        Dim GradH() As String = {"2", "4", "6", "8", "10", "12"}
        i = 0
        For k = 0 To 5
            i = i + 2 * pasH : w = g.MeasureString(GradH(k), myFont)
            g.DrawString(GradH(k), myFont, Brushes.Blue, oriX + i - w.Width / 2, oriY + w.Height)
        Next
        msg = "Aff [cm]"
        w = g.MeasureString(msg, myFont)
        g.DrawString(msg, myFont, Brushes.Blue, oriX + i + w.Width, oriY + w.Height)

        With Beton
            'Dessin des courbes de dosages
            myPen = New Pen(Color.Red, 1)
            'ligne 200 kg
            i = 0
            For k = 1 To 11
                i = i + pasH : Y = CSng(((.C200(k) - 0.8) / 0.1) * pasV) : Y1 = CSng(((.C200(k + 1) - 0.8) / 0.1) * pasV)
                g.DrawLine(myPen, oriX + i, oriY - Y, oriX + i + pasH, oriY - Y1)
            Next
            msg = "200" : w = g.MeasureString(msg, myFont) : X = w.Width / 4
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - w.Height / 2)
            'ligne 250 kg
            i = 0
            For k = 1 To 11
                i = i + pasH : Y = CSng(((.C250(k) - 0.8) / 0.1) * pasV) : Y1 = CSng(((.C250(k + 1) - 0.8) / 0.1) * pasV)
                g.DrawLine(myPen, oriX + i, oriY - Y, oriX + i + pasH, oriY - Y1)
            Next
            msg = "250" : w = g.MeasureString(msg, myFont)
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - w.Height / 2)
            'ligne 300 kg
            i = 0
            For k = 1 To 11
                i = i + pasH : Y = CSng(((.C300(k) - 0.8) / 0.1) * pasV) : Y1 = CSng(((.C300(k + 1) - 0.8) / 0.1) * pasV)
                g.DrawLine(myPen, oriX + i, oriY - Y, oriX + i + pasH, oriY - Y1)
            Next
            msg = "300" : w = g.MeasureString(msg, myFont)
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - w.Height / 2)
            'ligne 350 kg
            i = 0
            For k = 1 To 11
                i = i + pasH : Y = CSng(((.C350(k) - 0.8) / 0.1) * pasV) : Y1 = CSng(((.C350(k + 1) - 0.8) / 0.1) * pasV)
                g.DrawLine(myPen, oriX + i, oriY - Y, oriX + i + pasH, oriY - Y1)
            Next
            msg = "350" : w = g.MeasureString(msg, myFont)
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - w.Height / 2)
            'ligne 400 kg
            i = 0
            For k = 1 To 11
                i = i + pasH : Y = CSng(((.C400(k) - 0.8) / 0.1) * pasV) : Y1 = CSng(((.C400(k + 1) - 0.8) / 0.1) * pasV)
                g.DrawLine(myPen, oriX + i, oriY - Y, oriX + i + pasH, oriY - Y1)
            Next
            msg = "400" : w = g.MeasureString(msg, myFont)
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - w.Height / 2)
            'ligne 450 kg
            i = 0
            For k = 1 To 11
                i = i + pasH : Y = CSng(((.C450(k) - 0.8) / 0.1) * pasV) : Y1 = CSng(((.C450(k + 1) - 0.8) / 0.1) * pasV)
                g.DrawLine(myPen, oriX + i, oriY - Y, oriX + i + pasH, oriY - Y1)
            Next
            ' If .Dreux_AmendementENS = True Then msg = "450 + Superplastifiant" Else msg = "400 + Superplastifiant"
            msg = "400 + Superplastifiant"
            w = g.MeasureString(msg, myFont)
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - w.Height / 2)
            msg = "Dosage en ciment C[kg/m3]" : w = g.MeasureString(msg, myFont)
            g.DrawString(msg, myFont, Brushes.Red, oriX + i + pasH + X, oriY - Y1 - 2 * w.Height)
            'Point de dosage
            '--> ligne verticale
            myPen = New Pen(Color.Brown, 1)
            myPen.DashStyle = Drawing2D.DashStyle.Dash
            myPen.EndCap = Drawing2D.LineCap.RoundAnchor
            X = CSng((.Slump + 1) * pasH / 2) : Y = CSng(((C_E - 0.8) / 0.1) * pasV)
            g.DrawLine(myPen, oriX + X, oriY, oriX + X, oriY - Y)
            '--> ligne horizontale
            myPen.EndCap = Drawing2D.LineCap.Flat
            g.DrawLine(myPen, oriX, oriY - Y, oriX + X, oriY - Y)
        End With
    End Sub

    ''' <summary>Affichage de la courbe granulométrique</summary>
    '''  <param name="g">handle d'affichage</param>
    '''  <param name="Support">support d'affichage: 1 = sur écran, 2 = sur image 700x400, 3 sur imprimante A4</param> 
    '''  <param name="Appel">=1 Sable, =2 gravillon, =3 ensemble sable + gravillon(s) + droite brisé, 4 = sable 1 + sable 2 + ensemble sable + gravillon(s) + droite brisé</param>
    '''  <param name="Ind">index du sable(1, 2 ou 3 pour sable composé) ou du gravillon (1,2)</param>
    '''  <param name="Verif">renvoie False si erreur algoritmique</param>
    Public Sub Affichage_CourbeGranulo(ByVal g As Graphics, ByVal Support As Integer, ByVal Appel As Integer, Optional ByVal Ind As Integer = 0, Optional ByRef Verif As Boolean = True)
        Dim i, k, d1, d2, d3 As Integer
        Dim X, Y As Single
        Dim X95s, Y95s, X05g(Gravillon.Count), Y05g, X95g(Gravillon.Count), Y95g As Single
        Dim w As SizeF
        Dim msg As String
        Dim myPen1 As New Pen(Color.Beige, 1)
        Dim myFont As New Font("Times New Roman", 9, FontStyle.Regular)
        Dim myBrush As New SolidBrush(Color.Black)
        '
        Dim myPen As New Pen(Color.Black, 2)
        Select Case Support
            Case 1 '1070x681
                d1 = 650 : d3 = 6 : d2 = 30
                'Axe X
                myPen = New Pen(Color.Black, 2)
                g.DrawLine(myPen, 40, 650, 1000, d1)
                'Axe Y
                g.DrawLine(myPen, 50, 50, 50, 650)
                'ligne de graduation verticale
                myPen = New Pen(Color.Blue, 1)
                i = -30 : X = 50
                For k = 1 To 32
                    i = i + d2
                    g.DrawLine(myPen, X + i, 50, X + i, d1 + 10)
                Next
                'ligne de graduation horizontale
                i = -60 : Y = 50
                For k = 1 To 10
                    i = i + 60
                    g.DrawLine(myPen, 40, Y + i, 1000, Y + i)
                Next
                'module de tamis
                myFont = New Font("Times New Roman", 9, FontStyle.Regular)
                Dim Ta() As String = {"0.063", "0.08", "0.1", "0.125", "0.16", "0.20", "0.25", "0.315", "0.4", "0.5", "0.63", "0.80", "1", "1.25", "1.6", "2", "2.5", "3.15", "4", "5", "6.3", "8", "10", "12.5", "16", "20", "25", "31.5", "40", "50", "63", "80"}
                i = -30 : X = 50
                For k = 0 To 31
                    i = i + d2 : w = g.MeasureString(Ta(k), myFont)
                    g.DrawString(Ta(k), myFont, Brushes.Black, X + i - w.Width / 2, 655)
                Next
                Erase Ta
                'Tamisats
                Dim iTa() As String = {"100", "90", "80", "70", "60", "50", "40", "30", "20", "10", "0"}
                i = -60 : Y = 50
                For k = 0 To 10
                    i = i + 60 : w = g.MeasureString(iTa(k), myFont)
                    g.DrawString(iTa(k), myFont, Brushes.Black, 30 - w.Width / 2, Y + i - w.Height / 2)
                Next
                Erase iTa
                myFont = New Font("Times New Roman", 11, FontStyle.Regular)
                msg = "Série des tamis en mm" : w = g.MeasureString(msg, myFont)
                g.DrawString(msg, myFont, Brushes.Black, 535 - w.Width / 2, 680)
                msg = "Tamisats (%)" : w = g.MeasureString(msg, myFont)
                Dim format1 As New StringFormat()
                format1.FormatFlags = StringFormatFlags.DirectionVertical
                g.DrawString(msg, myFont, Brushes.Black, 2, 350 - w.Width / 2, format1)
            Case 2  '  700  x 400
                d1 = 350 : d3 = 3 : d2 = 20
                'Axe X
                myPen = New Pen(Color.Black, 2)
                g.DrawLine(myPen, 40, 350, 680, d1)
                'Axe Y
                g.DrawLine(myPen, 50, 40, 50, d1 + 10)
                'ligne de graduation verticale
                myPen = New Pen(Color.Blue, 1)
                i = 0 : X = 50
                For k = 1 To 31
                    i = i + d2
                    g.DrawLine(myPen, X + i, 50, X + i, d1 + 10)
                Next
                'ligne de graduation horizontale
                i = -30 : Y = 50
                For k = 1 To 10
                    i = i + 30
                    g.DrawLine(myPen, 40, Y + i, 668, Y + i)
                Next
                'module de tamis
                myFont = New Font("Times New Roman", 6, FontStyle.Regular)
                Dim Ta() As String = {"0.063", "0.08", "0.1", "0.125", "0.16", "0.20", "0.25", "0.315", "0.4", "0.5", "0.63", "0.80", "1", "1.25", "1.6", "2", "2.5", "3.15", "4", "5", "6.3", "8", "10", "12.5", "16", "20", "25", "31.5", "40", "50", "63", "80"}
                i = 0 : X = 50
                For k = 0 To 30
                    i = i + d2 : w = g.MeasureString(Ta(k), myFont)
                    g.DrawString(Ta(k), myFont, Brushes.Black, X + i - w.Width / 2, 365)
                Next
                Erase Ta
                'Tamisats
                Dim iTa() As String = {"100", "90", "80", "70", "60", "50", "40", "30", "20", "10", "0"}
                i = -30 : Y = 50
                For k = 0 To 10
                    i = i + 30 : w = g.MeasureString(iTa(k), myFont)
                    g.DrawString(iTa(k), myFont, Brushes.Black, 30 - w.Width / 2, Y + i - w.Height / 2)
                Next
                Erase iTa
                msg = "Série des tamis en mm"
                myFont = New Font("Times New Roman", 8, FontStyle.Regular)
                g.DrawString(msg, myFont, Brushes.Black, 400, 380)
                msg = "Tamisats (%)"
                Dim format1 As New StringFormat()
                format1.FormatFlags = StringFormatFlags.DirectionVertical
                g.DrawString(msg, myFont, Brushes.Black, 2, 180, format1)
            Case 3

        End Select

        'Affichage des points
        Select Case Appel
            Case 1 'Affichage courbe granulo sable uniquement
                Call Affichage_Sable(g, Support, Ind)
            Case 2 'Affichage courbe granulo gravillon uniquement
                Call Affichage_Gravillon(g, Support, Ind)
            Case 3, 4 'complet sable + gravillon
                If Appel = 4 Then
                    Call Affichage_Sable(g, Support, 0) 'Affichage Sable n°1
                    Call Affichage_Sable(g, Support, 1) 'Affichage Sable n°2
                End If
                'Affichage courbe granulo Sable
                If Sable.Count = 3 Then Call Affichage_Sable(g, Support, 2, X95s) Else Affichage_Sable(g, Support, 0, X95s) 'affichage d'une seule courbe de sable pour rendre le diagramme plus lisible
                'Affichage courbe granulo Gravillons
                For i = 0 To Gravillon.Count - 1
                    Call Affichage_Gravillon(g, Support, i, X95g(i + 1), X05g(i + 1))
                Next
                'Affichage droite brisée OAB
                Dim X0, Y0, XA, YA, XB, YB As Single
                Dim d4 As Integer
                Select Case Support
                    Case 1 '1070x681
                        d4 = 50
                        Select Case Beton.Formulation
                            Case 1 'Dreux - Gorisse
                                X0 = 80   'origine de la droite au tamis 0,08
                            Case 2 'Baron - Ollivier
                                X0 = d4  'origine de la droite au tamis 0,063
                        End Select
                        Y95s = 90 'sur l'échelle 1% = 6 pixels donc 5% = 30 pixels et les 100% sont à 90 pixels!
                        Y05g = 620
                        Y95g = 90
                    Case 2 '  700  x 400
                        d4 = 70
                        Select Case Beton.Formulation
                            Case 1 'Dreux - Gorisse
                                X0 = 90 'origine de la droite au tamis 0,08
                            Case 2 'Baron - Ollivier
                                X0 = d4 'origine de la droite au tamis 0,063
                        End Select
                        Y95s = 65 'sur l'échelle 1% = 3 pixels donc 5% = 15 pixels et les 100% sont à 50 pixels!
                        Y05g = 335
                        Y95g = 65
                    Case 3

                End Select
                Y0 = d1 'Ordonnée de l'origine de la droite au tamis 0,08/0.063
                YA = CSng(d1 - Beton.YA * d3) '50/350 
                For Each kvp As KeyValuePair(Of Double, Integer) In Beton.Module_Tamis
                    If Beton.XA = kvp.Key Then i = kvp.Value : Exit For
                Next
                XA = CSng(d4 + (i - 19) * d2) '0.063 correspond au module 19
                For Each kvp As KeyValuePair(Of Double, Integer) In Beton.Module_Tamis
                    If Beton.XB = kvp.Key Then i = kvp.Value : Exit For
                Next
                XB = CSng(d4 + (i - 19) * d2)
                YB = 50 '100% passant
                myPen = New Pen(Color.DarkGray, 2)
                g.DrawLine(myPen, X0, Y0, XA, YA)
                g.DrawLine(myPen, XA, YA, XB, YB)
                'Ecriture des points OAB
                myFont = New Font("Times New Roman", 8, FontStyle.Bold)
                msg = "O" : w = g.MeasureString(msg, myFont)
                g.DrawString(msg, myFont, Brushes.Black, X0 - w.Width, Y0 - w.Height)
                msg = "A" : w = g.MeasureString(msg, myFont)
                g.DrawString(msg, myFont, Brushes.Black, XA - w.Width, YA - w.Height)
                msg = "B" : w = g.MeasureString(msg, myFont)
                g.DrawString(msg, myFont, Brushes.Black, XB - w.Width, YB - w.Height)
                myFont = New Font("Times New Roman", 8, FontStyle.Regular)
                'Traçage du point 95% sur le sable
                g.DrawRectangle(Pens.Violet, X95s - 2, Y95s - 2, 4, 4) 'dessin du point 95% - traçage sur le sable n°1 ou le sable composé
                'Traçage du point 5% et 95% sur le gravillon

                g.DrawRectangle(Pens.Violet, X05g(1) - 2, Y05g - 2, 4, 4) 'dessin du point 5% - traçage sur le gravillon n°1
                myPen = New Pen(Color.DarkGoldenrod, 2)
                g.DrawLine(myPen, X95s, Y95s, X05g(1), Y05g) 'droite entre les points 95% sable et 5% gravillon
                If Gravillon.Count = 2 Then
                    g.DrawRectangle(Pens.Violet, X95g(1) - 2, Y95g - 2, 4, 4) 'dessin du point 95% - traçage sur le gravillon n°1
                    g.DrawRectangle(Pens.Violet, X05g(2) - 2, Y05g - 2, 4, 4) 'dessin du point point 5% - traçage sur le gravillon n°2
                    g.DrawLine(myPen, X95g(1), Y95g, X05g(2), Y05g) 'droite entre les points 95% gravillon 1 et 5% gravillon 2
                End If
                'calcul de la répartition Sable(s) et gravillon(s) uniquement dans le cas du support, c.a.d lors de la rédaction de la note de calcul
                If Support = 2 Then
                    'calcul de la répartition Sable(s) et gravillon(s)
                    For i = 1 To Beton.NbGravillon
                        Select Case i
                            Case 1
                                Call Recherche_Point_Intersection(i, X95s, X05g(1), XA, XB, Verif)
                                If Beton.NbGravillon = 1 Then Gravillon.Item(0).G_Vg = 100 - Beton.S_Vs : Exit For
                            Case 2
                                Call Recherche_Point_Intersection(i, X95g(1), X05g(2), XA, XB, Verif)
                        End Select
                    Next
                End If

        End Select
    End Sub

    ''' <summary>Affichage de la courbe granulométrique du sable sur le handle graphique transmis + recherche valeur x95%</summary>
    '''  <param name="g">handle d'affichage</param>
    '''  <param name="Support">support d'affichage: 1 = sur écran, 2 = sur image 700x400, 3 sur imprimante A4</param>
    '''  <param name="Ind">index du sable</param>
    '''  <param name="X95">abscisse du point 95% de passant</param> 
    Private Sub Affichage_Sable(ByVal g As Graphics, ByVal Support As Integer, ByVal Ind As Integer, Optional ByRef X95 As Single = 0)
        Dim i, j, k, k1 As Integer
        Dim X, Y, X1 As Single
        Dim myPen As New Pen(Color.Black, 2)
        Dim d1, d2, d3 As Integer
        'Affichage des points
        'Passant en %
        j = 0 : k = 0 ': Y = 50 '
        Dim xx(30), yy(30) As Single
        Select Case Support
            Case 1 'écran 1070x700
                X1 = 50   'analyse commence à 0.063mm
                d1 = 30 : d2 = 650 : d3 = 6
            Case 2 'image 700x400
                X1 = 70  'ou(gravillon, l) 'analyse commence à 0.063
                d1 = 20 : d2 = 350 : d3 = 3
        End Select
        k1 = 22 'sable
        Dim iiTa() As Double = {0.063, 0.08, 0.1, 0.125, 0.16, 0.2, 0.25, 0.315, 0.4, 0.5, 0.63, 0.8, 1, 1.25, 1.6, 2, 2.5, 3.15, 4, 5, 6.3, 8, 10}
        For i = 0 To k1

            With Sable.Item(Ind)
                If .Disponibilite_Tamis.Item(iiTa(i)) = True Then  'AndAlso .TamisatCumule_Pourcent.ContainsKey(iiTa(i))
                    X = X1 + j : k = k + 1 : xx(k) = X
                    Y = CSng(d2 - .TamisatCumule_Pourcent(iiTa(i)) * d3) : yy(k) = Y
                    g.DrawRectangle(Pens.Red, X - 2, Y - 2, 4, 4)
                End If
            End With
            j = j + d1
        Next
        'Ajout de 3 points de traçage:
        'Refus 100% à 0,063µm:
        k = k + 3
        xx(k - 2) = X + 20 : yy(k - 2) = 50
        xx(k - 1) = X + 30 : yy(k - 1) = 50
        xx(k) = X + 40 : yy(k) = 50
        '
        i = k
        Dim hi(k - 1), Hn(k, k), Cn(k), Yn(k) As Double
        Dim verif As Boolean = True
        For i = 1 To k
            xx(i - 1) = xx(i) 'démarrage à 0 au lieu de 1
            yy(i - 1) = yy(i)
        Next
        For i = 1 To k
            hi(i - 1) = xx(i) - xx(i - 1)
        Next
        'ligne 1
        i = 1
        Yn(i) = ((yy(i + 1) - yy(i)) / hi(i)) - ((yy(i) - yy(i - 1)) / hi(i - 1))
        Hn(i, i) = (hi(i - 1) + hi(i)) / 3
        Hn(i, i + 1) = hi(i) / 6
        'ligne k-2
        i = k - 2
        Yn(i) = ((yy(i + 1) - yy(i)) / hi(i)) - ((yy(i) - yy(i - 1)) / hi(i - 1))
        Hn(i, i - 1) = hi(i - 1) / 6
        Hn(i, i) = (hi(i - 1) + hi(i)) / 3
        'Autres lignes
        For i = 2 To k - 3 'ligne
            Yn(i) = ((yy(i + 1) - yy(i)) / hi(i)) - ((yy(i) - yy(i - 1)) / hi(i - 1))
            Hn(i, i - 1) = hi(i - 1) / 6
            Hn(i, i) = (hi(i - 1) + hi(i)) / 3
            Hn(i, i + 1) = hi(i) / 6
        Next
        Call Gauss_Pivot_Max(k - 2, Hn, Yn, Cn, verif)
        If verif = False Then Exit Sub
        'affichage de 3 droites par segment
        Dim xs(2, k - 2), ys(2, k - 2), xi As Single
        For i = 0 To k - 2
            xs(1, i) = CSng(xx(i) + hi(i) / 3)
            xs(2, i) = CSng(xx(i) + (2 * hi(i) / 3))
        Next
        Cn(0) = 0 : Cn(k - 1) = 0 : k1 = 1
        For i = 0 To k - 2
            For j = 1 To 2
                xi = xs(j, i)
                ys(j, i) = CSng((Cn(i) / 6) * (((xx(i + 1) - xi) ^ 3 / hi(i)) - hi(i) * (xx(i + 1) - xi)))
                ys(j, i) += CSng((Cn(i + 1) / 6) * (((xi - xx(i)) ^ 3 / hi(i)) - hi(i) * (xi - xx(i))))
                ys(j, i) += CSng((yy(i) * (xx(i + 1) - xi) / hi(i)) + (yy(i + 1) * (xi - xx(i)) / hi(i)))
                Select Case Support
                    Case 1
                      '  If ys(j, i) <= 90 And k1 = 1 Then X95 = xi : k1 = 2 'abscisse du point 95% de passant
                    Case 2
                        If ys(j, i) <= 65 And k1 = 1 Then X95 = xi : k1 = 2 'abscisse du point 95% de passant
                    Case 3

                End Select
            Next
        Next
        myPen = New Pen(Color.Salmon, 2)
        For i = 0 To k - 2
            g.DrawLine(myPen, xx(i), yy(i), xs(1, i), ys(1, i)) '1ier segment
            g.DrawLine(myPen, xs(1, i), ys(1, i), xs(2, i), ys(2, i)) '2ième segment
            g.DrawLine(myPen, xs(2, i), ys(2, i), xx(i + 1), yy(i + 1)) '3ième segment

            Select Case Support
                Case 1
                    '--> recherche du point 95 %
                    If yy(i) = 90 Then X95 = xx(i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '1ier segment
                    If yy(i) > 90 And ys(1, i) < 90 Then
                        X95 = xx(i) + ((xs(1, i) - xx(i)) / (yy(i) - ys(1, i))) * (yy(i) - 90) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(1, i) = 90 Then X95 = xs(1, i) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '2ième segment
                    If ys(1, i) > 90 And ys(2, i) < 90 Then
                        X95 = xs(1, i) + ((xs(2, i) - xs(1, i)) / (ys(1, i) - ys(2, i))) * (ys(1, i) - 90) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(2, i) = 90 Then X95 = xs(2, i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '3ième segment
                    If ys(2, i) > 90 And yy(i + 1) < 90 Then
                        X95 = xs(2, i) + ((xx(i + 1) - xs(2, i)) / (ys(2, i) - yy(i + 1))) * (ys(2, i) - 90) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If yy(i + 1) = 90 Then X95 = xx(i + 1)
                Case 2
                    '--> recherche du point 95 %
                    If yy(i) = 65 Then X95 = xx(i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '1ier segment
                    If yy(i) > 65 And ys(1, i) < 65 Then
                        X95 = xx(i) + ((xs(1, i) - xx(i)) / (yy(i) - ys(1, i))) * (yy(i) - 65) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(1, i) = 65 Then X95 = xs(1, i) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '2ième segment
                    If ys(1, i) > 65 And ys(2, i) < 65 Then
                        X95 = xs(1, i) + ((xs(2, i) - xs(1, i)) / (ys(1, i) - ys(2, i))) * (ys(1, i) - 65) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(2, i) = 65 Then X95 = xs(2, i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '3ième segment
                    If ys(2, i) > 65 And yy(i + 1) < 65 Then
                        X95 = xs(2, i) + ((xx(i + 1) - xs(2, i)) / (ys(2, i) - yy(i + 1))) * (ys(2, i) - 65) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If yy(i + 1) = 65 Then X95 = xx(i + 1)
                Case 3

            End Select
        Next
        Erase xs, ys, hi, Hn, Cn, Yn, xx, yy
    End Sub

    ''' <summary>Affichage de la courbe granulométrique du gravillon sur le handle graphique transmis</summary>
    '''  <param name="g">handle d'affichage</param>
    '''  <param name="Support">support d'affichage: 1 = sur écran, 2 = sur image 700x400, 3 sur imprimante A4</param>
    '''  <param name="Ind">index du gravillon</param>
    '''  <param name="X95">abscisse du point 95% de passant</param> 
    '''  <param name="X05">abscisse du point 5% de passant</param> 
    Private Sub Affichage_Gravillon(ByVal g As Graphics, ByVal Support As Integer, ByVal Ind As Integer, Optional ByRef X95 As Single = 0, Optional ByRef X05 As Single = 0)
        Dim i, j, k, k1 As Integer
        Dim X, Y, X1 As Single
        Dim d1, d2, d3 As Integer
        Dim myPen As New Pen(Color.Black, 2)
        'Affichage des points
        'Passant en %
        j = 0 : k = 0 ' 
        Dim xx(30), yy(30) As Single
        Select Case Support
            Case 1 'écran 1070x700
                X1 = 380 : k1 = 19 'ou(gravillon, l) 'analyse commence à 1mm
                d1 = 30 : d2 = 650 : d3 = 6
            Case 2 'image 700x400
                X1 = 290 : k1 = 19 'ou(gravillon, l) 'analyse commence à 1mm
                d1 = 20 : d2 = 350 : d3 = 3
        End Select

        Dim iiTa() As Double = {1, 1.25, 1.6, 2, 2.5, 3.15, 4, 5, 6.3, 8, 10, 12.5, 16, 20, 25, 31.5, 40, 50, 63, 80}
        For i = 0 To k1
            j = j + d1 '20
            With Gravillon.Item(Ind)
                If .Disponibilite_Tamis.Item(iiTa(i)) = True Then  'AndAlso .TamisatCumule_Pourcent.ContainsKey(iiTa(i))
                    X = X1 + j : k = k + 1 : xx(k) = X
                    Y = CSng(d2 - .TamisatCumule_Pourcent(iiTa(i)) * d3) : yy(k) = Y
                    g.DrawRectangle(Pens.Red, X - 2, Y - 2, 4, 4)
                End If
            End With
        Next
        'Ajout de 4 points de traçage:
        'Refus 0% à 6,3mm: 
        k = k + 4
        xx(k - 3) = X + 20 : yy(k - 3) = 50
        xx(k - 2) = X + 30 : yy(k - 2) = 50
        xx(k - 1) = X + 40 : yy(k - 1) = 50
        xx(k) = X + 50 : yy(k) = 50
        '
        i = k
        Dim hi(k - 1), Hn(k, k), Cn(k), Yn(k) As Double
        Dim verif As Boolean = True
        For i = 1 To k
            xx(i - 1) = xx(i) 'démarrage à 0 au lieu de 1
            yy(i - 1) = yy(i)
        Next
        For i = 1 To k
            hi(i - 1) = xx(i) - xx(i - 1)
        Next
        'ligne 1
        i = 1
        Yn(i) = ((yy(i + 1) - yy(i)) / hi(i)) - ((yy(i) - yy(i - 1)) / hi(i - 1))
        Hn(i, i) = (hi(i - 1) + hi(i)) / 3
        Hn(i, i + 1) = hi(i) / 6
        'ligne k-2
        i = k - 2
        Yn(i) = ((yy(i + 1) - yy(i)) / hi(i)) - ((yy(i) - yy(i - 1)) / hi(i - 1))
        Hn(i, i - 1) = hi(i - 1) / 6
        Hn(i, i) = (hi(i - 1) + hi(i)) / 3
        'Autres lignes
        For i = 2 To k - 3 'ligne
            Yn(i) = ((yy(i + 1) - yy(i)) / hi(i)) - ((yy(i) - yy(i - 1)) / hi(i - 1))
            Hn(i, i - 1) = hi(i - 1) / 6
            Hn(i, i) = (hi(i - 1) + hi(i)) / 3
            Hn(i, i + 1) = hi(i) / 6
        Next
        Call Gauss_Pivot_Max(k - 2, Hn, Yn, Cn, verif)
        If verif = False Then Exit Sub
        'affichage de 3 droites par segment
        Dim xs(2, k - 2), ys(2, k - 2), xi As Single
        For i = 0 To k - 2
            xs(1, i) = CSng(xx(i) + hi(i) / 3)
            xs(2, i) = CSng(xx(i) + (2 * hi(i) / 3))
        Next
        Cn(0) = 0 : Cn(k - 1) = 0
        For i = 0 To k - 2
            For j = 1 To 2
                xi = xs(j, i)
                ys(j, i) = CSng((Cn(i) / 6) * (((xx(i + 1) - xi) ^ 3 / hi(i)) - hi(i) * (xx(i + 1) - xi)))
                ys(j, i) = ys(j, i) + CSng((Cn(i + 1) / 6) * (((xi - xx(i)) ^ 3 / hi(i)) - hi(i) * (xi - xx(i))))
                ys(j, i) = ys(j, i) + CSng((yy(i) * (xx(i + 1) - xi) / hi(i)) + (yy(i + 1) * (xi - xx(i)) / hi(i)))
            Next
        Next
        k1 = 1
        myPen = New Pen(Color.DarkCyan, 2)
        For i = 0 To k - 2
            g.DrawLine(myPen, xx(i), yy(i), xs(1, i), ys(1, i)) '1ier segment
            g.DrawLine(myPen, xs(1, i), ys(1, i), xs(2, i), ys(2, i)) '2ième segment
            g.DrawLine(myPen, xs(2, i), ys(2, i), xx(i + 1), yy(i + 1)) '3ième segment
            'recherche des abscisses des points 5% et 95%
            Select Case Support
                Case 1
                    '--> recherche point 5%
                    If yy(i) = 620 Then X05 = xx(i) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '1ier segment
                    If yy(i) > 620 And ys(1, i) < 620 Then
                        X05 = xx(i) + ((xs(1, i) - xx(i)) / ((yy(i) - ys(1, i)))) * (yy(i) - 620) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(1, i) = 620 Then X05 = xs(1, i) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '2ième segment
                    If ys(1, i) > 620 And ys(2, i) < 620 Then
                        X05 = xs(1, i) + ((xs(2, i) - xs(1, i)) / ((ys(1, i) - ys(2, i)))) * (ys(1, i) - 620) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(2, i) = 620 Then X05 = xs(2, i) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '3ième segment
                    If ys(2, i) > 620 And yy(i + 1) < 620 Then
                        X05 = xs(2, i) + ((xx(i + 1) - xs(2, i)) / ((ys(2, i) - yy(i + 1)))) * (ys(2, i) - 620) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If yy(i + 1) = 620 Then X05 = xx(i + 1) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '--> recherche du point 95 %
                    If k1 = 1 Then
                        If yy(i) = 90 Then X95 = xx(i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        '1ier segment
                        If yy(i) > 90 And ys(1, i) < 90 Then
                            X95 = xx(i) + ((xs(1, i) - xx(i)) / (yy(i) - ys(1, i))) * (yy(i) - 90) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        End If
                        If ys(1, i) = 90 Then X95 = xs(1, i) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        '2ième segment
                        If ys(1, i) > 90 And ys(2, i) < 90 Then
                            X95 = xs(1, i) + ((xs(2, i) - xs(1, i)) / (ys(1, i) - ys(2, i))) * (ys(1, i) - 90) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        End If
                        If ys(2, i) = 90 Then X95 = xs(2, i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        '3ième segment
                        If ys(2, i) > 90 And yy(i + 1) < 90 Then
                            X95 = xs(2, i) + ((xx(i + 1) - xs(2, i)) / (ys(2, i) - yy(i + 1))) * (ys(2, i) - 90) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        End If
                        If yy(i + 1) = 90 Then X95 = xx(i + 1) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant

                        ' If ys(j, i) <= 90 And k1 = 1 Then X95 = xi : k1 = 2 'abscisse du point 95% de passant - 90 correspond à la ligne horizontale des 95% de passant
                    End If
                Case 2
                    '--> recherche point 5%
                    If yy(i) = 335 Then X05 = xx(i) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '1ier segment
                    If yy(i) > 335 And ys(1, i) < 335 Then
                        X05 = xx(i) + ((xs(1, i) - xx(i)) / ((yy(i) - ys(1, i)))) * (yy(i) - 335) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(1, i) = 335 Then X05 = xs(1, i) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '2ième segment
                    If ys(1, i) > 335 And ys(2, i) < 335 Then
                        X05 = xs(1, i) + ((xs(2, i) - xs(1, i)) / ((ys(1, i) - ys(2, i)))) * (ys(1, i) - 335) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If ys(2, i) = 335 Then X05 = xs(2, i) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '3ième segment
                    If ys(2, i) > 335 And yy(i + 1) < 335 Then
                        X05 = xs(2, i) + ((xx(i + 1) - xs(2, i)) / ((ys(2, i) - yy(i + 1)))) * (ys(2, i) - 335) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    End If
                    If yy(i + 1) = 335 Then X05 = xx(i + 1) 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    '--> recherche du point 95 %
                    If k1 = 1 Then
                        If yy(i) = 65 Then X95 = xx(i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        '1ier segment
                        If yy(i) > 65 And ys(1, i) < 65 Then
                            X95 = xx(i) + ((xs(1, i) - xx(i)) / (yy(i) - ys(1, i))) * (yy(i) - 65) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        End If
                        If ys(1, i) = 65 Then X95 = xs(1, i) : k1 = 2 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        '2ième segment
                        If ys(1, i) > 65 And ys(2, i) < 65 Then
                            X95 = xs(1, i) + ((xs(2, i) - xs(1, i)) / (ys(1, i) - ys(2, i))) * (ys(1, i) - 65) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        End If
                        If ys(2, i) = 65 Then X95 = xs(2, i) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        '3ième segment
                        If ys(2, i) > 65 And yy(i + 1) < 65 Then
                            X95 = xs(2, i) + ((xx(i + 1) - xs(2, i)) / (ys(2, i) - yy(i + 1))) * (ys(2, i) - 65) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                        End If
                        If yy(i + 1) = 65 Then X95 = xx(i + 1) : k1 = 2  'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant

                        ' If ys(j, i) <= 90 And k1 = 1 Then X95 = xi : k1 = 2 'abscisse du point 95% de passant - 90 correspond à la ligne horizontale des 95% de passant
                    End If
                    'If ys(j, i) >= 335 Then X05 = xi 'abscisse du point 5% de passant - 335 correspond à la ligne horizontale des 5% de passant
                    'If ys(j, i) <= 65 And k1 = 1 Then X95 = xi : k1 = 2 'abscisse du point 95% de passant - 65 correspond à la ligne horizontale des 95% de passant
                Case 3

            End Select
        Next
        Erase xs, ys, hi, Hn, Cn, Yn, xx, yy
    End Sub

    ''' <summary>Recherche du point d'intersection entre la droite brisée OAB et la droite 95%-5% - Détermination des valeurs en % de répartition entre sables et gravillon</summary>
    '''  <param name="Intersection">=1 si intersection entre sable et gravillon n°1, =2 si intersection entre gravillon 1 et gravillon 2</param>
    '''  <param name="X95">abscisse du point 95% de passant</param> 
    '''  <param name="X05">abscisse du point 5% de passant</param>
    '''  <param name="XA">abscisse du point A de droite brisée OAB</param> 
    '''  <param name="XB">abscisse du point B de droite brisée OAB</param>
    '''  <param name="Verif">renvoie False si erreur algoritmique</param>
    Private Sub Recherche_Point_Intersection(ByVal Intersection As Integer, ByVal X95 As Single, ByVal X05 As Single, ByVal XA As Single, ByVal XB As Single, ByRef Verif As Boolean)
        Dim xs1, ys1, ys2, Y05, Y95, PS As Single
        Dim X0, Y0, YA, YB As Single  'Affichage droite brisée OAB
        Select Case Beton.Formulation
            Case 1 'Dreux-Gorisse
                X0 = 80 : Y0 = 350'point 0,08 mm
            Case 2 'Baron - Ollivier
                X0 = 50 : Y0 = 350 'point 0.063 mm
        End Select

        YA = CSng(350 - Beton.YA * 3)
        YB = 50 '100% passant
        Y95 = 65 : Y05 = 335
        If X95 < X05 Then
            'la droite reliant les 2 points est inclinée vers la droite
            xs1 = X95
            Do
                xs1 = CSng(xs1 + 0.25)
                If xs1 >= X05 Then
                    Dim msg As String = String.Empty
                    msg = "Module Recherche_Point_Intersection : " & Environment.NewLine & "Pb sur l'algorithme de recherche du point d'intersection entre la droite brisée OAB et la droite reliant les points 5% et 95% - Cas x95% < x05%"
                    MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Verif = False : Exit Sub
                End If
                ys1 = Y95 + ((Y95 - Y05) / (X95 - X05)) * (xs1 - X95)
                If xs1 > XA Then
                    ys2 = YA + ((YA - YB) / (XA - XB)) * (xs1 - XA) 'segment AB
                Else
                    ys2 = Y0 + ((Y0 - YA) / (X0 - XA)) * (xs1 - X0) 'segment OA
                End If
            Loop While ys2 > ys1 'ys1 démarre à X95 et donc au-dessus de la droite OAB et origine y en haut de la figure
        Else
            'la droite reliant les 2 points est inclinée vers la gauche
            xs1 = X05
            Do
                xs1 = CSng(xs1 + 0.25)
                If xs1 >= X95 Then
                    Dim msg As String = String.Empty
                    msg = "Module Recherche_Point_Intersection : " & Environment.NewLine & "Pb sur l'algorithme de recherche du point d'intersection entre la droite brisée OAB et la droite reliant les points 5% et 95% - Cas x95% > x05%"
                    MessageBox.Show(msg, "Formulation béton suivant la méthode Dreux - Gorisse", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Verif = False : Exit Sub
                End If
                ys1 = Y05 + ((Y95 - Y05) / (X95 - X05)) * (xs1 - X05)
                If xs1 > XA Then
                    ys2 = YA + ((YA - YB) / (XA - XB)) * (xs1 - XA) 'segment AB
                Else
                    ys2 = Y0 + ((Y0 - YA) / (X0 - XA)) * (xs1 - X0) 'segment OA
                End If
            Loop While ys1 > ys2 'ys1 démarre à X05 et donc au-dessous de la droite OAB et origine y en haut de la figure
        End If

        Select Case Intersection
            Case 1 'entre sable et gravillon n°1
                PS = ys1 - 50 '52
                PS = (1 - (PS / 300)) * 100 'partie basse entre 0 et droite horizontale
                Beton.S_Vs = CInt(Floor(PS))
            Case 2 'entre gravillon n°1 et gravillon n°2
                PS = ys1 - 50 '52
                PS = (PS / 300) * 100
                Gravillon.Item(1).G_Vg = CInt(Floor(PS)) 'partie haute entre 100 et 1ière droite horizontale
                Gravillon.Item(0).G_Vg = 100 - Gravillon.Item(1).G_Vg - Beton.S_Vs
        End Select
    End Sub

    ''' <summary>Calcul de la compacité du béton</summary>
    '''  <param name="Dmax">diamètre maximal du granulat -en mm</param>
    '''  <param name="γ">compacité - Sans unité = Volume/volume</param>
    Private Sub Compacite(ByVal Dmax As Double, ByRef γ As Double)

        With Beton
            Select Case ((.Slump + 1) * 0.5)
                Case Is < Aff.BornePlastiqueFerme 'Ferme 
                    Select Case .Vibration
                        Case 2 'Faible
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.775
                                Case Is < 10
                                    γ = Interpolation_γ(0.775, 0.805, 5, 10, Dmax)
                                Case 10
                                    γ = 0.805
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.805, 0.82, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.82
                                Case Is < 20
                                    γ = Interpolation_γ(0.82, 0.83, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.83
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.83, 0.835, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.835
                                Case Is < 50
                                    γ = Interpolation_γ(0.835, 0.84, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.84
                                Case Is < 80
                                    γ = Interpolation_γ(0.84, 0.845, 50, 80, Dmax)
                                Case Else
                                    γ = 0.845
                            End Select
                        Case 3 'Normale
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.78
                                Case Is < 10
                                    γ = Interpolation_γ(0.78, 0.81, 5, 10, Dmax)
                                Case 10
                                    γ = 0.81
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.81, 0.825, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.825
                                Case Is < 20
                                    γ = Interpolation_γ(0.825, 0.835, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.835
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.835, 0.84, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.84
                                Case Is < 50
                                    γ = Interpolation_γ(0.84, 0.845, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.845
                                Case Is < 80
                                    γ = Interpolation_γ(0.845, 0.85, 50, 80, Dmax)
                                Case Else
                                    γ = 0.85
                            End Select
                        Case 4 'Puissante
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.785
                                Case Is < 10
                                    γ = Interpolation_γ(0.785, 0.815, 5, 10, Dmax)
                                Case 10
                                    γ = 0.815
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.815, 0.83, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.83
                                Case Is < 20
                                    γ = Interpolation_γ(0.83, 0.84, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.84
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.84, 0.845, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.845
                                Case Is < 50
                                    γ = Interpolation_γ(0.845, 0.85, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.85
                                Case Is < 80
                                    γ = Interpolation_γ(0.85, 0.855, 50, 80, Dmax)
                                Case Else
                                    γ = 0.855
                            End Select
                    End Select
                Case Is < Aff.BorneMollePlastique 'Plastique
                    Select Case .Vibration
                        Case 1 'légère
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.76
                                Case Is < 10
                                    γ = Interpolation_γ(0.76, 0.79, 5, 10, Dmax)
                                Case 10
                                    γ = 0.79
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.79, 0.805, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.805
                                Case Is < 20
                                    γ = Interpolation_γ(0.805, 0.815, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.815
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.815, 0.82, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.82
                                Case Is < 50
                                    γ = Interpolation_γ(0.82, 0.825, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.825
                                Case Is < 80
                                    γ = Interpolation_γ(0.825, 0.83, 50, 80, Dmax)
                                Case Else
                                    γ = 0.83
                            End Select
                        Case 2 'Faible
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.765
                                Case Is < 10
                                    γ = Interpolation_γ(0.765, 0.795, 5, 10, Dmax)
                                Case 10
                                    γ = 0.795
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.795, 0.81, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.81
                                Case Is < 20
                                    γ = Interpolation_γ(0.81, 0.82, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.82
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.82, 0.825, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.825
                                Case Is < 50
                                    γ = Interpolation_γ(0.825, 0.83, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.83
                                Case Is < 80
                                    γ = Interpolation_γ(0.83, 0.835, 50, 80, Dmax)
                                Case Else
                                    γ = 0.835
                            End Select
                        Case 3 'Normale
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.77
                                Case Is < 10
                                    γ = Interpolation_γ(0.77, 0.8, 5, 10, Dmax)
                                Case 10
                                    γ = 0.8
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.8, 0.815, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.815
                                Case Is < 20
                                    γ = Interpolation_γ(0.815, 0.825, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.825
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.825, 0.83, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.83
                                Case Is < 50
                                    γ = Interpolation_γ(0.83, 0.835, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.835
                                Case Is < 80
                                    γ = Interpolation_γ(0.835, 0.84, 50, 80, Dmax)
                                Case Else
                                    γ = 0.84
                            End Select
                        Case 4 'Puissante
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.775
                                Case Is < 10
                                    γ = Interpolation_γ(0.775, 0.805, 5, 10, Dmax)
                                Case 10
                                    γ = 0.805
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.805, 0.82, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.82
                                Case Is < 20
                                    γ = Interpolation_γ(0.82, 0.83, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.83
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.83, 0.835, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.835
                                Case Is < 50
                                    γ = Interpolation_γ(0.835, 0.84, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.84
                                Case Is < 80
                                    γ = Interpolation_γ(0.84, 0.845, 50, 80, Dmax)
                                Case Else
                                    γ = 0.845
                            End Select
                    End Select
                Case Else 'Molle
                    Select Case .Vibration
                        Case 1 'légère
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.75
                                Case Is < 10
                                    γ = Interpolation_γ(0.75, 0.78, 5, 10, Dmax)
                                Case 10
                                    γ = 0.78
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.78, 0.795, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.795
                                Case Is < 20
                                    γ = Interpolation_γ(0.795, 0.805, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.805
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.805, 0.81, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.81
                                Case Is < 50
                                    γ = Interpolation_γ(0.81, 0.815, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.815
                                Case Is < 80
                                    γ = Interpolation_γ(0.815, 0.82, 50, 80, Dmax)
                                Case Else
                                    γ = 0.82
                            End Select
                        Case 2 'Faible
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.755
                                Case Is < 10
                                    γ = Interpolation_γ(0.755, 0.785, 5, 10, Dmax)
                                Case 10
                                    γ = 0.785
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.785, 0.8, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.8
                                Case Is < 20
                                    γ = Interpolation_γ(0.8, 0.81, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.81
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.81, 0.815, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.815
                                Case Is < 50
                                    γ = Interpolation_γ(0.815, 0.82, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.82
                                Case Is < 80
                                    γ = Interpolation_γ(0.82, 0.825, 50, 80, Dmax)
                                Case Else
                                    γ = 0.825
                            End Select
                        Case 3 'Normale
                            Select Case Dmax
                                Case Is <= 5
                                    γ = 0.76
                                Case Is < 10
                                    γ = Interpolation_γ(0.76, 0.79, 5, 10, Dmax)
                                Case 10
                                    γ = 0.79
                                Case Is < 12.5
                                    γ = Interpolation_γ(0.79, 0.805, 10, 12.5, Dmax)
                                Case 12.5
                                    γ = 0.805
                                Case Is < 20
                                    γ = Interpolation_γ(0.805, 0.815, 12.5, 20, Dmax)
                                Case 20
                                    γ = 0.815
                                Case Is < 31.5
                                    γ = Interpolation_γ(0.815, 0.82, 20, 31.5, Dmax)
                                Case 31.5
                                    γ = 0.82
                                Case Is < 50
                                    γ = Interpolation_γ(0.82, 0.825, 31.5, 50, Dmax)
                                Case 50
                                    γ = 0.825
                                Case Is < 80
                                    γ = Interpolation_γ(0.825, 0.83, 50, 80, Dmax)
                                Case Else
                                    γ = 0.83
                            End Select
                    End Select
            End Select
        End With
    End Sub

    ''' <summary>Calcul de la compacité du béton</summary>
    '''  <param name="D1">diamètre maximal n°1 du granulat -en mm</param>
    '''  <param name="D2">diamètre maximal n°2 du granulat -en mm - D2 > D1</param>
    '''  <param name="γ1">compacité pour diamètre D1 - Sans unité = Volume/volume</param>
    '''  <param name="γ2">compacité pour diamètre D2 - Sans unité = Volume/volume</param>
    '''  <param name="D">Interpolation recherchée pour le diamètre maximal D du granulat -en mm - D2 > D > D1</param>
    Private Function Interpolation_γ(ByVal γ1 As Double, ByVal γ2 As Double, ByVal D1 As Double, ByVal D2 As Double, ByVal D As Double) As Double
        Interpolation_γ = γ1 + ((γ2 - γ1) / (D2 - D1)) * (D - D1)
    End Function

    ''' <summary> Module de formulation du béton suivant la méthode Baron - Ollivier</summary>
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    ''' <param name="verif"> variable prenant la valeur False si une erreur bloquante s'est produite pendant le calcul de la formulation</param>
    Public Sub Formulation_BaronOllivier(ByRef rtf As To_Rtf.RtfAnsiTextWriter, ByRef Verif As Boolean)
        Dim Dmax, fcm, EV, k1, k2, k3, k4, kb, kv, Vseg, Vpar, Vopt As Double ' 
        Dim forme, i, ValeurprecedenteS1, ValeurPrecedenteS2 As Integer '  
        Dim PlastifiantCalcul As Boolean = False
        Dim msg As String = String.Empty ' 
        Dim LiantEquivalent As Integer = 0 'Calcul du liant équivalent en kg/m3 - S'il reste ègal à 0, l'addition est compté uniquement comme fine et ne rentre pas en compte en liant équivalent.
        Dim Vf As Double = 0 'Volume de fines
        '
        '2ieme partie - Détermination du Calcul du rapport C/E - Dosage en eau et en ciment
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        'Ecriture de la note de calcul
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Bold = True
        rtf.Underline = True : rtf.WriteString("2 - Eléments de formulation Eau - Liant - Fines - Adjuvant") : rtf.Bold = False : rtf.FontSize = 11 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("2 - 1 : Dosage en eau efficace et teneur prévisible en air") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        'Détermination du rapport C/E
        With Beton
            'Dosage en eau efficace et teneur prévisible en air
            '"Les bétons - Bases et données pour leur formulation" - page 389
            rtf.WriteString("Le dosage en eau efficace (E) et la teneur prévisible en air (a) est calculée avec la prise en compte de différentes corrections.") : rtf.NewLine()
            rtf.WriteString("Pour rappel, eau efficace (E) = eau introduite dans la bétonnière + eau totale apportée par granulats, adjuvants, etc. - eau absorbée par les pores des granulats") : rtf.NewLine()
            PlastifiantCalcul = False 'pas de superplastifiant dans la formulation du béton
            Select Case .Slump 'tableau D
                Case 1 'S1
                    .Eau = 160 : .Air = 25
                Case 2 'S2
                    .Eau = 190 : .Air = 20
                Case 3 'S3
                    .Eau = 210 : .Air = 15
                Case 4 ' S4
                    .Eau = 210 : .Air = 15 : PlastifiantCalcul = True ' superplastifiant dans la formulation du béton
            End Select
            If PlastifiantCalcul = True Then msg = " avec superplastifiant en raison du classement S4 en Affaissement." Else msg = String.Empty
            rtf.WriteString("Initial suivant ouvrabilité souhaité :  Eau (E) = ") : rtf.Bold = True : rtf.WriteString(.Eau.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" (l/m3) et Air (a) = ") : rtf.Bold = True
            rtf.WriteString(.Air.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" (l/m3) " & msg) : rtf.NewLine()
            'Modification si Dmg du granulat différent de 20mm
            If .NbGravillon = 2 Then Dmax = Max(Gravillon.Item(0).Dmg, Gravillon.Item(1).Dmg) Else Dmax = Gravillon.Item(0).Dmg
            Select Case Dmax 'tableau E
                Case Is <= 4
                    k1 = 1.35
                Case Is <= 8
                    k1 = 1.18 + (8 - Dmax) * 0.17 / 4
                Case Is <= 16
                    k1 = 1.05 + (16 - Dmax) * 0.13 / 8
                Case Is <= 20
                    k1 = 1 + (20 - Dmax) * 0.05 / 4
                Case Is <= 25
                    k1 = 0.95 + (25 - Dmax) * 0.05 / 5
                Case Is <= 40
                    k1 = 0.87 + (40 - Dmax) * 0.08 / 15
                Case Is <= 80
                    k1 = 0.78 + (80 - Dmax) * 0.09 / 40
                Case Else
                    k1 = 0.78
            End Select
            rtf.WriteString("    - Modification n°1 si Dmax du granulat différent de 20mm sur les valeurs E et a :  k1 = " & k1.ToString("#0.00")) : rtf.NewLine()
            'Modification suivant type de granulats
            forme = 2 'granulats roulés
            For i = 1 To .NbGravillon
                If Gravillon.Item(i - 1).Forme = 1 Then forme = 1 : Exit For
            Next
            If forme = 2 Then
                For i = 1 To .NbSable
                    If Sable.Item(i - 1).Forme = 1 Then forme = 1 : Exit For
                Next
            End If
            Select Case forme
                Case 1 'granulat concassé
                    k2 = 1 + Aff.BaronCoefTabD : msg = " (granulats concassés - le coefficient de majoration est fixé à " & (Aff.BaronCoefTabD * 100).ToString("#0.00") & " %. Voir formulaire Configuration Onglet Méthode Baron-Ollivier pour le modifier)"'majoration comprise entre 10 et 15%
                Case 2 'granulat roulé
                    k2 = 1 : msg = " (granulats roulés - Pas d'application de coefficient de majoration.)"
            End Select
            rtf.WriteString("    - Modification n°2 si emploi de granulats roulés ou concassés sur les valeurs E et a :  k2 = " & k2.ToString("#0.00") & msg) : rtf.NewLine()
            'Modification suivant conditions climatiques
            Select Case .Temperature  'tableau F
                Case Is <= 5
                    k3 = 0.94
                Case Is <= 10
                    k3 = 0.94 + (.Temperature - 5) * 0.02 / 5
                Case Is <= 15
                    k3 = 0.96 + (.Temperature - 10) * 0.02 / 5
                Case Is <= 20
                    k3 = 0.98 + (.Temperature - 15) * 0.02 / 5
                Case Is <= 25
                    k3 = 1 + (.Temperature - 20) * 0.04 / 5
                Case Is <= 30
                    k3 = 1.04 + (.Temperature - 25) * 0.04 / 5
                Case Is <= 35
                    k3 = 1.08 + (.Temperature - 30) * 0.04 / 5
            End Select
            rtf.WriteString("    - Modification n°3 suivant la température du béton frais sur la valeur de E :  k3 = " & k3.ToString("#0.00") & " (température du béton = " & .Temperature.ToString("#0") & "°C)") : rtf.NewLine()
            'Modification suivant conditions de transport et de mise en oeuvre
            Select Case .Delai
                Case 0 'moins de 30 minutes
                    msg = " moins de 30 minutes = aucune modification"' 
                Case 1 'plus de 30 minutes
                    msg = " plus de 30 minutes = élévation d'une classe d'ouvrabilité pour conserver le même affaissement" ' 
                    Select Case .Slump 'tableau D
                        Case 1 'S1
                            .Eau = 190 : .Air = 20
                        Case 2 'S2
                            .Eau = 210 : .Air = 15
                        Case 3 'S3
                            .Eau = 210 : .Air = 15
                            PlastifiantCalcul = True ' superplastifiant dans la formulation du béton
                        Case 4 ' S4
                            .Eau = 210 : .Air = 15
                            PlastifiantCalcul = True ' superplastifiant dans la formulation du béton
                    End Select
            End Select
            If PlastifiantCalcul = True Then msg += " + Superplastifiant"
            rtf.WriteString("    - Modification n°4 suivant conditions de transport et de mise en oeuvre : " & msg) : rtf.NewLine()
            If .Delai = 1 AndAlso .Slump < 3 Then rtf.InsertTab() : rtf.WriteString("▸ Modification de la quantitée d'Eau et d'Air :  Eau (E) = " & .Eau.ToString("#0") & " (l/m3) et Air (a) = " & .Air.ToString("#0") & " (l/m3) ") : rtf.NewLine()
            'Modification suivant emploi d'un adjuvant
            If .Plastifiant = True Then
                k4 = 1 - .PlastifiantReduc
                rtf.WriteString("    - Modification n°5 : emploi d'un plastifiant avec un taux de minoration d'eau de " & (.PlastifiantReduc * 100).ToString("#0.0") & " % - k4 = ") : rtf.Bold = True : rtf.WriteString(k4.ToString("#0.000")) : rtf.Bold = False : rtf.NewLine()
            Else
                If PlastifiantCalcul = True Then
                    k4 = 0.95 : rtf.WriteString("    - Modification n°5 suivant emploi d'un adjuvant : emploi d'un superplastifiant - k4 = ") : rtf.Bold = True : rtf.WriteString(k4.ToString("#0.000")) : rtf.Bold = False : rtf.NewLine()
                Else
                    k4 = 1 : rtf.WriteString("    - Modification n°5 suivant emploi d'un adjuvant : Sans objet - k4 = " & k4.ToString("#0")) : rtf.NewLine()
                End If
            End If

            '--> AU FINAL
            rtf.WriteString("Final : ") : rtf.NewLine()
            Dim AirInitial, EauInitial As Integer
            AirInitial = .Air : EauInitial = .Eau
            .Eau = CInt(Floor(k1 * k2 * k3 * k4 * .Eau))
            .Air = CInt(Floor(k1 * k2 * .Air))
            rtf.WriteString("Eau (E) = k1 . k2 . k3 . k4 . E = " & k1.ToString("#0.00") & " . " & k2.ToString("#0.00") & " . " & k3.ToString("#0.00") & " . " & k4.ToString("#0.00") & " . " & EauInitial.ToString("#0") & " = ") : rtf.Bold = True : rtf.WriteString(.Eau.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" l/m3") : rtf.NewLine()
            rtf.WriteString("Air (a) = k1 . k2 . a = " & k1.ToString("#0.00") & " . " & k2.ToString("#0.00") & " . " & AirInitial.ToString("#0") & " = ") : rtf.Bold = True : rtf.WriteString(.Air.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" l/m3") : rtf.NewLine()
            '-- Valeurs des rapports E/C ou (C+kA)/(E+V) et résistance cible
            rtf.NewLine() : rtf.FontSize = 11 : rtf.Underline = True
            rtf.WriteString("2 - 2 : Valeurs des rapports E/C ou (C+kA)/(E+V) et résistance cible") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
            rtf.WriteString("Les calculs sont réalisés suivant l'équation de Bolomey modifié, ci-dessous:") : rtf.NewLine()
            rtf.InsertImage(My.Resources.RésistanceMoyenne_BaronOllivier) : rtf.NewLine()
            '-->détermination fcE: suivant ciment - Voir formulaire Ciment
            rtf.Bold = True : rtf.WriteString("fm") : rtf.Bold = False : rtf.WriteString(" la classe vraie du ciment utilisé à 28 jours : ") : rtf.Bold = True : rtf.WriteString(Beton.Ciment.FcE.ToString("#")) : rtf.Bold = False : rtf.WriteString(" MPa") : rtf.NewLine()
            '-->Détermination de la résistance cible - Titre 5
            'Prise en compte des conditions de durabilité de l'EN206-1: résistance caractéristique
            If .EN206 > 0.1 Then Call Verif_Fck_EN206(rtf) '.EN206_Durabilite = True
            rtf.WriteString("fc résistance cible du béton à la compression à 28 jours :") : rtf.NewLine()
            Select Case .Fabrication
                Case 1 'avec matériel régulé tel que sondes d'humidité des sables, wattmètres différentiel, ...
                    rtf.WriteString("     ▸ fc est déterminé suivant les dispositions du titre 5 du cahier des bases de la formulation") : rtf.NewLine()
                    If .Fck > 25 Then fcm = .Fck + 4 Else fcm = .Fck + 3
                    msg = "avec matériel régulé tel que sondes d'humidité des sables, wattmètres différentiel, ..."
                    rtf.WriteString("     ▸ Conditions de fabrication du béton :  " & msg) : rtf.NewLine()
                Case 2 'sur chantier
                    rtf.WriteString("     ▸ fc est déterminé suivant les dispositions du titre 5 du cahier des bases de la formulation") : rtf.NewLine()
                    If .Fck > 25 Then fcm = .Fck + 6 Else fcm = .Fck + 5
                    msg = "sans information particulière sur sa fabrication (matériel de pesée, étalonnage, etc. ...)"
                    rtf.WriteString("     ▸ Conditions de fabrication du béton :  " & msg) : rtf.NewLine()
                Case 3 'renseigné directement dans le formulaire
                    fcm = .Fcm
                    rtf.WriteString("     ▸ fc a été renseigné directement.") : rtf.NewLine()
            End Select
            rtf.Bold = True : rtf.WriteString("fc") : rtf.Bold = False : rtf.WriteString(" :  ") : rtf.Bold = True : rtf.WriteString(fcm.ToString("#0.00")) : rtf.Bold = False : rtf.WriteString(" MPa") : rtf.NewLine()

            '-->détermination Kb le coefficient granulaire
            If .Kg_Direct = True Then
                kb = .Kg
            Else
                Select Case Gravillon.Item(0).Petrographie  'Tableau H
                    Case 1 'siliceux altéré
                        ' dgr = 2650 'densité du granulat
                        Select Case Dmax
                            Case Is <= 16
                                kb = 0.45
                            Case Is < 20
                                kb = 0.45 + (20 - Dmax) * 0.05 / 4
                            Case Is <= 25
                                kb = 0.5
                            Case Is < 30
                                kb = 0.5 + (30 - Dmax) * 0.05 / 5
                            Case Else
                                kb = 0.55
                        End Select
                    Case 2 'siliceux roulé
                        ' dgr = 2650 'densité du granulat
                        Select Case Dmax
                            Case Is <= 16
                                kb = 0.5
                            Case Is < 20
                                kb = 0.5 + (20 - Dmax) * 0.05 / 4
                            Case Is <= 25
                                kb = 0.55
                            Case Is < 30
                                kb = 0.55 + (30 - Dmax) * 0.05 / 5
                            Case Else
                                kb = 0.6
                        End Select
                    Case 3 'calcaires
                        ' dgr = 2700 'densité du granulat
                        Select Case Dmax
                            Case Is <= 16
                                kb = 0.55
                            Case Is < 20
                                kb = 0.55 + (20 - Dmax) * 0.05 / 4
                            Case Is <= 25
                                kb = 0.6
                            Case Is < 30
                                kb = 0.6 + (30 - Dmax) * 0.05 / 5
                            Case Else
                                kb = 0.65
                        End Select
                End Select
            End If

            rtf.Bold = True : rtf.WriteString("Kb") : rtf.Bold = False : rtf.WriteString(" le coefficient granulaire : ") : rtf.Bold = True : rtf.WriteString(kb.ToString("#0.00")) : rtf.Bold = False : rtf.WriteString(" (valeur numérique sans unité - Cf. Tableau H du cahier).") : rtf.NewLine()
            '-->détermination Kv  
            Select Case .Slump 'tableau I
                Case 1 'S1
                    kv = 0.87
                Case 2 'S2
                    kv = 0.9
                Case 3 'S3
                    kv = 0.93
                Case 4 ' S4
                    kv = 0.94 'suivant commentaire de la méthode
            End Select
            rtf.WriteString("Kv : ") : rtf.Bold = True : rtf.WriteString(kv.ToString("#0.00")) : rtf.Bold = False : rtf.WriteString(" (valeur numérique sans unité - Cf. Tableau I du cahier).") : rtf.NewLine()
            EV = .Eau / kv
            rtf.Bold = True : rtf.WriteString("E + V") : rtf.Bold = False : rtf.WriteString(" = volume Eau + Vide = E/Kv = ") : rtf.Bold = True : rtf.WriteString(EV.ToString("#0.00")) : rtf.Bold = False : rtf.WriteString(" l/m3.") : rtf.NewLine()
            With .Addition
                Select Case .Addition
                    Case 0
                        rtf.Bold = True : rtf.WriteString("A") : rtf.Bold = False : rtf.WriteString(" addition minérale au ciment tel que cendre volante, fumées de silice, etc... : Sans objet - aucune addition minérale à ce béton") : rtf.NewLine()
                        rtf.Bold = True : rtf.WriteString("k") : rtf.Bold = False : rtf.WriteString(" fonction de l'indice d'activité de l'addition minérale : Sans objet - aucune addition minérale à ce béton") : rtf.NewLine()
                    Case Else
                        rtf.Bold = True : rtf.WriteString("A") : rtf.Bold = False
                        Select Case .Addition
                            Case 1
                                rtf.WriteString(" addition minérale au ciment : fines calcaires de catégorie A")
                            Case 2 'calcaire LL
                                rtf.WriteString(" addition minérale au ciment : fines calcaires de catégorie B")
                            Case 3 'cendre volante siliceuse
                                rtf.WriteString(" addition minérale au ciment : cendre volante siliceuse")
                            Case 4 'laitier vitrifié
                                rtf.WriteString(" addition minérale au ciment : laitier vitrifié")
                            Case 5 'fumée de silice
                                rtf.WriteString(" addition minérale au ciment : fumée de silice")
                            Case 6 'addition siliceuse de minéralogie QZ
                                rtf.WriteString(" addition minérale au ciment : addition siliceuse de minéralogie QZ")
                            Case 7 'Métalaolin
                                rtf.WriteString(" addition minérale au ciment : Métakaolin")
                        End Select
                        rtf.WriteString(" - densité = " & .MV.ToString("#0.00") & " - quantité = ")
                        If .ComplementFines = False Then
                            If .Q_Impose = True Then
                                rtf.Bold = True : rtf.WriteString(.QuantiteImpose.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine() 'La quantité d'Addition a été imposée par le projeteur   
                            Else
                                rtf.WriteString(" A déterminer par optimisation couple Ciment/Addition et suivant volume optimal Fines") : rtf.NewLine()
                            End If
                            rtf.Bold = True : rtf.WriteString("k") : rtf.Bold = False : rtf.WriteString(" fonction de l'indice d'activité de l'addition minérale : ") : rtf.Bold = True : rtf.WriteString(.k.ToString("#0.00")) : rtf.Bold = False : rtf.NewLine()
                        Else
                            rtf.WriteString(" A déterminer suivant volume optimal Fines") : rtf.NewLine()
                            rtf.Bold = True : rtf.WriteString("k") : rtf.Bold = False : rtf.WriteString(" fonction de l'indice d'activité de l'addition minérale : Sans objet - l'addition minérale ne venant qu'en complément de fines.") : rtf.NewLine()
                        End If
                End Select
            End With
            rtf.NewLine()
            ' rtf.WriteString("L'équation de Bolomey modifiée indique une quantité de ciment C fonction des éléments introduits ci-dessus de :") : rtf.NewLine()
            Dim LHmin As Double
            .C = CInt(Floor(((fcm / (kb * Beton.Ciment.FcE)) + 0.5) * EV))
            LHmin = .C
            rtf.Bold = True : rtf.WriteString("LHe") : rtf.Bold = False : rtf.WriteString(" = C (+ kA) = Quantité minimale de Liant Hydraulique équivalent pour une résistance cible de ") : rtf.Bold = True : rtf.WriteString(fcm.ToString("#0.00"))
            rtf.Bold = False : rtf.WriteString("  MPa : LHe = ") : rtf.Bold = True : rtf.WriteString(LHmin.ToString("#0.0")) : rtf.Bold = False : rtf.WriteString("  kg/m3 ") : rtf.NewLine()

            If .Addition.Addition = 0 Then
                rtf.WriteString("Pas d'addition minérale A") : rtf.NewLine()
                rtf.WriteEndGroup()
                'Prise en compte ou pas des conditions de durabilité de l'EN206-1
                Call Verification_EN206_Ciment(Verif, rtf)
            Else
                'Prise en compte de l'addition comme complément fines et suivant le cas, complément ciment
                .Addition.Quantite = 0 'Ré-initialisation
                If .Addition.ComplementFines = True Then
                    rtf.WriteEndGroup()
                    'Prise en compte ou pas des conditions de durabilité de l'EN206-1 - L'Addition ne compte pas dans le Ciment - la masse de quantité de fines n'est pas donnée
                    Call Verification_EN206_Ciment(Verif, rtf)
                Else
                    rtf.WriteEndGroup()
                    If .Addition.Q_Impose = True Then
                        'La masse de quantité de fines est donnée
                        Call Verification_EN206_Avec_Qtite_Addition_Definie(LHmin, LiantEquivalent, Verif, rtf) 'QuantiteModifie,
                    Else
                        'La masse de quantité de fines n'est pas imposée
                        Call Verification_EN206_Avec_Qtite_Addition_Non_Definie(LHmin, LiantEquivalent, Verif, rtf)
                    End If
                End If
            End If
            '
            '3ième partie - Dosage optimal en fines en fonction de D et prise en compte ou pas de l'effet de défloculation du plastifiant
            '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________

            rtf.WriteStartGroup()
            rtf.FontSize = 12 : rtf.FontSize = 9
            rtf.NewLine() : rtf.FontSize = 11 : rtf.Underline = True
            rtf.WriteString("2 - 3 : Dosage optimal en fines en fonction de D") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
            rtf.WriteEndGroup()
            Call Calcul_Volume_Optimal_Fines(Dmax, Vopt, rtf)
            rtf.WriteStartGroup()
            rtf.FontSize = 12 : rtf.FontSize = 9
            'Rajouter si nécessaire de l'Addition pour se caler sur V optimal
            If Beton.Addition.Addition > 0.1 Then
                With Beton.Addition
                    If .ComplementFines = True Or .Q_Impose = False Then
                        Vf = (Beton.C / Beton.Ciment.Densite) + (.Quantite / .MV) + (250 * Sable.Item(0).TeneurFines / Sable.Item(0).Densite) 'Volume de fine = V ciment + V sable pour la teneur en fines (250L est une valeur estimative)
                        If Vf < Vopt Then
                            Dim Q1, Q2 As Integer
                            Q1 = .Quantite
                            Q2 = CInt(Truncate((Vopt - Vf) * .MV))
                            .Quantite += Q2
                            rtf.Bold = True : rtf.WriteString("Addition :") : rtf.Bold = False
                            rtf.WriteString(" la quantité d' addition initiale ( = " & Q1.ToString("#0.0") & " kg/m3) est majorée de " & Q2.ToString("#0.0") & " kg/m3 pour atteindre la valeur de " & .Quantite.ToString("#0") & " kg/m3.") : rtf.NewLine()
                            rtf.NewLine()

                        End If
                    End If
                End With
            End If

            Vseg = Vopt * 0.85 : Vpar = Vopt * 1.15
            Vseg = Floor(Vseg) : Vpar = Floor(Vpar)
            rtf.WriteString("Volume minimal de fines pour éviter les risques de ségrégations - Vmin Segreg : ") : rtf.Bold = True : rtf.WriteString(Vseg.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" litres pour 1 m3 de béton") : rtf.NewLine()
            rtf.WriteString("Volume maximal de fines pour un beau parement - V parement : ") : rtf.Bold = True : rtf.WriteString(Vpar.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" litres pour 1 m3 de béton") : rtf.NewLine()

        End With

        '
        '3ième partie - Détermination de la répartition en % des différents granulats - Sables et Gravillons
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.NewLine() : rtf.FontSize = 12 : rtf.Underline = True : rtf.Bold = True
        rtf.WriteString("3 - Squelette granulaire de la composition du béton - Répartition Sables et Gravillons") : rtf.Bold = False : rtf.FontSize = 11 : rtf.NewLine() : rtf.NewLine()
        If Sable.Count = 2 Then msg = "Caractéristiques des sables" Else msg = "Caractéristiques du sable"
        Dim i_chap As Integer
        i_chap = 1
        rtf.WriteString("3 - " & i_chap.ToString & " : " & msg) : rtf.Underline = False : rtf.FontSize = 10 : rtf.NewLine()
        With Sable
            For i = 1 To Beton.NbSable
                If i > Sable.Count Then
                    MessageBox.Show("Pb comptage nb sable", "Formulation Dreux", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
                    rtf.WriteEndGroup() : Verif = False : Exit Sub
                End If
                rtf.InsertTab() : rtf.Italic = True : rtf.FontSize = 10 : rtf.NewLine()
                rtf.WriteString("Sable n°" & i.ToString & " :") : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
                With .Item(i - 1)
                    rtf.WriteString("- Identité : " & .NomSable.ToString) : rtf.NewLine()
                    rtf.WriteString("- Classe granulaire : " & .ds.ToString("#0") & " / " & .Dms.ToString("#0")) : rtf.NewLine()
                    rtf.WriteString("- Forme du granulat : ")
                    Select Case .Forme
                        Case 1
                            msg = "concassé."
                        Case 2
                            msg = "roulé"
                    End Select
                    rtf.WriteString(msg) : rtf.NewLine()
                    rtf.WriteString("- Densité sèche : " & .Densite.ToString("#0.00") & " T/m3") : rtf.NewLine()
                    If Beton.CompPondHumide = True Then
                        rtf.WriteString("- Teneur en Humidité : " & (.Humidite * 100).ToString("#0.00") & " %") : rtf.NewLine()
                    End If
                    .ModuleFinesse(.Choix_mesureGranulo, Beton.Formulation)
                    If .Correcteur = True Then msg = " - Sable correcteur" Else msg = ""
                    rtf.WriteString("Module de finesse mf : " & .mf.ToString("#0.00") & msg) : rtf.NewLine()
                    Select Case i
                        Case 1
                            If Sable.Count = 1 Then 'Valide uniquement sans sable correcteur
                                If .mf <= 1.8 Then
                                    rtf.InsertImage(My.Resources.trafficlight_red)
                                    rtf.WriteString(" - Sable inapproprié :   mf < 1.8 ") : rtf.NewLine()
                                    rtf.WriteString("Le module de finesse est trop petit. Le sable est trop fin et la résistance du béton va chuter. Prévoir de corriger ce sable avec un autre complément plus grossier.") : rtf.NewLine()
                                    msg = "- Sable inapproprié :   mf < 1.8" & Environment.NewLine & "Le module de finesse est trop petit. Le sable est trop fin et la résistance du béton va chuter. Prévoir de corriger ce sable avec un autre complément plus grossier."
                                    Aff.msg_Avertiss.Add(msg)
                                ElseIf .mf < 2.2 Then
                                    rtf.InsertImage(My.Resources.trafficlight_yellow)
                                    rtf.WriteString(" - Sable un peu fin, le mf devrait être > 2.2") : rtf.NewLine()
                                ElseIf .mf > 2.8 Then
                                    rtf.InsertImage(My.Resources.trafficlight_yellow)
                                    rtf.WriteString(" - Sable un peu grossier, le mf devrait être < 2.8") : rtf.NewLine()
                                ElseIf .mf >= 3.2 Then
                                    rtf.InsertImage(My.Resources.trafficlight_red)
                                    rtf.WriteString(" - Sable inapproprié :   mf > 3.2 ") : rtf.NewLine()
                                    rtf.WriteString("Le module de finesse est trop gros. Le sable est trop grossier et la compacité du béton va chuter. Prévoir de corriger ce sable avec un complément plus fin.") : rtf.NewLine()
                                    msg = "- Sable inapproprié :   mf > 3.2" & Environment.NewLine & "Le module de finesse est trop gros. Le sable est trop grossier et la compacité du béton va chuter. Prévoir de corriger ce sable avec un complément plus fin."
                                    Aff.msg_Avertiss.Add(msg)
                                End If
                            End If
                        Case 2
                            rtf.WriteString("Objectif fixé pour le module de finesse avec le complément de sable n°2 : mf = " & .mfCible.ToString("#0.00")) : rtf.NewLine()
                    End Select
                    'Affichage de la courbe granulaire du sable
                    Try
                        Dim myImage As Image
                        myImage = My.Resources.Test700x400
                        Dim g As Graphics = Graphics.FromImage(myImage)
                        Call Affichage_CourbeGranulo(g, 2, 1, i - 1)
                        myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
                        g.Dispose()
                        rtf.InsertImage(myImage)
                        rtf.NewLine()
                        My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
                    Catch ex As Exception
                        msg = "Le logiciel n'a pas pu charger l'image de la courbe granulométrique du sable n°" & i.ToString & "." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
                        MessageBox.Show(msg, "Formulation béton suivant la méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End With
            Next
            '-->  Affichage de la composition des 2 sables
            If Beton.NbSable = 2 Then
                If Sable.Count >= 2 Then
                    rtf.Underline = True : rtf.FontSize = 11 : i_chap += 1
                    rtf.WriteString("3 - " & i_chap.ToString & " - Composition des deux sables") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine()
                    rtf.WriteString(" mf cible = " & .Item(1).mfCible.ToString("#0.00")) : rtf.NewLine()
                    If .Item(0).mf < .Item(1).mf Then
                        If .Item(0).mfCible > .Item(1).mf OrElse .Item(0).mfCible < .Item(0).mf Then
                            msg = "Le module de finesse cible doit être compris entre " & .Item(0).mf.ToString("#0.00") & " et " & .Item(1).mf.ToString("#0.00") & ". Or, ce n'est pas le cas. Le module de finesse cible n'est donc pas atteignable."
                            msg += Environment.NewLine & "Veuillez modifier la granulométrie des sables."
                            msg += Environment.NewLine & "Calcul arrêté."
                            MessageBox.Show(msg, "Formulation béton suivant la méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            rtf.WriteEndGroup()
                            Verif = False : Exit Sub
                        End If
                    Else '.Item(0).mf > .Item(1).mf
                        If .Item(0).mfCible > .Item(0).mf OrElse .Item(0).mfCible < .Item(1).mf Then
                            msg = "Le module de finesse cible doit être compris entre " & .Item(1).mf.ToString("#0.00") & " et " & .Item(0).mf.ToString("#0.00") & ". Or, ce n'est pas le cas. Le module de finesse cible n'est donc pas atteignable."
                            msg += Environment.NewLine & "Veuillez modifier la granulométrie des sables."
                            msg += Environment.NewLine & "Calcul arrêté."
                            MessageBox.Show(msg, "Formulation béton suivant la méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            rtf.WriteEndGroup()
                            Verif = False : Exit Sub
                        End If
                    End If
                    'proportion du sable 1
                    .Item(0).Mf_prop = Abs((.Item(1).mf - .Item(0).mfCible) / (.Item(1).mf - .Item(0).mf))
                    'proportion du sable 2
                    .Item(1).Mf_prop = 1 - .Item(0).Mf_prop
                    'composition du sable composé
                    rtf.WriteString("Le mélange des 2 sables sera composé de " & (.Item(0).Mf_prop * 100).ToString("#0.00") & " % de sable n°1 et de " & (.Item(1).Mf_prop * 100).ToString("#0.00") & " % de sable n°2.") : rtf.NewLine()
                    'ajout d'un 3ième sable qui sera le sable composé
                    Dim SableCompose As New clsSable
                    Dim Total As Double
                    SableCompose.Disponibilite_Tamis = .Item(0).Disponibilite_Tamis

                    For Each kvp As KeyValuePair(Of Double, Boolean) In Sable.Item(1).Disponibilite_Tamis
                        If SableCompose.Disponibilite_Tamis.ContainsKey(kvp.Key) AndAlso SableCompose.Disponibilite_Tamis(kvp.Key) = False AndAlso Sable.Item(1).Disponibilite_Tamis(kvp.Key) = True Then
                            SableCompose.Disponibilite_Tamis(kvp.Key) = True
                        End If
                    Next
                    SableCompose.TamisatCumule_Pourcent.Clear() : ValeurprecedenteS1 = 0 : ValeurPrecedenteS2 = 0
                    For Each kvp As KeyValuePair(Of Double, Boolean) In SableCompose.Disponibilite_Tamis
                        If .Item(0).TamisatCumule_Pourcent(kvp.Key) = 0 And ValeurprecedenteS1 = 100 Then .Item(0).TamisatCumule_Pourcent(kvp.Key) = 100
                        If .Item(1).TamisatCumule_Pourcent(kvp.Key) = 0 And ValeurPrecedenteS2 = 100 Then .Item(1).TamisatCumule_Pourcent(kvp.Key) = 100
                        Total = .Item(0).Mf_prop * .Item(0).TamisatCumule_Pourcent(kvp.Key) + .Item(1).Mf_prop * .Item(1).TamisatCumule_Pourcent(kvp.Key)
                        SableCompose.TamisatCumule_Pourcent.Add(kvp.Key, Total)
                        If .Item(0).TamisatCumule_Pourcent(kvp.Key) = 100 Then ValeurprecedenteS1 = 100
                        If .Item(1).TamisatCumule_Pourcent(kvp.Key) = 100 Then ValeurPrecedenteS2 = 100
                    Next
                    SableCompose.Choix_mesureGranulo = 4 'pour spécifier que pour le sable composé, la mesure est réalisée en tamisat cumulé %
                    Sable.Add(SableCompose) 'le sable composé sera le 3ième sable soit le sable n°2
                    'Affichage de la courbe granulaire du sable composé
                    Try
                        Dim myImage As Image
                        myImage = My.Resources.Test700x400
                        Dim g As Graphics = Graphics.FromImage(myImage)
                        Call Affichage_CourbeGranulo(g, 2, 1, 2)
                        myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
                        g.Dispose()
                        rtf.InsertImage(myImage)
                        rtf.NewLine()
                        My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
                    Catch ex As Exception
                        msg = "Le logiciel n'a pas pu charger l'image de la courbe granulométrique du sable composé." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
                        MessageBox.Show(msg, "Formulation béton suivant la méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                Else
                    MessageBox.Show("Pb sur nombre de sables: beton.nbsable = 2 et sable.count = " & Sable.Count.ToString("#0"), "Sub Formulation_BaronOllivier", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
                    rtf.WriteEndGroup() : Verif = False : Exit Sub
                End If
            End If
        End With
        If Gravillon.Count = 2 Then msg = " : Caractéristiques des gravillons" Else msg = " : Caractéristiques du gravillon"
        rtf.Underline = True : rtf.FontSize = 11 : i_chap += 1
        rtf.WriteString("3 - " & i_chap.ToString & msg) : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine()
        With Gravillon
            For i = 1 To Gravillon.Count
                rtf.InsertTab() : rtf.Italic = True : rtf.FontSize = 10 : rtf.NewLine()
                rtf.WriteString("Gravillon n°" & i.ToString & " :") : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
                With .Item(i - 1)
                    rtf.WriteString("- Identité : " & .NomGravillon.ToString) : rtf.NewLine()
                    rtf.WriteString("- Classe granulaire : " & .dg.ToString("#0") & " / " & .Dmg.ToString("#0")) : rtf.NewLine()
                    rtf.WriteString("- Nature Pétrographique : ")
                    Select Case .Petrographie
                        Case 1
                            msg = "Siliceux, légèrements altérés"
                        Case 2
                            msg = "Siliceux, roulés"
                        Case 3
                            msg = "Calcaires, durs"
                    End Select
                    rtf.WriteString(msg) : rtf.NewLine()
                    rtf.WriteString("- Forme du gravillon : ")
                    Select Case .Forme
                        Case 1
                            msg = "concassé."
                        Case 2
                            msg = "roulé"
                    End Select
                    rtf.WriteString(msg) : rtf.NewLine()
                    rtf.WriteString("- Densité sèche : " & .Densite.ToString("#0.00") & " T/m3") : rtf.NewLine()
                    If Beton.CompPondHumide = True Then
                        rtf.WriteString("- Teneur en Humidité : " & (.Humidite * 100).ToString("#0.00") & " %") : rtf.NewLine()
                    End If
                    'Affichage de la courbe granulaire du gravillon
                    Try
                        Dim myImage As Image
                        myImage = My.Resources.Test700x400
                        Dim g As Graphics = Graphics.FromImage(myImage)
                        Call Affichage_CourbeGranulo(g, 2, 2, i - 1)
                        myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
                        g.Dispose()
                        rtf.InsertImage(myImage)
                        rtf.NewLine()
                        My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
                    Catch ex As Exception
                        msg = "Le logiciel n'a pas pu charger l'image de la courbe granulométrique du gravillon n°" & i.ToString & "." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
                        MessageBox.Show(msg, "Formulation béton suivant la méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End With
            Next
        End With
        ''--> Composition du squeulette granulaire
        rtf.Underline = True : rtf.FontSize = 11 : i_chap += 1
        rtf.WriteString("3 - " & i_chap.ToString & " : Composition du mélange de granulats sable + gravillon") : rtf.Italic = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        rtf.Underline = True
        rtf.WriteString("Détermination de la droite brisée de référence OAB pour le mélange granulaire :") : rtf.Underline = False : rtf.NewLine()
        rtf.WriteEndGroup()
        Call DroitebriseeOAB_BaronOllivier(Verif, rtf)
        rtf.WriteStartGroup() : rtf.FontSize = 12 : rtf.FontSize = 9 : rtf.Underline = True
        rtf.WriteString("Affichage de la composition du mélange granulaire Sable(s) + Gravillon(s) :") : rtf.Underline = False : rtf.NewLine()
        'Affichage de la composition du mélange granulaire
        Try
            Dim myImage As Image
            myImage = My.Resources.Test700x400
            Dim g As Graphics = Graphics.FromImage(myImage)
            Call Affichage_CourbeGranulo(g, 2, 3,, Verif)
            myImage.Save(Directory.GetCurrentDirectory.ToString() & "\test1.bmp")
            g.Dispose()
            rtf.InsertImage(myImage)
            rtf.NewLine()
            My.Computer.FileSystem.DeleteFile(Directory.GetCurrentDirectory.ToString() & "\test1.bmp") 'effacement du fichier
        Catch ex As Exception
            msg = "Le logiciel n'a pas pu charger l'image de la composition granulaire." & Environment.NewLine & "Erreur: " & ex.Message & Environment.NewLine & ex.StackTrace
            MessageBox.Show(msg, "Formulation béton suivant la méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
        'Test en cas de problème de calcul du point d'intersection droite OAB et droite X95%-X05%
        If Verif = False Then
            rtf.WriteEndGroup() : Verif = True : Exit Sub
        End If

        rtf.WriteString("La répartition en % entre le Sable et le Gravillon est la suivante :") : rtf.NewLine()
        If Beton.NbSable = 1 Then
            Sable.Item(0).S_Vs = Beton.S_Vs
            rtf.WriteString("  - Sable : " & Sable.Item(0).S_Vs.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        Else
            'mélange des 2 sables sera composé de " & (prop1 * 100).ToString("#0.00") & " % de sable n°1 et de " & (prop2 * 100).ToString("#0.00") & " % de sable n°2."
            Sable.Item(0).S_Vs = CInt(Floor(Sable.Item(0).Mf_prop * Beton.S_Vs))
            Sable.Item(1).S_Vs = Beton.S_Vs - Sable.Item(0).S_Vs
            rtf.WriteString("  ▸ % Total de Sable dans la composition granulaire du béton : " & Beton.S_Vs.ToString("#0") & " % avec la répartition suivante :") : rtf.NewLine()
            rtf.WriteString("       - Sable n°1 : " & Sable.Item(0).S_Vs.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
            rtf.WriteString("       - Sable n°2 : " & Sable.Item(1).S_Vs.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        End If
        If Beton.NbGravillon = 1 Then
            rtf.WriteString("  - Gravillon : " & Gravillon.Item(0).G_Vg.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        Else
            rtf.WriteString("  ▸ % Total de Gravillon dans la composition granulaire du béton : " & (100 - Beton.S_Vs).ToString("#0") & " % avec la répartition suivante :") : rtf.NewLine()
            rtf.WriteString("       - Gravillon n°1 : " & Gravillon.Item(0).G_Vg.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
            rtf.WriteString("       - Gravillon n°2 : " & Gravillon.Item(1).G_Vg.ToString("#0") & " % du volume global de la composition granulaire.") : rtf.NewLine()
        End If

        '
        '4ième partie - Détermination des volumes de Ciment - Eau - Air - Granulats (Sables et Gravillons)
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Bold = True
        rtf.Underline = True : rtf.WriteString("4 - Répartition volumique de la formulation") : rtf.Bold = False : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteEndGroup()
        Dim Vc As Double 'Volume de ciment
        Dim Vag As Double 'volume absolu de l'ensemble des granulats
        Dim VA As Double = 0 'volume Addition minérale
        Dim Vpl As Double = 0 'volume plastifiant partie Extrait Sec
        Dim Vs As Double = 0 'Volume de fines cumulées dans le sable
        ' Dim ChoixComplementFines As Integer = 0
        With Beton
            Vc = Beton.C / Beton.Ciment.Densite
            If .Plastifiant = True Then
                'Le test se fait sur le liant équivalent car je peux avoir une addition mais servant uniquement au volume de fines
                If LiantEquivalent = 0 Then Vpl = ((.PlastifiantDosage * .C) / .PlastifiantDensite) * .PlastifiantExtraitSec Else Vpl = ((.PlastifiantDosage * LiantEquivalent) / .PlastifiantDensite) * .PlastifiantExtraitSec
            End If
            Vf = Vc 'sans tenir compte des fines amenées par le sable en initial

            With .Addition
                If .Addition > 0.1 Then
                    If .q_impose = True Then
                        VA = .QuantiteImpose / .MV ' 
                    Else
                        VA = .Quantite / .MV ' 
                    End If
                End If
            End With
            Vag = 1000 - Vc - VA - Vpl - .Eau - .Air
            Sable.Item(0).Vol = CInt(Floor(Sable.Item(0).S_Vs * Vag / 100))
            Vs = Sable.Item(0).Vol * Sable.Item(0).TeneurFines
            If .NbSable = 2 Then Sable.Item(1).Vol = CInt(Floor(Sable.Item(1).S_Vs * Vag / 100)) : Vs += Sable.Item(1).Vol * Sable.Item(1).TeneurFines
            Gravillon.Item(0).Vol = CInt(Floor(Gravillon.Item(0).G_Vg * Vag / 100))
            If .NbGravillon = 2 Then Gravillon.Item(1).Vol = CInt(Floor(Gravillon.Item(1).G_Vg * Vag / 100))
            Call Ecriture_Chapitre_Volume(Vc, Vag, VA, Vpl, rtf)
        End With

        '
        '5ième partie - Détermination des masses de granulats - Sables et Gravillons
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.WriteStartGroup() : rtf.NewLine() : rtf.Bold = True
        rtf.Underline = True : rtf.WriteString("5 - Répartition pondérale de la formulation") : rtf.Bold = False : rtf.FontSize = 11 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("5 - 1  Dosage en matériaux sec") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        With Sable
            With .Item(0)
                rtf.WriteString("Sable n° 1 : ") : rtf.NewLine()
                rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                .Masse = CInt(Truncate(.Vol * .Densite))
                rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
            End With
            If Beton.NbSable = 2 And .Count >= 2 Then
                With .Item(1)
                    rtf.WriteString("Sable n° 2 : ") : rtf.NewLine()
                    rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                    .Masse = CInt(Truncate(.Vol * .Densite))
                    rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
                End With
            End If
        End With

        With Gravillon
            With .Item(0)
                rtf.WriteString("Gravillon n° 1 : ") : rtf.NewLine()
                rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                .Masse = CInt(Truncate(.Vol * .Densite))
                rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
            End With
            If Beton.NbGravillon = 2 And .Count >= 2 Then
                With .Item(1)
                    rtf.WriteString("Gravillon n° 2 : ") : rtf.NewLine()
                    rtf.WriteString("  - Densité : " & .Densite.ToString("#0.00") & " kg/L ") : rtf.NewLine()
                    .Masse = CInt(Truncate(.Vol * .Densite))
                    rtf.WriteString("  - Masse : " & .Masse.ToString("#0") & " kg ") : rtf.NewLine()
                End With
            End If
        End With
        Dim TotalSec As Double = 0
        rtf.NewLine() : rtf.Underline = True
        rtf.WriteString("Composition pondérale matériaux secs pour 1 m") : rtf.Superscript = True : rtf.WriteString("3") : rtf.Superscript = False : rtf.WriteString(" de béton : ") : rtf.Underline = False : rtf.NewLine()
        With Beton
            msg = String.Empty
            Select Case .Ciment.Type
                Case 1
                    msg = "CEM I"' & .ClasseResistance.ToString("#0.0") & " "
                Case 2
                    msg = "CEM II/" '& msg1 & msg2 '& " " & .ClasseResistance.ToString("#0.0") & " "'  msg = "CEM II/B-D 42,5 R"
                Case 3
                    msg = "CEM III/" ' & msg1 & msg2 '& " " & .ClasseResistance.ToString("#0.0") & " "
            End Select
            If .Ciment.Type > 1 Then
                Select Case .Ciment.Clinker
                    Case 1
                        msg += "A-"
                    Case 2
                        msg += "B-"
                    Case 3
                        msg += "C-"
                End Select
                Select Case .Ciment.Constituant
                    Case 1
                        msg += "S"
                    Case 2
                        msg += "D"
                    Case 3
                        msg += "P"
                    Case 4
                        msg += "Q"
                    Case 5
                        msg += "V"
                    Case 6
                        msg += "W"
                    Case 7
                        msg += "T"
                    Case 8
                        msg += "L"
                    Case 9
                        msg += "LL"
                End Select
            End If
            rtf.WriteString("  - Ciment " & msg & " : " & .C & " kg.") : rtf.NewLine()
            TotalSec = .C
            If .Addition.Addition > 0.1 Then
                Select Case .Addition.Addition
                    Case 1
                        msg = "  - Addition fines calcaires de catégorie A"
                    Case 2 'calcaire LL
                        msg = "  - Addition fines calcaires de catégorie B"
                    Case 3 'cendre volante siliceuse
                        msg = "  - Addition cendre volante siliceuse"
                    Case 4 'laitier vitrifié
                        msg = "  - Addition laitier vitrifié"
                    Case 5 'fumée de silice
                        msg = "  - Addition fumée de silice"
                    Case 6 'addition siliceuse de minéralogie QZ
                        msg = "  - Addition siliceuse de minéralogie QZ"
                    Case 7 'Métalaolin
                        msg = "  - Addition Métakaolin"
                End Select
                Select Case .Addition.Q_Impose
                    Case True
                        rtf.WriteString(msg & " : " & .Addition.QuantiteImpose & " kg.") : rtf.NewLine()
                    Case False
                        rtf.WriteString(msg & " : " & .Addition.Quantite & " kg.") : rtf.NewLine()
                End Select
                TotalSec += .Addition.Quantite
            End If
            If .Plastifiant = True Then
                If LiantEquivalent = 0 Then Vpl = (.PlastifiantDosage * .C) / .PlastifiantDensite Else Vpl = (.PlastifiantDosage * LiantEquivalent) / .PlastifiantDensite
                rtf.WriteString("  - Plastifiant : " & Vpl.ToString("#0.00") & " L (= dm3) pour un dosage massique de " & (.PlastifiantDosage * 100).ToString("#0.00") & "%.") : rtf.NewLine()
                TotalSec += Vpl * .PlastifiantExtraitSec 'La partie liquide est compté dans l'eau efficace
            End If
            rtf.WriteString("  - Eau : " & .Eau & " L")
            If .Plastifiant = True Then
                rtf.WriteString(" dont :") : rtf.NewLine()
                If LiantEquivalent = 0 Then Vpl = ((.PlastifiantDosage * .C) / .PlastifiantDensite) * (1 - .PlastifiantExtraitSec) Else Vpl = ((.PlastifiantDosage * LiantEquivalent) / .PlastifiantDensite) * (1 - .PlastifiantExtraitSec)
                rtf.InsertTab() : rtf.WriteString("▸ Eau provenant de l'adjuvant : " & Vpl.ToString("#0.0") & " L") : rtf.NewLine()
                Vpl = Floor(Vpl) 'arrondie
                Dim Eau_Ajout As Double
                Eau_Ajout = .Eau - Vpl
                rtf.InsertTab() : rtf.WriteString("▸ Eau ajoutée : " & Eau_Ajout.ToString("#0") & " L") : rtf.NewLine()
            Else
                rtf.WriteString(".") : rtf.NewLine()
            End If
            rtf.WriteString("  - Sable n°1 : " & Sable.Item(0).Masse.ToString("#0") & " kg.") : rtf.NewLine()
            TotalSec += .Eau + Sable.Item(0).Masse
            If .NbSable = 2 Then rtf.WriteString("  - Sable n°2 : " & Sable.Item(1).Masse.ToString("#0") & " kg.") : rtf.NewLine() : TotalSec += Sable.Item(1).Masse
            rtf.WriteString("  - Gravillon n°1 : " & Gravillon.Item(0).Masse.ToString("#0") & " kg.") : rtf.NewLine()
            TotalSec += Gravillon.Item(0).Masse
            If .NbGravillon = 2 Then rtf.WriteString("  - Gravillon n°2 : " & Gravillon.Item(1).Masse.ToString("#0") & " kg.") : rtf.NewLine() : TotalSec += Gravillon.Item(1).Masse
        End With
        rtf.WriteString("--------------------------------------") : rtf.NewLine()
        rtf.WriteString("Total Général : " & TotalSec.ToString("#0") & " kg.") : rtf.NewLine()
        'Dosage en matériaux humide
        If Beton.CompPondHumide = True Then
            rtf.NewLine() : rtf.Underline = True : rtf.FontSize = 11
            rtf.WriteString("4 - 2  Dosage en matériaux humide") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
            With Sable
                With .Item(0)
                    rtf.WriteString("Sable n° 1 : ") : rtf.NewLine()
                    rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                    rtf.WriteString("  - Apport en eau à la masse de sable : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                    .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                    rtf.WriteString("  - Masse totale du sable humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                End With
                If Beton.NbSable = 2 Then
                    With .Item(1)
                        rtf.WriteString("Sable n° 2 : ") : rtf.NewLine()
                        rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                        rtf.WriteString("  - Apport en eau à la masse de sable : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                        .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                        rtf.WriteString("  - Masse totale du sable humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                    End With
                End If
            End With
            With Gravillon
                With .Item(0)
                    rtf.WriteString("Gravillon n° 1 : ") : rtf.NewLine()
                    rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                    rtf.WriteString("  - Apport en eau à la masse de Gravillon : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                    .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                    rtf.WriteString("  - Masse totale du Gravillon humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                End With
                If Beton.NbSable = 2 Then
                    With .Item(1)
                        rtf.WriteString("Gravillon n° 2 : ") : rtf.NewLine()
                        rtf.WriteString("  - Teneur en eau : " & (.Humidite * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                        rtf.WriteString("  - Apport en eau à la masse de Gravillon : " & (.Masse * .Humidite).ToString("#0.0") & " kg.") : rtf.NewLine()
                        .MasseHumide = CInt(Truncate(.Masse + (.Masse * .Humidite)))
                        rtf.WriteString("  - Masse totale du Gravillon humide : " & .MasseHumide.ToString("#0") & " kg ") : rtf.NewLine()
                    End With
                End If
            End With
            Dim qtiteEauS As Double = 0
            Dim qtiteEauG As Double = 0
            rtf.WriteString("Eau : ") : rtf.NewLine()
            rtf.WriteString("  - Correction sur la quantité d'eau totale : ") : rtf.NewLine()
            rtf.WriteString("  - Quantité d'eau apportée par le sable : ")
            For i = 1 To Beton.NbSable
                With Sable.Item(i - 1)
                    qtiteEauS += .Masse * .Humidite
                End With
            Next
            rtf.WriteString(qtiteEauS.ToString("#0.0") & " L.") : rtf.NewLine()
            rtf.WriteString("  - Quantité d'eau apportée par le gravillon : ")
            For i = 1 To Beton.NbGravillon
                With Gravillon.Item(i - 1)
                    qtiteEauG += .Masse * .Humidite
                End With
            Next
            rtf.WriteString(qtiteEauG.ToString("#0.0") & " L.") : rtf.NewLine()
            Beton.Eau = CInt(Floor(Beton.Eau - qtiteEauG - qtiteEauS))
            Dim TotalHumide As Double = 0
            rtf.WriteString("  - Quantité d'eau après correction : " & Beton.Eau.ToString("#0.0") & " L.") : rtf.NewLine() : rtf.NewLine() : rtf.Underline = True
            rtf.WriteString("Composition pondérale humide : ") : rtf.Underline = False : rtf.NewLine()
            With Beton
                rtf.WriteString("  - Ciment : " & .C & " kg.") : rtf.NewLine()
                rtf.WriteString("  - Eau : " & .Eau & " L.") : rtf.NewLine()
                rtf.WriteString("  - Sable n°1 : " & Sable.Item(0).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine()
                TotalHumide = .C + .Eau + Sable.Item(0).MasseHumide
                If .NbSable = 2 Then rtf.WriteString("  - Sable n°2 : " & Sable.Item(1).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine() : TotalHumide += Sable.Item(1).MasseHumide
                rtf.WriteString("  - Gravillon n°1 : " & Gravillon.Item(0).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine()
                TotalHumide += Gravillon.Item(0).MasseHumide
                If .NbGravillon = 2 Then rtf.WriteString("  - Gravillon n°2 : " & Gravillon.Item(1).MasseHumide.ToString("#0") & " kg.") : rtf.NewLine() : TotalHumide += Gravillon.Item(1).MasseHumide
            End With
            rtf.WriteString("--------------------------------------") : rtf.NewLine()
            rtf.WriteString("Total Général : " & TotalHumide.ToString("#0") & " kg.") : rtf.NewLine()
        End If
        '
        '6ième partie - Vérification de la teneur en fines
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Underline = True : rtf.Bold = True
        rtf.WriteString("6 - Vérification de la teneur en fines") : rtf.Underline = False : rtf.Bold = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("Pour rappel, le volume des fines (Vf) est l'ensemble des grains solides d'un béton passant au tamis de maille 63 μm.") : rtf.NewLine()
        rtf.WriteString("Vf = Volume Ciment (Vc) + Volume Sable passant 63 μm (Vs) + Volume Addition minérale (VA)") : rtf.NewLine()

        Vs = 0
        For i = 1 To Beton.NbSable
            ' Vs += Sable.Item(i - 1).Vol * Sable.Item(i - 1).TamisatCumule_Pourcent(0.063)
            Vs += Sable.Item(i - 1).Vol * Sable.Item(i - 1).TeneurFines
        Next
        With Beton.Addition
            If .Addition = 0 Then
                rtf.WriteString("Aucune addition minérale : VA = 0") : rtf.NewLine()
            Else
                Select Case .Addition
                    Case 1
                        rtf.WriteString("Addition minérale au ciment : fines calcaires de catégorie A")
                    Case 2 'calcaire LL
                        rtf.WriteString("Addition minérale au ciment : fines calcaires de catégorie B")
                    Case 3 'cendre volante siliceuse
                        rtf.WriteString("Addition minérale au ciment : cendre volante siliceuse")
                    Case 4 'laitier vitrifié
                        rtf.WriteString("Addition minérale au ciment : laitier vitrifié")
                    Case 5 'fumée de silice
                        rtf.WriteString("Addition minérale au ciment : fumée de silice")
                    Case 6 'addition siliceuse de minéralogie QZ
                        rtf.WriteString("Addition minérale au ciment : addition siliceuse de minéralogie QZ")
                    Case 7 'Métalaolin
                        rtf.WriteString("Addition minérale au ciment : Métakaolin")
                End Select
                rtf.WriteString(" - densité = " & .MV.ToString("#0.00") & " - quantité = ") : rtf.Bold = True
                Select Case .Q_Impose
                    Case True
                        rtf.WriteString(.QuantiteImpose.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                        VA = .QuantiteImpose / .MV
                    Case False
                        rtf.WriteString(.Quantite.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                        VA = .Quantite / .MV
                End Select
                rtf.WriteString("Addition minérale : Volume VA = ") : rtf.Bold = True : rtf.WriteString(VA.ToString("#0.0")) : rtf.Bold = False : rtf.WriteString(" L/m") : rtf.Superscript = True : rtf.WriteString("3") : rtf.Superscript = False : rtf.NewLine()
                End If
        End With
        rtf.WriteString("Sable : volume de fines : Vs = " & Vs.ToString("#0.0") & " L/m") : rtf.Superscript = True : rtf.WriteString("3") : rtf.Superscript = False : rtf.NewLine()
        rtf.WriteString("Ciment : volume de fines : Vc = " & Vc.ToString("#0.0") & " L/m") : rtf.Superscript = True : rtf.WriteString("3") : rtf.Superscript = False : rtf.NewLine()
        Vf = Vc + Vs + VA 'voirp388
        rtf.WriteString("Volume total de fines : Vf = Vc + Vs + VA = " & Vc.ToString("#0.0") & " + " & Vs.ToString("#0.0") & " + " & VA.ToString("#0.0") & " = ")
        rtf.Bold = True : rtf.Underline = True : rtf.WriteString(Vf.ToString("#0.0") & " L/m") : rtf.Superscript = True : rtf.WriteString("3") : rtf.Superscript = False : rtf.Bold = False : rtf.Underline = False : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("Volume optimal en fines : ") : rtf.Underline = True : rtf.Bold = True : rtf.WriteString(Vopt.ToString("#0")) : rtf.Bold = False : rtf.Underline = False : rtf.WriteString(" L/m") : rtf.Superscript = True : rtf.WriteString("3") : rtf.Superscript = False : rtf.NewLine()

        '
        rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification") : rtf.Underline = False : rtf.NewLine()
        'Ségrégation :
        If Vf < Vseg Then
            'L'Addition est géré par V optimal
            msg = "Le volume de fines est inférieur à la valeur plancher pour éviter le risque de ségrégation : " & Vf.ToString("#0.0") & " pour une valeur minimale de :" & Vseg.ToString("#0")
            rtf.WriteString(msg) : rtf.NewLine()
            Aff.msg_Avertiss.Add(msg)
        Else
            msg = "Volume de fines > valeur plancher pour éviter le risque de ségrégation : " & Vf.ToString("#0.0") & " > " & Vseg.ToString("#0") & " -- OK"
            rtf.WriteString(msg) : rtf.NewLine()
        End If
        If Vf > Vpar Then
            'Suivant Addition ou pas
            With Beton
                With .Addition
                    If .Addition > 0.1 Then
                        If .ComplementFines = True Then
                            'Addition en fines exclusivement - Je ne devrais jamais être dans ce cas de figure! (à part un bug logiciel!
                            rtf.WriteString("Risque concernant la qualité du parement : ") : rtf.NewLine()
                            msg = "Le volume de fines est supérieur à la valeur plafond pour obtenir un beau parement : " & Vf.ToString("#0") & " pour une valeur maximale de :" & Vpar.ToString("#0")
                            rtf.InsertTab() : rtf.WriteString(msg) : rtf.NewLine()
                            Aff.msg_Avertiss.Add(msg)
                        Else
                            If .Q_Impose = True Then
                                'Quantité d'Addition imposée
                                rtf.WriteString("Risque concernant la qualité du parement : ") : rtf.NewLine()
                                msg = "Le volume de fines est supérieur à la valeur plafond pour obtenir un beau parement : " & Vf.ToString("#0") & " pour une valeur maximale de :" & Vpar.ToString("#0")
                                rtf.InsertTab() : rtf.WriteString(msg) : rtf.NewLine()
                                Aff.msg_Avertiss.Add(msg)
                                Dim Qdim As Double
                                Qdim = Truncate((Vf - Vpar) / .MV) + 1
                                If Qdim < .QuantiteImpose Then
                                    msg = "Vérifier si vous ne pouvez pas diminuer la quantité d'Addition d'une valeur de " & Qdim.ToString("#0.0") & " kg/m3"
                                Else
                                    msg = "La quantité à diminuer ( = " & Qdim.ToString("#0.0") & " kg/m3) excède la quantité d'Addition (= " & .QuantiteImpose.ToString("#0") & " kg/m3) - Revoyez les hypothèses de formulation."
                                End If
                                rtf.InsertTab() : rtf.WriteString(msg) : rtf.NewLine()
                                Aff.msg_Avertiss.Add(msg)
                            Else
                                'Quantité d'Addition Non imposée et ne sera pas comptée dans le liant équivalent
                                rtf.WriteString("Risque concernant la qualité du parement : ") : rtf.NewLine()
                                msg = "Le volume de fines est supérieur à la valeur plafond pour obtenir un beau parement : " & Vf.ToString("#0") & " pour une valeur maximale de :" & Vpar.ToString("#0")
                                rtf.InsertTab() : rtf.WriteString(msg) : rtf.NewLine()
                                Aff.msg_Avertiss.Add(msg)
                                msg = "Les éléments de calcul n'ont pas permis d'obtenir une valeur de volume de fines plus basse. Revoyez les hypothèses de formulation."
                                rtf.InsertTab() : rtf.WriteString(msg) : rtf.NewLine()
                                Aff.msg_Avertiss.Add(msg)
                            End If
                        End If
                    Else
                        'Pas d'Addition
                        msg = "Le volume de fines est supérieur à la valeur plafond pour obtenir un beau parement : " & Vf.ToString("#0") & " pour une valeur maximale de :" & Vpar.ToString("#0")
                        rtf.WriteString(msg) : rtf.NewLine()
                        Aff.msg_Avertiss.Add(msg)
                    End If
                End With
            End With
        Else
            msg = "Volume de fines < valeur plafond pour obtenir un beau parement : " & Vf.ToString("#0") & " < " & Vpar.ToString("#0") & " -- OK"
            rtf.WriteString(msg) : rtf.NewLine()
        End If

        '
        '7ième partie - Avertissements
        '_______________________________________________________________________________________________________________________________________________________________________________________________________________________________
        rtf.FontSize = 12 : rtf.NewLine() : rtf.Underline = True : rtf.Bold = True
        rtf.WriteString("7 - Avertissements") : rtf.Underline = False : rtf.Bold = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        If Aff.msg_Avertiss.Count = 0 Then
            rtf.WriteString("Aucun avertissement.") : rtf.NewLine()
        Else
            With Aff
                For i = 1 To .msg_Avertiss.Count
                    rtf.WriteString(.msg_Avertiss(i - 1).ToString) : rtf.NewLine()
                Next
            End With
        End If
        rtf.WriteEndGroup()
    End Sub

    ''' <summary>Verification des conditions d'application de l'EN206-1 uniquement avec la quantité de ciment</summary>
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    Private Sub Verification_EN206_Ciment(ByRef Verif As Boolean, ByRef rtf As To_Rtf.RtfAnsiTextWriter, Optional Affichage As Integer = 0)
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.FontSize = 9
        'Prise en compte des conditions de durabilité de l'EN206-1
        With Beton
            rtf.Bold = True : rtf.WriteString("C") : rtf.Bold = False : rtf.WriteString(" quantité de ciment : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
            If .EN206 > 0.1 = True Then '.EN206_Durabilite = True
                If Affichage = 0 Then rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification conditions EN 206-1 :") : rtf.Underline = False : rtf.NewLine()
                'Vérification de la teneur mini en liant
                rtf.Italic = True : rtf.WriteString("Vérification de la teneur minimale en ciment : ") : rtf.Italic = False : rtf.NewLine()
                rtf.InsertTab() : rtf.WriteString("teneur minimale en ciment suivant EN206-1 : " & .EN206_TeneurLiant.ToString("#0")) : rtf.NewLine()
                If .C > .EN206_TeneurLiant Then
                    rtf.InsertTab() : rtf.WriteString("vérification de la teneur : C = " & .C.ToString("#0") & " > " & .EN206_TeneurLiant.ToString("#0") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant") : rtf.Underline = False : rtf.NewLine()
                Else
                    rtf.InsertTab() : rtf.WriteString("vérification de la teneur : C = " & .C.ToString("#0") & " < " & .EN206_TeneurLiant.ToString("#0") & " - ") : rtf.Underline = True : rtf.WriteString("Non Satisfaisant") : rtf.Underline = False : rtf.NewLine()
                    rtf.InsertTab() : rtf.WriteString("Complément de ciment à ajouter (kg/m3) : " & (.EN206_TeneurLiant - .C).ToString("#0")) : rtf.NewLine()
                    .C += CInt(.EN206_TeneurLiant)
                    rtf.InsertTab() : rtf.Bold = True : rtf.WriteString("C") : rtf.Bold = False : rtf.WriteString(" quantité finale de ciment : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                End If
                'Vérification de la teneur en eau
                Dim Rap As Double ' 
                Rap = .Eau / .C
                rtf.Italic = True : rtf.WriteString("Vérification de la teneur maximale en eau ") : rtf.Italic = False : rtf.NewLine()
                rtf.InsertTab() : rtf.WriteString("rapport Eau efficace/Liant équivalent (E/C) : " & (.Eau / .C).ToString("#0.00")) : rtf.NewLine()
                rtf.InsertTab() : rtf.WriteString("rapport Maxi E/C suivant EN206-1 : " & .EN206_EC.ToString("#0.00")) : rtf.NewLine()
                If Rap > .EN206_EC Then
                    rtf.InsertTab() : rtf.WriteString("Vérification rapport E/C : " & Rap.ToString("#0.00") & " > " & .EN206_EC.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Non satisfaisant") : rtf.Underline = False : rtf.NewLine()
                    rtf.InsertTab() : rtf.WriteString("La quantité d'eau est trop importante par rapport au ciment. ") : rtf.NewLine()
                    If .Plastifiant = True Then
                        rtf.InsertTab() : rtf.WriteString("L'ajout d'un plastifiant ou superplastifiant ne s'est pas avéré satisfaisant. En conséquence, la quantité de ciment sera augmentée.") : rtf.NewLine()
                    Else
                        rtf.InsertTab() : rtf.WriteString("Il faut soit ajouter un plastifiant ou superplastifiant pour conserver la même ouvrabilité et diminuer ainsi la quanité d'eau, " &
                                                          "ou augmenter la quantité de ciment au détriment de l'ouvrabilité. C'est ce 2ième choix qui est opéré ici.") : rtf.NewLine()
                    End If
                    rtf.InsertTab() : rtf.WriteString("La quantité de ciment C est augmentée de " & ((.Eau / .EN206_EC) - .C).ToString("#0.0") & " kg/m3.") : rtf.NewLine()
                    .C += CInt(Math.Truncate((.Eau / .EN206_EC) - .C) + 1)
                    rtf.InsertTab() : rtf.Bold = True : rtf.WriteString("C") : rtf.Bold = False : rtf.WriteString(" quantité de ciment : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                Else
                    rtf.InsertTab() : rtf.WriteString("Vérification rapport E/C : " & Rap.ToString("#0.00") & " < " & .EN206_EC.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant") : rtf.Underline = False : rtf.NewLine()
                End If
            Else
                rtf.WriteString("Pour information : rapport Eau efficace/Liant équivalent (E/C) : " & (.Eau / .C).ToString("#0.00")) : rtf.NewLine()
            End If
        End With
        rtf.WriteEndGroup()
                End Sub

    ''' <summary>Verification des conditions d'application de l'EN206-1 avec quantité d'addition donnée</summary>
    '''  <param name="LHmin">Quantité de Liant Hydraulique résultant de l'équation de Bolomey</param> 
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    Private Sub Verification_EN206_Avec_Qtite_Addition_Definie(ByVal LHmin As Double, ByRef LiantEquivalent As Integer, ByRef Verif As Boolean, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim msg As String = String.Empty
        '  Dim QuantiteModifie1 As Integer = 0ByRef QuantiteModifie As Integer, 
        'Dim QuantiteModifie As Integer = 0
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.FontSize = 9
        With Beton
            'Prise en compte des conditions de durabilité de l'EN206-1
            If .EN206 > 0.1 = True Then '.EN206_Durabilite = True
                'Vérification suivant EN 206-1
                rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification des conditions EN 206-1 :") : rtf.Underline = False : rtf.NewLine()
                If .Ciment.Type = 1 OrElse ((.Ciment.Type = 2 And .Ciment.Clinker = 1) = True And .EN206 = 2) = True Then
                    Dim Rap, RapMax As Double
                    RapMax = 0
                    Call Valeur_RapMax(RapMax)  'détermination de la valeur maximale du rapport  A/(A+C) suivant l'EN206-1 utilisée

                    If RapMax <> 0 Then
                        rtf.InsertTab() : rtf.WriteString("Prise en compte d'un ajout d'une Addition au ciment : la qualité du ciment utilisée pour la formulation du béton, permet d'intégrer l'addition en totalité (la quantité de l'addition est imposée) comme substitution au ciment comme liant équivalent.") : rtf.NewLine()
                        'Détermination de la valeur de C en fonction de l'équation de Bolomey
                        .C = CInt(Truncate(LHmin - .Addition.k * .Addition.QuantiteImpose) + 1) 'détermination de la nouvelle quantité de ciment par prise en compte de la substitution de l'addition
                        LiantEquivalent = CInt(Truncate(.C + .Addition.k * .Addition.QuantiteImpose))
                        rtf.Italic = True : rtf.WriteString("Pour satisfaire la condition de résistance de l'équation de Bolomey :") : rtf.Italic = False : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString(" Quantité de ciment C : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3 pour une quantité d'addition imposée de " & .Addition.QuantiteImpose.ToString("#0") & " kg/m3.") : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString(" Quantité en Liant Equivalent LE : ") : rtf.Bold = True : rtf.WriteString(LiantEquivalent.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                        '
                        'Vérification de la teneur maximale en addition
                        Rap = .Addition.QuantiteImpose / (.Addition.QuantiteImpose + .C)
                        rtf.Italic = True : rtf.WriteString("Vérification de la teneur maximale en addition :") : rtf.Italic = False : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString("Seuil maximal rapport A/(A+C) : " & RapMax.ToString("#0.00")) : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString(" C : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString(" A : ") : rtf.Bold = True : rtf.WriteString(.Addition.QuantiteImpose.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString("Rapport A/(A+C) = " & Rap.ToString("#0.00")) : rtf.NewLine()
                        If Rap > RapMax Then
                            rtf.InsertTab() : rtf.WriteString("Vérification : " & Rap.ToString("#0.00") & " > " & RapMax.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Non satisfaisant.") : rtf.Underline = False : rtf.NewLine()
                            'Ce qui implique une majoration de la quantité de ciment pour valider l'inéquation
                            .C = CInt(Truncate(.Addition.QuantiteImpose * (1 - RapMax) / RapMax)) + 1
                            rtf.InsertTab() : rtf.WriteString("Majoration de la quantité de ciment C = ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3.") : rtf.NewLine()
                            LiantEquivalent = CInt(Truncate(.C + .Addition.k * .Addition.QuantiteImpose))
                        Else
                            rtf.InsertTab() : rtf.WriteString("Vérification : " & Rap.ToString("#0.00") & " < " & RapMax.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant.") : rtf.Underline = False : rtf.NewLine()
                            LiantEquivalent = CInt(Truncate(.C + .Addition.k * .Addition.QuantiteImpose))
                        End If
                        '
                        'Vérification de la teneur mini en liant
                        'Dans le cas ou la yeneur mini en liant soit plus défavorable que l'équation de Bolomey
                        rtf.Italic = True : rtf.WriteString("Vérification de la teneur minimale en liant équivalent : ") : rtf.Italic = False : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString("Seuil minimal : " & .EN206_TeneurLiant.ToString("#0") & " kg/m3") : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString(" Teneur en liant équivalent C + k.A : ") : rtf.Bold = True : rtf.WriteString(LiantEquivalent.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
                        If LiantEquivalent > .EN206_TeneurLiant Then
                            rtf.InsertTab() : rtf.WriteString("Vérification : " & LiantEquivalent.ToString("#0") & " > " & .EN206_TeneurLiant.ToString("#0") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant.") : rtf.Underline = False : rtf.NewLine()
                        Else
                            rtf.InsertTab() : rtf.WriteString("Vérification : " & LiantEquivalent.ToString("#0") & " < " & .EN206_TeneurLiant.ToString("#0") & " - ") : rtf.Underline = True : rtf.WriteString("Non satisfaisant.") : rtf.Underline = False : rtf.NewLine()
                            rtf.InsertTab() : rtf.WriteString("Complément de ciment à ajouter : " & (.EN206_TeneurLiant - LiantEquivalent).ToString("#0") & " kg/m3") : rtf.NewLine()
                            .C += CInt(.EN206_TeneurLiant - LiantEquivalent)
                            rtf.InsertTab() : rtf.WriteString("C corrigé : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3.") : rtf.NewLine()
                            LiantEquivalent = CInt(.EN206_TeneurLiant)
                        End If
                        '                        '
                        'Vérification de la teneur en eau
                        rtf.Italic = True : rtf.WriteString("Vérification de la teneur maximale en eau - rapport Eau efficace/Liant équivalent :") : rtf.Italic = False : rtf.NewLine()
                        rtf.InsertTab() : rtf.WriteString("Teneur maximale en eau : " & .EN206_EC.ToString("#0.00")) : rtf.NewLine()
                        Rap = .Eau / LiantEquivalent
                        rtf.InsertTab() : rtf.WriteString("  Rapport Eau efficace/Liant équivalent : " & Rap.ToString("#0.000")) : rtf.NewLine()
                        If Rap > .EN206_EC Then
                            rtf.InsertTab() : rtf.WriteString("Vérification teneur en eau : " & Rap.ToString("#0.00") & " > " & .EN206_EC.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Non Satisfaisant.") : rtf.Underline = False : rtf.NewLine()
                            rtf.InsertTab() : rtf.WriteString("La quantité d'eau est trop importante par rapport au liant équivalent")
                            If .Plastifiant = True Then
                                rtf.InsertTab() : rtf.WriteString("L'ajout d'un plastifiant ou superplastifiant ne s'est pas avéré satisfaisant. En conséquence, la quantité de ciment sera augmentée.") : rtf.NewLine()
                            Else
                                rtf.InsertTab() : rtf.WriteString("Il faut soit ajouter un plastifiant ou superplastifiant pour conserver la même ouvrabilité et diminuer ainsi la quanité d'eau, " &
                                                              "ou augmenter la quantité de ciment au détriment de l'ouvrabilité. C'est ce 2ième choix qui est opéré ici.") : rtf.NewLine()
                            End If
                            Dim C_complementaire As Integer
                            C_complementaire = CInt(Truncate((.Eau / .EN206_EC) - LiantEquivalent) + 1)
                            rtf.InsertTab() : rtf.WriteString("La quantité de ciment C est augmentée de " & (C_complementaire.ToString("#0") & " kg/m3.")) : rtf.NewLine()
                            LiantEquivalent += C_complementaire : .C += C_complementaire
                            rtf.InsertTab() : rtf.WriteString("C corrigé : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3.") : rtf.NewLine()
                            rtf.InsertTab() : rtf.WriteString("Liant équivalent corrigé : ") : rtf.Bold = True : rtf.WriteString(LiantEquivalent.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3.") : rtf.NewLine()
                        Else
                            rtf.InsertTab() : rtf.WriteString("Vérification teneur en eau : " & Rap.ToString("#0.000") & " < " & .EN206_EC.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant.") : rtf.Underline = False : rtf.NewLine()
                        End If
                        rtf.WriteEndGroup()
                    Else
                        rtf.InsertTab() : rtf.WriteString("Non prise en compte de l'Addition en substitut partiel du ciment car cette addition ne peut être prise en compte pour cette classe d'exposition suivant l'EN206-1. Addition prise en compte uniquement au titre des fines.") : rtf.NewLine()
                        rtf.WriteEndGroup()
                        'L'addition servira uniquement au dosage optimal en fines et sera considéré comme un ajout
                        'Pas de modification de la quantité d'Addition - La quantité sera à réévaluer lors du calcul final de fines
                        Call Verification_EN206_Ciment(Verif, rtf, 1)
                    End If                   '
                Else
                    rtf.WriteString("Prise en compte d'une Addition au ciment : la qualité du ciment utilisée pour la formulation du béton ne permet pas de d'intégrer l'addition dans le liant équivalent.") : rtf.NewLine()
                    rtf.WriteString("L'addition servira uniquement au dosage optimal en fines et sera considéré comme un ajout.") : rtf.NewLine()
                    'Pas de modification de la quantité d'Addition - La quantité sera à réévaluer lors du calcul final de fines
                    rtf.WriteEndGroup()
                    Call Verification_EN206_Ciment(Verif, rtf, 1)
                End If
            Else
                'Aucune Vérification suivant EN 206-1
                Call Verification_EN206_Ciment(Verif, rtf, 1)
                'Pas de modification de la quantité d'Addition - La quantité sera à réévaluer lors du calcul final de fines
            End If
        End With

    End Sub

    ''' <summary>Verification des conditions d'application de l'EN206-1 avec détermination de la quantité d'addition</summary>
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    Private Sub Verification_EN206_Avec_Qtite_Addition_Non_Definie(ByVal LHmin As Double, ByRef LiantEquivalent As Integer, ByRef Verif As Boolean, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        ' Dim Vopt As Double
        Dim msg As String = String.Empty
        Dim Det, DetC, DetA, Q_A, Q_C, RapMax, Tmin As Double
        ' Call Calcul_Volume_Optimal_Fines(Dmax, Vopt)
        With Beton
            'Prise en compte des conditions de durabilité de l'EN206-1
            If .EN206 > 0.1 = True Then '.EN206_Durabilite = True
                rtf.WriteStartGroup()
                rtf.FontSize = 12 : rtf.FontSize = 9
                rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification des conditions EN 206-1 :") : rtf.Underline = False : rtf.NewLine()
                If .Ciment.Type = 1 OrElse ((.Ciment.Type = 2 And .Ciment.Clinker = 1) = True And .EN206 = 2) = True Then
                    RapMax = 0
                    Call Valeur_RapMax(RapMax) 'détermination de la valeur maximale du rapport  A/(A+C) suivant l'EN206-1 utilisée
                    If RapMax <> 0 Then
                        rtf.InsertTab() : rtf.WriteString("Prise en compte d'un ajout d'une Addition au ciment : la qualité du ciment utilisée pour la formulation du béton, permet d'intégrer l'addition en totalité ou en partie comme substitution au ciment comme liant équivalent.") : rtf.NewLine()
                        rtf.WriteEndGroup()
                        'Calcul du déterminant
                        Det = (RapMax * (1 - .Addition.k)) - 1
                        If Det > -0.0001 Then
                            MessageBox.Show("Pb conditionnement matrice", "Verif_En206_Qnondéfinie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                            Verif = False : rtf.WriteEndGroup() : Exit Sub
                        End If
                        'détermination Tmin
                        If .EN206_TeneurLiant > LHmin Then Tmin = .EN206_TeneurLiant Else Tmin = LHmin
                        DetC = Tmin * (RapMax - 1)
                        DetA = -RapMax * Tmin
                        Q_A = DetA / Det : Q_C = DetC / Det
                        'Vérification E/C
                        If (Q_C + .Addition.k * Q_A) * .EN206_EC < .Eau Then Q_C = (.Eau / .EN206_EC) - .Addition.k * Q_A + 1
                        'Affectation des valeurs
                        .C = CInt(Floor(Q_C) + 1) 'détermination de la nouvelle quantité de ciment par prise en compte de la substitution de l'addition
                        .Addition.Quantite = CInt(Floor(Q_A))
                        LiantEquivalent = CInt(Floor(.C + .Addition.k * .Addition.Quantite))
                        'Ecriture des vérifications dans la note de calcul
                        Call Ecriture_Verification_EN206(LHmin, LiantEquivalent, RapMax, rtf)
                    Else
                        rtf.InsertTab() : rtf.WriteString("Non prise en compte de l'Addition en substitut partiel du ciment car cette addition ne peut être prise en compte pour cette classe d'exposition suivant l'EN206-1. Addition prise en compte uniquement au titre des fines.") : rtf.NewLine()
                        rtf.WriteEndGroup()
                        'Vérification uniquement avec la teneur en ciment
                        Call Verification_EN206_Ciment(Verif, rtf, 1)
                    End If
                Else
                    rtf.WriteString("Prise en compte d'une Addition au ciment : la qualité du ciment utilisée pour la formulation du béton ne permet pas de l'intégrer comme liant équivalent.") : rtf.NewLine()
                    rtf.WriteString("L'addition servira uniquement au dosage optimal en fines et sera considéré comme un ajout.") : rtf.NewLine()
                    rtf.WriteEndGroup()
                    'Vérification uniquement avec la teneur en ciment
                    Call Verification_EN206_Ciment(Verif, rtf, 1)
                End If
            Else
                'Aucune Vérification suivant EN 206-1
                Call Verification_EN206_Ciment(Verif, rtf, 1)
                .Addition.Quantite = 0
                'Aucun calcul de quantité d'Addition - La quantité servira uniquement en complément de volume de fines
            End If
        End With
    End Sub

    Private Sub Ecriture_Verification_EN206(ByVal LHmin As Double, ByVal LEq As Integer, ByVal RapMax As Double, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim Rap As Double ' 
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.FontSize = 9
        With Beton
            rtf.Bold = True : rtf.WriteString("C") : rtf.Bold = False : rtf.WriteString(" quantité de ciment : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
            rtf.Bold = True : rtf.WriteString("A") : rtf.Bold = False : rtf.WriteString(" quantité d'Addition : ") : rtf.Bold = True : rtf.WriteString(.Addition.Quantite.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
            rtf.Bold = True : rtf.WriteString("Liant Equivalent LEq ") : rtf.Bold = False : rtf.WriteString(" (C + k.A) : ") : rtf.Bold = True : rtf.WriteString(LEq.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
            rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification vis à vis de la résistance moyenne (Eq. Bolomey) :") : rtf.Underline = False : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("LH minimal : " & LHmin.ToString("#0")) : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("LEq = " & LEq.ToString("#0") & " > " & LHmin.ToString("#0") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant") : rtf.Underline = False : rtf.NewLine()
            rtf.NewLine() : rtf.Underline = True : rtf.WriteString("Vérification conditions EN 206-1 :") : rtf.Underline = False : rtf.NewLine()
            'Vérification de la teneur maximale en addition
            Rap = .Addition.Quantite / (.Addition.Quantite + .C)
            rtf.Italic = True : rtf.WriteString("Vérification de la teneur maximale en addition :") : rtf.Italic = False : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("Seuil maximal rapport A/(A+C) : " & RapMax.ToString("#0.00")) : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString(" C : ") : rtf.Bold = True : rtf.WriteString(.C.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString(" A : ") : rtf.Bold = True : rtf.WriteString(.Addition.Quantite.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" kg/m3") : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("Rapport A/(A+C) = " & Rap.ToString("#0.00")) : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("Vérification : " & Rap.ToString("#0.00") & " < " & RapMax.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant.") : rtf.Underline = False : rtf.NewLine()
            'Vérification de la teneur mini en liant
            rtf.Italic = True : rtf.WriteString("Vérification de la teneur minimale en liant équivalent : ") : rtf.Italic = False : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("teneur minimale en liant équivalent suivant EN206-1 : " & .EN206_TeneurLiant.ToString("#0")) : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("vérification de la teneur : LEq = " & LEq.ToString("#0") & " > " & .EN206_TeneurLiant.ToString("#0") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant") : rtf.Underline = False : rtf.NewLine()
            'Vérification de la teneur en eau
            Rap = .Eau / LEq
            rtf.Italic = True : rtf.WriteString("Vérification de la teneur maximale en eau ") : rtf.Italic = False : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("rapport Eau efficace/Liant équivalent (E/C) : " & Rap.ToString("#0.00")) : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("rapport Maxi E/C suivant EN206-1 : " & .EN206_EC.ToString("#0.00")) : rtf.NewLine()
            rtf.InsertTab() : rtf.WriteString("Vérification rapport E/C : " & Rap.ToString("#0.00") & " < " & .EN206_EC.ToString("#0.00") & " - ") : rtf.Underline = True : rtf.WriteString("Satisfaisant") : rtf.Underline = False : rtf.NewLine()
        End With
        rtf.WriteEndGroup()
    End Sub

    ''' <summary>Calcul de la valeur maximale du rapport A/(A+C)</summary>
    '''  <param name="RapMax">valeur maximale du rapport A/(A+C)</param> 
    ''' <param name="Vopt">Volume optimal en fines</param>
    Private Sub Valeur_RapMax(ByRef RapMax As Double)
        'détermination de la valeur maximale du rapport  A/(A+C) suivant l'EN206-1 utilisée
        With Beton
            Select Case .EN206 '  
                Case 1 ' EN206-2000
                    Select Case .Addition.Addition
                        Case 1, 2
                            RapMax = .EN206_A_AC_Cal
                        Case 3 'cendre volante
                            RapMax = .EN206_A_AC_CV
                        Case 4 'laitier
                            RapMax = .EN206_A_AC_LM
                        Case 5 'fumée de silice
                            RapMax = .EN206_A_AC_FS
                        Case 6 'addition siliceuse
                            RapMax = .EN206_A_AC_Sil
                    End Select
                Case 2 ' EN206-2022
                    Select Case .Addition.Addition
                        Case 1
                            If .Ciment.Type = 1 Then RapMax = .EN206_A_AC_Cal_A Else RapMax = .EN206_A_AC_Cal_A_CEMII
                        Case 2
                            RapMax = .EN206_A_AC_Cal_B
                        Case 3 'cendre volante
                            If .Ciment.Type = 1 Then RapMax = .EN206_A_AC_CV Else RapMax = .EN206_A_AC_CV_CEMII
                        Case 4 'laitier
                            If .Ciment.Type = 1 Then RapMax = .EN206_A_AC_LM Else RapMax = .EN206_A_AC_LM_CEMII
                        Case 5 'fumée de silice
                            If .Ciment.Type = 1 Then RapMax = .EN206_A_AC_FS Else RapMax = .EN206_A_AC_FS_CEMII
                        Case 6 'addition siliceuse
                            If .Ciment.Type = 1 Then RapMax = .EN206_A_AC_Sil Else RapMax = .EN206_A_AC_Sil_CEMII
                        Case 7 'métakaolin
                            If .Ciment.Type = 1 Then RapMax = .EN206_A_AC_MK Else RapMax = .EN206_A_AC_MK_CEMII
                    End Select
            End Select
        End With

    End Sub

    ''' <summary>Calcul du Volume Optimal de Fines</summary>
    '''  <param name="Dmax">Diamètre Max du granulat</param> 
    ''' <param name="Vopt">Volume optimal en fines</param>
    Private Sub Calcul_Volume_Optimal_Fines(ByVal Dmax As Double, ByRef Vopt As Double, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim msg As String = String.Empty
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.FontSize = 9
        'Calcul du volume de fines optimal
        With Beton
            If .Plastifiant = True AndAlso .PlastifiantMajFines = True Then
                Dim compacite As Single
                Select Case .PlastifiantAdjType
                    Case 1 'Plastifiant
                        compacite = 0.6
                        Vopt = 0.4 * compacite / Dmax ^ 0.2 : Vopt = 1000 * Vopt 'pour passage de m3 en L
                        rtf.WriteString("Prise en compte de l'effet de défloculation du plastifiant sur le volume de fines.") : rtf.NewLine() : rtf.NewLine()
                        msg = " ( Volume initial = " & (220 / Dmax ^ 0.2).ToString("#.0.0") & " L/m3 )"
                    Case 2 'SuperPlastifiant
                        compacite = 0.7
                        Vopt = 0.4 * compacite / Dmax ^ 0.2 : Vopt = 1000 * Vopt 'pour passage de m3 en L
                        rtf.WriteString("Prise en compte de l'effet de défloculation du superplastifiant sur le volume de fines.") : rtf.NewLine() : rtf.NewLine()
                        msg = " ( Volume initial = " & (220 / Dmax ^ 0.2).ToString("#.0.0") & " L/m3 )"
                    Case Else
                        Vopt = 220 / Dmax ^ 0.2
                End Select
            Else
                If .Plastifiant = True Then rtf.WriteString("Pas de prise en compte de l'effet de défloculation du plastifiant/superplastifiant sur le volume de fines.") : rtf.NewLine() : rtf.NewLine()
                Vopt = 220 / Dmax ^ 0.2
            End If
        End With
        rtf.WriteString("Volume optimal de fines pour Dmax = " & Dmax.ToString("#0.0") & " - Vopt : ") : rtf.Bold = True : rtf.WriteString(Vopt.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" litres pour 1 m3 de béton" & msg) : rtf.NewLine()
        rtf.WriteEndGroup()
    End Sub


    ''' <summary>Ecriture du chapitre des différents volumes de la formulation béton</summary>
    '''  <param name="Vc">Volume de ciment</param> 
    '''  <param name="Vag">volume absolu de l'ensemble des granulats</param> 
    '''  <param name="VA">volume Addition minérale</param> 
    '''  <param name="Vpl">volume du plastifiant</param>  
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    Private Sub Ecriture_Chapitre_Volume(ByVal Vc As Double, ByVal Vag As Double, ByVal VA As Double, ByVal Vpl As Double, ByRef rtf As To_Rtf.RtfAnsiTextWriter) 'ByVal Choix As Integer,)
        rtf.WriteStartGroup()
        rtf.FontSize = 12 : rtf.FontSize = 9
        With Beton
            rtf.WriteString("Volume du ciment = Vc (= quantité de ciment / densité ciment) : Vc = " & Beton.C.ToString("#0") & " / " & Beton.Ciment.Densite.ToString("#0.00") & " =  " & Vc.ToString("#0.00") & " L (= dm3) ") : rtf.NewLine()
            With .Addition
                If .Addition = 0 Then
                    rtf.WriteString("Volume de l'addition minérale = VA : VA = 0  -  Aucune addition minérale.") : rtf.NewLine()
                Else
                    Select Case .Addition
                        Case 1
                            rtf.WriteString("Addition : fines calcaires de catégorie A")
                        Case 2 'calcaire LL
                            rtf.WriteString("Addition : fines calcaires de catégorie B")
                        Case 3 'cendre volante siliceuse
                            rtf.WriteString("Addition : cendre volante siliceuse")
                        Case 4 'laitier vitrifié
                            rtf.WriteString("Addition : laitier vitrifié")
                        Case 5 'fumée de silice
                            rtf.WriteString("Addition : fumée de silice")
                        Case 6 'addition siliceuse de minéralogie QZ
                            rtf.WriteString("Addition : addition siliceuse de minéralogie QZ")
                        Case 7 'Métalaolin
                            rtf.WriteString("Addition : Métakaolin")
                    End Select
                    rtf.WriteString(" (= VA) : VA = " & VA.ToString("#0.0") & " L (= dm3)") : rtf.NewLine()
                    'Complément en fines si Addition
                    If .ComplementFines = True Then rtf.WriteString("Ajout d'une Addition pour complément de fines : Voir §2.3") : rtf.NewLine()
                End If
            End With
            If .Plastifiant = True Then rtf.WriteString("Volume Plastifiant pour la partie Extrait Sec = Vpl : Vpl = " & Vpl.ToString("#0.0") & " L (= dm3) - La partie liquide est comprise dans le volume d'eau efficace. ") : rtf.NewLine()
            rtf.WriteString("Volume d'eau efficace = Ve : Ve = " & .Eau.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
            rtf.WriteString("Volume d'air = Va : Va = " & .Air.ToString("#0") & " L (= dm3) ") : rtf.NewLine()
            End With

            rtf.WriteString("Volume absolu de l'ensemble des granulats :") : rtf.NewLine()
            rtf.WriteString("Vag = 1000 - Vc -VA - Ve - Va")
            If Beton.Plastifiant = True Then rtf.WriteString(" - Vpl")
            rtf.NewLine()
            rtf.WriteString("Vag = " & Vag.ToString("#0.00") & " L (= dm3) avec la répartition suivante :") : rtf.NewLine()
            rtf.WriteString("   - Sable n° 1 : " & Sable.Item(0).S_Vs.ToString("#0") & " % du volume global Vag arrondie à ") : rtf.Bold = True : rtf.WriteString(Sable.Item(0).Vol.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" L (= dm3) ") : rtf.NewLine()
            If Beton.NbSable = 2 Then
                rtf.WriteString("   - Sable n° 2 : " & Sable.Item(1).S_Vs.ToString("#0") & " % du volume global Vag arrondie à ") : rtf.Bold = True : rtf.WriteString(Sable.Item(1).Vol.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" L (= dm3) ") : rtf.NewLine()
            End If
            rtf.WriteString("   - Gravillon n° 1 : " & (Gravillon.Item(0).G_Vg).ToString("#0") & " % du volume global Vag arrondie à ") : rtf.Bold = True : rtf.WriteString(Gravillon.Item(0).Vol.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" L (= dm3) ") : rtf.NewLine()
            If Beton.NbGravillon = 2 Then
                rtf.WriteString("   - Gravillon n° 2 : " & (Gravillon.Item(1).G_Vg).ToString("#0") & " % du volume global Vag arrondie à ") : rtf.Bold = True : rtf.WriteString(Gravillon.Item(1).Vol.ToString("#0")) : rtf.Bold = False : rtf.WriteString(" L (= dm3) ") : rtf.NewLine()
            End If
            rtf.WriteEndGroup()
            End Sub

    ''' <summary>Calcul du squelette granulaire de la formulation béton</summary>
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    Public Sub Squelette_Granulaire(ByRef Verif As Boolean)
        'writer de sortie du RTF
        Dim sw As New System.IO.StringWriter
        'crée un writer de RTF avec une police par défaut
        Dim rtf As New To_Rtf.RtfAnsiTextWriter(sw, New Font(FontFamily.GenericSerif, 12, FontStyle.Regular))
        Select Case Beton.Formulation
            Case 1
                Call DroitebriseeOAB_DreuxGorisse(Verif, rtf)
            Case 2
                Call DroitebriseeOAB_BaronOllivier(Verif, rtf)
        End Select
        sw = New StringWriter 'remise à 0
        rtf = New To_Rtf.RtfAnsiTextWriter(sw, New Font(FontFamily.GenericSerif, 12, FontStyle.Regular)) 'remise à 0
    End Sub

    ''' <summary>Calcul des points OAB de la droite brisée correspondant à l'optimum granulaire de la formulation béton suivant la méthode Dreux - Gorisse</summary>
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    Private Sub DroitebriseeOAB_DreuxGorisse(ByRef Verif As Boolean, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim Dmax, Kg, Ks, Kp, mf As Double
        With Beton
            'Ecriture de la note de calcul
            rtf.WriteStartGroup()
            rtf.FontSize = 12 : rtf.FontSize = 9
            'calcul de Dmax du béton
            Select Case Gravillon.Count
                Case 1
                    Dmax = Gravillon.Item(0).Dmg
                Case 2
                    Dmax = Max(Gravillon.Item(0).Dmg, Gravillon.Item(1).Dmg)
            End Select
            'O point origine de la droite
            .XO = 0.08 '.Module_Tamis.Item(0.08) 'origine 0.08
            .YO = 0
            rtf.WriteString("- O point origine de la droite :") : rtf.NewLine()
            rtf.WriteString("  XO = 0.08 mm Module Tamis de 20") : rtf.NewLine()
            rtf.WriteString("  YO = 0 %.") : rtf.NewLine()
            'B point final de la droite brisée
            .XB = Dmax '.Module_Tamis.Item(Dmax)
            .YB = 100
            rtf.WriteString("- B point final de la droite brisée :") : rtf.NewLine()
            rtf.WriteString("  XB = diamètre maximal du granulat = " & Dmax.ToString("#0.0") & " mm soit Module Tamis de " & .Module_Tamis.Item(Dmax).ToString("#0")) : rtf.NewLine()
            rtf.WriteString("  YB = 100% de passant (ou Tamisats)") : rtf.NewLine()
            'A point de brisure de la droite
            rtf.WriteString("- A point de brisure de la droite ")
            If Dmax <= 20 Then
                rtf.WriteString("- Dmax = " & Dmax.ToString("#0.00") & " mm ≤ 20 mm :") : rtf.NewLine()
                Select Case Dmax
                    Case 20, 16, 10, 8, 6.3, 5, 4, 2.5, 2, 1.6
                        .XA = Dmax / 2 ' .Module_Tamis.Item(Dmax / 2)
                        rtf.WriteString("  XA = diamètre maximal du granulat/2 = " & .XA.ToString("#0.00") & " mm soit Module Tamis de " & .Module_Tamis.Item(Dmax / 2).ToString("#0")) : rtf.NewLine()
                    Case 12.5
                        .XA = 6.3
                        rtf.WriteString("  XA = diamètre maximal du granulat/2 arrondi à 6,3mm soit Module Tamis de " & .Module_Tamis.Item(6.3).ToString("#0")) : rtf.NewLine()
                    Case 3.15
                        .XA = 1.25
                        rtf.WriteString("  XA = diamètre maximal du granulat/2 arrondi à 1.25mm soit Module Tamis de " & .Module_Tamis.Item(1.25).ToString("#0")) : rtf.NewLine()
                    Case Else
                        Dim msg As String = String.Empty
                        msg = "Le diamètre Dmax = " & Dmax.ToString("#0.00") & " mm ne correspond pas à un diamètre de module de tamis ou il est inférieur à 1,6mm. Cette formulation n'est pas adaptée à des microbéton."
                        MessageBox.Show(msg & Environment.NewLine & "Le calcul est arrêté.", "Calcul des coordonnées de la droite brisée", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                End Select
            Else
                rtf.WriteString("- Dmax = " & Dmax.ToString("#0.00") & " mm > 20 mm :") : rtf.NewLine()
                .XA = 0
                Dim i As Integer
                i = CInt(Truncate((.Module_Tamis.Item(Dmax) + .Module_Tamis.Item(5)) / 2))
                For Each kvp As KeyValuePair(Of Double, Integer) In .Module_Tamis
                    If i = kvp.Value Then .XA = kvp.Key : Exit For
                Next
                If .XA = 0 Then
                    Dim msg As String = String.Empty
                    msg = "Le diamètre Dmax = " & Dmax.ToString("#0.00") & " mm ne correspond pas à un diamètre de module de tamis - Cas Dmax > 20mm. Cette formulation n'est pas adaptée."
                    MessageBox.Show(msg & Environment.NewLine & "Le calcul est arrêté.", "Calcul des coordonnées de la droite brisée", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Verif = False : rtf.WriteEndGroup() : Exit Sub
                End If
                rtf.WriteString("  XA = est pris égal au milieu du segment [module tamis (5mm) - module tamis (Dmax)] soit le module " & i.ToString("#0") & " soit une valeur pour XA = " & .XA.ToString("#0.00") & " mm.") : rtf.NewLine()
            End If
            'détermination du coefficient correctif Ks suivant le module de finesse
            Ks = 0
            If .NbSable = 1 Then
                mf = Sable.Item(0).mf
            Else
                If Sable.Count > 1 Then
                    mf = Sable.Item(1).mfCible
                Else
                    Dim msg As String = String.Empty
                    msg = "Pb dans le calcul du coef Ks correctif suivant le module de finesse."
                    MessageBox.Show(msg & Environment.NewLine & "Le calcul est arrêté.", "Calcul des coordonnées de la droite brisée", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Verif = False : rtf.WriteEndGroup() : Exit Sub
                End If
            End If
            Ks = 6 * mf - 15
            rtf.WriteString("Ks correctif suivant le module de finesse : Ks = " & Ks.ToString("#0.00")) : rtf.NewLine()
            'détermination du coefficient correctif Kp pour béton pompable
            Kp = 0
            If .Pompe = True Then
                Kp = 8
                rtf.WriteString("Kp correctif pour béton pompable : Kp = " & Kp.ToString("#0.00")) : rtf.NewLine()
            Else
                rtf.WriteString("Kp correctif pour béton pompable : Kp = " & Kp.ToString("#0") & " - Béton non pompable") : rtf.NewLine()
            End If
            'détermination du coefficient correctif Kg suivant la qualité du granulat, sa vibration et la quantité de ciment
            Kg = 0
            Dim kg1, kg2, Ck As Integer
            Dim Concasse As Boolean = False
            'type de sable et gravillon
            Select Case Sable.Count
                Case 1
                    If Sable.Item(0).Forme = 1 Then Concasse = True
                Case 2
                    If Sable.Item(0).Forme = 1 Then Concasse = True
                    If Sable.Item(1).Forme = 1 Then Concasse = True
            End Select
            Select Case Gravillon.Count
                Case 1
                    If Gravillon.Item(0).Forme = 1 Then Concasse = True
                Case 2
                    If Gravillon.Item(0).Forme = 1 Then Concasse = True
                    If Gravillon.Item(1).Forme = 1 Then Concasse = True
            End Select
            Select Case .Vibration
                Case 1, 2 'Faible
                    If Concasse = True Then
                        Select Case .C
                            Case Is >= 450
                                kg1 = 0 : kg2 = 0 : Ck = 450
                            Case Is > 400
                                kg1 = 0 : kg2 = 2 : Ck = 400
                            Case 400
                                kg1 = 2 : kg2 = 2 : Ck = 400
                            Case Is > 350
                                kg1 = 2 : kg2 = 4 : Ck = 350
                            Case 350
                                kg1 = 4 : kg2 = 4 : Ck = 350
                            Case Is > 300
                                kg1 = 4 : kg2 = 6 : Ck = 300
                            Case 300
                                kg1 = 6 : kg2 = 6 : Ck = 300
                            Case Is > 250
                                kg1 = 6 : kg2 = 8 : Ck = 250
                            Case 250
                                kg1 = 8 : kg2 = 8 : Ck = 250
                            Case Is > 200
                                kg1 = 8 : kg2 = 10 : Ck = 200
                            Case 200
                                kg1 = 10 : kg2 = 10 : Ck = 200
                        End Select
                    Else
                        Select Case .C
                            Case Is >= 450
                                kg1 = 0 : kg2 = -2 : Ck = 450
                            Case Is > 400
                                kg1 = -2 : kg2 = 0 : Ck = 400
                            Case 400
                                kg1 = 0 : kg2 = 0 : Ck = 400
                            Case Is > 350
                                kg1 = 0 : kg2 = 2 : Ck = 350
                            Case 350
                                kg1 = 2 : kg2 = 2 : Ck = 350
                            Case Is > 300
                                kg1 = 2 : kg2 = 4 : Ck = 300
                            Case 300
                                kg1 = 4 : kg2 = 4 : Ck = 300
                            Case Is > 250
                                kg1 = 4 : kg2 = 6 : Ck = 250
                            Case 250
                                kg1 = 6 : kg2 = 6 : Ck = 250
                            Case Is > 200
                                kg1 = 6 : kg2 = 8 : Ck = 200
                            Case 200
                                kg1 = 8 : kg2 = 8 : Ck = 200
                        End Select
                    End If
                Case 3 'Normale
                    If Concasse = True Then
                        Select Case .C
                            Case Is >= 450
                                kg1 = -2 : kg2 = -2 : Ck = 450
                            Case Is > 400
                                kg1 = -2 : kg2 = 0 : Ck = 400
                            Case 400
                                kg1 = 0 : kg2 = 0 : Ck = 400
                            Case Is > 350
                                kg1 = 0 : kg2 = 2 : Ck = 350
                            Case 350
                                kg1 = 2 : kg2 = 2 : Ck = 350
                            Case Is > 300
                                kg1 = 2 : kg2 = 4 : Ck = 300
                            Case 300
                                kg1 = 4 : kg2 = 4 : Ck = 300
                            Case Is > 250
                                kg1 = 4 : kg2 = 6 : Ck = 250
                            Case 250
                                kg1 = 6 : kg2 = 6 : Ck = 250
                            Case Is > 200
                                kg1 = 6 : kg2 = 8 : Ck = 200
                            Case 200
                                kg1 = 8 : kg2 = 8 : Ck = 200
                        End Select
                    Else
                        Select Case .C
                            Case Is >= 450
                                kg1 = -4 : kg2 = -4 : Ck = 450
                            Case Is > 400
                                kg1 = -4 : kg2 = -2 : Ck = 400'''''''
                            Case 400
                                kg1 = -2 : kg2 = -2 : Ck = 400
                            Case Is > 350
                                kg1 = -2 : kg2 = 0 : Ck = 350
                            Case 350
                                kg1 = 0 : kg2 = 0 : Ck = 350
                            Case Is > 300
                                kg1 = 0 : kg2 = 2 : Ck = 300
                            Case 300
                                kg1 = 2 : kg2 = 2 : Ck = 300
                            Case Is > 250
                                kg1 = 2 : kg2 = 4 : Ck = 250
                            Case 250
                                kg1 = 4 : kg2 = 4 : Ck = 250
                            Case Is > 200
                                kg1 = 4 : kg2 = 6 : Ck = 200
                            Case 200
                                kg1 = 6 : kg2 = 6 : Ck = 200
                        End Select
                    End If
                Case 4 'Puissante
                    If Concasse = True Then
                        Select Case .C
                            Case Is >= 450
                                kg1 = -4 : kg2 = -4 : Ck = 450
                            Case Is > 400
                                kg1 = -4 : kg2 = -2 : Ck = 400
                            Case 400
                                kg1 = -2 : kg2 = -2 : Ck = 400
                            Case Is > 350
                                kg1 = -2 : kg2 = 0 : Ck = 350
                            Case 350
                                kg1 = 0 : kg2 = 0 : Ck = 350
                            Case Is > 300
                                kg1 = 0 : kg2 = 2 : Ck = 300
                            Case 300
                                kg1 = 2 : kg2 = 2 : Ck = 300
                            Case Is > 250
                                kg1 = 2 : kg2 = 4 : Ck = 250
                            Case 250
                                kg1 = 4 : kg2 = 4 : Ck = 250
                            Case Is > 200
                                kg1 = 4 : kg2 = 6 : Ck = 200
                            Case 200
                                kg1 = 6 : kg2 = 6 : Ck = 200
                        End Select
                    Else
                        Select Case .C
                            Case Is >= 450
                                kg1 = -6 : kg2 = -6 : Ck = 450
                            Case Is > 400
                                kg1 = -6 : kg2 = -4 : Ck = 400
                            Case 400
                                kg1 = -4 : kg2 = -4 : Ck = 400
                            Case Is > 350
                                kg1 = -4 : kg2 = -2 : Ck = 350
                            Case 350
                                kg1 = -2 : kg2 = -2 : Ck = 350
                            Case Is > 300
                                kg1 = -2 : kg2 = 0 : Ck = 300
                            Case 300
                                kg1 = 0 : kg2 = 0 : Ck = 300
                            Case Is > 250
                                kg1 = 0 : kg2 = 2 : Ck = 250
                            Case 250
                                kg1 = 2 : kg2 = 2 : Ck = 250
                            Case Is > 200
                                kg1 = 2 : kg2 = 4 : Ck = 200
                            Case 200
                                kg1 = 4 : kg2 = 4 : Ck = 200
                        End Select
                    End If
            End Select
            Kg = kg2 + ((kg1 - kg2) * (.C - Ck) / (50))
            rtf.WriteString("Kg correctif suivant la qualité du granulat, sa vibration et la quantité de ciment : Kg = " & Kg.ToString("#0.00")) : rtf.NewLine()
            .YA = 50 - Sqrt(Dmax) + Kg + Ks + Kp
            rtf.WriteString("  YA = 50 - √Dmax + Kg + Ks + Kp = " & .YA.ToString("#0.00") & " %.") : rtf.NewLine()
            rtf.WriteEndGroup()
        End With
    End Sub

    ''' <summary>Calcul des points OAB de la droite brisée correspondant à l'optimum granulaire de la formulation béton suivant la méthode Baron - Ollivier</summary>
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    Private Sub DroitebriseeOAB_BaronOllivier(ByRef Verif As Boolean, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim Dmax, Kg, Kba, Kp, Ks, mf As Double
        With Beton
            'Ecriture de la note de calcul
            rtf.WriteStartGroup()
            rtf.FontSize = 12 : rtf.FontSize = 9
            'calcul de Dmax du béton
            Select Case Gravillon.Count
                Case 1
                    Dmax = Gravillon.Item(0).Dmg
                Case 2
                    Dmax = Max(Gravillon.Item(0).Dmg, Gravillon.Item(1).Dmg)
            End Select
            'O point origine de la droite
            .XO = 0.08 '.Module_Tamis.Item(0.08) 'origine 0.08
            .YO = 0
            rtf.WriteString("- O point origine de la droite :") : rtf.NewLine()
            rtf.WriteString("  XO = 0.063 mm - Module Tamis de 19") : rtf.NewLine()
            rtf.WriteString("  YO = 0 %.") : rtf.NewLine()
            'B point final de la droite brisée
            .XB = Dmax '.Module_Tamis.Item(Dmax)
            .YB = 100
            rtf.WriteString("- B point final de la droite brisée :") : rtf.NewLine()
            rtf.WriteString("  XB = diamètre maximal du granulat = " & Dmax.ToString("#0.0") & " mm soit Module Tamis de " & .Module_Tamis.Item(Dmax).ToString("#0")) : rtf.NewLine()
            rtf.WriteString("  YB = 100% de passant (ou Tamisats)") : rtf.NewLine()
            'A point de brisure de la droite
            rtf.WriteString("- A point de brisure de la droite ")
            rtf.WriteString("- Dmax = " & Dmax.ToString("#0.00") & " mm ≤ 20 mm :") : rtf.NewLine()
            Select Case Dmax
                Case 80, 63, 50, 40, 25, 20, 16, 10, 8, 6.3, 5, 4, 2.5, 2, 1.6 ' 
                    .XA = Dmax / 2 ' .Module_Tamis.Item(Dmax / 2)
                    rtf.WriteString("  XA = diamètre maximal du granulat/2 = " & .XA.ToString("#0.00") & " mm soit Module Tamis de " & .Module_Tamis.Item(Dmax / 2).ToString("#0")) : rtf.NewLine()
                Case 31.5
                    .XA = 16
                    rtf.WriteString("  XA = diamètre maximal du granulat/2 arrondi à 16 mm soit Module Tamis de " & .Module_Tamis.Item(16).ToString("#0")) : rtf.NewLine()
                Case 12.5
                    .XA = 6.3
                    rtf.WriteString("  XA = diamètre maximal du granulat/2 arrondi à 6,3 mm soit Module Tamis de " & .Module_Tamis.Item(6.3).ToString("#0")) : rtf.NewLine()
                Case 3.15
                    .XA = 1.25
                    rtf.WriteString("  XA = diamètre maximal du granulat/2 arrondi à 1.25 mm soit Module Tamis de " & .Module_Tamis.Item(1.25).ToString("#0")) : rtf.NewLine()
                Case Else
                    Dim msg As String = String.Empty
                    msg = "Le diamètre Dmax = " & Dmax.ToString("#0.00") & " mm ne correspond pas à un diamètre de module de tamis ou il est inférieur à 1,6mm. Cette formulation n'est pas adaptée à des microbéton."
                    MessageBox.Show(msg & Environment.NewLine & "Le calcul est arrêté.", "Calcul des coordonnées de la droite brisée - Méthode Baron - Ollivier", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Verif = False : rtf.WriteEndGroup() : Exit Sub
            End Select

            'détermination du coefficient correctif Kp pour béton pompable
            Kp = 0
            If .Slump = 4 Then
                Kp = 10
                rtf.WriteString("Kp correctif pour béton pompable : Kp = " & Kp.ToString("#0") & " - Béton pompable") : rtf.NewLine()
            Else
                rtf.WriteString("Kp correctif pour béton pompable : Kp = " & Kp.ToString("#0") & " - Béton non pompable") : rtf.NewLine()
            End If
            'détermination du coefficient correctif Kg suivant la forme du granulat
            Kg = 0
            Dim Concasse As Boolean = False
            'type de sable et gravillon
            Select Case Sable.Count
                Case 1
                    If Sable.Item(0).Forme = 1 Then Concasse = True
                Case 2
                    If Sable.Item(0).Forme = 1 Then Concasse = True
                    If Sable.Item(1).Forme = 1 Then Concasse = True
            End Select
            Select Case Gravillon.Count
                Case 1
                    If Gravillon.Item(0).Forme = 1 Then Concasse = True
                Case 2
                    If Gravillon.Item(0).Forme = 1 Then Concasse = True
                    If Gravillon.Item(1).Forme = 1 Then Concasse = True
            End Select
            If Concasse = True Then
                Kg = 3
                rtf.WriteString("Kg correctif pour forme du granulat : Kg = " & Kg.ToString("#0") & " - granulat concassé") : rtf.NewLine()
            Else
                rtf.WriteString("Kg correctif pour forme du granulat : Kg = " & Kg.ToString("#0") & " - granulat roulé") : rtf.NewLine()
            End If
            'détermination du coefficient correctif Kba pour béton armé
            Kba = 0
            If Kp = 10 Then
                rtf.WriteString("Kba correctif pour ferraillage du béton armé : Kba = 0 car le béton est de qualité pompable et donc suffisamment fluide pour un ouvrage en béton armé.") : rtf.NewLine()
            Else
                Select Case .DensiteFerraillage
                    Case 1
                        Kba = 5
                        rtf.WriteString("Kba correctif pour densité de ferraillage du béton armé : Kba = " & Kba.ToString("#0") & " - Densité de ferraillage < 80kg/m3") : rtf.NewLine()
                    Case 2
                        Kba = 10
                        rtf.WriteString("Kba correctif pour densité de ferraillage du béton armé : Kba = " & Kba.ToString("#0") & " - Densité de ferraillage > 80kg/m3") : rtf.NewLine()
                End Select
                If Kba = 0 Then rtf.WriteString("Kba correctif pour ferraillage du béton armé : Kba = " & Kba.ToString("#0") & " - Béton non armé") : rtf.NewLine()
            End If

            'détermination du coefficient correctif Ks suivant le module de finesse
            If .Correction_Ks = True Then
                Ks = 0
                If .NbSable = 1 Then
                    mf = Sable.Item(0).mf
                Else
                    If Sable.Count > 1 Then
                        mf = Sable.Item(1).mfCible
                    Else
                        Dim msg As String = String.Empty
                        msg = "Pb dans le calcul du coef Ks correctif suivant le module de finesse."
                        MessageBox.Show(msg & Environment.NewLine & "Le calcul est arrêté.", "Calcul des coordonnées de la droite brisée", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        Verif = False : rtf.WriteEndGroup() : Exit Sub
                    End If
                End If
                Ks = 6 * mf - 15
                rtf.WriteString("Ks correctif suivant le module de finesse : Ks = " & Ks.ToString("#0.00")) : rtf.NewLine()
            Else
                rtf.WriteString("Ks correctif suivant le module de finesse : Ks = 0 - Aucune correction demandée") : rtf.NewLine()
            End If
            'Ecriture finale : 
            .YA = 50 - Sqrt(Dmax) + Kg + Kba + Kp + Ks
            rtf.WriteString("  YA = 50 - √Dmax + Kg + Kba + Kp + Ks = " & .YA.ToString("#0.00") & " %.") : rtf.NewLine()
            rtf.WriteEndGroup()
        End With
    End Sub

    ''' <summary>RESOLUTION DE SYSTEME LINEAIRE par la METHODE DE LA TRIANGULATION DE GAUSS AVEC RECHERCHE DU PIVOT MAXIMUM</summary>
    '''  <param name="n">rang de la matrice: matrice de dimension nxn</param> 
    '''  <param name="Akg">termes de la matrice Akg avec Akg(i,j) pour i=1 to n et j=1 to n</param> 
    '''  <param name="F">termes de 2nd membre: Akg(,) x U() = F(), avec F(i) pour i=1 to n</param> 
    '''  <param name="U">inconnues du système matriciel: Akg(,) x U() = F(), avec U(i) pour i=1 to n</param> 
    '''  <param name="Verif">TRUE si Calcul OK</param> 
    Public Sub Gauss_Pivot_Max(ByVal n As Integer, ByVal Akg(,) As Double, ByVal F() As Double, ByRef U() As Double, ByRef Verif As Boolean) ', ByVal i_pas As Integer)
        Dim msg As String
        Dim i, j, L, Lmax, k, ns As Integer
        Dim m, S, m1, A(n, n), B(n) As Double
        For i = 1 To n
            B(i) = F(i)
            For j = 1 To n
                A(i, j) = Akg(i, j)
            Next
        Next
        ns = n
        For k = 1 To ns - 1
            m = A(k, k)
            Lmax = k
            For L = k + 1 To ns
                If Abs(A(L, k)) >= Abs(m) Then
                    m = A(L, k)
                    Lmax = L
                End If
            Next L
            If Abs(m) < 9.999999E-21 Then 'pivot nul
                msg = " - calcul du terme diagonal n°" & k.ToString("#0") & Environment.NewLine & " matrice singulière"
                MessageBox.Show("Erreur:" & Environment.NewLine & msg, "Module Gauss", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
                Verif = False : Exit Sub
            End If
            If Lmax <> k Then
                If Abs(A(Lmax, k)) >= 10 * Abs(A(k, k)) Then
                    For L = k To ns
                        m1 = A(k, L)
                        A(k, L) = A(Lmax, L)
                        A(Lmax, L) = m1
                    Next
                    m1 = B(k)
                    B(k) = B(Lmax)
                    B(Lmax) = m1
                End If
            End If
            For i = k + 1 To ns
                B(i) = B(i) - A(i, k) / A(k, k) * B(k)
                For j = k + 1 To ns
                    A(i, j) = A(i, j) - A(i, k) / A(k, k) * A(k, j)
                Next j
            Next i
        Next k
        '
        'CALCUL DES SOLUTIONS
        '
        If Abs(A(ns, ns)) < 9.999999E-21 Then 'pivot nul
            msg = " - calcul du dernier terme diagonal" & Environment.NewLine & " matrice singulière"
            MessageBox.Show("Erreur:" & Environment.NewLine & msg, "Module Gauss", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Verif = False : Exit Sub
        End If
        U(ns) = B(ns) / A(ns, ns)
        For i = ns - 1 To 1 Step -1
            S = 0
            For k = i + 1 To ns
                S = S + A(i, k) * U(k)
            Next k
            U(i) = (B(i) - S) / A(i, i)
        Next i
        Erase A, B
    End Sub

    ''' <summary>Valeurs limite suivant EN 206-1 de 2004</summary>
    ''' <param name="Verif">true si données OK</param>
    ''' <param name="Dmax">Dimension nominale supérieure du plus gros granulat, en mm</param>
    Public Sub Calcul_ValeursLimitesBeton(ByRef Verif As Boolean, Optional Dmax As Double = 20)
        With Beton
            Select Case .EN206
                Case 1 ' suivant EN206-1 de 2000 - Amendement 2004
                    If .X0_ClassExpo = True Then
                        'Teneur en liant fonction du Dmax
                        Select Case Dmax
                            Case Is <= 12.5 'plus 10%
                                .EN206_TeneurLiant = 165
                            Case Is <= 14
                                .EN206_TeneurLiant = 150 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                            Case Is <= 16
                                .EN206_TeneurLiant = 150 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                            Case Is <= 20
                                .EN206_TeneurLiant = 150 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                            Case Is <= 22.4
                                .EN206_TeneurLiant = 150 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                            Case Is <= 25
                                .EN206_TeneurLiant = 150 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                            Case Is <= 31.5
                                .EN206_TeneurLiant = 150 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                            Case Is > 31.5 'moins 10%
                                .EN206_TeneurLiant = 135
                        End Select
                        .EN206_A_AC_CV = 0.3 : .EN206_A_AC_FS = 0.1 : .EN206_A_AC_LM = 0.3 : .EN206_A_AC_Cal = 0.25 : .EN206_A_AC_Sil = 0.2
                    Else
                        If .XC1 = True Or .XC2 = True Then
                            .EN206_EC = 0.65 : .EN206_Cl = 20 : .EN206_TeneurAir = 0 : .EN206_A_AC_CV = 0.3 : .EN206_A_AC_FS = 0.1 : .EN206_A_AC_LM = 0.3 : .EN206_A_AC_Cal = 0.25 : .EN206_A_AC_Sil = 0.2
                            'Teneur en liant fonction du Dmax
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    .EN206_TeneurLiant = 286
                                Case Is <= 14
                                    .EN206_TeneurLiant = 260 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    .EN206_TeneurLiant = 260 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    .EN206_TeneurLiant = 260 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    .EN206_TeneurLiant = 260 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    .EN206_TeneurLiant = 260 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    .EN206_TeneurLiant = 260 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    .EN206_TeneurLiant = 234
                            End Select
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        ElseIf .XC3 = True Or .XC4 = True Then
                            .EN206_EC = 0.6 : .EN206_Cl = 25 : .EN206_TeneurAir = 0 : .EN206_A_AC_CV = 0.3 : .EN206_A_AC_FS = 0.1 : .EN206_A_AC_LM = 0.3 : .EN206_A_AC_Cal = 0.25 : .EN206_A_AC_Sil = 0.2
                            'Teneur en liant fonction du Dmax
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    .EN206_TeneurLiant = 308
                                Case Is <= 14
                                    .EN206_TeneurLiant = 280 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    .EN206_TeneurLiant = 280 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    .EN206_TeneurLiant = 280 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    .EN206_TeneurLiant = 280 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    .EN206_TeneurLiant = 280 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    .EN206_TeneurLiant = 280 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    .EN206_TeneurLiant = 252
                            End Select
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        End If
                        If .XS1 = True Or .XS2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 363
                                Case Is <= 14
                                    TeneurLiant = 330 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 330 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 330 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 330 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 297
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XS3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.5) : .EN206_Cl = Math.Max(.EN206_Cl, 35) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 385
                                Case Is <= 14
                                    TeneurLiant = 350 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 350 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 350 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 350 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 350 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 350 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 315
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                        If .XD1 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.6) : .EN206_Cl = Math.Max(.EN206_Cl, 25) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.2)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 308
                                Case Is <= 14
                                    TeneurLiant = 280 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 280 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 280 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 280 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 280 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 280 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 252
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        ElseIf .XD2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 363
                                Case Is <= 14
                                    TeneurLiant = 330 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 330 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 330 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 330 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 297
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XD3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.5) : .EN206_Cl = Math.Max(.EN206_Cl, 35) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 385
                                Case Is <= 14
                                    TeneurLiant = 350 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 350 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 350 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 350 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 350 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 350 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 315
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                        If .XF1 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.6) : .EN206_Cl = Math.Max(.EN206_Cl, 25) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.2)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 308
                                Case Is <= 14
                                    TeneurLiant = 280 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 280 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 280 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 280 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 280 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 280 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 252
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        ElseIf .XF2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 25) : .EN206_TeneurAir = 4
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.2)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 330
                                Case Is <= 14
                                    TeneurLiant = 300 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 300 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 300 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 300 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 270
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XF3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 4
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.2)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 347'valeur arrondie pour ne pas avoir de virgule
                                Case Is <= 14
                                    TeneurLiant = 315 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 315 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 315 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 315 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 315 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 315 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 284
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XF4 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.45) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 4
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.05)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 374
                                Case Is <= 14
                                    TeneurLiant = 340 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 340 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 340 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 340 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 340 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 340 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 306
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                        If .XA1 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 0
                            If .Sulfates = True Then .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) Else .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3)
                            .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0)
                            If .Sulfates = True Then .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) Else .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 363
                                Case Is <= 14
                                    TeneurLiant = 330 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 330 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 330 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 330 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 297
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XA2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.5) : .EN206_Cl = Math.Max(.EN206_Cl, 35) : .EN206_TeneurAir = 0
                            If .Sulfates = True Then .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) Else .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3)
                            .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0)
                            If .Sulfates = True Then .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15) Else .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 385
                                Case Is <= 14
                                    TeneurLiant = 350 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 350 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 350 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 350 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 350 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 350 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 315
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XA3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.45) : .EN206_Cl = Math.Max(.EN206_Cl, 40) : .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, 385) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0) : .EN206_A_AC_Cal = Math.Min(.EN206_A_AC_Cal, 0) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 424
                                Case Is <= 14
                                    TeneurLiant = 385 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 385 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 385 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 385 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 385 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 385 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 347
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                    End If
                Case 2 'suivant EN206-1 de 2022  
                    If .X0_ClassExpo = True Then
                        'Teneur en liant fonction du Dmax
                        Select Case Dmax
                            Case Is <= 12.5 'plus 10%
                                .EN206_TeneurLiant = 165
                            Case Is <= 14
                                .EN206_TeneurLiant = 150 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                            Case Is <= 16
                                .EN206_TeneurLiant = 150 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                            Case Is <= 20
                                .EN206_TeneurLiant = 150 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                            Case Is <= 22.4
                                .EN206_TeneurLiant = 150 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                            Case Is <= 25
                                .EN206_TeneurLiant = 150 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                            Case Is <= 31.5
                                .EN206_TeneurLiant = 150 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                            Case Is > 31.5 'moins 10%
                                .EN206_TeneurLiant = 135
                        End Select
                        .EN206_A_AC_CV = 0.3 : .EN206_A_AC_FS = 0.1 : .EN206_A_AC_MK = 0.15 : .EN206_A_AC_LM = 0.3 : .EN206_A_AC_Cal_A = 0.3 : .EN206_A_AC_Cal_B = 0.25 : .EN206_A_AC_Sil = 0.25
                        .EN206_A_AC_CV_CEMII = 0.2 : .EN206_A_AC_FS_CEMII = 0.1 : .EN206_A_AC_MK_CEMII = 0.1 : .EN206_A_AC_LM_CEMII = 0.2 : .EN206_A_AC_Cal_A_CEMII = 0.1 : .EN206_A_AC_Sil_CEMII = 0
                    Else
                        If .XC1 = True Or .XC2 = True Then
                            .EN206_EC = 0.65 : .EN206_Cl = 20 : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = 0.3 : .EN206_A_AC_FS = 0.1 : .EN206_A_AC_MK = 0.15 : .EN206_A_AC_LM = 0.3 : .EN206_A_AC_Cal_A = 0.3 : .EN206_A_AC_Cal_B = 0.25 : .EN206_A_AC_Sil = 0.25
                            .EN206_A_AC_CV_CEMII = 0.2 : .EN206_A_AC_FS_CEMII = 0.1 : .EN206_A_AC_MK_CEMII = 0.1 : .EN206_A_AC_LM_CEMII = 0.2 : .EN206_A_AC_Cal_A_CEMII = 0.1 : .EN206_A_AC_Sil_CEMII = 0
                            'Teneur en liant fonction du Dmax
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    .EN206_TeneurLiant = 286
                                Case Is <= 14
                                    .EN206_TeneurLiant = 260 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    .EN206_TeneurLiant = 260 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    .EN206_TeneurLiant = 260 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    .EN206_TeneurLiant = 260 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    .EN206_TeneurLiant = 260 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    .EN206_TeneurLiant = 260 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    .EN206_TeneurLiant = 234
                            End Select
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 280 Then .EN206_TeneurLiant = 280
                        ElseIf .XC3 = True Or .XC4 = True Then
                            .EN206_EC = 0.6 : .EN206_Cl = 25 : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = 0.3 : .EN206_A_AC_FS = 0.1 : .EN206_A_AC_MK = 0.15 : .EN206_A_AC_LM = 0.3 : .EN206_A_AC_Cal_A = 0.3 : .EN206_A_AC_Cal_B = 0.25 : .EN206_A_AC_Sil = 0.25
                            .EN206_A_AC_CV_CEMII = 0.2 : .EN206_A_AC_FS_CEMII = 0.1 : .EN206_A_AC_MK_CEMII = 0.1 : .EN206_A_AC_LM_CEMII = 0.2 : .EN206_A_AC_Cal_A_CEMII = 0.1 : .EN206_A_AC_Sil_CEMII = 0
                            'Teneur en liant fonction du Dmax
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    .EN206_TeneurLiant = 308
                                Case Is <= 14
                                    .EN206_TeneurLiant = 280 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    .EN206_TeneurLiant = 280 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    .EN206_TeneurLiant = 280 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    .EN206_TeneurLiant = 280 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    .EN206_TeneurLiant = 280 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    .EN206_TeneurLiant = 280 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    .EN206_TeneurLiant = 252
                            End Select
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        End If
                        If .XS1 = True Or .XS2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.05) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 363
                                Case Is <= 14
                                    TeneurLiant = 330 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 330 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 330 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 330 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 297
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XS3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.5) : .EN206_Cl = Math.Max(.EN206_Cl, 35) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.05) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 385
                                Case Is <= 14
                                    TeneurLiant = 350 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 350 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 350 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 350 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 350 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 350 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 315
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                        If .XD1 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.6) : .EN206_Cl = Math.Max(.EN206_Cl, 25) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.3) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.25)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0.1) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 308
                                Case Is <= 14
                                    TeneurLiant = 280 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 280 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 280 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 280 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 280 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 280 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 252
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        ElseIf .XD2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.05) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 363
                                Case Is <= 14
                                    TeneurLiant = 330 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 330 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 330 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 330 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 297
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XD3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.5) : .EN206_Cl = Math.Max(.EN206_Cl, 35) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.05) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.15)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 385
                                Case Is <= 14
                                    TeneurLiant = 350 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 350 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 350 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 350 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 350 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 350 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 315
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                        If .XF1 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.6) : .EN206_Cl = Math.Max(.EN206_Cl, 25) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.3) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.25)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0.1) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 308
                                Case Is <= 14
                                    TeneurLiant = 280 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 280 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 280 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 280 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 280 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 280 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 252
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                            If .OuvrageBP = True AndAlso .EN206_TeneurLiant < 300 Then .EN206_TeneurLiant = 300
                        ElseIf .XF2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 25) : .EN206_TeneurAir = 4
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.25) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.2)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 330
                                Case Is <= 14
                                    TeneurLiant = 300 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 300 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 300 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 300 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 270
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XF3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 4
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.25) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.25) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.2)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 347'valeur arrondie pour ne pas avoir de virgule
                                Case Is <= 14
                                    TeneurLiant = 315 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 315 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 315 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 315 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 315 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 315 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 284
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XF4 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.45) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 4
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.15) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.15)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0.05) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0.05) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0.05)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 374
                                Case Is <= 14
                                    TeneurLiant = 340 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 340 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 340 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 340 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 340 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 340 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 306
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                        If .XA1 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.55) : .EN206_Cl = Math.Max(.EN206_Cl, 30) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 363
                                Case Is <= 14
                                    TeneurLiant = 330 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 330 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 330 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 330 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 330 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 330 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 297
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XA2 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.5) : .EN206_Cl = Math.Max(.EN206_Cl, 35) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 385
                                Case Is <= 14
                                    TeneurLiant = 350 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 350 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 350 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 350 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 350 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 350 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 315
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        ElseIf .XA3 = True Then
                            .EN206_EC = Math.Min(.EN206_EC, 0.45) : .EN206_Cl = Math.Max(.EN206_Cl, 40) : .EN206_TeneurAir = 0
                            .EN206_A_AC_CV = Math.Min(.EN206_A_AC_CV, 0.3) : .EN206_A_AC_FS = Math.Min(.EN206_A_AC_FS, 0.1) : .EN206_A_AC_MK = Math.Min(.EN206_A_AC_MK, 0.15) : .EN206_A_AC_LM = Math.Min(.EN206_A_AC_LM, 0.3)
                            .EN206_A_AC_Cal_A = Math.Min(.EN206_A_AC_Cal_A, 0) : .EN206_A_AC_Cal_B = Math.Min(.EN206_A_AC_Cal_B, 0) : .EN206_A_AC_Sil = Math.Min(.EN206_A_AC_Sil, 0)
                            .EN206_A_AC_CV_CEMII = Math.Min(.EN206_A_AC_CV_CEMII, 0.2) : .EN206_A_AC_FS_CEMII = Math.Min(.EN206_A_AC_FS_CEMII, 0.1) : .EN206_A_AC_MK_CEMII = Math.Min(.EN206_A_AC_MK_CEMII, 0.1)
                            .EN206_A_AC_LM_CEMII = Math.Min(.EN206_A_AC_LM_CEMII, 0.2) : .EN206_A_AC_Cal_A_CEMII = Math.Min(.EN206_A_AC_Cal_A_CEMII, 0) : .EN206_A_AC_Sil_CEMII = Math.Min(.EN206_A_AC_Sil_CEMII, 0)
                            'Teneur en liant fonction du Dmax
                            Dim TeneurLiant As Double
                            Select Case Dmax
                                Case Is <= 12.5 'plus 10%
                                    TeneurLiant = 396
                                Case Is <= 14
                                    TeneurLiant = 360 * (1.075 + (0.025 * ((14 - Dmax) / (14 - 12.5))))
                                Case Is <= 16
                                    TeneurLiant = 360 * (1.05 + (0.025 * ((16 - Dmax) / (16 - 14))))
                                Case Is <= 20
                                    TeneurLiant = 360 * (1 + (0.05 * ((20 - Dmax) / (20 - 16))))
                                Case Is <= 22.4
                                    TeneurLiant = 360 * (1 - (0.025 * ((Dmax - 20) / (22.4 - 20))))
                                Case Is <= 25
                                    TeneurLiant = 360 * (0.975 - (0.025 * ((Dmax - 22.4) / (25 - 22.4))))
                                Case Is <= 31.5
                                    TeneurLiant = 360 * (0.95 - (0.05 * ((Dmax - 25) / (31.5 - 25))))
                                Case Is > 31.5 'moins 10%
                                    TeneurLiant = 324
                            End Select
                            .EN206_TeneurLiant = Math.Max(.EN206_TeneurLiant, TeneurLiant)
                        End If
                    End If
            End Select
            'Teneur ions Chlorure : identique pour les 2 EN206-1
            If .OuvrageBP = True Then
                ' - Béton pour ouvrage contenant des armatures précontraintes en acier
                .EN206_TeneurChlorure = 0.2
            Else
                ' - Béton pour ouvrage ne contenant pas des armatures précontraintes en acier") : rtf.NewLine()
                If .Ciment.Type = 3 Then
                    '- Ciment de type CEM III 
                    .EN206_TeneurChlorure = 0.65
                Else
                    ' - Ciment de type différent du CEM III 
                    If .Formulation = 2 Then
                        'Dans la méthode Baron-Ollivier, il est précisé si béton armé ou pas
                        If .DensiteFerraillage = 0 Then
                            'béton non armé
                            .EN206_TeneurChlorure = 1
                        Else
                            'béton armé
                            .EN206_TeneurChlorure = 0.4
                        End If
                    Else
                        'Dans la méthode Dreux-Gorisse, pas de distinguo béton armé et béton non armé
                        .EN206_TeneurChlorure = 0.4
                    End If
                End If
            End If
        End With
    End Sub

    ''' <summary> Module de vérification de la contrainte caractéristique à la compression du béton vis à vis de l'exigence de l'EN206-1</summary>
    ''' <param name="rtf">Stream pour la création du fichier RTF</param>
    ''' <param name="verif"> variable prenant la valeur False si une erreur bloquante s'est produite pendant le calcul de la formulation</param>
    Private Sub Verif_Fck_EN206(ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim msg As String = String.Empty
        With Beton
            If .EN206 = 1 Then msg = "(2000)" Else msg = "(2022)" 'EN206-2000 ou EN206-2022
            rtf.WriteString("Résistance caractéristique du béton formulé : fck = " & .Fck.ToString("#0") & " MPa") : rtf.NewLine()
            rtf.Italic = True : rtf.Underline = True : rtf.WriteString("Exigence de l'EN 206-1 " & msg & " :") : rtf.Underline = False : rtf.Italic = False
            If .Fck < .EN206_Cl Then
                rtf.WriteString("  fck < " & .EN206_Cl.ToString("#0") & " MPa - ") : rtf.Bold = True : rtf.WriteString("Non Satisfaisant") : rtf.Bold = False : rtf.NewLine()
                Aff.msg_Avertiss.Add("fck - Résistance caractéristique trop faible, béton non conforme à l'EN206-1 " & msg)
            Else
                rtf.WriteString("  fck > " & .EN206_Cl.ToString("#0") & " MPa - ") : rtf.Bold = True : rtf.WriteString("Satisfaisant") : rtf.Bold = False : rtf.NewLine()
            End If
        End With

    End Sub
End Module

