bonjourrs a tous ,

dans le code ci dessous,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
 
 
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Text.RegularExpressions;
 
 
namespace WindowsFormsApplication11
{
    public partial class Form1 : Form
    {   
        ///////////////////////////////////////////////////////////////////////////////////////
        // todo variable 
        // converne la méthode des délégué 
        delegate void T();// création du delegué
        T recup; // declartation
        ///////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////déclaration de variables/////////
        ///////////////////////////////////////////////////////////////////////////////////////
        // creation de list 
        List<string> recor = new List<string>();
        List<string> reccoord = new List<string>();
        List<PointF> geodata = new List<PointF>();
        List<PointF> PICTTBL = new List<PointF>();
        // declaration du pen 
        Pen greenpen = new Pen(Color.Green, 2); //definition d'un nouveau bic ,et de sa couleur , de la grosseur du trait
        // declaration des concernant les PointF et les tableau de PointF
        PointF coordonnees = new PointF();
        PointF PICTB = new PointF();
        PointF[] coordon,affichage;
        /// <summary>
        /// //////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// ///////////////////////////////déclaration de variable de pour le traitement/////////////////////////////
        /// /////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// </summary>
          float DEBMIN=0,DEBMAX=0,DMBMIN=0,DMBMAX=0,DELTADEB=0,DELTADMB=0,echelleX=0,echelleY=0;
          int degrelat=0, degrelong=0,length=0;
          double minuteslat=0, minuteslong=0,conversionlat=0,conversionlong=0, radlat=0,radlong=0,deb=0,dmb=0;
          string choixport, choicecolor, data;
          string[] donnee;
          //K constante pour effectuer un ZOOM
 
        public Form1()
        {
            InitializeComponent();
            recup = new T (recuperation);
        }
 
        public void main()
        {}
        private void btnbalisage_Click(object sender, EventArgs e)
        {//attention par securité il faudra stopper les actions des boutons
            //affichage du btnretour menu 
            btnretour.Visible = true;
            //pour se reperer dans quelle partie du programme nous sommes 
            lblbalisage.Visible = true;
            lblchampsenregistre.Visible = false;
            lblparametres.Visible = false;
            // pour le demarrage du balisage 
            btndembal.Visible = true;
 
            richTextBox1.Visible = true;
            lblchoixport.Visible = true;
            cbxchoixport.Visible = true;
            btntestconex.Visible = true;
            btnenre.Visible = true;
            // action secondaire qui apparaitront lors de l'appui sur paramètre.
            btncolor.Visible = false;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = false;
            // fermeture du port série
            portserie.Close();
        }
 
        private void btnchampsenre_Click(object sender, EventArgs e)
        {//attention par securité il faudra stopper les actions des boutons
            //affichage du btnretour menu 
            btnretour.Visible = true;
            //pour se reperer dans quelle partie du programme nous sommes 
            lblbalisage.Visible = false;
            lblchampsenregistre.Visible = true;
            lblparametres.Visible = false;
            //supprimer les actions possibles des autres parties du programme 
            // supression du sousprogramme du bouton balisage
            btndembal.Visible = false;
            lblchoixport.Visible = false;
            cbxchoixport.Visible = false;
            btntestconex.Visible = false;
 
            richTextBox1.Visible = true;
            btnenre.Visible = false;
            // action secondaire qui apparaitront lors de l'appui sur paramètre.
            btncolor.Visible = false;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = true;
            // rafraichir la richtextbox
            richTextBox1.Clear();
            //destruction du dessin dedans 
            pictureBox.Invalidate();
            // fermeture du port série
            portserie.Close();
        }
 
        private void btnparametres_Click(object sender, EventArgs e)
        {//attention par securité il faudra stopper les actions des boutons
            //affichage du btnretour menu 
            btnretour.Visible = true;
            //pour se reperer dans quelle partie du programme nous sommes
            lblbalisage.Visible = false;
            lblchampsenregistre.Visible = false;
            lblparametres.Visible = true;
            //supprimer les actions possibles des autres parties du programme 
            // supression du sousprogramme du bouton balisage
            btndembal.Visible = false;
            lblchoixport.Visible = false;
            cbxchoixport.Visible = false;
            btntestconex.Visible = false;
            richTextBox1.Visible = true;
            btnenre.Visible = false;
            btncolor.Visible = true;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = false;
        }
 
        private void btndembal_Click(object sender, EventArgs e)
        { // todo demarrer balisage
 
        }
 
 
        private void Form1_Load(object sender, EventArgs e)
        {
            retourload();//appel de la fonction retourload
        }
 
        private void btnretour_Click(object sender, EventArgs e)
        {
            retourload();// appel de la fonction retourload
        }
 
        void retourload() // création de la fonction qui retourne au menu principale 
        {
            // possibilité du menu principale 
            btnbalisage.Visible = true;
            btnparametres.Visible = true;
            btnchampsenre.Visible = true;
            // les trois label doivent etre visible pour afficher les choix possibles
            lblbalisage.Visible = true;
            lblchampsenregistre.Visible = true;
            lblparametres.Visible = true;
            //action secondaires qui apparaîtront lors de l'action sur les boutons du menu principale
            btndembal.Visible = false;
            lblchoixport.Visible = false;
            cbxchoixport.Visible = false;
            btntestconex.Visible = false;
 
            richTextBox1.Visible = false;
            btnenre.Visible = false;
            btnretour.Visible = false;
            // action secondaire qui apparaitront lors de l'appui sur paramètre.
            btncolor.Visible = false;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = false;
            //initialisation du premier point pour la picture box 
        }
 
        private void cbxchoixport_SelectedIndexChanged(object sender, EventArgs e)
        {/* bouton pour choisir le choix du port utilisé  pour cela , 
            il suffit d'utiliser la propriété selecteditem du combobox "cbxchoixport"
            et de donner le nom au port serie grace au elements modifié préalablement.
          */
            portserie.Close();
            choixport = cbxchoixport.SelectedItem.ToString();
            portserie.PortName = choixport;
        }
        //desactivation de l'evenement sur le port série a dmd 
        private void btntestconex_Click(object sender, EventArgs e)
        {
            /* besoin de la methode try catch :
             * si le port serie a un probleme lors du test de la connexion, c'est qu'il n'existe pas 
             */
            try
            {
                portserie.Open();
                portserie.DtrEnable = true;
                if (portserie.DsrHolding == true)
                {
                    label1.Text = "ok";
                }
            }
            catch (Exception)
            {
                label1.Text = "pas de connexion";
            }
            }           
        private void btncolor_Click(object sender, EventArgs e)
        {// permet de changer la couleur du pen.
            colorDialog1.ShowDialog();
            choicecolor = colorDialog1.Color.ToString();
            greenpen.Color = colorDialog1.Color;
            //permet de creer le pen affin d'afficher 
            Graphics g = Graphics.FromHwnd(pictureBox.Handle);   //encapsulage d'une surface de dessin , mise en lien
            //avec la picturebox
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //ligne de commande pour lisser la ligne
            //graphique tracée  
            greenpen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;      // ligne pour commander l'apparence de la ligne
            // permet de convertir la list de points en tableau de point grâce au pen appelé greenpen
            g.DrawLines(greenpen, coordon);    // la methode drawlines dessine un segment d'un tableau
            g.Dispose();                      // pour ne pas occuper de la memoire pour rien.
 
        }
        private void btnenre_Click(object sender, EventArgs e)
        {//todo enregistrement 
            saveFileDialog1.ShowDialog();// faire apparaître la savefiledialog
            // permet de retranscrire le txt dans un fichier.text 
            saveFileDialog1.DefaultExt = ".txt";
            richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
        }
 
 
 
 
 
 
        private void btnouvrir_Click(object sender, EventArgs e)
        {
            degrelat = 0;
            minuteslat = 0;
            degrelong = 0;
            minuteslong = 0;
            conversionlat = 0;
            conversionlong = 0;
            affichage = null;
            coordon = null;
            geodata.Clear();
            PICTTBL.Clear();
 
 
            StreamReader lecture = new StreamReader("c:/champ.txt");
 
            while (lecture.EndOfStream!=true)
 
            {
                string ligne =" ";
                ligne = lecture.ReadLine();
                degrelat = Convert.ToInt32(ligne.Substring(0,2));
                minuteslat = Convert.ToDouble(ligne.Substring(2,7).Replace('.',','));
                degrelong = Convert.ToInt32(ligne.Substring(10,3));
                minuteslong = Convert.ToDouble(ligne.Substring(13, 7).Replace('.',','));
                affichage = agricoltraits(minuteslong, minuteslat, degrelat, degrelong);            
            }
            Graphics g = Graphics.FromHwnd(pictureBox.Handle);   //encapsulage d'une surface de dessin , mise en lien
            //avec la picturebox
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //ligne de commande pour lisser la ligne
            //graphique tracée  
            greenpen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;      // ligne pour commander l'apparence de la ligne
            // permet de convertir la list de points en tableau de point grâce au pen appelé greenpen
            g.DrawLines(greenpen, coordon);    // la methode drawlines dessine un segment d'un tableau
            g.Dispose();                      // pour ne pas occuper de la memoire pour rien.
        }
 
        public void recuperation()// todo delegue
        {
 
            ///////////////////////////////////////////////////////////////////////////////////////////////////////
            if (data.IndexOf("$GPRMC") == 0 && donnee[2].IndexOf("A") == 0)// on veut $GPRMC et que la commande de navigation soit bonne 
            {
 
                richTextBox1.Text = richTextBox1.Text + donnee[3] + "," + donnee[5] + "\n";
 
                // remise en ordre du text pour pouvoir passer en mode conversion 
                // latitude
                degrelat = Convert.ToInt32(donnee[3].Substring(0, 2));// nous avons bien 50
                minuteslat = Convert.ToDouble(donnee[3].Substring(2, 7).Replace('.', ','));
                //longitude
                degrelong = Convert.ToInt32(donnee[5].Substring(0, 3));
                minuteslong = Convert.ToDouble(donnee[5].Substring(3, 7).Replace('.', ','));
                //////////////////////////////////////////////////////////////////////////////////////////////////////
                ///////////////////////        appel de la fonction                 //////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////////////////
                affichage = agricoltraits(minuteslong, minuteslat, degrelat, degrelat);
            }
        }
 
        public void portserie_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                data = portserie.ReadLine();// on lit toute une phrase du port série on la met dans data
                donnee = data.Split(',');// tout est éclate sur form d'un tableau dont le nom est : donnee    
                Invoke(recup);// éxécution de la methode des délégué sans thread 
            }
            catch (Exception)
            {
 
            }
        }
 
            private void richTextBox1_TextChanged(object sender, EventArgs e)
            {
            }
 
 
            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    portserie.Close();
                }
                catch (Exception)
                {
                    portserie.Close();
                }
            }
 
            private void label2_Click(object sender, EventArgs e)
            {
 
            }
 
 
 
            private void label5_Click(object sender, EventArgs e)
            {         
            }
 
 
        /*
         fonction pour le traitement des coordonnées reçue 
         */
        PointF[] agricoltraits(double minuteslong , double minuteslat , int degrelat , int degrelong )
        {
                ////////////////////////////////////////////////////////////////////////////////////////////////////
                ///////////////////////////conversion d'angle en seconde en radian//////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////////////////
                // conversion en seconde
                conversionlat = (degrelat * 3600) + (minuteslat * 60);
                conversionlong = (degrelong * 3600) + (minuteslong * 60);
 
                /* si on est a l'ouest,  la longitude est négative mais le gps ne l'indique pas au niveau des angle
                   si on est au sud , la latitude est négative mais le gps ne l'indique pas au niveau des angle
                 * se code ne s'y trouve plus attention car problème à resoudre par la suite 
                 */
 
                // convrsion en radian
                radlat = conversionlat * ((Math.PI) / (180 * 3600));
                radlong = conversionlong * ((Math.PI) / (180 * 3600));
                /*
                formules
                D= R*Math.Acos((Math.Sin (phi0) *Math.Sin (phi1))+ (Math.Cos (phi0)*Math.Cos(phi1)*Math.Cos(teta1-teta0)));
                 * le rayon moyen de la terre est de 6371km
                 * nous allons chercher la distance entre le point et l'équateur et entre le point et le méridien0
                 * pour cela , il faut soit annuler phi0 soit têta.
                 * ce qui revient a dire d'annuler soit lat soit long en fonction de la distance que l'on veut. 
                 * ces deux distance vont permettre de se reperer dans le plan X et Y pour pouvoir retracer le champ 
                */
                //distance entre Le point de l'equateur => on mesure une latitude. => même longitude
                deb = 6371000 * Math.Acos(Math.Cos(radlat));
                // distance entre le meridien et le point => on mesure une longitude => même latitude
                dmb = 6371000 * Math.Acos(Math.Cos(radlong));
            //////////////////////////////////////////////////////////////////////////////////////////////////
            /////////////////////////////////////// mise sous forme de point//////////////////////////////////
            //////////////////////////////////////////////////////////////////////////////////////////////////
                coordonnees.X = Convert.ToSingle(dmb);
                coordonnees.Y = Convert.ToSingle(deb);
 
                if (length==0)
                {
                    // on a besoin connaître une valeur de départ => la premiere valeur que l'on a sera la valeur de référence 
                    // pour les minimums que programme va connaître
 
 
                    DEBMIN = coordonnees.Y;
                    DMBMIN = coordonnees.X;
 
 
                }
 
                geodata.Add(coordonnees);// on ajoute le point a la liste de pointf
 
 
                // attention il faut minimum deux point .... 
                if (length>2)
                {
                    foreach (PointF P in geodata)// on parcourt la liste de pointf
                    {
                        if (P.Y > DEBMAX)
                        {
                            DEBMAX = P.Y;
                        }
 
                        if (P.Y < DEBMIN)
                        {
                            DEBMIN = P.Y;
                        }
 
                        DELTADEB = DEBMAX - DEBMIN;// distance entre les deux points latitudinalement dont on a besoin 
 
                        if (P.X > DMBMAX)
                        {
                            DMBMAX = P.X;
                        }
 
                        if (P.X < DMBMIN)
                        {
                            DMBMIN = P.X;
                        }
 
                        DELTADMB = DMBMAX - DMBMIN;// distance entre les deux points longitudinalement dont on a besoin 
                        // instauration d'une echelle en X et en Y 
                        echelleX = ((DELTADMB / (pictureBox.Width)));
 
                        echelleY = ((DELTADEB / (pictureBox.Height)));
                        PICTTBL.Clear();
 
                        }
                }
                // pour retranscrir et centrer sur la picture box : 
                // pt.X = (pictureBox1.Width / 2) + nombrex; // 
                // pt.Y = (pictureBox1.Height / 2) - nombrey;// 
                // de plus, on soustrait DMB a deb min pour la reference de la  picturebox1
 
 
                foreach (PointF rectification in geodata)
 
                {
 
 
                    PICTB.X = ((rectification.X - DMBMIN) / echelleX);
                    PICTB.Y = ((rectification.Y - DEBMIN) / echelleY);
                    PICTTBL.Add(PICTB);               
 
                }
 
                ////////////////////////////////////////////////////////////////////////////////////////////////////////////
                coordon = PICTTBL.ToArray();// tableau de pointf
                length = length + 1;
                return coordon;
            // on returne le tableau qui sera affiché sur la picture box
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
 
        }
        }
    }
je démarre la connexion serie avec mon gps jusque la rien de chinois. les evenement sur le portsérie amène a un traitement de calcul via une methode des délegués.
après avoir reçu pendant plus ou moins une heure les données , je ferme ma connexion ce qui est une action tout a fait normal.
seulement lors de la fermeture via le button2 , le programme se bloque pourquoi?

si vous avez un avis, il est le bien venu

merci.