ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/VMM/win32/importcarte.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (18 years, 2 months ago)
Original Path: magic/app/VMM/VMM/win32/importcarte.cpp
File size: 38937 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //---------------------------------------------------------------------------
2     #include "gestionversion.h"
3     #include <vcl.h>
4     #pragma hdrstop
5    
6     #include <math.h>
7     #include "importcarte.h"
8     #include "mg_gestionnaire.h"
9     #include "ot_mathematique.h"
10     #include "visuctt.h"
11     //---------------------------------------------------------------------------
12     #pragma package(smart_init)
13     #pragma resource "*.dfm"
14     Tfimcarte *fimcarte;
15     //---------------------------------------------------------------------------
16     __fastcall Tfimcarte::Tfimcarte(TComponent* Owner,MG_GESTIONNAIRE *magic)
17     : TForm(Owner),gest(magic)
18     {
19     }
20     //---------------------------------------------------------------------------
21     void __fastcall Tfimcarte::Button3Click(TObject *Sender)
22     {
23     Close();
24     }
25     //---------------------------------------------------------------------------
26     void __fastcall Tfimcarte::FormClose(TObject *Sender, TCloseAction &Action)
27     {
28     Action=caFree;
29     }
30     //---------------------------------------------------------------------------
31     void __fastcall Tfimcarte::Button2Click(TObject *Sender)
32     {
33     if (OpenDialog1->Execute()) Edit1->Text=OpenDialog1->FileName;
34     }
35     //---------------------------------------------------------------------------
36    
37     void __fastcall Tfimcarte::Button7Click(TObject *Sender)
38     {
39     if (OpenDialog1->Execute()) Edit2->Text=OpenDialog1->FileName;
40     }
41     //---------------------------------------------------------------------------
42    
43     void __fastcall Tfimcarte::Button1Click(TObject *Sender)
44     {
45     MG_MAILLAGE* mgmai=gest->get_mg_maillageid(atol(ComboBox1->Text.c_str()));
46     if (mgmai!=NULL)
47     {
48     int nb_noeud=mgmai->get_nb_mg_noeud();
49     char nomfichier[500];
50     strcpy(nomfichier,Caption.c_str());
51     nomfichier[strlen(nomfichier)-6]=0;
52     int nb_sol=gest->get_nb_mg_solution()+gest->get_nb_fem_solution();
53     char mess[30];
54     sprintf(mess,".sol%d",nb_sol+1);
55     strcat(nomfichier,mess);
56     string nomsol="Carte de taille reelle";
57     MG_SOLUTION* mgsol=new MG_SOLUTION(mgmai,1,nomfichier,nb_noeud,nomsol);
58     gest->ajouter_mg_solution(mgsol);
59     mgsol->change_legende(0,"F(x,y,z)");
60     for (int j=0;j<nb_noeud;j++)
61     {
62     MG_NOEUD* noeud=mgmai->get_mg_noeud(j);
63     int nb_segment=noeud->get_lien_segment()->get_nb();
64     double ec=0.;int nbr=0;
65     for (int k=0;k<nb_segment;k++)
66     {
67     MG_SEGMENT* seg=noeud->get_lien_segment()->get(k);
68     MG_SEGMENT* segtmp=mgmai->get_mg_segmentid(seg->get_id());
69     if (segtmp!=NULL)
70     {
71     nbr++;
72     ec=ec+seg->get_longueur();
73     }
74    
75     }
76     ec=ec/nbr;
77     mgsol->ecrire(j,0,ec);
78     }
79     }
80     gest->enregistrer(Caption.c_str());
81     }
82     //---------------------------------------------------------------------------
83    
84     void __fastcall Tfimcarte::Button5Click(TObject *Sender)
85     {
86     FEM_MAILLAGE* femmai=gest->get_fem_maillageid(atol(ComboBox2->Text.c_str()));
87     if (femmai!=NULL)
88     {
89     int nb_noeud=femmai->get_nb_fem_noeud();
90     char nomfichier[500];
91     strcpy(nomfichier,Caption.c_str());
92     nomfichier[strlen(nomfichier)-6]=0;
93     int nb_sol=gest->get_nb_mg_solution()+gest->get_nb_fem_solution();
94     char mess[30];
95     sprintf(mess,".sol%d",nb_sol+1);
96     strcat(nomfichier,mess);
97     string nomsol="Carte de taille reelle";
98     FEM_SOLUTION* femsol=new FEM_SOLUTION(femmai,1,nomfichier,nb_noeud,nomsol);
99     gest->ajouter_fem_solution(femsol);
100     femsol->change_legende(0,"F(x,y,z)");
101     int nbseg=femmai->get_nb_fem_segment();
102     int nbtri=femmai->get_nb_fem_triangle();
103     int nbtet=femmai->get_nb_fem_tetra();
104     int base;
105     if (nbtet!=0) base=3; else if (nbtri!=0) base=2; else if (nbseg!=0) base=1; else base=0;
106     for (int j=0;j<nb_noeud;j++)
107     {
108     double ec=0.;
109     int nbr=0;
110     FEM_NOEUD* noeud=femmai->get_fem_noeud(j);
111     int nb;
112     double longueur;
113     if (base==1)
114     {
115     nb=noeud->get_lien_segment()->get_nb();
116     for (int k=0;k<nb;k++)
117     {
118     FEM_SEGMENT* segment=noeud->get_lien_segment()->get(k);
119     calcule_longueur_segment(noeud,segment,ec,nbr);
120     }
121     }
122     if (base==2)
123     {
124     nb=noeud->get_lien_triangle()->get_nb();
125     for (int k=0;k<nb;k++)
126     {
127     FEM_TRIANGLE* triangle=noeud->get_lien_triangle()->get(k);
128     calcule_longueur_triangle(noeud,triangle,ec,nbr);
129     }
130     }
131     if (base==3)
132     {
133     nb=noeud->get_lien_tetra()->get_nb();
134     for (int k=0;k<nb;k++)
135     {
136     FEM_TETRA* tetra=noeud->get_lien_tetra()->get(k);
137     calcule_longueur_tetra(noeud,tetra,ec,nbr);
138     }
139     }
140     if (nbr==0) ec=-1.; else ec=ec/nbr;
141     femsol->ecrire(j,0,ec);
142     }
143     gest->enregistrer(Caption.c_str());
144     }
145     }
146     //---------------------------------------------------------------------------
147     void __fastcall Tfimcarte::calcule_longueur_segment(FEM_NOEUD* noeud,FEM_SEGMENT* segment,double &ec,int &nbr)
148     {
149     int nb=segment->get_nb_fem_noeud();
150     if (nb==2)
151     {
152     double l=calcul_dist_noeud_noeud(segment->get_fem_noeud(0),segment->get_fem_noeud(1));
153     ec=ec+l;
154     nbr++;
155     }
156     if (nb==3)
157     {
158     FEM_NOEUD* noeud1=segment->get_fem_noeud(0);
159     FEM_NOEUD* noeud2=segment->get_fem_noeud(1);
160     FEM_NOEUD* noeud3=segment->get_fem_noeud(2);
161     if (noeud==noeud1)
162     {
163     double l=calcul_dist_noeud_noeud(noeud1,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud3);
164     ec=ec+l;
165     nbr++;
166     }
167     if (noeud==noeud2)
168     {
169     double l=calcul_dist_noeud_noeud(noeud1,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud3);
170     ec=ec+l;
171     nbr++;
172     }
173     if (noeud==noeud3)
174     {
175     double l=calcul_dist_noeud_noeud(noeud1,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud3);
176     ec=ec+l;
177     nbr=nbr++;
178     }
179    
180     }
181     }
182     //---------------------------------------------------------------------------
183     void __fastcall Tfimcarte::calcule_longueur_triangle(FEM_NOEUD* noeud,FEM_TRIANGLE* triangle,double &ec,int &nbr)
184     {
185     int nb=triangle->get_nb_fem_noeud();
186     if (nb==3)
187     {
188     FEM_NOEUD* noeud1=triangle->get_fem_noeud(0);
189     FEM_NOEUD* noeud2=triangle->get_fem_noeud(1);
190     FEM_NOEUD* noeud3=triangle->get_fem_noeud(2);
191     if (noeud==noeud1)
192     {
193     double l=calcul_dist_noeud_noeud(noeud1,noeud2);
194     ec=ec+l;
195     nbr++;
196     l=calcul_dist_noeud_noeud(noeud1,noeud3);
197     ec=ec+l;
198     nbr++;
199     }
200     if (noeud==noeud2)
201     {
202     double l=calcul_dist_noeud_noeud(noeud2,noeud2);
203     ec=ec+l;
204     nbr++;
205     l=calcul_dist_noeud_noeud(noeud2,noeud3);
206     ec=ec+l;
207     nbr++;
208     }
209     if (noeud==noeud3)
210     {
211     double l=calcul_dist_noeud_noeud(noeud3,noeud1);
212     ec=ec+l;
213     nbr++;
214     l=calcul_dist_noeud_noeud(noeud3,noeud2);
215     ec=ec+l;
216     nbr++;
217     }
218    
219     }
220     if (nb==6)
221     {
222     FEM_NOEUD* noeud1=triangle->get_fem_noeud(0);
223     FEM_NOEUD* noeud2=triangle->get_fem_noeud(1);
224     FEM_NOEUD* noeud3=triangle->get_fem_noeud(2);
225     FEM_NOEUD* noeud4=triangle->get_fem_noeud(3);
226     FEM_NOEUD* noeud5=triangle->get_fem_noeud(4);
227     FEM_NOEUD* noeud6=triangle->get_fem_noeud(5);
228     if (noeud==noeud1)
229     {
230     double l=calcul_dist_noeud_noeud(noeud1,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud3);
231     ec=ec+l;
232     nbr++;
233     l=calcul_dist_noeud_noeud(noeud1,noeud6)+calcul_dist_noeud_noeud(noeud6,noeud5);
234     ec=ec+l;
235     nbr++;
236     }
237     if (noeud==noeud2)
238     {
239     double l=calcul_dist_noeud_noeud(noeud2,noeud1)+calcul_dist_noeud_noeud(noeud2,noeud3);
240     ec=ec+l;
241     nbr++;
242     }
243     if (noeud==noeud3)
244     {
245     double l=calcul_dist_noeud_noeud(noeud3,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud1);
246     ec=ec+l;
247     nbr++;
248     l=calcul_dist_noeud_noeud(noeud3,noeud4)+calcul_dist_noeud_noeud(noeud4,noeud5);
249     ec=ec+l;
250     nbr++;
251     }
252     if (noeud==noeud4)
253     {
254     double l=calcul_dist_noeud_noeud(noeud4,noeud3)+calcul_dist_noeud_noeud(noeud4,noeud5);
255     ec=ec+l;
256     nbr++;
257     }
258     if (noeud==noeud5)
259     {
260     double l=calcul_dist_noeud_noeud(noeud5,noeud4)+calcul_dist_noeud_noeud(noeud4,noeud3);
261     ec=ec+l;
262     nbr++;
263     l=calcul_dist_noeud_noeud(noeud5,noeud6)+calcul_dist_noeud_noeud(noeud6,noeud1);
264     ec=ec+l;
265     nbr++;
266     }
267     if (noeud==noeud6)
268     {
269     double l=calcul_dist_noeud_noeud(noeud6,noeud5)+calcul_dist_noeud_noeud(noeud6,noeud1);
270     ec=ec+l;
271     nbr++;
272     }
273     }
274     }
275     //---------------------------------------------------------------------------
276     void __fastcall Tfimcarte::calcule_longueur_tetra(FEM_NOEUD* noeud,FEM_TETRA* tetra,double &ec,int &nbr)
277     {
278     int nb=tetra->get_nb_fem_noeud();
279     if (nb==4)
280     {
281     FEM_NOEUD* noeud1=tetra->get_fem_noeud(0);
282     FEM_NOEUD* noeud2=tetra->get_fem_noeud(1);
283     FEM_NOEUD* noeud3=tetra->get_fem_noeud(2);
284     FEM_NOEUD* noeud4=tetra->get_fem_noeud(3);
285     if (noeud==noeud1)
286     {
287     double l=calcul_dist_noeud_noeud(noeud1,noeud2);
288     ec=ec+l;
289     nbr++;
290     l=calcul_dist_noeud_noeud(noeud1,noeud3);
291     ec=ec+l;
292     nbr++;
293     l=calcul_dist_noeud_noeud(noeud1,noeud4);
294     ec=ec+l;
295     nbr++;
296     }
297     if (noeud==noeud2)
298     {
299     double l=calcul_dist_noeud_noeud(noeud2,noeud1);
300     ec=ec+l;
301     nbr++;
302     l=calcul_dist_noeud_noeud(noeud2,noeud3);
303     ec=ec+l;
304     nbr++;
305     l=calcul_dist_noeud_noeud(noeud2,noeud4);
306     ec=ec+l;
307     nbr++;
308     }
309     if (noeud==noeud3)
310     {
311     double l=calcul_dist_noeud_noeud(noeud3,noeud1);
312     ec=ec+l;
313     nbr++;
314     l=calcul_dist_noeud_noeud(noeud3,noeud2);
315     ec=ec+l;
316     nbr++;
317     l=calcul_dist_noeud_noeud(noeud3,noeud4);
318     ec=ec+l;
319     nbr++;
320     }
321     if (noeud==noeud4)
322     {
323     double l=calcul_dist_noeud_noeud(noeud4,noeud1);
324     ec=ec+l;
325     nbr++;
326     l=calcul_dist_noeud_noeud(noeud4,noeud2);
327     ec=ec+l;
328     nbr++;
329     l=calcul_dist_noeud_noeud(noeud4,noeud3);
330     ec=ec+l;
331     nbr++;
332     }
333    
334     }
335     if (nb==10)
336     {
337     FEM_NOEUD* noeud1=tetra->get_fem_noeud(0);
338     FEM_NOEUD* noeud2=tetra->get_fem_noeud(1);
339     FEM_NOEUD* noeud3=tetra->get_fem_noeud(2);
340     FEM_NOEUD* noeud4=tetra->get_fem_noeud(3);
341     FEM_NOEUD* noeud5=tetra->get_fem_noeud(4);
342     FEM_NOEUD* noeud6=tetra->get_fem_noeud(5);
343     FEM_NOEUD* noeud7=tetra->get_fem_noeud(6);
344     FEM_NOEUD* noeud8=tetra->get_fem_noeud(7);
345     FEM_NOEUD* noeud9=tetra->get_fem_noeud(8);
346     FEM_NOEUD* noeud10=tetra->get_fem_noeud(9);
347     if (noeud==noeud1)
348     {
349     double l=calcul_dist_noeud_noeud(noeud1,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud3);
350     ec=ec+l;
351     nbr++;
352     l=calcul_dist_noeud_noeud(noeud1,noeud6)+calcul_dist_noeud_noeud(noeud6,noeud5);
353     ec=ec+l;
354     nbr++;
355     l=calcul_dist_noeud_noeud(noeud1,noeud7)+calcul_dist_noeud_noeud(noeud7,noeud10);;
356     ec=ec+l;
357     nbr++;
358     }
359     if (noeud==noeud2)
360     {
361     double l=calcul_dist_noeud_noeud(noeud2,noeud1)+calcul_dist_noeud_noeud(noeud2,noeud3);
362     ec=ec+l;
363     nbr++;
364     }
365     if (noeud==noeud3)
366     {
367     double l=calcul_dist_noeud_noeud(noeud3,noeud2)+calcul_dist_noeud_noeud(noeud2,noeud1);
368     ec=ec+l;
369     nbr++;
370     l=calcul_dist_noeud_noeud(noeud3,noeud4)+calcul_dist_noeud_noeud(noeud4,noeud5);
371     ec=ec+l;
372     nbr++;
373     l=calcul_dist_noeud_noeud(noeud3,noeud8)+calcul_dist_noeud_noeud(noeud1,noeud10);
374     ec=ec+l;
375     nbr++;
376     }
377     if (noeud==noeud4)
378     {
379     double l=calcul_dist_noeud_noeud(noeud4,noeud3)+calcul_dist_noeud_noeud(noeud4,noeud5);
380     ec=ec+l;
381     nbr++;
382     }
383     if (noeud==noeud5)
384     {
385     double l=calcul_dist_noeud_noeud(noeud5,noeud4)+calcul_dist_noeud_noeud(noeud4,noeud3);
386     ec=ec+l;
387     nbr++;
388     l=calcul_dist_noeud_noeud(noeud5,noeud6)+calcul_dist_noeud_noeud(noeud6,noeud1);
389     ec=ec+l;
390     nbr++;
391     l=calcul_dist_noeud_noeud(noeud5,noeud9)+calcul_dist_noeud_noeud(noeud9,noeud10);
392     ec=ec+l;
393     nbr++;
394     }
395     if (noeud==noeud6)
396     {
397     double l=calcul_dist_noeud_noeud(noeud6,noeud5)+calcul_dist_noeud_noeud(noeud6,noeud1);
398     ec=ec+l;
399     nbr++;
400     }
401     if (noeud==noeud7)
402     {
403     double l=calcul_dist_noeud_noeud(noeud7,noeud1)+calcul_dist_noeud_noeud(noeud7,noeud10);
404     ec=ec+l;
405     nbr++;
406     }
407     if (noeud==noeud8)
408     {
409     double l=calcul_dist_noeud_noeud(noeud8,noeud3)+calcul_dist_noeud_noeud(noeud8,noeud10);
410     ec=ec+l;
411     nbr++;
412     }
413    
414     if (noeud==noeud9)
415     {
416     double l=calcul_dist_noeud_noeud(noeud9,noeud5)+calcul_dist_noeud_noeud(noeud9,noeud10);
417     ec=ec+l;
418     nbr++;
419     }
420     if (noeud==noeud10)
421     {
422     double l=calcul_dist_noeud_noeud(noeud10,noeud7)+calcul_dist_noeud_noeud(noeud7,noeud1);
423     ec=ec+l;
424     nbr++;
425     l=calcul_dist_noeud_noeud(noeud10,noeud8)+calcul_dist_noeud_noeud(noeud8,noeud3);
426     ec=ec+l;
427     nbr++;
428     l=calcul_dist_noeud_noeud(noeud10,noeud9)+calcul_dist_noeud_noeud(noeud9,noeud5);
429     ec=ec+l;
430     nbr++;
431     }
432    
433     }
434     }
435    
436     //---------------------------------------------------------------------------
437    
438     double __fastcall Tfimcarte::calcul_dist_noeud_noeud(FEM_NOEUD* noeud1,FEM_NOEUD* noeud2)
439     {
440     double *xyz1=noeud1->get_coord();
441     double *xyz2=noeud2->get_coord();
442     OT_VECTEUR_3D vec(xyz1,xyz2);
443     return vec.get_longueur();
444     }
445    
446     //---------------------------------------------------------------------------
447     void __fastcall Tfimcarte::Button4Click(TObject *Sender)
448     {
449     vector<celluleaff*> lst_cellule;
450     FILE *in=fopen(Edit1->Text.c_str(),"rt");
451     char mess[400];
452     fgets(mess,400,in);
453     int nb_renseignement;
454     sscanf(mess,"%d",&nb_renseignement);
455     char nomfichier[500];
456     strcpy(nomfichier,Caption.c_str());
457     nomfichier[strlen(nomfichier)-6]=0;
458     int nb_sol=gest->get_nb_mg_solution()+gest->get_nb_fem_solution();
459     sprintf(mess,".sol%d",nb_sol+1);
460     strcat(nomfichier,mess);
461     MG_MAILLAGE* mgmai=gest->get_mg_maillage(ComboBox1->ItemIndex);
462     if (mgmai==NULL) return;
463     AnsiString InputString = InputBox("Entrez le nom de la solution ?", "Information", "nom");
464     char messtmp[1000];
465     strcpy(messtmp,InputString.c_str());
466     string nomsol=messtmp;
467     int nb_noeud=mgmai->get_nb_mg_noeud();
468     MG_SOLUTION* mgsol=new MG_SOLUTION(mgmai,nb_renseignement,nomfichier,nb_noeud,nomsol);
469     gest->ajouter_mg_solution(mgsol);
470     for (int i=0;i<nb_renseignement;i++)
471     {
472     fgets(mess,400,in);
473     mess[strlen(mess)-1]=0;
474     mgsol->change_legende(i,mess);
475     }
476     if (in!=NULL)
477     {
478     while (feof(in)==0)
479     {
480     char mess[400];
481     celluleaff* cell=new celluleaff(nb_renseignement);
482     fgets(mess,400,in);
483     sscanf(mess,"%lf %lf %lf",&(cell->coordpt1[0]),&(cell->coordpt1[1]),&(cell->coordpt1[2]));
484     char *p=strchr(mess,' ')+1;
485     p=strchr(p,' ')+1;
486     for (int l=0;l<nb_renseignement;l++)
487     {
488     double val;
489     p=strchr(p,' ')+1;
490     sscanf(p,"%lf",&val);
491     cell->change_valeur(l,0,val);
492     }
493     fgets(mess,400,in);
494     sscanf(mess,"%lf %lf %lf",&(cell->coordpt2[0]),&(cell->coordpt2[1]),&(cell->coordpt2[2]));
495     p=strchr(mess,' ')+1;
496     p=strchr(p,' ')+1;
497     for (int l=0;l<nb_renseignement;l++)
498     {
499     double val;
500     p=strchr(p,' ')+1;
501     sscanf(p,"%lf",&val);
502     cell->change_valeur(l,1,val);
503     }
504     fgets(mess,400,in);
505     sscanf(mess,"%lf %lf %lf",&(cell->coordpt3[0]),&(cell->coordpt3[1]),&(cell->coordpt3[2]));
506     p=strchr(mess,' ')+1;
507     p=strchr(p,' ')+1;
508     for (int l=0;l<nb_renseignement;l++)
509     {
510     double val;
511     p=strchr(p,' ')+1;
512     sscanf(p,"%lf",&val);
513     cell->change_valeur(l,2,val);
514     }
515     fgets(mess,400,in);
516     sscanf(mess,"%lf %lf %lf",&(cell->coordpt4[0]),&(cell->coordpt4[1]),&(cell->coordpt4[2]));
517     p=strchr(mess,' ')+1;
518     p=strchr(p,' ')+1;
519     for (int l=0;l<nb_renseignement;l++)
520     {
521     double val;
522     p=strchr(p,' ')+1;
523     sscanf(p,"%lf",&val);
524     cell->change_valeur(l,3,val);
525     }
526     fgets(mess,400,in);
527     sscanf(mess,"%lf %lf %lf",&(cell->coordpt5[0]),&(cell->coordpt5[1]),&(cell->coordpt5[2]));
528     p=strchr(mess,' ')+1;
529     p=strchr(p,' ')+1;
530     for (int l=0;l<nb_renseignement;l++)
531     {
532     double val;
533     p=strchr(p,' ')+1;
534     sscanf(p,"%lf",&val);
535     cell->change_valeur(l,4,val);
536     }
537     fgets(mess,400,in);
538     sscanf(mess,"%lf %lf %lf",&(cell->coordpt6[0]),&(cell->coordpt6[1]),&(cell->coordpt6[2]));
539     p=strchr(mess,' ')+1;
540     p=strchr(p,' ')+1;
541     for (int l=0;l<nb_renseignement;l++)
542     {
543     double val;
544     p=strchr(p,' ')+1;
545     sscanf(p,"%lf",&val);
546     cell->change_valeur(l,5,val);
547     }
548     fgets(mess,400,in);
549     sscanf(mess,"%lf %lf %lf",&(cell->coordpt7[0]),&(cell->coordpt7[1]),&(cell->coordpt7[2]));
550     p=strchr(mess,' ')+1;
551     p=strchr(p,' ')+1;
552     for (int l=0;l<nb_renseignement;l++)
553     {
554     double val;
555     p=strchr(p,' ')+1;
556     sscanf(p,"%lf",&val);
557     cell->change_valeur(l,6,val);
558     }
559     fgets(mess,400,in);
560     sscanf(mess,"%lf %lf %lf",&(cell->coordpt8[0]),&(cell->coordpt8[1]),&(cell->coordpt8[2]));
561     p=strchr(mess,' ')+1;
562     p=strchr(p,' ')+1;
563     for (int l=0;l<nb_renseignement;l++)
564     {
565     double val;
566     p=strchr(p,' ')+1;
567     sscanf(p,"%lf",&val);
568     cell->change_valeur(l,7,val);
569     }
570     lst_cellule.insert(lst_cellule.end(),cell);
571     }
572     double xmin,ymin,zmin,xmax,ymax,zmax;
573     for (int i=0;i<nb_noeud;i++)
574     {
575     double *xyz=mgmai->get_mg_noeud(i)->get_coord();
576     if (i==0)
577     {
578     xmin=xyz[0];
579     xmax=xyz[0];
580     ymin=xyz[1];
581     ymax=xyz[1];
582     zmin=xyz[2];
583     zmax=xyz[2];
584     }
585     else
586     {
587     if (xyz[0]<xmin) xmin=xyz[0];
588     if (xyz[0]>xmax) xmax=xyz[0];
589     if (xyz[1]<ymin) ymin=xyz[1];
590     if (xyz[1]>ymax) ymax=xyz[1];
591     if (xyz[2]<zmin) zmin=xyz[2];
592     if (xyz[2]>zmax) zmax=xyz[2];
593     }
594     }
595     double dx=(xmax-xmin)*0.05;
596     double dy=(ymax-ymin)*0.05;
597     double dz=(zmax-zmin)*0.05;
598     xmin=xmin-dx;
599     ymin=ymin-dy;
600     zmin=zmin-dz;
601     xmax=xmax+dx;
602     ymax=ymax+dy;
603     zmax=zmax+dz;
604     TPL_GRILLE<MG_NOEUD*> grille;
605     int pas=(int)(pow(nb_noeud,0.33333333333333)+1);
606     grille.initialiser(xmin,ymin,zmin,xmax,ymax,zmax,pas,pas,pas);
607     for (int i=0;i<nb_noeud;i++)
608     {
609     MG_NOEUD* noeud=mgmai->get_mg_noeud(i);
610     noeud->change_nouveau_numero(i);
611     grille.inserer(noeud);
612     }
613     int nb_cell=lst_cellule.size();
614     for (int i=0;i<nb_cell;i++)
615     {
616     celluleaff* cell=lst_cellule[i];
617     double *xyz1=cell->coordpt1;
618     double *xyz7=cell->coordpt7;
619     BOITE_3D boite1(xyz1[0],xyz1[1],xyz1[2],xyz7[0],xyz7[1],xyz7[2]);
620     TPL_MAP_ENTITE<MG_NOEUD*> lst_noeud;
621     grille.rechercher(boite1.get_xcentre(),boite1.get_ycentre(),boite1.get_zcentre(),boite1.get_rayon(),lst_noeud);
622     int nb_noeud_trouve=lst_noeud.get_nb();
623     for (int j=0;j<nb_noeud_trouve;j++)
624     {
625     MG_NOEUD* mgnoeud=lst_noeud.get(j);
626     if (mgnoeud->get_boite_3D()*boite1)
627     {
628     double xsi=-1+2*(mgnoeud->get_x()-boite1.get_xmin())/(boite1.get_xmax()-boite1.get_xmin());
629     double eta=-1+2*(mgnoeud->get_y()-boite1.get_ymin())/(boite1.get_ymax()-boite1.get_ymin());
630     double psi=-1+2*(mgnoeud->get_z()-boite1.get_zmin())/(boite1.get_zmax()-boite1.get_zmin());
631     double a1=1+xsi;
632     double b1=1+eta;
633     double c1=1+psi;
634     double a2=1-xsi;
635     double b2=1-eta;
636     double c2=1-psi;
637     double N1=a2*b2*c2;
638     double N3=a1*b1*c2;
639     double N2=a1*b2*c2;
640     double N4=a2*b1*c2;
641     double N5=a2*b2*c1;
642     double N6=a1*b2*c1;
643     double N7=a1*b1*c1;
644     double N8=a2*b1*c1;
645     for (int k=0;k<nb_renseignement;k++)
646     {
647     double valeur1=cell->get_valeur(k,0);
648     double valeur2=cell->get_valeur(k,1);
649     double valeur3=cell->get_valeur(k,2);
650     double valeur4=cell->get_valeur(k,3);
651     double valeur5=cell->get_valeur(k,4);
652     double valeur6=cell->get_valeur(k,5);
653     double valeur7=cell->get_valeur(k,6);
654     double valeur8=cell->get_valeur(k,7);
655     double res=N1*valeur1+N2*valeur2+N3*valeur3+N4*valeur4+N5*valeur5+N6*valeur6+N7*valeur7+N8*valeur8;
656     res=res/8.;
657     mgsol->ecrire(mgnoeud->get_nouveau_numero(),k,res);
658     }
659     }
660    
661     }
662     }
663    
664     fclose(in);
665     gest->enregistrer(Caption.c_str());
666     return;
667    
668     }
669     MessageBox(Handle,"Fichier non valide","Erreur",MB_OK);
670     }
671     //---------------------------------------------------------------------------
672    
673    
674     void __fastcall Tfimcarte::Button6Click(TObject *Sender)
675     {
676     vector<celluleaff*> lst_cellule;
677     FILE *in=fopen(Edit2->Text.c_str(),"rt");
678     char mess[400];
679     fgets(mess,400,in);
680     int nb_renseignement;
681     sscanf(mess,"%d",&nb_renseignement);
682     char nomfichier[500];
683     strcpy(nomfichier,Caption.c_str());
684     nomfichier[strlen(nomfichier)-6]=0;
685     int nb_sol=gest->get_nb_mg_solution()+gest->get_nb_fem_solution();
686     sprintf(mess,".sol%d",nb_sol+1);
687     strcat(nomfichier,mess);
688     FEM_MAILLAGE* mai=gest->get_fem_maillage(ComboBox2->ItemIndex);
689     if (mai==NULL) return;
690     AnsiString InputString = InputBox("Entrez le nom de la solution ?", "Information", "nom");
691     char messtmp[1000];
692     strcpy(messtmp,InputString.c_str());
693     string nomsol=messtmp;
694     int nb_noeud=mai->get_nb_fem_noeud();
695     FEM_SOLUTION* sol=new FEM_SOLUTION(mai,nb_renseignement,nomfichier,nb_noeud,nomsol);
696     gest->ajouter_fem_solution(sol);
697     for (int i=0;i<nb_renseignement;i++)
698     {
699     fgets(mess,400,in);
700     mess[strlen(mess)-1]=0;
701     sol->change_legende(i,mess);
702     }
703     if (in!=NULL)
704     {
705     while (feof(in)==0)
706     {
707     char mess[400];
708     celluleaff* cell=new celluleaff(nb_renseignement);
709     fgets(mess,400,in);
710     sscanf(mess,"%lf %lf %lf",&(cell->coordpt1[0]),&(cell->coordpt1[1]),&(cell->coordpt1[2]));
711     char *p=strchr(mess,' ')+1;
712     p=strchr(p,' ')+1;
713     for (int l=0;l<nb_renseignement;l++)
714     {
715     double val;
716     p=strchr(p,' ')+1;
717     sscanf(p,"%lf",&val);
718     cell->change_valeur(l,0,val);
719     }
720     fgets(mess,400,in);
721     sscanf(mess,"%lf %lf %lf",&(cell->coordpt2[0]),&(cell->coordpt2[1]),&(cell->coordpt2[2]));
722     p=strchr(mess,' ')+1;
723     p=strchr(p,' ')+1;
724     for (int l=0;l<nb_renseignement;l++)
725     {
726     double val;
727     p=strchr(p,' ')+1;
728     sscanf(p,"%lf",&val);
729     cell->change_valeur(l,1,val);
730     }
731     fgets(mess,400,in);
732     sscanf(mess,"%lf %lf %lf",&(cell->coordpt3[0]),&(cell->coordpt3[1]),&(cell->coordpt3[2]));
733     p=strchr(mess,' ')+1;
734     p=strchr(p,' ')+1;
735     for (int l=0;l<nb_renseignement;l++)
736     {
737     double val;
738     p=strchr(p,' ')+1;
739     sscanf(p,"%lf",&val);
740     cell->change_valeur(l,2,val);
741     }
742     fgets(mess,400,in);
743     sscanf(mess,"%lf %lf %lf",&(cell->coordpt4[0]),&(cell->coordpt4[1]),&(cell->coordpt4[2]));
744     p=strchr(mess,' ')+1;
745     p=strchr(p,' ')+1;
746     for (int l=0;l<nb_renseignement;l++)
747     {
748     double val;
749     p=strchr(p,' ')+1;
750     sscanf(p,"%lf",&val);
751     cell->change_valeur(l,3,val);
752     }
753     fgets(mess,400,in);
754     sscanf(mess,"%lf %lf %lf",&(cell->coordpt5[0]),&(cell->coordpt5[1]),&(cell->coordpt5[2]));
755     p=strchr(mess,' ')+1;
756     p=strchr(p,' ')+1;
757     for (int l=0;l<nb_renseignement;l++)
758     {
759     double val;
760     p=strchr(p,' ')+1;
761     sscanf(p,"%lf",&val);
762     cell->change_valeur(l,4,val);
763     }
764     fgets(mess,400,in);
765     sscanf(mess,"%lf %lf %lf",&(cell->coordpt6[0]),&(cell->coordpt6[1]),&(cell->coordpt6[2]));
766     p=strchr(mess,' ')+1;
767     p=strchr(p,' ')+1;
768     for (int l=0;l<nb_renseignement;l++)
769     {
770     double val;
771     p=strchr(p,' ')+1;
772     sscanf(p,"%lf",&val);
773     cell->change_valeur(l,5,val);
774     }
775     fgets(mess,400,in);
776     sscanf(mess,"%lf %lf %lf",&(cell->coordpt7[0]),&(cell->coordpt7[1]),&(cell->coordpt7[2]));
777     p=strchr(mess,' ')+1;
778     p=strchr(p,' ')+1;
779     for (int l=0;l<nb_renseignement;l++)
780     {
781     double val;
782     p=strchr(p,' ')+1;
783     sscanf(p,"%lf",&val);
784     cell->change_valeur(l,6,val);
785     }
786     fgets(mess,400,in);
787     sscanf(mess,"%lf %lf %lf",&(cell->coordpt8[0]),&(cell->coordpt8[1]),&(cell->coordpt8[2]));
788     p=strchr(mess,' ')+1;
789     p=strchr(p,' ')+1;
790     for (int l=0;l<nb_renseignement;l++)
791     {
792     double val;
793     p=strchr(p,' ')+1;
794     sscanf(p,"%lf",&val);
795     cell->change_valeur(l,7,val);
796     }
797     lst_cellule.insert(lst_cellule.end(),cell);
798     }
799     double xmin,ymin,zmin,xmax,ymax,zmax;
800     for (int i=0;i<nb_noeud;i++)
801     {
802     double *xyz=mai->get_fem_noeud(i)->get_coord();
803     if (i==0)
804     {
805     xmin=xyz[0];
806     xmax=xyz[0];
807     ymin=xyz[1];
808     ymax=xyz[1];
809     zmin=xyz[2];
810     zmax=xyz[2];
811     }
812     else
813     {
814     if (xyz[0]<xmin) xmin=xyz[0];
815     if (xyz[0]>xmax) xmax=xyz[0];
816     if (xyz[1]<ymin) ymin=xyz[1];
817     if (xyz[1]>ymax) ymax=xyz[1];
818     if (xyz[2]<zmin) zmin=xyz[2];
819     if (xyz[2]>zmax) zmax=xyz[2];
820     }
821     }
822     double dx=(xmax-xmin)*0.05;
823     double dy=(ymax-ymin)*0.05;
824     double dz=(zmax-zmin)*0.05;
825     xmin=xmin-dx;
826     ymin=ymin-dy;
827     zmin=zmin-dz;
828     xmax=xmax+dx;
829     ymax=ymax+dy;
830     zmax=zmax+dz;
831     TPL_GRILLE<FEM_NOEUD*> grille;
832     int pas=(int)(pow(nb_noeud,0.33333333333333)+1);
833     grille.initialiser(xmin,ymin,zmin,xmax,ymax,zmax,pas,pas,pas);
834     for (int i=0;i<nb_noeud;i++)
835     {
836     FEM_NOEUD* noeud=mai->get_fem_noeud(i);
837     noeud->change_numero(i);
838     grille.inserer(noeud);
839     }
840     int nb_cell=lst_cellule.size();
841     for (int i=0;i<nb_cell;i++)
842     {
843     celluleaff* cell=lst_cellule[i];
844     double *xyz1=cell->coordpt1;
845     double *xyz7=cell->coordpt7;
846     BOITE_3D boite1(xyz1[0],xyz1[1],xyz1[2],xyz7[0],xyz7[1],xyz7[2]);
847     TPL_MAP_ENTITE<FEM_NOEUD*> lst_noeud;
848     grille.rechercher(boite1.get_xcentre(),boite1.get_ycentre(),boite1.get_zcentre(),boite1.get_rayon(),lst_noeud);
849     int nb_noeud_trouve=lst_noeud.get_nb();
850     for (int j=0;j<nb_noeud_trouve;j++)
851     {
852     FEM_NOEUD* noeud=lst_noeud.get(j);
853     if (noeud->get_boite_3D()*boite1)
854     {
855     double xsi=-1+2*(noeud->get_x()-boite1.get_xmin())/(boite1.get_xmax()-boite1.get_xmin());
856     double eta=-1+2*(noeud->get_y()-boite1.get_ymin())/(boite1.get_ymax()-boite1.get_ymin());
857     double psi=-1+2*(noeud->get_z()-boite1.get_zmin())/(boite1.get_zmax()-boite1.get_zmin());
858     double a1=1+xsi;
859     double b1=1+eta;
860     double c1=1+psi;
861     double a2=1-xsi;
862     double b2=1-eta;
863     double c2=1-psi;
864     double N1=a2*b2*c2;
865     double N3=a1*b1*c2;
866     double N2=a1*b2*c2;
867     double N4=a2*b1*c2;
868     double N5=a2*b2*c1;
869     double N6=a1*b2*c1;
870     double N7=a1*b1*c1;
871     double N8=a2*b1*c1;
872     for (int k=0;k<nb_renseignement;k++)
873     {
874     double valeur1=cell->get_valeur(k,0);
875     double valeur2=cell->get_valeur(k,1);
876     double valeur3=cell->get_valeur(k,2);
877     double valeur4=cell->get_valeur(k,3);
878     double valeur5=cell->get_valeur(k,4);
879     double valeur6=cell->get_valeur(k,5);
880     double valeur7=cell->get_valeur(k,6);
881     double valeur8=cell->get_valeur(k,7);
882     double res=N1*valeur1+N2*valeur2+N3*valeur3+N4*valeur4+N5*valeur5+N6*valeur6+N7*valeur7+N8*valeur8;
883     res=res/8.;
884     sol->ecrire(noeud->get_numero(),k,res);
885     }
886     }
887    
888     }
889     }
890    
891     fclose(in);
892     gest->enregistrer(Caption.c_str());
893     return;
894    
895     }
896     MessageBox(Handle,"Fichier non valide","Erreur",MB_OK);
897     }
898     //---------------------------------------------------------------------------
899