Imports System.Math
Imports System.IO
Imports System.Xml.Serialization

Module General
    Public Aff As New clsAffaire
    Public Beton As New clsBeton
    Public Ciment As New clsCiment
    Public Addition As New clsAddition
    Public Sable As New List(Of clsSable)
    Public Gravillon As New List(Of clsGravillon)
    ''' <summary>Mise à 0 de l'ensemble des variables y compris la classe Affaire</summary>
    Public Sub Initialisation()
        'Affaire
        Aff = New clsAffaire
        'Mise à 0 générale
        Call Mise_a_zero_generale()
    End Sub
    ''' <summary>Mise à 0 de l'ensemble des variables sauf la classe Affaire</summary>
    Public Sub Mise_a_zero_generale()
        'Sable
        Dim Sable1 As New clsSable
        Sable.Clear()
        Sable.Add(Sable1) 'au moins 1 sable est initié
        'Gravillon
        Dim Gravillon1 As New clsGravillon
        Gravillon.Clear()
        Gravillon.Add(Gravillon1) 'au moins 1 gravillon est initié
        'béton
        Beton = New clsBeton
        'ciment
        Ciment = New clsCiment
        'Addition
        Addition = New clsAddition
    End Sub
    ''' <summary>Mise à 0 de la collection de sable</summary>
    '''  <param name="i">n° d'index du sable - Commence à 0</param>
    Public Sub Mise_a_zero_sable(ByVal i As Integer)
        'sable
        Select Case i
            Case 0
                If Beton.NbSable = 2 Then
                    Sable.RemoveAt(0)
                Else
                    Sable.Clear()
                End If
            Case 1
                If Beton.NbSable = 2 Then
                    If Sable.Count > 1 Then Sable.RemoveAt(1)
                Else
                    Sable.Clear()
                End If
        End Select
    End Sub

    ''' <summary>Mise à 0 de la collection de gravillons</summary>
    '''  <param name="i">n° d'index du gravillon - Commence à 0</param>
    Public Sub Mise_a_zero_gravillon(ByVal i As Integer)
        'gravillon
        Select Case i
            Case 0
                If Beton.NbGravillon = 2 Then
                    Gravillon.RemoveAt(0)
                Else
                    ' Dim Sable1 As New clsSable
                    Gravillon.Clear()
                    ' Sable.Add(Sable1) 'au moins 1 sable est initié
                End If
            Case 1
                If Beton.NbGravillon = 2 Then
                    If Gravillon.Count > 1 Then Gravillon.RemoveAt(1)
                Else
                    ' Dim Sable1 As New clsSable
                    Gravillon.Clear()
                    ' Sable.Add(Sable1) 'au moins 1 sable est initié
                End If
        End Select
    End Sub

    ''' <summary>Sous-programme du Programme de gestion des touches pressées</summary>
    Private Function checkUnicode(ByVal ee As System.Windows.Forms.KeyPressEventArgs) As Integer
        checkUnicode = 1
        If ee.KeyChar = Convert.ToChar(8) Then Exit Function ' touche del utilisable
        ' If ee.KeyChar = Convert.ToChar(44) Then Exit Function ' touche , utilisable
        If ee.KeyChar = "." Then Exit Function ' touche . utilisable Convert.ToChar(46) 
        If ee.KeyChar = "0" Then Exit Function '0Convert.ToChar(48)
        If ee.KeyChar = "1" Then Exit Function '1 Convert.ToChar(49)
        If ee.KeyChar = "2" Then Exit Function '2Convert.ToChar(50)
        If ee.KeyChar = "3" Then Exit Function '3Convert.ToChar(51)
        If ee.KeyChar = "4" Then Exit Function '4Convert.ToChar(52)
        If ee.KeyChar = "5" Then Exit Function '5Convert.ToChar(53)
        If ee.KeyChar = "6" Then Exit Function '6Convert.ToChar(54)
        If ee.KeyChar = "7" Then Exit Function '7Convert.ToChar(55)
        If ee.KeyChar = "8" Then Exit Function '8Convert.ToChar(56)
        If ee.KeyChar = "9" Then Exit Function '9Convert.ToChar(57)
        checkUnicode = 0
    End Function
    ''' <summary>Programme de gestion des touches pressées</summary>
    '''  <param name="positif">variable prenant la valeur Vrai si la valeur doit être un nombre positif</param>
    ''' <param name="entier"> variable prenant la valeur Vrai si la valeur doit être un entier</param>
    Public Sub Gestion_Keypress(ByRef ee As System.Windows.Forms.KeyPressEventArgs, ByVal text1 As System.Windows.Forms.TextBox, ByVal positif As Boolean, ByVal entier As Boolean)
        Dim Lettre1 As Boolean = False

        If text1.SelectionLength = text1.Text.Length Then text1.Clear() : Lettre1 = True 'Pour gérer la 1ière lettre tapée dans le textbox
        If ee.KeyChar = "," Then
            If Lettre1 = False And entier = False Then 'le text1 comporte plus de 1 chiffre et le chiffre ne doit pas être un entier, remplacer . par ,
                'Pour éviter d'avoir plusieurs points ou virgule
                Dim texte As String = text1.Text
                If texte.Contains(".") OrElse texte.Contains(",") Then ee.Handled = True : Exit Sub
                text1.Text = text1.Text + "."
                text1.SelectionStart = text1.TextLength + 1
            End If
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "." Then
            If Lettre1 = True Then 'le text1 comporte  1 chiffre, on ne valide pas la frappe
                ee.Handled = True
                Exit Sub
            ElseIf entier = True Then
                ee.Handled = True
                Exit Sub
            Else
                'Pour éviter d'avoir plusieurs points ou virgule
                Dim texte As String = text1.Text
                If texte.Contains(".") OrElse texte.Contains(",") Then ee.Handled = True : Exit Sub
            End If
        End If
        If ee.KeyChar = "&" Then
            text1.Text = text1.Text + "1"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "é" Then
            text1.Text = text1.Text + "2"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = Convert.ToChar(34) Then 'ascw(ee.KeyChar) = 34 code " = keyAscii = 34
            text1.Text = text1.Text + "3"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "'" Then
            text1.Text = text1.Text + "4"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "(" Then
            text1.Text = text1.Text + "5"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If positif = True Then 'seulement si la valeur >0
            If ee.KeyChar = "-" Then
                text1.Text = text1.Text + "6"
                text1.SelectionStart = text1.TextLength + 1
                ee.Handled = True
                Exit Sub
            End If
        Else
            If ee.KeyChar = "-" Then
                text1.Text = "-"
                text1.SelectionStart = text1.TextLength + 1
                ee.Handled = True
                Exit Sub
            End If
        End If
        If ee.KeyChar = "è" Then
            text1.Text = text1.Text + "7"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "_" Then
            text1.Text = text1.Text + "8"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "ç" Then
            text1.Text = text1.Text + "9"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If ee.KeyChar = "à" Then
            text1.Text = text1.Text + "0"
            text1.SelectionStart = text1.TextLength + 1
            ee.Handled = True
            Exit Sub
        End If
        If checkUnicode(ee) = 0 Then ee.Handled = True
    End Sub

    ''' <summary>Programme de gestion des entrées dans les textbox</summary>
    '''  <param name="e">ByVal e As System.Windows.Forms.TextBox</param>
    ''' <param name="ep1">ByRef ep1 As System.Windows.Forms.ErrorProvider</param>
    Public Function gestionderreur(ByVal e As System.Windows.Forms.TextBox, ByRef ep1 As System.Windows.Forms.ErrorProvider) As Boolean
        Try
            gestionderreur = True
            If e.Text = "" Then
                ep1.SetError(e, "le champ n'a pas été renseigné!!")
                gestionderreur = False
            ElseIf e.Text <> "" Then
                Dim isnum As Boolean
                Dim retnum As Double
                Dim toto As String
                toto = Convert.ToString(e.Text) : toto = toto.Trim(" "c) : toto = toto.Replace(",", ".")
                isnum = Double.TryParse(toto, System.Globalization.NumberStyles.AllowLeadingSign Or System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.CurrentInfo, retnum)
                If isnum = False Then
                    ep1.SetError(e, "le champ n'est pas une valeur numérique !!")
                    gestionderreur = False
                Else
                    ep1.SetError(e, "") ' Clear the error.
                    gestionderreur = True
                End If
            End If
        Catch ex As Exception
            ep1.SetError(e, ex.Message)
            gestionderreur = False
        End Try
    End Function

    ''' <summary>Programme de gestion des entrées dans les ComboBox</summary>
    '''  <param name="e">ByVal e As System.Windows.Forms.ComboBox</param>
    ''' <param name="ep1">ByRef ep1 As System.Windows.Forms.ErrorProvider</param>
    Public Function gestionderreurCB(ByVal e As System.Windows.Forms.ComboBox, ByRef ep1 As System.Windows.Forms.ErrorProvider) As Boolean
        Try
            gestionderreurCB = True
            If e.Text = "" Then
                ep1.SetError(e, "le champ n'a pas été renseigné!!")
                gestionderreurCB = False
            ElseIf e.Text <> "" Then
                Dim isnum As Boolean
                Dim retnum As Double
                Dim toto As String
                toto = Convert.ToString(e.Text) : toto = toto.Trim(" "c) : toto = toto.Replace(",", ".")
                isnum = Double.TryParse(toto, System.Globalization.NumberStyles.AllowLeadingSign Or System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.CurrentInfo, retnum)
                If isnum = False Then
                    ep1.SetError(e, "le champ n'est pas une valeur numérique !!")
                    gestionderreurCB = False
                Else
                    ep1.SetError(e, "") ' Clear the error.
                    gestionderreurCB = True
                End If
            End If
        Catch ex As Exception
            ep1.SetError(e, ex.Message)
            gestionderreurCB = False
        End Try
    End Function

    ''' <summary>Lecture de données se trouvant dans de simples fichiers texte</summary>
    '''  <param name="toto">correspond à une ligne entière du fichier</param>
    ''' <param name="titi">une donnée se trouvant sur la ligne</param>
    ''' <param name="Verif">renvoie FALSE si erreur dans l'exécution du programme</param>
    ''' <param name="Limite">nombre maximal de données pouvant se trouver sur la ligne</param>
    ''' <param name="NbreDouble">= TRUE si la ligne ne doit comporter que des nombres</param>
    Public Sub LectureGen(ByVal toto As String, ByRef titi() As String, ByRef Verif As Boolean, Optional ByVal Limite As Integer = 10, Optional ByVal NbreDouble As Boolean = False)
        Dim i, i1, i2 As Integer
        Dim tutu() As String
        Dim nbre As Double
        toto = toto.ToLower() 'transforme la chaine en minuscule, permet dans le fichier original d'écrire en minuscule ou en majuscule
        toto = toto.Trim(New Char() {" "c, ","c, ";"c, "_"c, ":"c}) 'supprime les espaces/ , / ; / _ / : / en debut et fin de chaine
        toto = toto.Replace(Convert.ToChar(9), " "c) 'supprime toutes les tabulations et les remplace par des blanc
        toto = toto.Trim(New Char() {" "c}) 'supprime les espaces en debut et fin de chaine dans le cas ou des tabulations auraient été placées en début et fin de chaine
        'recherche de blanc dans la chaine et divise en sous-chaine
        tutu = toto.Split(" "c)
        'dans le cas ou on ne récupère que des valeurs numériques
        If NbreDouble = True Then
            i2 = 0
            For i = 1 To tutu.Length
                tutu(i - 1) = tutu(i - 1).Replace(",", ".")
                If Double.TryParse(tutu(i - 1), nbre) = False Then
                    For j = i - 1 To tutu.Length - 2
                        tutu(j) = tutu(j + 1) 'remplace ce qui n'est pas un chiffre
                    Next
                    i = i - 1 'pour repartir du bon indice
                    i2 += 1
                End If
            Next
            Array.Resize(tutu, tutu.Length - i2)
        End If
        'en cas de dépassement de limite
        If tutu.Length > Limite Then
            MessageBox.Show("Erreur lors de la lecture du fichier texte sur la ligne n°" & toto.ToString & " : " & Environment.NewLine & "Le nombre de chaines de caractères excède la limite indiquée (=" & Limite.ToString & ").",
                 "Sous-Module de lecture fichier texte LectureGen()", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Verif = False : Exit Sub
        End If
        'Suppression des virgules dans les nombres décimaux et remplacement par des points sinon plantage
        i1 = 0
        For i = 1 To tutu.Length
            i1 += 1
            If tutu(i - 1) = "" Then i1 -= 1 : Continue For
            If i1 > titi.Length - 1 Then Exit For 'pour éviter tout plantage
            titi(i1) = tutu(i - 1)
            titi(i1) = titi(i1).Replace(",", ".")
        Next
    End Sub

    ''' <summary>Lecture du nom du fichier de données et de son répertoire racine</summary>
    '''  <param name="toto">correspond à une ligne entière du fichier</param>
    ''' <param name="Racine">Répertoire du fichier de données</param>
    ''' <param name="Verif">renvoie FALSE si erreur dans l'exécution du programme</param>
    Public Sub Lecture_chaine_Racine(ByRef toto As String, ByRef Racine As String, ByRef NomFichier As String, ByRef Verif As Boolean)
        'Traitement de la chaine de caractère pour pouvoir être lu par le logiciel
        Try
            toto.Trim(New Char() {" "c, ","c, ";"c, "_"c, ":"c}) 'supprime les espaces , _ en debut et fin de chaine
            Racine = toto.Substring(0, toto.LastIndexOf("\"))
            NomFichier = toto.Substring(toto.LastIndexOf("\"), toto.Length - toto.LastIndexOf("\"))
        Catch ex As Exception
            MessageBox.Show("Erreur lors de la lecture de la chaine " & toto.ToString & Environment.NewLine & ex.Message & ex.StackTrace, "Module Lecture_Chaine", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1)
            Verif = False
        End Try
    End Sub

#Region " Code de lecture et d'écriture du fichier de données par Sérialization et par Déserialization"

#Region "Sérialization"
    ''' <summary>Routine sauvegardant les données objet par sérialization </summary>
    Public Sub SerializeData()
        Dim Fichier_Beton As String = String.Empty
        Dim Fichier_Ciment As String = String.Empty
        Dim Fichier_Sable As String = String.Empty
        Dim Fichier_Gravillon As String = String.Empty
        Dim Fichier_Affaire As String = String.Empty

        Dim myStreamWriter As StreamWriter = Nothing
        Try
            myStreamWriter = File.CreateText(Aff.FileName)
            myStreamWriter.WriteLine("Formulation béton - Fichiers de sauvegarde de l'affaire")
            Fichier_Beton = "Fichier_Beton_" & Mise_en_Forme_date(CStr(DateTime.Now))
            myStreamWriter.WriteLine(Fichier_Beton)
            Fichier_Ciment = "Fichier_Ciment_" & Mise_en_Forme_date(CStr(DateTime.Now))
            myStreamWriter.WriteLine(Fichier_Ciment)
            Fichier_Sable = "Fichier_Sable_" & Mise_en_Forme_date(CStr(DateTime.Now))
            myStreamWriter.WriteLine(Fichier_Sable)
            Fichier_Gravillon = "Fichier_Gravillon_" & Mise_en_Forme_date(CStr(DateTime.Now))
            myStreamWriter.WriteLine(Fichier_Gravillon)
            Fichier_Affaire = "Fichier_Affaire_" & Mise_en_Forme_date(CStr(DateTime.Now))
            myStreamWriter.WriteLine(Fichier_Affaire)
            myStreamWriter.Flush()
        Catch exc As Exception
            MessageBox.Show("Le fichier de sauvegarde ne peut être crée." & Environment.NewLine & "SVP, verifiez que le nom du fichier est correct, et que vous avez la permission de lire ou d'écrire " &
              "dans le répertoire indiqué." & Environment.NewLine & Environment.NewLine & "Erreur: " & exc.Message, "Sauvegarde des données", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Finally
            ' fermer le fichier si pas de création possible
            If myStreamWriter IsNot Nothing Then myStreamWriter.Close()
        End Try
        'Sérialise les objets
        Call SerializeSysKeys(Aff.msgData & "\" & Fichier_Beton & ".xml", Beton)
        Call SerializeSysKeys(Aff.msgData & "\" & Fichier_Ciment & ".xml", Ciment)
        Call SerializeSysKeys(Aff.msgData & "\" & Fichier_Sable & ".xml", Sable)
        Call SerializeSysKeys(Aff.msgData & "\" & Fichier_Gravillon & ".xml", Gravillon)
        Call SerializeSysKeys(Aff.msgData & "\" & Fichier_Affaire & ".xml", Aff)
    End Sub
    Public Sub SerializeSysKeys(ByVal Path As String, ByVal Objet As Object)
        Try
            Call SaveXmlData(Path, Objet)
        Catch ex As Exception
            MessageBox.Show("Problème de sérialisation!" & Environment.NewLine & "Erreur: " & ex.Message, "Sauvegarde des données", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub
    Private Sub SaveXmlData(ByVal Path As String, ByVal Objet As Object)
        Dim Type As Type = Objet.GetType
        Dim Serializeur As New XmlSerializer(Type)
        Dim Fi As New FileInfo(Path)
        If Fi.Directory.Exists = False Then System.IO.Directory.CreateDirectory(Fi.DirectoryName)
        'Sérialization
        Using fs As New FileStream(Path, FileMode.Create, FileAccess.Write)
            Serializeur.Serialize(fs, Objet)
            fs.Close()
        End Using
    End Sub
#End Region

#Region "Déserialization"
    ''' <summary>Routine lisant et affectant les données objet sauvegardées par sérialization </summary>
    ''' <param name="PathFileData">chemin d'accès complet du fichier Data/nom du fichier data </param>
    ''' <param name="Racine">Nom du répertoire dans lequel se trouve le fichier data</param>
    ''' <param name="Verif">Renvoie FALSE si l'extraction de la racine n'a pu être réalisé</param>
    Public Sub DeSerializeData(ByVal PathFileData As String, ByVal Racine As String, ByRef Verif As Boolean)
        Dim toto, titi(1) As String
        Dim Fichier_Beton As String = String.Empty
        Dim Fichier_Ciment As String = String.Empty
        Dim Fichier_Sable As String = String.Empty
        Dim Fichier_Gravillon As String = String.Empty
        Dim Fichier_Affaire As String = String.Empty
        Dim myStreamReader As StreamReader = Nothing

        Try
            myStreamReader = File.OpenText(PathFileData)
            toto = myStreamReader.ReadLine 'barre de titre
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif) : If Verif = False Then Exit Sub 'ligne suivante
            Fichier_Beton = CStr(titi(1))
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif) : If Verif = False Then Exit Sub 'ligne suivante
            Fichier_Ciment = CStr(titi(1))
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif) : If Verif = False Then Exit Sub 'ligne suivante
            Fichier_Sable = CStr(titi(1))
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif) : If Verif = False Then Exit Sub 'ligne suivante
            Fichier_Gravillon = CStr(titi(1))
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif) : If Verif = False Then Exit Sub 'ligne suivante
            Fichier_Affaire = CStr(titi(1))
        Catch exc As Exception
            MessageBox.Show("Le fichier de sauvegarde ne peut être lu." & Environment.NewLine & "SVP, verifiez que le nom du fichier est correct, et que vouz avez la permission de lire ou d'écrire " &
              "dans le répertoire indiqué." & Environment.NewLine & Environment.NewLine & "Erreur: " & exc.Message, "Lecture des données", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Verif = False
        Finally
            If myStreamReader IsNot Nothing Then myStreamReader.Close() 'fermer le fichier si pas de création possible
        End Try
        'DéSérialise les objets
        If Racine <> Aff.msgData Then
            Call DeSerializeSysKeys(Racine & "\" & Fichier_Affaire & ".xml", Aff, 1)
            Call DeSerializeSysKeys(Racine & "\" & Fichier_Beton & ".xml", Beton, 2)
            Call DeSerializeSysKeys(Racine & "\" & Fichier_Ciment & ".xml", Ciment, 3)
            Call DeSerializeSysKeys(Racine & "\" & Fichier_Sable & ".xml", Sable, 4)
            Call DeSerializeSysKeys(Racine & "\" & Fichier_Gravillon & ".xml", Gravillon, 5)
        Else
            Call DeSerializeSysKeys(Aff.msgData & "\" & Fichier_Affaire & ".xml", Aff, 1)
            Call DeSerializeSysKeys(Aff.msgData & "\" & Fichier_Beton & ".xml", Beton, 2)
            Call DeSerializeSysKeys(Aff.msgData & "\" & Fichier_Ciment & ".xml", Ciment, 3)
            Call DeSerializeSysKeys(Aff.msgData & "\" & Fichier_Sable & ".xml", Sable, 4)
            Call DeSerializeSysKeys(Aff.msgData & "\" & Fichier_Gravillon & ".xml", Gravillon, 5)
        End If

    End Sub

    ''' <summary>Lecture du fichier de sauvegarde des données caractérisant le sable</summary>
    '''  <param name="Path">Chemin d'accès</param>
    '''  <param name="Objet">Objet à désérialiser</param>
    '''  <param name="i">=1 pour Aff, 2 pour béton, 3 pour sable, 4 pour Gravillon</param>
    Public Sub DeSerializeSysKeys(ByVal Path As String, ByVal Objet As Object, ByVal i As Integer)

        Call LoadXmlData(Path, Objet)
        Select Case i
            Case 1
                Aff = CType(Objet, clsAffaire)
            Case 2
                Beton = CType(Objet, clsBeton)
            Case 3
                Ciment = CType(Objet, clsCiment)
            Case 4
                Sable = CType(Objet, List(Of clsSable))
            Case 5
                Gravillon = CType(Objet, List(Of clsGravillon))
        End Select
    End Sub
    Private Sub LoadXmlData(ByVal Path As String, ByRef Objet As Object)

        ' Try
        Dim Type As Type = Objet.GetType
        Dim Serializeur As New XmlSerializer(Type)
        Dim Fi As New FileInfo(Path)
        If Fi.Directory.Exists = False Then System.IO.Directory.CreateDirectory(Fi.DirectoryName)
        'Sérialization
        Using fs As New FileStream(Path, FileMode.Open, FileAccess.Read)
            Objet = Serializeur.Deserialize(fs)
            fs.Close()
        End Using
        'Catch ex As Exception
        '    MessageBox.Show("Problème de Désérialisation!" & Environment.NewLine & "Erreur: " + ex.Message, "Module LoadXmlData", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        'End Try
    End Sub

#End Region
#End Region
    Public Function Mise_en_Forme_date(ByVal Toto As String) As String
        Toto = Toto.Replace("/", "_")
        Toto = Toto.Replace(" ", "_")
        Toto = Toto.Replace(":", "_")
        Mise_en_Forme_date = Toto
    End Function

    ''' <summary>Programme de lecture dans le fichier ini</summary>
    '''  <param name="filename">nom du fichier ini</param>
    ''' <param name="Verif">renvoie FALSE si erreur</param>
    Public Sub Lecture_fichier_Ini(ByVal filename As String, ByRef Verif As Boolean)
        Dim myStreamReader As StreamReader = Nothing
        Dim toto, titi(10) As String
        Try
            myStreamReader = File.OpenText(filename)
            toto = myStreamReader.ReadLine 'on n'affecte aucune valeur sur la première ligne
            toto = myStreamReader.ReadLine 'ligne de commentaire
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub  'ligne suivante
            Aff.Redacteur = CStr(titi(1))
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
            Aff.Chantier = CStr(titi(1))
            'fichiers
            toto = myStreamReader.ReadLine  'ligne suivante
            Aff.msgResult = toto
            toto = myStreamReader.ReadLine   'ligne suivante
            Aff.msgData = toto
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 2) : If Verif = False Then myStreamReader.Close() : Exit Sub  'ligne suivante
            Aff.i_result = CInt(titi(1)) : Aff.i_data = CInt(titi(2))
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 2) : If Verif = False Then myStreamReader.Close() : Exit Sub  'ligne suivante
            Aff.Aide_Largeur = CInt(titi(1)) : Aff.Aide_Hauteur = CInt(titi(2))
            'Editeur
            toto = myStreamReader.ReadLine 'pour sauter la ligne
            toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
            Aff.Editeur = CInt(titi(1))
            'Onglet Béton
            toto = myStreamReader.ReadLine 'pour sauter la ligne
            With Beton
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .Formulation = CInt(titi(1))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 2) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .EN206_Fc = CBool(titi(1)) : .Fck = CInt(titi(2))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 9) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .EN206 = CInt(titi(1)) : .X0_ClassExpo = CBool(titi(2)) : .XC1 = CBool(titi(3)) : .XC2 = CBool(titi(4)) : .XC3 = CBool(titi(5)) : .XC4 = CBool(titi(6)) : .XD1 = CBool(titi(7)) : .XD2 = CBool(titi(8)) : .XD3 = CBool(titi(9))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 10) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .XS1 = CBool(titi(1)) : .XS2 = CBool(titi(2)) : .XS3 = CBool(titi(3)) : .XF1 = CBool(titi(4)) : .XF2 = CBool(titi(5)) : .XF3 = CBool(titi(6)) : .XF4 = CBool(titi(7)) : .XA1 = CBool(titi(8)) : .XA2 = CBool(titi(9)) : .XA3 = CBool(titi(10))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .FcmCoef = CDbl(titi(1))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .Slump = CInt(titi(1))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .Vibration = CInt(titi(1))
            End With
            'Onglet sable
            toto = myStreamReader.ReadLine 'pour sauter la ligne
            If Sable.Count = 0 Then
                Dim Sable1 As New clsSable
                Sable.Add(Sable1) 'au moins 1 sable est initié
            End If
            With Sable.Item(0)
                toto = myStreamReader.ReadLine  'ligne suivante
                .NomSable = toto
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 9) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .Densite = CDbl(titi(1)) : .Humidite = CDbl(titi(2)) : .TeneurFines = CDbl(titi(3)) : .ds = CDbl(titi(4)) : .Dms = CDbl(titi(5)) : .Forme = CInt(titi(6)) : .Choix_mesureGranulo = CInt(titi(7)) : .mfCible = CDbl(titi(8)) : .Wabs = CDbl(titi(9))
            End With
            'Onglet gravillon
            toto = myStreamReader.ReadLine 'pour sauter la ligne
            If Gravillon.Count = 0 Then
                Dim Gravillon1 As New clsGravillon
                Gravillon.Add(Gravillon1) 'au moins 1 gravillon est initié
            End If
            With Gravillon.Item(0)
                toto = myStreamReader.ReadLine  'ligne suivante
                .NomGravillon = toto
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 9) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .Densite = CDbl(titi(1)) : .Humidite = CDbl(titi(2)) : .Wabs = CDbl(titi(3)) : .dg = CDbl(titi(4)) : .Dmg = CDbl(titi(5)) : .Qualite = CInt(titi(6)) : .Petrographie = CInt(titi(7)) : .Forme = CInt(titi(8)) : .Choix_mesureGranulo = CInt(titi(9))
            End With
            'Onglet Ciment
            toto = myStreamReader.ReadLine 'pour sauter la ligne
            With Ciment
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 3) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .Type = CInt(titi(1)) : .Clinker = CInt(titi(2)) : .Constituant = CInt(titi(3))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 3) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .FcE325 = CInt(titi(1)) : .FcE425 = CInt(titi(2)) : .FcE525 = CInt(titi(3))
            End With
            With Addition
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 8) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .L_dens = CDbl(titi(1)) : .L_k = CDbl(titi(2)) : .LL_dens = CDbl(titi(3)) : .LL_k = CDbl(titi(4)) : .MK_dens = CDbl(titi(5)) : .MK_k = CDbl(titi(6)) : .V_dens = CDbl(titi(7)) : .V_k = CDbl(titi(8))
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 6) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .S_dens = CDbl(titi(1)) : .S_k = CDbl(titi(2)) : .D_dens = CDbl(titi(3)) : .D_k = CDbl(titi(4)) : .U_dens = CDbl(titi(5)) : .U_k = CDbl(titi(6))
            End With
            'Onglet Méthode Dreux-Gorisse
            toto = myStreamReader.ReadLine 'pour sauter la ligne  myStreamWriter.WriteLine("formulaire configuration Onglet Méthode Dreux-Gorisse")
            With Aff
                'bornes pour le tableau du coefficient de compacité
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 2) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .BorneMollePlastique = CInt(titi(1)) : .BornePlastiqueFerme = CInt(titi(2))
            End With
            'Onglet Formulation Baron - Ollivier
            toto = myStreamReader.ReadLine 'pour sauter la ligne  myStreamWriter.WriteLine("formulaire configuration Onglet Méthode Baron - Ollivier")
            With Aff
                'Coefficient de majoration en cas de granulats concassés
                toto = myStreamReader.ReadLine : Call LectureGen(toto, titi, Verif, 1) : If Verif = False Then myStreamReader.Close() : Exit Sub   'ligne suivante
                .BaronCoefTabD = CDbl(titi(1))
            End With
        Catch ex As Exception
            MessageBox.Show("Erreur lors de la lecture du fichier: " & Environment.NewLine & "Exception: " & ex.Message & ex.StackTrace, "General: Module lecture fichier ini", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Verif = False
        Finally
            If Not myStreamReader Is Nothing Then myStreamReader.Close() ' Close the object if it has been created.
        End Try

    End Sub

    ''' <summary>Programme d'écriture dans le fichier ini</summary>
    '''  <param name="filename">nom du fichier ini</param>
    ''' <param name="Verif">renvoie FALSE si erreur</param>
    Public Sub Ecriture_fichier_Cfg_Ini(ByVal filename As String, ByRef Verif As Boolean) ' 
        Dim myStreamWriter As StreamWriter = Nothing
        Try
            ' Create a StreamWriter using a Shared (static) File class.
            myStreamWriter = File.CreateText(filename)
            myStreamWriter.WriteLine("Fichier des valeurs par défauts Labo Béton")
            myStreamWriter.WriteLine("formulaire configuration Onglet Général")
            myStreamWriter.WriteLine(Aff.Redacteur)
            myStreamWriter.WriteLine(Aff.Chantier)
            'répertoire
            myStreamWriter.WriteLine(Aff.msgResult)
            myStreamWriter.WriteLine(Aff.msgData)
            myStreamWriter.WriteLine(Aff.i_result & " " & Aff.i_data)
            myStreamWriter.WriteLine(Aff.Aide_Largeur & " " & Aff.Aide_Hauteur)
            'Editeur
            myStreamWriter.WriteLine("formulaire configuration Onglet Editeur ")
            myStreamWriter.WriteLine(Aff.Editeur)
            'Onglet Béton
            myStreamWriter.WriteLine("formulaire configuration Onglet Béton ")
            With Beton
                myStreamWriter.WriteLine(.Formulation)
                myStreamWriter.WriteLine(.EN206_Fc & " " & .Fck)
                myStreamWriter.WriteLine(.EN206 & " " & .X0_ClassExpo & " " & .XC1 & " " & .XC2 & " " & .XC3 & " " & .XC4 & " " & .XD1 & " " & .XD2 & " " & .XD3)
                myStreamWriter.WriteLine(.XS1 & " " & .XS2 & " " & .XS3 & " " & .XF1 & " " & .XF2 & " " & .XF3 & " " & .XF4 & " " & .XA1 & " " & .XA2 & " " & .XA3)
                myStreamWriter.WriteLine(.FcmCoef)  '-> Coefficient de majoration pour détermination de fcm
                myStreamWriter.WriteLine(.Slump)
                myStreamWriter.WriteLine(.Vibration)
            End With
            'Onglet sable
            myStreamWriter.WriteLine("formulaire configuration Onglet Sable ")
            With Sable.Item(0)
                myStreamWriter.WriteLine(.NomSable)
                myStreamWriter.WriteLine(.Densite & " " & .Humidite & " " & .TeneurFines & " " & .ds & " " & .Dms & " " & .Forme & " " & .Choix_mesureGranulo & " " & .mfCible & " " & .Wabs)
            End With
            'Onglet gravillon
            myStreamWriter.WriteLine("formulaire configuration Onglet Gravillon ")
            With Gravillon.Item(0)
                myStreamWriter.WriteLine(.NomGravillon)
                myStreamWriter.WriteLine(.Densite & " " & .Humidite & " " & .Wabs & " " & .dg & " " & .Dmg & " " & .Qualite & " " & .Petrographie & " " & .Forme & " " & .Choix_mesureGranulo)
            End With
            'Onglet Ciment - Additions
            myStreamWriter.WriteLine("formulaire configuration Onglet Ciment Additions")
            With Ciment
                myStreamWriter.WriteLine(.Type & " " & .Clinker & " " & .Constituant)
                myStreamWriter.WriteLine(.FcE325 & " " & .FcE425 & " " & .FcE525)
            End With
            With Addition
                myStreamWriter.WriteLine(.L_dens & " " & .L_k & " " & .LL_dens & " " & .LL_k & " " & .MK_dens & " " & .MK_k & " " & .V_dens & " " & .V_k)
                myStreamWriter.WriteLine(.S_dens & " " & .S_k & " " & .D_dens & " " & .D_k & " " & .U_dens & " " & .U_k)
            End With
            'Onglet Méthode Dreux-Gorisse
            myStreamWriter.WriteLine("formulaire configuration Onglet Méthode Dreux-Gorisse")
            With Aff
                'bornes pour le tableau du coefficient de compacité
                myStreamWriter.WriteLine(.BorneMollePlastique & " " & .BornePlastiqueFerme)
            End With
            'Onglet Formulation Baron - Ollivier
            myStreamWriter.WriteLine("formulaire configuration Onglet Méthode Baron - Ollivier")
            With Aff
                'Coefficient de majoration en cas de granulats concassés
                myStreamWriter.WriteLine(.BaronCoefTabD)
            End With
            '-->  Fin du fichier de données
            myStreamWriter.Flush() ' Obligatoire - Vide le tampon pour être sûr que tout soit écrit dans le fichier

        Catch exc As Exception
            MessageBox.Show("Le fichier n'a pas pu être ouvert ou écrit. Vérifiez que le nom du fichier et son chemin d'accès soient exact." & Environment.NewLine & "Exception: " & exc.Message, "Module écriture fichier de configuration",
                           MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Verif = False
        Finally
            ' Close the object if it has been created.
            If Not myStreamWriter Is Nothing Then myStreamWriter.Close()
        End Try
    End Sub

    ''' <summary>Ecriture du §Hypothèses de la note de calcul</summary>
    ''' <param name="rtf">flux d'écriture</param>
    Public Sub Ecriture_Hypothese_Note_de_calcul(ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim msg As String = String.Empty
        Dim msg1 As String = String.Empty
        Dim msg2 As String = String.Empty
        Dim i As Integer
        rtf.WriteStartGroup()
        rtf.NewParagraph(To_Rtf.RtfAnsiTextWriter.Align.Center) : rtf.Bold = True : rtf.FontSize = 18 : rtf.Underline = True
        rtf.WriteString("Formulation du béton")
        rtf.NewLine()
        rtf.Bold = False : rtf.FontSize = 9 : rtf.Underline = False : rtf.NewParagraph(To_Rtf.RtfAnsiTextWriter.Align.Left)
        rtf.WriteString("Note de calcul du : ") : msg = Mise_en_Forme_date(CStr(DateTime.Now)) : rtf.WriteString(msg) : rtf.NewLine()
        rtf.WriteString("Rédacteur : " & Aff.Redacteur) : rtf.NewLine()
        rtf.WriteString("Chantier : " & Aff.Chantier) : rtf.NewLine()
        rtf.WriteString("Logiciel : Labon Beton  -  version " & My.Application.Info.Version.ToString & "   2009 - " & DateTime.Now.Year.ToString) : rtf.NewLine() '-  version 2.0  2014") : rtf.NewLine()
        rtf.NewLine() : rtf.FontSize = 12 : rtf.Bold = True : rtf.Underline = True
        rtf.WriteString("1 - Rappel des hypothèses") : rtf.Bold = False : rtf.FontSize = 11 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("1 - 1 : Normes et documents ") : rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        Select Case Beton.EN206
            Case 1
                rtf.WriteString("-  NF EN 206-1 d'avril 2004 et annexe nationale ") : rtf.NewLine()
                rtf.WriteString("-  Les classes d’exposition – Aides à la prescription – Recommandations professionnelles – CERIB – FIB – Décembre 2009") : rtf.NewLine()
            Case 2
                rtf.WriteString("-  NF EN 206-1 2020 et annexe nationale ") : rtf.NewLine()
                rtf.WriteString("-  Les classes d’exposition – Aides à la prescription – Recommandations professionnelles – CERIB – FIB – Décembre 2009") : rtf.NewLine()
            Case 0
                rtf.WriteString("La référence à la norme NF EN 206-1 n'a pas été sélectionnée. Pour rappel, aucun ouvrage en béton en France ne peut être réalisé si le béton qui le constitue, n'est pas conforme à l'EN206-1.") : rtf.NewLine()
                Aff.msg_Avertiss.Add("Béton non conforme à l'EN206-1")
        End Select
        rtf.WriteString("-  NF EN 197-1 - ciments courants ") : rtf.NewLine()
        rtf.WriteString("-  NF EN 1008 - eau de gâchage pour béton ") : rtf.NewLine()
        rtf.WriteString("-  NF EN 12620 - granulats pour béton ") : rtf.NewLine()
        If Beton.Formulation = 1 Then
            rtf.WriteString("-  Nouveau guide du béton et de ses constituants  - 8ième édition 1998 3ième tirage 2007 – G. Dreux & J. FESTA- Edition Eyrolles") : rtf.NewLine()
            If Beton.Dreux_TabE = 2 OrElse Beton.Dreux_TabKdg = 2 Then 'Dreux_AmendementENS = True
                rtf.WriteString("-  TD – Formulation d’un béton ordinaire – Ecole Normale Supérieure Paris-Saclay – 15/10/2018") : rtf.NewLine()
            End If
            rtf.NewLine()
        End If
        If Beton.Formulation = 2 Then rtf.WriteString("-  Les bétons – Bases et données pour leur formulation  écrit sous la direction de Jacques Baron et Jean-Pierre Ollivier et paru aux Editions Eyrolles") : rtf.NewLine() : rtf.NewLine()
        rtf.FontSize = 11 : rtf.Underline = True
        rtf.WriteString("1 - 2 : Exigences formulées")
        rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        rtf.WriteString("-  Méthode de calcul utilisée: ")
        Select Case Beton.Formulation
            Case 1 'Dreux - Gorisse
                rtf.WriteString(" Méthode Dreux - Gorisse")
                If Beton.Dreux_TabKdg = 2 OrElse Beton.Dreux_TabE = 2 Then 'Dreux_AmendementENS = True
                    rtf.WriteString(" amendé par modifications portées par l'Ecole Normale Supérieure Paris-Saclay - Voir note TD librement accessible sur le net.")
                ElseIf Beton.Dreux_TabKdg = 1 AndAlso Beton.Dreux_TabE = 1 Then
                    rtf.WriteString(" stricte.")
                ElseIf Beton.Dreux_TabKdg = 3 AndAlso Beton.Dreux_TabE = 3 Then
                    rtf.WriteString(" avec utilisation des tableaux composés.")
                End If
            Case 2 'Baron - Ollivier
                rtf.WriteString(" Méthode Baron - Ollivier")
        End Select
        rtf.NewLine()
        With Beton
            rtf.InsertTab() : rtf.WriteString("▸ résistance caractéristique souhaitée fck = " & .Fck.ToString & " MPa") : rtf.NewLine()
            Select Case Beton.Formulation
                Case 1 'Dreux - Gorisse
                    rtf.InsertTab() : rtf.WriteString("▸ ouvrabilité souhaitée " & ((.Slump + 1) * 0.5).ToString("#0.0") & " cm d'affaissement au cône d'Abrams.") : rtf.NewLine()
                    Select Case .Vibration
                        Case 1
                            msg = " par vibration légère (piquage, damage, ...)"
                        Case 2
                            msg = " par vibration légère (régle vibrante, etc. ...)"
                        Case 3
                            msg = " par vibration normale (aiguilles vibrantes, etc. ... )"
                        Case 4
                            msg = " par vibration puissante (coffrage vibrant, etc. ...)"
                    End Select
                    rtf.InsertTab() : rtf.WriteString("▸ mode de mise en place dans son coffrage" & msg) : rtf.NewLine()
                Case 2 'Baron - Ollivier
                    Select Case .Slump
                        Case 1
                            msg = "S1 soit une consistance Ferme (F)"
                        Case 2
                            msg = "S2 soit une consistance Plastique (P)"
                        Case 3
                            msg = "S3 soit une consistance Trés Plastique (TP)"
                        Case 4
                            msg = "S4 soit une consistance Fluide (Fl)"
                    End Select
                    rtf.InsertTab() : rtf.WriteString("▸ ouvrabilité souhaitée : " & msg) : rtf.NewLine()
                    Select Case .Fabrication
                        Case 1
                            msg = "▸ fabrication en centrale équipé de sonde d'humidité, wattmètre différentiel, etc. ..."
                        Case 2
                            msg = "▸ fabrication sur chantier ou en centrale non régulé, etc ...."
                        Case 3
                            msg = "▸ résistance moyenne en compression visée : " & .Fcm.ToString("#0") & " MPa."
                    End Select
                    rtf.InsertTab() : rtf.WriteString(msg) : rtf.NewLine()
                    Select Case .Delai
                        Case 0
                            msg = "délai inférieur à 30 minutes"
                        Case 1
                            msg = "délai supérieur à 30 minutes"
                    End Select
                    rtf.InsertTab() : rtf.WriteString("▸ Transport et mise en oeuvre du béton : " & msg) : rtf.NewLine()
                    rtf.InsertTab() : rtf.WriteString("▸ Température du béton frais : " & .Temperature & "°") : rtf.NewLine()
                    rtf.InsertTab() : rtf.WriteString("▸ Corrections pour la composition de la courbe granulaire : ") : rtf.NewLine()
                    Select Case .DensiteFerraillage
                        Case 0
                            msg = "Ouvrage non armé"
                        Case 1
                            msg = "Ouvrage avec densité de ferraillage =< à 80 kg/m3"
                        Case 2
                            msg = "Ouvrage avec densité de ferraillage > à 80 kg/m3"
                    End Select
                    rtf.InsertTab() : rtf.InsertTab() : rtf.WriteString("▸ " & msg) : rtf.NewLine()
                    If .Pompe = True Then msg = "Béton de qualité pompable" : rtf.InsertTab() : rtf.InsertTab() : rtf.WriteString("▸ " & msg) : rtf.NewLine()
                    If .Correction_Ks = True Then msg = "Module de finesse du sable" : rtf.InsertTab() : rtf.InsertTab() : rtf.WriteString("▸ " & msg) : rtf.NewLine()
            End Select
            'EN206-1
            If .EN206 > 0.1 Then
                rtf.WriteString("-  Exigences de durabilité vis à vis de l'EN 206-1 ") : If .EN206 = 1 Then rtf.WriteString("(2004) :") Else rtf.WriteString("(2022) :") : rtf.NewLine()
                Dim Dmax As Double
                Select Case .NbGravillon
                    Case 1
                        Dmax = Gravillon.Item(0).Dmg
                    Case 2
                        Dmax = Max(Gravillon.Item(0).Dmg, Gravillon.Item(1).Dmg)
                End Select
                Call Calcul_ValeursLimitesBeton(True, Dmax)
                rtf.WriteEndGroup()
                Call Affichage_Exigences_EN206_1(msg, rtf)
                msg = String.Empty 'je vide le msg
                rtf.WriteStartGroup()
            Else
                rtf.WriteString("-  Aucune exigences de durabilité vis à vis de l'EN 206-1.") : rtf.NewLine()
            End If
            rtf.NewLine()
        End With
        rtf.FontSize = 11 : rtf.Underline = True
        rtf.WriteString("1 - 3 : Caractéristiques des composants constituant le béton")
        rtf.Underline = False : rtf.FontSize = 9 : rtf.NewLine() : rtf.NewLine()
        With Beton.Ciment
            Select Case .Clinker
                Case 1
                    msg1 = "A-"
                Case 2
                    msg1 = "B-"
                Case 3
                    msg1 = "C-"
            End Select
            Select Case .Constituant
                Case 1
                    msg2 = "S"
                Case 2
                    msg2 = "D"
                Case 3
                    msg2 = "P"
                Case 4
                    msg2 = "Q"
                Case 5
                    msg2 = "V"
                Case 6
                    msg2 = "W"
                Case 7
                    msg2 = "T"
                Case 8
                    msg2 = "L"
                Case 9
                    msg2 = "LL"
            End Select
            Select Case .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
            Select Case .Prise
                Case 1
                    msg += "N"
                Case 2
                    msg += "R"
            End Select
            rtf.WriteString("-  Ciment : " & msg & " - classe vraie " & .FcE.ToString & " MPa - densité " & Beton.Ciment.Densite.ToString("#0.00") & " T/m3") : rtf.NewLine()
        End With
        With Beton.Addition
            Select Case .Addition
                Case 0
                    rtf.WriteString("-  Addition : aucune addition") : rtf.NewLine()
                Case 1
                    rtf.WriteString("-  Addition : addition calcaire de catégorie A ")
                Case 2
                    rtf.WriteString("-  Addition : addition calcaire de catégorie B ")
                Case 3
                    rtf.WriteString("-  Addition : addition cendre volante siliceuse ")
                Case 4
                    rtf.WriteString("-  Addition : addition laitier moulu ")
                Case 5
                    rtf.WriteString("-  Addition : fumée de silice ")
                Case 6
                    rtf.WriteString("-  Addition : addition siliceuse de minéralogie QZ ")
                Case 7
                    rtf.WriteString("-  Addition : Métakaolin de type A ")
            End Select
            If .Addition > 0 Then
                rtf.WriteString("- densité: " & .MV.ToString("#0.00") & "kg/L - coefficient k: " & .k.ToString("#0.00") & " - quantité: ")
                If .ComplementFines = True Then
                    rtf.WriteString(" calculée comme complément en fines si besoin.")
                Else
                    If .Q_Impose = True Then
                        rtf.WriteString(.QuantiteImpose.ToString("#0.0") & " kg/m3.")
                    Else
                        rtf.WriteString(" calculée en substitution partielle du ciment suivant EN206-1 et en complément de fines si besoin.")
                    End If
                End If
                rtf.NewLine()
            End If
        End With
        rtf.WriteString("-  Eau de gâchage : conforme à la norme NF EN 1008") : rtf.NewLine()
        rtf.WriteString("-  Adjuvant : ")
        If Beton.Plastifiant = True Then
            With Beton
                rtf.WriteString(" plastifiant") : rtf.NewLine()
                rtf.WriteString("     ▸ Taux de minoration de la teneur en eau : " & (.PlastifiantReduc * 100).ToString("#0.0") & " %") : rtf.NewLine()
                rtf.WriteString("     ▸ Dosage : " & (.PlastifiantDosage * 100).ToString("#0.00") & " % (exprimé en % de masse de liant)") : rtf.NewLine()
                rtf.WriteString("     ▸ Extrait sec : " & (.PlastifiantExtraitSec * 100).ToString("#0.0") & " %") : rtf.NewLine()
                rtf.WriteString("     ▸ Densité : " & .PlastifiantDensite.ToString("#0.000") & " kg/L") : rtf.NewLine()
            End With
        Else
            rtf.WriteString(" sans objet")
        End If
        rtf.NewLine()
        rtf.WriteString("-  Sable : ") : rtf.NewLine()
        With Sable
            rtf.WriteString("     ▸ Nombre de sables différents : " & .Count.ToString("#")) : rtf.NewLine()
            For i = 1 To .Count
                With .Item(i - 1)
                    rtf.WriteString("     ▸ Sable n°" & i.ToString("#")) : rtf.NewLine()
                    msg = "" : If .Correcteur = True Then msg = " - Sable correcteur."
                    rtf.WriteString("       ▪ Identifié :" & .NomSable.ToString() & msg) : rtf.NewLine()
                    rtf.WriteString("       ▪ Classe granulaire " & .ds.ToString("#0.00") & "/" & .Dms.ToString("#0.00")) : rtf.NewLine()
                    Select Case .Forme
                        Case 1
                            msg = "concassé"
                        Case 2
                            msg = "roulé"
                    End Select
                    rtf.WriteString("       ▪ Forme : " & msg.ToString()) : rtf.NewLine()
                    msg = "" : If Beton.CompPondHumide = True Then msg = "et teneur en humidité = " & (.Humidite * 100).ToString("0.0") & " %."
                    rtf.WriteString("       ▪ Densité sèche = " & .Densite.ToString("#0.00") & " T/m3 " & msg) : rtf.NewLine()
                    If Beton.Formulation = 2 Then 'Baron-Ollivier
                        rtf.WriteString("       ▪ Teneur en fines : " & (.TeneurFines * 100).ToString("#0.00") & " %.") : rtf.NewLine()
                    End If
                End With
            Next
        End With
        rtf.WriteString("-  Gravillon : ") : rtf.NewLine()
        With Gravillon
            rtf.WriteString("     ▸ Nombre de gravillons différents : " & .Count.ToString("#")) : rtf.NewLine()
            For i = 1 To .Count
                With .Item(i - 1)
                    rtf.WriteString("     ▸ Gravillon n°" & i.ToString("#")) : rtf.NewLine()
                    rtf.WriteString("       ▪ Identifié :" & .NomGravillon.ToString()) : rtf.NewLine()
                    rtf.WriteString("       ▪ Classe granulaire " & .dg.ToString("#0") & "/" & .Dmg.ToString("#0")) : rtf.NewLine()
                    Select Case .Forme
                        Case 1
                            msg = "concassé"
                        Case 2
                            msg = "roulé"
                    End Select
                    rtf.WriteString("       ▪ Forme : " & msg.ToString()) : rtf.NewLine()
                    Select Case Beton.Formulation
                        Case 1
                            Select Case .Qualite
                                Case 1
                                    msg = "A"
                                Case 2
                                    msg = "B"
                                Case 3
                                    msg = "C"
                                Case 4
                                    msg = "D"
                            End Select
                            rtf.WriteString("       ▪ Qualité suivant NF 12620 + A1 : " & msg.ToString()) : rtf.NewLine()
                        Case 2
                            Select Case .Petrographie
                                Case 1
                                    msg = "siliceux, légèrement altérés"
                                Case 2
                                    msg = "siliceux roulés"
                                Case 3
                                    msg = "calcaires, durs"
                            End Select
                            rtf.WriteString("       ▪ Nature pétrographique : " & msg.ToString()) : rtf.NewLine()
                    End Select

                    msg = ""
                    If Beton.CompPondHumide = True Then msg = "et teneur en humidité = " & (.Humidite * 100).ToString("0.0") & " %."
                    rtf.WriteString("       ▪ Densité sèche = " & .Densite.ToString("#0.00") & " T/m3 " & msg) : rtf.NewLine()
                End With
            Next
        End With
        rtf.WriteEndGroup()
    End Sub

    ''' <summary>Ecriture des exigences de l'EN206-1</summary>
    ''' <param name="rtf">flux d'écriture pour écriture dans la note de calcul</param>
    ''' <param name="Result">flux d'écriture sous format string pour affichage directement dans le formulaire Classe d'exposition</param>
    Public Sub Affichage_Exigences_EN206_1(ByRef Result As String, ByRef rtf As To_Rtf.RtfAnsiTextWriter)
        Dim msg As String = String.Empty
        Dim msg1 As String = String.Empty
        With Beton
            rtf.WriteStartGroup()
            rtf.FontSize = 12 : rtf.FontSize = 9
            If .X0_ClassExpo = True Then
                msg = "X0"
            Else
                msg = ""
                If .XC1 = True Or .XC2 = True Or .XC3 = True Or .XC4 = True Then
                    If .XC1 = True Then msg1 = " XC1 "
                    If .XC2 = True Then msg1 = " XC2 "
                    If .XC3 = True Then msg1 = " XC3 "
                    If .XC4 = True Then msg1 = " XC4 "
                End If
                msg = msg1
                If .XD1 = True Or .XD2 = True Or .XD3 = True Then
                    If .XD1 = True Then msg1 = " XD1 "
                    If .XD2 = True Then msg1 = " XD2 "
                    If .XD3 = True Then msg1 = " XD3 "
                Else
                    msg1 = ""
                End If
                msg += msg1
                If .XS1 = True Or .XS2 = True Or .XS3 = True Then
                    If .XS1 = True Then msg1 = " XS1 "
                    If .XS2 = True Then msg1 = " XS2 "
                    If .XS3 = True Then msg1 = " XS3 "
                Else
                    msg1 = ""
                End If
                msg += msg1
                If .XF1 = True Or .XF2 = True Or .XF3 = True Or .XF4 = True Then
                    If .XF1 = True Then msg1 = " XF1 "
                    If .XF2 = True Then msg1 = " XF2 "
                    If .XF3 = True Then msg1 = " XF3 "
                    If .XF4 = True Then msg1 = " XF4 "
                Else
                    msg1 = ""
                End If
                msg += msg1
                If .XA1 = True Or .XA2 = True Or .XA3 = True Then
                    If .XA1 = True Then msg1 = " XA1 "
                    If .XA2 = True Then msg1 = " XA2 "
                    If .XA3 = True Then msg1 = " XA3 "
                Else
                    msg1 = ""
                End If
                msg += msg1
            End If
            Result = "Classe d'exposition : " & msg & Environment.NewLine
            rtf.InsertTab() : rtf.WriteString("Classe d'exposition : " & msg) : rtf.NewLine()
            If .X0_ClassExpo = False Then
                Result += "Rapport Eau efficace/Liant maximal : " & .EN206_EC.ToString("#0.00") & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("Rapport Eau efficace/Liant maximal : " & .EN206_EC.ToString("#0.00")) : rtf.NewLine()
                Select Case .EN206_Cl
                    Case 20
                        msg = "C20/25"
                    Case 25
                        msg = "C25/30"
                    Case 30
                        msg = "C30/37"
                    Case 35
                        msg = "C35/45"
                    Case 40
                        msg = "C40/50"
                End Select
                Result += "Classe de résistance minimale : " & msg & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("Classe de résistance minimale : " & msg) : rtf.NewLine()
                Result += "Teneur minimale en liant équivalent (kg/m3) : " & .EN206_TeneurLiant.ToString("#0") & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("Teneur minimale en liant équivalent (kg/m3) : " & .EN206_TeneurLiant.ToString("#0")) : rtf.NewLine()
                If .XF2 = True OrElse .XF3 = True OrElse .XF4 = True Then
                    Result += "Teneur minimale en air (%) : " & .EN206_TeneurAir.ToString("#0") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("Teneur minimale en air (%) : " & .EN206_TeneurAir.ToString("#0")) : rtf.NewLine()
                Else
                    Result += "Teneur minimale en air (%) : Sans objet" & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("Teneur minimale en air (%) : Sans objet") : rtf.NewLine()
                End If

                With .Addition
                    rtf.InsertTab() : rtf.WriteString("Limite de rapport addition (A) / ciment (C) pour ciment CEM I classe 42,5 et 52,5 :")
                    Select Case .Addition
                        Case 0
                            rtf.WriteString(" sans objet - aucune addition.") : rtf.NewLine()
                        Case 1 'calcaire cat A
                            If Beton.EN206 = 1 Then
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire : " & Beton.EN206_A_AC_Cal.ToString("#0.00")) : rtf.NewLine()
                            Else
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & Beton.EN206_A_AC_Cal_A.ToString("#0.00")) : rtf.NewLine()
                            End If
                        Case 2 'Calcaire cat B
                            rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire catégorie B : " & Beton.EN206_A_AC_Cal_B.ToString("#0.00")) : rtf.NewLine()
                        Case 3 'cendres volantes  
                            rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Cendres volantes : " & Beton.EN206_A_AC_CV.ToString("#0.00")) : rtf.NewLine()
                        Case 4 'laitier vitrifié
                            rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Laitier moulu : " & Beton.EN206_A_AC_LM.ToString("#0.00")) : rtf.NewLine()
                        Case 5 'fumée de silice
                            rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Fumées de silice : " & Beton.EN206_A_AC_FS.ToString("#0.00")) : rtf.NewLine()
                        Case 6 'Addition siliceuse de minéralogie QZ
                            If Beton.EN206 = 1 Then
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - addition siliceuse : " & Beton.EN206_A_AC_Sil.ToString("#0.00")) : rtf.NewLine()
                            Else
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & Beton.EN206_A_AC_Sil.ToString("#0.00")) : rtf.NewLine()
                            End If
                        Case 7 'Métakaolin
                            If Beton.EN206 = 2 Then
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Métakaolin de type A : " & Beton.EN206_A_AC_MK.ToString("#0.00")) : rtf.NewLine()
                            End If
                    End Select
                End With
                Result += "Limite de rapport de l'addition(A) vis à vis du ciment (C) pour les ciments CEM I de classe 42,5 et 52,5 :" & Environment.NewLine
                Result += "  - Rapport maximal A/(A+C) - Cendres volantes : " & .EN206_A_AC_CV.ToString("#0.00") & Environment.NewLine
                Result += "  - Rapport maximal A/(A+C) - Fumées de silice : " & .EN206_A_AC_FS.ToString("#0.00") & Environment.NewLine
                If .EN206 = 2 Then
                    Result += "  - Rapport maximal A/(A+C) - Métakaolin de type A : " & .EN206_A_AC_MK.ToString("#0.00") & Environment.NewLine
                End If
                Result += "  - Rapport maximal A/(A+C) - Laitier moulu : " & .EN206_A_AC_LM.ToString("#0.00") & Environment.NewLine
                If .EN206 = 1 Then
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire : " & .EN206_A_AC_Cal.ToString("#0.00") & Environment.NewLine
                Else
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & .EN206_A_AC_Cal_A.ToString("#0.00") & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire catégorie B : " & .EN206_A_AC_Cal_B.ToString("#0.00") & Environment.NewLine
                End If
                If .EN206 = 1 Then
                    Result += "  - Rapport maximal A/(A+C) - addition siliceuse : " & .EN206_A_AC_Sil.ToString("#0.00") & Environment.NewLine
                Else
                    Result += "  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & .EN206_A_AC_Sil.ToString("#0.00") & Environment.NewLine
                End If
                If .EN206 = 2 Then
                    Result += "Limite de rapport de l'addition(A) vis à vis du ciment (C) pour les ciments CEM II/A de classe 42,5 et 52,5 :" & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - Cendres volantes : " & .EN206_A_AC_CV_CEMII.ToString("#0.00") & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - Fumées de silice : " & .EN206_A_AC_FS_CEMII.ToString("#0.00") & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - Métakaolin de type A : " & .EN206_A_AC_MK_CEMII.ToString("#0.00") & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - Laitier moulu : " & .EN206_A_AC_LM_CEMII.ToString("#0.00") & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & .EN206_A_AC_Cal_A.ToString("#0.00") & Environment.NewLine
                    Result += "  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & .EN206_A_AC_Sil_CEMII.ToString("#0.00") & Environment.NewLine

                    With .Addition
                        rtf.InsertTab() : rtf.WriteString("Limite de rapport addition (A) / ciment (C) pour ciment CEM II/A classe 42,5 et 52,5 :")
                        Select Case .Addition
                            Case 0
                                rtf.WriteString(" sans objet - aucune addition.") : rtf.NewLine()
                            Case 1 'calcaire cat A
                                rtf.NewLine() : rtf.InsertTab() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & Beton.EN206_A_AC_Cal_A.ToString("#0.00")) : rtf.NewLine()
                            Case 2 'Calcaire cat B

                            Case 3 'cendres volantes  
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Cendres volantes : " & Beton.EN206_A_AC_CV_CEMII.ToString("#0.00")) : rtf.NewLine()
                            Case 4 'laitier vitrifié
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Laitier moulu : " & Beton.EN206_A_AC_LM_CEMII.ToString("#0.00")) : rtf.NewLine()
                            Case 5 'fumée de silice
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Fumées de silice : " & Beton.EN206_A_AC_FS_CEMII.ToString("#0.00")) : rtf.NewLine()
                            Case 6 'Addition siliceuse de minéralogie QZ
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & Beton.EN206_A_AC_Sil.ToString("#0.00")) : rtf.NewLine()
                            Case 7 'Métakaolin
                                rtf.NewLine() : rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Métakaolin de type A : " & Beton.EN206_A_AC_MK_CEMII.ToString("#0.00")) : rtf.NewLine()
                        End Select
                    End With
                End If
                If .XS1 = True Then
                    If .EN206 = 1 Then
                        Result += "Nature du ciment: Ciment Prise Mer"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment Prise Mer") : rtf.NewLine()
                    Else
                        Result += "Nature du ciment: Sans objet"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Sans objet") : rtf.NewLine()
                    End If
                ElseIf .XS2 = True Then
                    If .EN206 = 1 Then
                        Result += "Nature du ciment: Ciment Prise Mer + agent entraineur d'air"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment Prise Mer  + agent entraineur d'air") : rtf.NewLine()
                    Else
                        Result += "Nature du ciment: Ciment Prise Mer + liant suivant P15-317"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment Prise Mer + liant suivant P15-317") : rtf.NewLine()
                    End If
                ElseIf .XS3 = True Then
                    If .EN206 = 1 Then
                        Result += "Nature du ciment: Ciment Prise Mer + agent entraineur d'air"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment Prise Mer  + agent entraineur d'air") : rtf.NewLine()
                    Else
                        Result += "Nature du ciment: Ciment Prise Mer + liant suivant P15-317 + voir zone marnage"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment Prise Mer + liant suivant P15-317 + voir zone marnage") : rtf.NewLine()
                    End If
                ElseIf .XF3 = True Then
                    If .EN206 = 1 Then
                        Result += "Les granulats doivent être non gélifs au sens de la NF P18-545." & Environment.NewLine
                        rtf.InsertTab() : rtf.WriteString("Les granulats doivent être non gélifs au sens de la NF P18-545.") : rtf.NewLine()
                        Result += "Nature du ciment: Sans objet"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Sans objet") : rtf.NewLine()
                    Else
                        Result += "Les granulats doivent être non gélifs au sens de la NF P18-545 + essais de performance." & Environment.NewLine
                        rtf.InsertTab() : rtf.WriteString("Les granulats doivent être non gélifs au sens de la NF P18-545 + essais de performance.") : rtf.NewLine()
                        Result += "Nature du ciment: Sans objet"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Sans objet") : rtf.NewLine()
                    End If
                ElseIf .XF4 = True Then
                    If .EN206 = 1 Then
                        Result += "Les granulats doivent être non gélifs au sens de la NF P18-545." & Environment.NewLine
                        rtf.InsertTab() : rtf.WriteString("Les granulats doivent être non gélifs au sens de la NF P18-545.") : rtf.NewLine()
                        Result += "Nature du ciment: en cas d'utilisation de sels de déverglaçage dont la teneur en sulfate soluble est supérieure ou égale à 3%, utiliser un ciment PM ou ES."
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: en cas d'utilisation de sels de déverglaçage dont la teneur en sulfate soluble est supérieure ou égale à 3%, utiliser un ciment PM ou ES.") : rtf.NewLine()
                    Else
                        Result += "Les granulats doivent être non gélifs au sens de la NF P18-545." & Environment.NewLine
                        rtf.InsertTab() : rtf.WriteString("Les granulats doivent être non gélifs au sens de la NF P18-545.") : rtf.NewLine()
                        Result += "Nature du ciment: voir cas d'utilisation de sels de déverglaçage."
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: voir cas d'utilisation de sels de déverglaçage.") : rtf.NewLine()
                    End If
                ElseIf .XA1 = True Then
                    If .EN206 = 1 Then
                        If .Sulfates = True Then
                            Result += "Nature du ciment: Ciment Prise Mer et conforme aux exigences de la NF P15-317"
                            rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment Prise Mer et conforme aux exigences de la NF P15-317") : rtf.NewLine()
                        Else
                            Result += "Nature du ciment: Conforme aux exigences de la NF P18-011"
                            rtf.InsertTab() : rtf.WriteString("Nature du ciment: Conforme aux exigences de la NF P18-011") : rtf.NewLine()
                        End If
                    Else
                        Result += "Nature du ciment: Conforme aux exigences de la NF P18-011"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Conforme aux exigences de la NF P18-011") : rtf.NewLine()
                    End If
                ElseIf .XA2 = True OrElse .XA3 = True Then
                    If .EN206 = 1 Then
                        If .Sulfates = True Then
                            Result += "Nature du ciment: Ciment ES et conforme aux exigences de la XP P15-319"
                            rtf.InsertTab() : rtf.WriteString("Nature du ciment: Ciment ES et conforme aux exigences de la XP P15-319") : rtf.NewLine()
                        Else
                            Result += "Nature du ciment: Conforme aux exigences de la NF P18-011"
                            rtf.InsertTab() : rtf.WriteString("Nature du ciment: Conforme aux exigences de la NF P18-011") : rtf.NewLine()
                        End If
                    Else
                        Result += "Nature du ciment: Conforme aux exigences de la NF P18-011"
                        rtf.InsertTab() : rtf.WriteString("Nature du ciment: Conforme aux exigences de la NF P18-011") : rtf.NewLine()
                    End If
                Else
                    Result += "Nature du ciment: Sans objet"
                    rtf.InsertTab() : rtf.WriteString("Nature du ciment: Sans objet") : rtf.NewLine()
                End If
            Else
                Result += "Teneur minimale en liant équivalent (kg/m3) : " & .EN206_TeneurLiant.ToString("#0") & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("Teneur minimale en liant équivalent (kg/m3) : " & .EN206_TeneurLiant.ToString("#0")) : rtf.NewLine()
                Result += "Limite de rapport de l'addition(A) vis à vis du ciment (C) pour les ciments CEM I de classe 42,5 et 52,5 :" & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("Limite de rapport de l'addition(A) vis à vis du ciment (C) pour les ciments CEM I de classe 42,5 et 52,5 :") : rtf.NewLine()
                Result += "  - Rapport maximal A/(A+C) - Cendres volantes : " & .EN206_A_AC_CV.ToString("#0.00") & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Cendres volantes : " & .EN206_A_AC_CV.ToString("#0.00")) : rtf.NewLine()
                Result += "  - Rapport maximal A/(A+C) - Fumées de silice : " & .EN206_A_AC_FS.ToString("#0.00") & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Fumées de silice : " & .EN206_A_AC_FS.ToString("#0.00")) : rtf.NewLine()
                If .EN206 = 2 Then
                    Result += "  - Rapport maximal A/(A+C) - Métakaolin de type A : " & .EN206_A_AC_MK.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Métakaolin de type A : " & .EN206_A_AC_MK.ToString("#0.00")) : rtf.NewLine()
                End If
                Result += "  - Rapport maximal A/(A+C) - Laitier moulu : " & .EN206_A_AC_LM.ToString("#0.00") & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Laitier moulu : " & .EN206_A_AC_LM.ToString("#0.00")) : rtf.NewLine()
                If .EN206 = 1 Then
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire : " & .EN206_A_AC_Cal.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire : " & .EN206_A_AC_Cal.ToString("#0.00")) : rtf.NewLine()
                Else
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & .EN206_A_AC_Cal_A.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & .EN206_A_AC_Cal_A.ToString("#0.00")) : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire catégorie B : " & .EN206_A_AC_Cal_B.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire catégorie B : " & .EN206_A_AC_Cal_B.ToString("#0.00")) : rtf.NewLine()
                End If
                If .EN206 = 1 Then
                    Result += "  - Rapport maximal A/(A+C) - addition siliceuse : " & .EN206_A_AC_Sil.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - addition siliceuse : " & .EN206_A_AC_Sil.ToString("#0.00")) : rtf.NewLine()
                Else
                    Result += "  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & .EN206_A_AC_Sil.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & .EN206_A_AC_Sil.ToString("#0.00")) : rtf.NewLine()
                End If
                If .EN206 = 2 Then
                    Result += "Limite de rapport de l'addition(A) vis à vis du ciment (C) pour les ciments CEM II/A de classe 42,5 et 52,5 :" & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("Limite de rapport de l'addition(A) vis à vis du ciment (C) pour les ciments CEM II/A de classe 42,5 et 52,5 :") : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - Cendres volantes : " & .EN206_A_AC_CV_CEMII.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Cendres volantes : " & .EN206_A_AC_CV_CEMII.ToString("#0.00")) : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - Fumées de silice : " & .EN206_A_AC_FS_CEMII.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Fumées de silice : " & .EN206_A_AC_FS_CEMII.ToString("#0.00")) : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - Métakaolin de type A : " & .EN206_A_AC_MK_CEMII.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Métakaolin de type A : " & .EN206_A_AC_MK_CEMII.ToString("#0.00")) : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - Laitier moulu : " & .EN206_A_AC_LM_CEMII.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Laitier moulu : " & .EN206_A_AC_LM_CEMII.ToString("#0.00")) : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & .EN206_A_AC_Cal_A.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - Addition calcaire catégorie A : " & .EN206_A_AC_Cal_A.ToString("#0.00")) : rtf.NewLine()
                    Result += "  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & .EN206_A_AC_Sil_CEMII.ToString("#0.00") & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Rapport maximal A/(A+C) - addition siliceuse de minéralogie QZ: " & .EN206_A_AC_Sil_CEMII.ToString("#0.00")) : rtf.NewLine()
                End If
            End If
            'Teneur en chlorure
            Result += "Teneur maximale en ions chlorure : " & Environment.NewLine
            rtf.InsertTab() : rtf.WriteString("Teneur maximale en ions chlorure : ") : rtf.NewLine()
            If .OuvrageBP = True Then
                ' - Béton pour ouvrage contenant des armatures précontraintes en acier
                Result += "  - Béton pour ouvrage contenant des armatures précontraintes en acier" & Environment.NewLine
                rtf.InsertTab() : rtf.WriteString("  - Béton pour ouvrage contenant des armatures précontraintes en acier") : rtf.NewLine()
            Else
                ' - Béton pour ouvrage ne contenant pas des armatures précontraintes en acier") : rtf.NewLine()
                If .Ciment.Type = 3 Then
                    Result += "  - Ciment de type CEM III" & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Ciment de type CEM III") : rtf.NewLine()
                Else
                    If .Ciment.Type = 1 Then msg = "I" Else msg = "II"
                    Result += "  - Ciment de type CEM " & msg & Environment.NewLine
                    rtf.InsertTab() : rtf.WriteString("  - Ciment de type CEM " & msg) : rtf.NewLine()
                    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é
                            Result += "  - méthode Baron-Ollivier : ouvrage en béton Non armé" & Environment.NewLine
                            rtf.InsertTab() : rtf.WriteString("  - méthode Baron-Ollivier : ouvrage en béton Non armé") : rtf.NewLine()
                        Else
                            'béton armé
                            Result += "  - méthode Baron-Ollivier : ouvrage en béton armé" & Environment.NewLine
                            rtf.InsertTab() : rtf.WriteString("  - méthode Baron-Ollivier : ouvrage en béton armé") : rtf.NewLine()
                        End If
                    Else
                        Result += "  - méthode Dreux-Gorisse : pas de distinguo béton armé et béton non armé" & Environment.NewLine
                        rtf.InsertTab() : rtf.WriteString("  - méthode Dreux-Gorisse : pas de distinguo béton armé et béton non armé") : rtf.NewLine()
                    End If
                End If
            End If
            Result += "  - Teneur maximale en ions chlorure : " & .EN206_TeneurChlorure.ToString("#0.00") & " %" & Environment.NewLine
            rtf.InsertTab() : rtf.WriteString("  - Teneur maximale en ions chlorure : " & .EN206_TeneurChlorure.ToString("#0.00") & " %") : rtf.NewLine()
            rtf.WriteEndGroup()
        End With
    End Sub
End Module
