ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/mesh/Fenetre.cpp
Revision: 3
Committed: Tue Jun 12 12:42:51 2007 UTC (17 years, 11 months ago)
File size: 91496 byte(s)
Log Message:

File Contents

# User Rev Content
1 3 //---------------------------------------------------------------------------
2     #include <vcl\vcl.h>
3     #include <process.h>
4     #include <string.h>
5     #include <stdio.h>
6     #include <stdlib.h>
7     #include <math.h>
8     #include <dir.h>
9     #pragma hdrstop
10    
11     #include "Fenetre.h"
12     #include "Edition.h"
13     #include "Igsopt.h"
14     #include "Rigsopt.h"
15     #include "diaopt.h"
16     #include "s_valeur.h"
17     #include "configure.h"
18     #include "aproposde.h"
19     #include "cface.h"
20     #include "tool.h"
21     #include "session.h"
22     #include "infopiece.h"
23     #include "debug.h"
24    
25     extern void trirea(float *a,int *la,int *ir);
26    
27     //---------------------------------------------------------------------------
28     #pragma resource "*.dfm"
29     TFenp *Fenp;
30     //---------------------------------------------------------------------------
31     __fastcall TFenp::TFenp(TComponent* Owner)
32     : TForm(Owner)
33     {
34     }
35     //---------------------------------------------------------------------------
36     void __fastcall TFenp::Fermer1Click(TObject *Sender)
37     {
38     Fenp->Close();
39     }
40     //---------------------------------------------------------------------------
41     void __fastcall TFenp::Ouvre(char *mess)
42     {
43     char messtmp[255],messf[255];
44     char *p,arg1[255],arg2[255],arg3[255],arg4[255];
45     FILE *out;
46     TObject *Sender=NULL;
47    
48     strcpy(Fichier,mess);
49     strcpy(messtmp,"Mesh2000 ");
50     strcat(messtmp,mess);
51     Fenp->Caption=messtmp;
52     if (existetool==1)
53     {
54     Toolbar->Caption="Outil pour "+Fenp->Caption;
55     Toolbar->Invalidate();
56     }
57     Mailleur1->Enabled=True;
58     Remailleur1->Enabled=True;
59     Vue1->Enabled=True;
60     Geometrie1->Checked=false;
61     Maillage1D1->Checked=false;
62     Maillage2D1->Checked=false;
63     Maillage3D1->Checked=false;
64     Maillage3D2->Checked=false;
65     Remaillage2D1->Checked=false;
66     Remaillage3D1->Checked=false;
67     Aucun1->Checked=true;
68     Acismesh1->Enabled=True;
69     Acismesh2->Enabled=True;
70     Paramesh1->Enabled=True;
71     p=strstr(Fichier,".");
72     strcpy(messf,Fichier);
73     messf[strlen(messf)-4]=0;
74     strcat(messf,".geo");
75     out=fopen(messf,"rt");
76     if (strcmp(p,".igs")==0)
77     {
78     Acismesh1->Enabled=False;
79     Acismesh2->Enabled=False;
80     }
81     if (strcmp(p,".sat")==0)
82     {
83     if (out==NULL)
84     {
85     sprintf(arg1,"%s\\acismesh.exe",home);
86     strcpy(arg2,"-fich");
87     sprintf(arg3,"%s",Fichier);
88     strcpy(arg4,"-geo");
89     spawnl(P_WAIT,arg1,arg1,arg2,arg3,arg4,NULL);
90     }
91     Geometrie1->Checked=true;
92     Aucun1->Checked=false;
93     Geometrie1Click(Sender) ;
94     }
95     if (out!=NULL) fclose(out);
96     passe_norme=0;
97     }
98     //---------------------------------------------------------------------------
99     void __fastcall TFenp::wininit()
100     {
101     char mess[255];
102     int i;
103     FILE *out;
104    
105     sprintf(mess,"%s\\mesh.ini",home);
106     out=fopen(mess,"wt");
107     fprintf(out,"[Apparence]\n");
108     fprintf(out,"%d %d %d %d\n",Fenp->Top,Fenp->Left,Fenp->Height,Fenp->Width);
109     if (existetool==1)
110     {
111     Fenp->toolx=Toolbar->Left;
112     Fenp->tooly=Toolbar->Top;
113     }
114     fprintf(out,"%d %d %d %d\n\n",existetool,toolx,tooly,horizon);
115     fprintf(out,"[Directory]\n");
116     fprintf(out,"%s\n",dir_defaut);
117     fprintf(out,"\n");
118     fprintf(out,"[History]\n");
119     fprintf(out,"%d\n",nb_fichier);
120     for (i=0;i<nb_fichier;i++)
121     fprintf(out,"%s\n",ancien_fichier[i]);
122     fprintf(out,"\n");
123     fprintf(out,"[Color]\n");
124     for (i=0;i<12;i++)
125     fprintf(out,"%X\n",Cshade[i]);
126     fprintf(out,"%d\n",uni);
127     fclose(out);
128     }
129     //---------------------------------------------------------------------------
130     void __fastcall TFenp::Ouvrir1Click(TObject *Sender)
131     {
132     char mess[255],*p;
133     int i;
134     TMenuItem *active;
135    
136     OpenDialog1->InitialDir=dir_defaut;
137     if (OpenDialog1->Execute()==true)
138     {
139     strcpy(mess,OpenDialog1->FileName.c_str());
140     Ouvre(mess);
141     nb_fichier++;
142     if (nb_fichier>4) nb_fichier=4;
143     for (i=nb_fichier-1;i>=0;i--)
144     strcpy(ancien_fichier[i+1],ancien_fichier[i]);
145     strcpy(ancien_fichier[0],Fichier);
146     strcpy(dir_defaut,Fichier);
147     p=strrchr(dir_defaut,'\\');
148     dir_defaut[p-dir_defaut]=0;
149     wininit();
150     for (i=0;i<nb_fichier;i++)
151     {
152     if (i==0) active=ancien1;
153     if (i==1) active=ancien2;
154     if (i==2) active=ancien3;
155     if (i==3) active=ancien4;
156     active->Visible=true;
157     active->Caption=ancien_fichier[i];
158     }
159     if (i>0) N5->Visible=true;
160     Invalidate();
161     }
162     }
163    
164     //---------------------------------------------------------------------------
165     void __fastcall TFenp::Igsmesh1Click(TObject *Sender)
166     {
167     char mess[255];
168     char arg1[255];
169     char arg2[255];
170     char arg3[255];
171     char arg4[255];
172     char arg5[255];
173     char arg6[255];
174     char arg7[255];
175     char arg8[255];
176     float dens;
177     int opt=5;
178    
179    
180     Igsoption->Edit2->Text="5";
181     Igsoption->GroupBox1->Caption=Fichier;
182     Igsoption->Label3->Enabled=false;
183     Igsoption->Edit3->Enabled=false;
184     Igsoption->RadioButton1->Enabled=false;
185     Igsoption->RadioButton2->Enabled=false;
186     Igsoption->ShowModal();
187     if (Igsoption->ok==1)
188     {
189     dens=0.;
190     strcpy(mess,Igsoption->Edit1->Text.c_str());
191     sscanf(mess,"%f",&dens);
192     strcpy(mess,Igsoption->Edit2->Text.c_str());
193     sscanf(mess,"%d",&opt);
194     if (Igsoption->CheckBox1->Checked==true) strcpy(arg8,"-analyse"); else strcpy(arg6,"");
195     sprintf(arg1,"%s\\igsmesh.exe",home);
196     strcpy(arg2,"-fich");
197     sprintf(arg3,"%s",Fichier);
198     strcpy(arg4,"-dens");
199     sprintf(arg5,"%f",dens);
200     strcpy(arg6,"-opt");
201     sprintf(arg7,"%d",opt);
202     if (dens>0.) spawnl(P_NOWAIT,arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,NULL);
203     else MessageBox(Handle,"Mauvaise valeur de densite","Erreur",0);
204     }
205     }
206     //---------------------------------------------------------------------------
207     void __fastcall TFenp::FormCreate(TObject *Sender)
208     {
209     FILE *out;
210     int i,drive;
211     int top,height,left,width;
212     char mess[255],nom[255];
213     TMenuItem *active;
214    
215     homo=0.8;
216     loin=1.;
217     passe_norme=0;
218     tete=NULL;
219     Mailleur1->Enabled=False;
220     Vue1->Enabled=False;
221     Acismesh1->Enabled=False;
222     Remailleur1->Enabled=False;
223     Acismesh2->Enabled=False;
224     Paramesh1->Enabled=False;
225     Face1->Enabled=False;
226     Activerlerendu3D1->Enabled=False;
227     Canvas->Pen->Color=clWhite;
228     rot[0][0]=1.;rot[0][1]=0.;rot[0][2]=0.;
229     rot[1][0]=0.;rot[1][1]=1.;rot[1][2]=0.;
230     rot[2][0]=0.;rot[2][1]=0.;rot[2][2]=1.;
231     batch=false;
232     fc=0;
233     uni=0;
234     zoomwin=0;
235     toolx=0;tooly=394;
236     horizon=1;
237     numface=(-1);
238     numero_noeud=(-1);
239     numero_maille=(-1);
240     drive=getdisk();
241     getcurdir(0,mess);
242     for (i=0;i<11;i++) Cshade[i]=clOlive;
243     Cshade[11]=clBlack;
244     sprintf(home,"%c:\\%s",'A'+drive,mess);
245     sprintf(mess,"%s\\mesh.ini",home);
246     out=fopen(mess,"rt");
247     if (out!=NULL)
248     {
249     fgets(mess,255,out);
250     fgets(mess,255,out);
251     sscanf(mess,"%d %d %d %d\n",&top,&left,&height,&width);
252     fgets(mess,255,out);
253     sscanf(mess,"%d %d %d %d\n\n",&tool,&toolx,&tooly,&horizon);
254     fgets(mess,255,out);
255     fgets(mess,255,out);
256     fgets(mess,255,out);
257     sscanf(mess,"%s",dir_defaut);
258     fgets(mess,255,out);
259     fgets(mess,255,out);
260     fgets(mess,255,out);
261     sscanf(mess,"%d",&nb_fichier);
262     if (nb_fichier!=0) N5->Visible=true;
263     for (i=0;i<nb_fichier;i++)
264     {
265     fgets(mess,255,out);
266     sscanf(mess,"%s",nom);
267     if (i==0) active=ancien1;
268     if (i==1) active=ancien2;
269     if (i==2) active=ancien3;
270     if (i==3) active=ancien4;
271     active->Visible=true;
272     active->Caption=nom;
273     strcpy(ancien_fichier[i],nom);
274     }
275     fgets(mess,255,out);
276     fgets(mess,255,out);
277     for (i=0;i<12;i++)
278     {
279     fgets(mess,255,out);
280     sscanf(mess,"%X",&Cshade[i]);
281     }
282     fclose(out);
283     fgets(mess,255,out);
284     sscanf(mess,"%d",&uni);
285     Fenp->Top=top;
286     Fenp->Left=left;
287     Fenp->Height=height;
288     Fenp->Width=width;
289     }
290     }
291     //---------------------------------------------------------------------------
292     void __fastcall TFenp::Vueisometrique1Click(TObject *Sender)
293     {
294     Vueisometrique1->Checked=true;
295     VueXY1->Checked=false;
296     VueXZ1->Checked=false;
297     VueYZ1->Checked=false;
298     rot[0][0]=1.0;rot[1][0]=0.0;rot[2][0]=0.0;
299     rot[0][1]=0.0;rot[1][1]=1.0;rot[2][1]=0.0;
300     rot[0][2]=0.0;rot[1][2]=0.0;rot[2][2]=1.0;
301     norme();
302     Invalidate();
303     }
304     //---------------------------------------------------------------------------
305     void __fastcall TFenp::VueXY1Click(TObject *Sender)
306     {
307     Vueisometrique1->Checked=false;
308     VueXY1->Checked=true;
309     VueXZ1->Checked=false;
310     VueYZ1->Checked=false;
311     rot[0][0]=1.0;rot[1][0]=0.0;rot[2][0]=0.0;
312     rot[0][1]=0.0;rot[1][1]=1.0;rot[2][1]=0.0;
313     rot[0][2]=0.0;rot[1][2]=0.0;rot[2][2]=1.0;
314     norme();
315     Invalidate();
316     }
317     //---------------------------------------------------------------------------
318     void __fastcall TFenp::VueXZ1Click(TObject *Sender)
319     {
320     Vueisometrique1->Checked=false;
321     VueXY1->Checked=false;
322     VueXZ1->Checked=true;
323     VueYZ1->Checked=false;
324     rot[0][0]=1.0;rot[1][0]=0.0;rot[2][0]=0.0;
325     rot[0][1]=0.0;rot[1][1]=1.0;rot[2][1]=0.0;
326     rot[0][2]=0.0;rot[1][2]=0.0;rot[2][2]=1.0;
327     norme();
328     Invalidate();
329     }
330     //---------------------------------------------------------------------------
331     void __fastcall TFenp::VueYZ1Click(TObject *Sender)
332     {
333     Vueisometrique1->Checked=false;
334     VueXY1->Checked=false;
335     VueXZ1->Checked=false;
336     VueYZ1->Checked=true;
337     rot[0][0]=1.0;rot[1][0]=0.0;rot[2][0]=0.0;
338     rot[0][1]=0.0;rot[1][1]=1.0;rot[2][1]=0.0;
339     rot[0][2]=0.0;rot[1][2]=0.0;rot[2][2]=1.0;
340     norme();
341     Invalidate();
342     }
343     //---------------------------------------------------------------------------
344     void __fastcall TFenp::Igsmesh2Click(TObject *Sender)
345     {
346     char mess[255];
347     char arg1[255];
348     char arg2[255];
349     char arg3[255];
350     char arg4[255];
351     char arg5[255];
352     char arg6[255];
353     char arg7[255];
354     char arg8[255];
355     int opt=5;
356    
357    
358     Rigsoption->Edit2->Text="5";
359     Rigsoption->Label3->Enabled=false;
360     Rigsoption->Edit3->Enabled=false;
361     Rigsoption->GroupBox1->Caption=Fichier;
362     Rigsoption->ShowModal();
363     if (Rigsoption->ok==1)
364     {
365     strcpy(mess,Rigsoption->Edit2->Text.c_str());
366     sscanf(mess,"%d",&opt);
367     if (Rigsoption->CheckBox1->Checked==true) strcpy(arg8,"-analyse"); else strcpy(arg8,"");
368     mess[0]=0;
369     strcpy(mess,Rigsoption->Edit1->Text.c_str());
370     sprintf(arg1,"%s\\igsmesh.exe",home);
371     strcpy(arg2,"-fich");
372     sprintf(arg3,"%s",Fichier);
373     strcpy(arg4,"-mesh");
374     strcpy(arg5,mess);
375     strcpy(arg6,"-opt");
376     sprintf(arg7,"%d",opt);
377     if (mess[0]!=0) spawnl(P_NOWAIT,arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,NULL);
378     else MessageBox(Handle,"Pas de fichier modele","Erreur",0);
379     }
380     }
381     //---------------------------------------------------------------------------
382     void __fastcall TFenp::FormPaint(TObject *Sender)
383     {
384     Fenp->Cursor=crHourGlass;
385     Fenp->SetFocus();
386     Fenp->Color=Cshade[11];
387     if (Geometrie1->Checked==true) affiche_geo();
388     if (Maillage1D1->Checked==true) affiche_1D();
389     if (Maillage2D1->Checked==true) affiche_2D();
390     if (Maillage3D1->Checked==true) affiche_3D();
391     if (Maillage3D2->Checked==true) affiche_3D();
392     if (Remaillage2D1->Checked==true) affiche_2D();
393     if (Front3D1->Checked==true) affiche_2D();
394     if (Remaillage3D1->Checked==true) affiche_3D();
395     affiche_axe();
396     Fenp->Cursor=crDefault;
397     }
398     //---------------------------------------------------------------------------
399     void __fastcall TFenp::Mai1Click(TObject *Sender)
400     {
401     FILE *fic;
402     char mess[255];
403     char fich[255];
404    
405     strcpy(fich,Fichier);
406     fich[strlen(fich)-4]=0;
407    
408    
409     strcpy(mess,fich);
410     strcat(mess,".geo");
411     fic=fopen(mess,"rt");
412     if (fic==NULL) Geometrie1->Enabled=false;
413     else
414     {
415     Geometrie1->Enabled=true;
416     fclose(fic);
417     }
418    
419    
420    
421     strcpy(mess,fich);
422     strcat(mess,"_1D.mai");
423     fic=fopen(mess,"rt");
424     if (fic==NULL) Maillage1D1->Enabled=false;
425     else
426     {
427     Maillage1D1->Enabled=true;
428     fclose(fic);
429     }
430    
431    
432     strcpy(mess,fich);
433     strcat(mess,"_2D.mai");
434     fic=fopen(mess,"rt");
435     if (fic==NULL) Maillage2D1->Enabled=false;
436     else
437     {
438     Maillage2D1->Enabled=true;
439     fclose(fic);
440     }
441    
442     strcpy(mess,fich);
443     strcat(mess,"r_2D.mai");
444     fic=fopen(mess,"rt");
445     if (fic==NULL) Remaillage2D1->Enabled=false;
446     else
447     {
448     Remaillage2D1->Enabled=true;
449     fclose(fic);
450     }
451     strcpy(mess,fich);
452     strcat(mess,"_3D.mai");
453     fic=fopen(mess,"rt");
454     if (fic==NULL) Maillage3D1->Enabled=false;
455     else
456     {
457     Maillage3D1->Enabled=true;
458     fclose(fic);
459     }
460     strcpy(mess,fich);
461     strcat(mess,"c_3D.mai");
462     fic=fopen(mess,"rt");
463     if (fic==NULL) Maillage3D2->Enabled=false;
464     else
465     {
466     Maillage3D2->Enabled=true;
467     fclose(fic);
468     }
469     strcpy(mess,fich);
470     strcat(mess,"r_3D.mai");
471     fic=fopen(mess,"rt");
472     if (fic==NULL) Remaillage3D1->Enabled=false;
473     else
474     {
475     Remaillage3D1->Enabled=true;
476     fclose(fic);
477     }
478     strcpy(mess,fich);
479     strcat(mess,"f_2D.mai");
480     fic=fopen(mess,"rt");
481     if (fic==NULL) Front3D1->Enabled=false;
482     else
483     {
484     Front3D1->Enabled=true;
485     fclose(fic);
486     }
487     }
488     //---------------------------------------------------------------------------
489     void __fastcall TFenp::Geometrie1Click(TObject *Sender)
490     {
491     FILE *fic;
492     int i,j,k,nb,nb2;
493     char fich[255];
494     char mess[255];
495     int nb_arete;
496    
497     Geometrie1->Checked=true;
498     Maillage1D1->Checked=false;
499     Front3D1->Checked=false;
500     Maillage2D1->Checked=false;
501     Remaillage2D1->Checked=false;
502     Maillage3D1->Checked=false;
503     Maillage3D2->Checked=false;
504     Remaillage3D1->Checked=false;
505     Face1->Enabled=false;
506     Activerlerendu3D1->Enabled=false;
507     Activerlerendu3D1->Checked=false;
508     Aucun1->Checked=false;
509     if (point!=NULL) free(point);
510     if (segment!=NULL) free(segment);
511     if (triangle!=NULL) free(triangle);
512     if (tetra!=NULL) free(tetra);
513     nb_point=0;point=NULL;
514     nb_segment=0;segment=NULL;
515     nb_triangle=0;triangle=NULL;
516     nb_tetra=0;tetra=NULL;
517     tete=NULL;
518     strcpy(fich,Fichier);
519     fich[strlen(fich)-4]=0;
520     strcat(fich,".geo");
521     fic=fopen(fich,"rt");
522     fgets(mess,255,fic);
523     sscanf(mess,"%d",&nb_arete);
524     for (i=0;i<nb_arete;i++)
525     {
526     fgets(mess,255,fic);
527     sscanf(mess,"%d",&j);
528     nb_point=nb_point+j;
529     nb_segment=nb_segment+j-1;
530     for (k=0;k<j;k++)
531     fgets(mess,255,fic);
532     }
533     fclose(fic);
534     fic=fopen(fich,"rt");
535     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
536     segment=(struct s_segment *)calloc(nb_segment,sizeof(struct s_segment));
537     fgets(mess,255,fic);
538     sscanf(mess,"%d",&nb_arete);
539     nb=0;nb2=0;
540     xpiece=0.;ypiece=0.;zpiece=0.;
541     for (i=0;i<nb_arete;i++)
542     {
543     fgets(mess,255,fic);
544     sscanf(mess,"%d",&j);
545     for (k=0;k<j;k++)
546     {
547     fgets(mess,255,fic);
548     sscanf(mess,"%f %f %f",&point[nb].x,&point[nb].y,&point[nb].z);
549     if (nb==0)
550     {
551     xmin=point[nb].x;
552     xmax=point[nb].x;
553     ymin=point[nb].y;
554     ymax=point[nb].y;
555     zmin=point[nb].z;
556     zmax=point[nb].z;
557     }
558     if (point[nb].x<xmin) xmin=point[nb].x;
559     if (point[nb].x>xmax) xmax=point[nb].x;
560     if (point[nb].y<ymin) ymin=point[nb].y;
561     if (point[nb].y>ymax) ymax=point[nb].y;
562     if (point[nb].z<zmin) zmin=point[nb].z;
563     if (point[nb].z>zmax) zmax=point[nb].z;
564     xpiece=xpiece+point[nb].x;
565     ypiece=ypiece+point[nb].y;
566     zpiece=zpiece+point[nb].z;
567     if (k!=0)
568     {
569     segment[nb2].n1=nb-1;
570     segment[nb2].n2=nb;
571     nb2++;
572     }
573     nb++;
574     }
575     }
576     xpiece=xpiece/nb;
577     ypiece=ypiece/nb;
578     zpiece=zpiece/nb;
579     fclose(fic);
580     if (passe_norme==0)
581     {
582     norme();
583     passe_norme=1;
584     }
585     Invalidate();
586     }
587    
588    
589     //---------------------------------------------------------------------------
590     void __fastcall TFenp::Maillage1D1Click(TObject *Sender)
591     {
592     char fich[255];
593     char mess[255];
594     FILE *fic;
595     int i,j;
596    
597     Geometrie1->Checked=false;
598     Maillage1D1->Checked=true;
599     Front3D1->Checked=false;
600     Maillage2D1->Checked=false;
601     Face1->Enabled=false;
602     Remaillage2D1->Checked=false;
603     Maillage3D1->Checked=false;
604     Maillage3D2->Checked=false;
605     Remaillage3D1->Checked=false;
606     Activerlerendu3D1->Checked=false;
607     Activerlerendu3D1->Enabled=false;
608     Aucun1->Checked=false;
609     if (point!=NULL) free(point);
610     if (segment!=NULL) free(segment);
611     if (triangle!=NULL) free(triangle);
612     if (tetra!=NULL) free(tetra);
613     nb_point=0;point=NULL;
614     nb_segment=0;segment=NULL;
615     nb_triangle=0;triangle=NULL;
616     nb_tetra=0;tetra=NULL;
617     tete=NULL;
618     strcpy(fich,Fichier);
619     fich[strlen(fich)-4]=0;
620     strcat(fich,"_1D.mai");
621     fic=fopen(fich,"rt");
622     fgets(mess,255,fic);
623     sscanf(mess,"%d %d",&nb_point,&nb_segment);
624     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
625     segment=(struct s_segment *)calloc(nb_segment,sizeof(struct s_segment));
626     xpiece=0.;ypiece=0.;zpiece=0.;
627     for (i=0;i<nb_point;i++)
628     {
629     fgets(mess,255,fic);
630     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
631     xpiece=xpiece+point[i].x;
632     ypiece=ypiece+point[i].y;
633     zpiece=zpiece+point[i].z;
634     }
635     xpiece=xpiece/nb_point;
636     ypiece=ypiece/nb_point;
637     zpiece=zpiece/nb_point;
638     for (i=0;i<nb_segment;i++)
639     {
640     fgets(mess,255,fic);
641     sscanf(mess,"%d %d %d",&j,&segment[i].n1,&segment[i].n2);
642     segment[i].n1=segment[i].n1-1;
643     segment[i].n2=segment[i].n2-1;
644     segment[i].num=i;
645     point[segment[i].n1].segment[point[segment[i].n1].nb_segment]=&(segment[i]);
646     point[segment[i].n1].nb_segment++;
647     point[segment[i].n2].segment[point[segment[i].n2].nb_segment]=&(segment[i]);
648     point[segment[i].n2].nb_segment++;
649     }
650     fclose(fic);
651     if (passe_norme==0)
652     {
653     norme();
654     passe_norme=1;
655     }
656     Invalidate();
657     }
658     //---------------------------------------------------------------------------
659     void __fastcall TFenp::Maillage2D1Click(TObject *Sender)
660     {
661     int i,j;
662     FILE *fic;
663     int *test_face,maxface;
664     char fich[255];
665     char mess[255];
666    
667     Geometrie1->Checked=false;
668     Front3D1->Checked=false;
669     Maillage1D1->Checked=false;
670     Maillage2D1->Checked=true;
671     Remaillage2D1->Checked=false;
672     Maillage3D1->Checked=false;
673     Maillage3D2->Checked=false;
674     Remaillage3D1->Checked=false;
675     Activerlerendu3D1->Enabled=false;
676     Activerlerendu3D1->Checked=false;
677     Aucun1->Checked=false;
678     Face1->Enabled=true;
679     Face->ListBox1->Items->Clear();
680     Face->ListBox1->Items->Add("Toutes");
681     Face->ListBox1->ItemIndex=0;
682     Fenp->numface=(-1);
683     if (point!=NULL) free(point);
684     if (segment!=NULL) free(segment);
685     if (triangle!=NULL) free(triangle);
686     if (tetra!=NULL) free(tetra);
687     nb_point=0;point=NULL;
688     nb_segment=0;segment=NULL;
689     nb_triangle=0;triangle=NULL;
690     nb_tetra=0;tetra=NULL;
691     tete=NULL;
692     strcpy(fich,Fichier);
693     fich[strlen(fich)-4]=0;
694     strcat(fich,"_2D.mai");
695     fic=fopen(fich,"rt");
696     fgets(mess,255,fic);
697     sscanf(mess,"%d %d",&nb_point,&nb_triangle);
698     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
699     triangle=(struct s_triangle *)calloc(nb_triangle,sizeof(struct s_triangle));
700     xpiece=0.;ypiece=0.;zpiece=0.;
701     for (i=0;i<nb_point;i++)
702     {
703     fgets(mess,255,fic);
704     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
705     if (i==0)
706     {
707     xmin=point[i].x;
708     xmax=point[i].x;
709     ymin=point[i].y;
710     ymax=point[i].y;
711     zmin=point[i].z;
712     zmax=point[i].z;
713     maxcoord=point[i].x;
714     }
715     if (point[i].x<xmin) xmin=point[i].x;
716     if (point[i].x>xmax) xmax=point[i].x;
717     if (point[i].y<ymin) ymin=point[i].y;
718     if (point[i].y>ymax) ymax=point[i].y;
719     if (point[i].z<zmin) zmin=point[i].z;
720     if (point[i].z>zmax) zmax=point[i].z;
721     if (fabs((double)point[i].x)>maxcoord) maxcoord=(float)fabs((double)point[i].x);
722     if (fabs((double)point[i].y)>maxcoord) maxcoord=(float)fabs((double)point[i].y);
723     if (fabs((double)point[i].z)>maxcoord) maxcoord=(float)fabs((double)point[i].z);
724     xpiece=xpiece+point[i].x;
725     ypiece=ypiece+point[i].y;
726     zpiece=zpiece+point[i].z;
727     }
728     xpiece=xpiece/nb_point;
729     ypiece=ypiece/nb_point;
730     zpiece=zpiece/nb_point;
731     maxface=0;
732     for (i=0;i<nb_triangle;i++)
733     {
734     fgets(mess,255,fic);
735     sscanf(mess,"%d %d %d %d %s %d",&j,&triangle[i].n1,&triangle[i].n2,&triangle[i].n3,&triangle[i].type,&triangle[i].num_ent);
736     triangle[i].n1=triangle[i].n1-1;
737     triangle[i].n2=triangle[i].n2-1;
738     triangle[i].n3=triangle[i].n3-1;
739     triangle[i].num=i;
740     if (triangle[i].num_ent>maxface) maxface=triangle[i].num_ent;
741     point[triangle[i].n1].triangle[point[triangle[i].n1].nb_triangle]=&(triangle[i]);
742     point[triangle[i].n1].nb_triangle++;
743     point[triangle[i].n2].triangle[point[triangle[i].n2].nb_triangle]=&(triangle[i]);
744     point[triangle[i].n2].nb_triangle++;
745     point[triangle[i].n3].triangle[point[triangle[i].n3].nb_triangle]=&(triangle[i]);
746     point[triangle[i].n3].nb_triangle++;
747     }
748     fclose(fic);
749     test_face=(int *)calloc(maxface+1,sizeof(int));
750     for (i=0;i<nb_triangle;i++)
751     test_face[triangle[i].num_ent]=1;
752     for (i=0;i<maxface+1;i++)
753     if (test_face[i]==1)
754     {
755     sprintf(mess,"%d",i);
756     Face->ListBox1->Items->Add(mess);
757     }
758     free(test_face);
759     if (passe_norme==0)
760     {
761     norme();
762     passe_norme=1;
763     }
764     Invalidate();
765     }
766     //---------------------------------------------------------------------------
767     void __fastcall TFenp::Maillage3D1Click(TObject *Sender)
768     {
769     int i,j;
770     FILE *fic;
771     char fich[255];
772     char mess[255];
773    
774    
775     Geometrie1->Checked=false;
776     Maillage1D1->Checked=false;
777     Maillage2D1->Checked=false;
778     Remaillage2D1->Checked=false;
779     Front3D1->Checked=false;
780     Maillage3D1->Checked=true;
781     Maillage3D2->Checked=false;
782     Remaillage3D1->Checked=false;
783     Activerlerendu3D1->Enabled=true;
784     Activerlerendu3D1->Checked=false;
785     Face1->Enabled=false;
786     Aucun1->Checked=false;
787     if (point!=NULL) free(point);
788     if (segment!=NULL) free(segment);
789     if (triangle!=NULL) free(triangle);
790     if (tetra!=NULL) free(tetra);
791     nb_point=0;point=NULL;
792     nb_segment=0;segment=NULL;
793     nb_triangle=0;triangle=NULL;
794     nb_tetra=0;tetra=NULL;
795     tete=NULL;
796     strcpy(fich,Fichier);
797     fich[strlen(fich)-4]=0;
798     strcat(fich,"_3D.mai");
799     fic=fopen(fich,"rt");
800     fgets(mess,255,fic);
801     sscanf(mess,"%d %d",&nb_point,&nb_tetra);
802     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
803     tetra=(struct s_tetra *)calloc(nb_tetra,sizeof(struct s_tetra));
804     xpiece=0.;ypiece=0.;zpiece=0.;
805     for (i=0;i<nb_point;i++)
806     {
807     fgets(mess,255,fic);
808     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
809     if (i==0)
810     {
811     xmin=point[i].x;
812     xmax=point[i].x;
813     ymin=point[i].y;
814     ymax=point[i].y;
815     zmin=point[i].z;
816     zmax=point[i].z;
817     maxcoord=point[i].x;
818     }
819     if (point[i].x<xmin) xmin=point[i].x;
820     if (point[i].x>xmax) xmax=point[i].x;
821     if (point[i].y<ymin) ymin=point[i].y;
822     if (point[i].y>ymax) ymax=point[i].y;
823     if (point[i].z<zmin) zmin=point[i].z;
824     if (point[i].z>zmax) zmax=point[i].z;
825     if (fabs((double)point[i].x)>maxcoord) maxcoord=(float)fabs((double)point[i].x);
826     if (fabs((double)point[i].y)>maxcoord) maxcoord=(float)fabs((double)point[i].y);
827     if (fabs((double)point[i].z)>maxcoord) maxcoord=(float)fabs((double)point[i].z);
828     xpiece=xpiece+point[i].x;
829     ypiece=ypiece+point[i].y;
830     zpiece=zpiece+point[i].z;
831     }
832     xpiece=xpiece/nb_point;
833     ypiece=ypiece/nb_point;
834     zpiece=zpiece/nb_point;
835     for (i=0;i<nb_tetra;i++)
836     {
837     fgets(mess,255,fic);
838     sscanf(mess,"%d %d %d %d %d",&j,&tetra[i].n1,&tetra[i].n2,&tetra[i].n3,&tetra[i].n4);
839     tetra[i].n1=tetra[i].n1-1;
840     tetra[i].n2=tetra[i].n2-1;
841     tetra[i].n3=tetra[i].n3-1;
842     tetra[i].n4=tetra[i].n4-1;
843     tetra[i].num=i;
844     point[tetra[i].n1].tetra[point[tetra[i].n1].nb_tetra]=&(tetra[i]);
845     point[tetra[i].n1].nb_tetra++;
846     point[tetra[i].n2].tetra[point[tetra[i].n2].nb_tetra]=&(tetra[i]);
847     point[tetra[i].n2].nb_tetra++;
848     point[tetra[i].n3].tetra[point[tetra[i].n3].nb_tetra]=&(tetra[i]);
849     point[tetra[i].n3].nb_tetra++;
850     point[tetra[i].n4].tetra[point[tetra[i].n4].nb_tetra]=&(tetra[i]);
851     point[tetra[i].n4].nb_tetra++;
852     }
853     fclose(fic);
854     if (passe_norme==0)
855     {
856     norme();
857     passe_norme=1;
858     }
859     Invalidate();
860     }
861     //---------------------------------------------------------------------------
862     void __fastcall TFenp::Aucun1Click(TObject *Sender)
863     {
864     Geometrie1->Checked=false;
865     Maillage1D1->Checked=false;
866     Front3D1->Checked=false;
867     Maillage2D1->Checked=false;
868     Remaillage2D1->Checked=false;
869     Maillage3D1->Checked=false;
870     Maillage3D2->Checked=false;
871     Remaillage3D1->Checked=false;
872     Aucun1->Checked=true;
873     Face1->Enabled=false;
874     if (point!=NULL) free(point);
875     if (segment!=NULL) free(segment);
876     if (triangle!=NULL) free(triangle);
877     if (tetra!=NULL) free(tetra);
878     nb_point=0;point=NULL;
879     nb_segment=0;segment=NULL;
880     nb_triangle=0;triangle=NULL;
881     nb_tetra=0;tetra=NULL;
882     Invalidate();
883     }
884     //---------------------------------------------------------------------------
885     void __fastcall TFenp::norme(void)
886     {
887     int i,xc,yc;
888     float zoomx,zoomy;
889     int xcmax,ycmin,ycmax,xcmin;
890    
891     for (i=0;i<nb_point;i++)
892     {
893     projection(point[i].x,point[i].y,point[i].z,&xc,&yc,0);
894     if (i==0)
895     {
896     xcmax=xc;
897     xcmin=xc;
898     ycmax=yc;
899     ycmin=yc;
900     }
901     if (xc>xcmax) xcmax=xc;
902     if (yc>ycmax) ycmax=yc;
903     if (xc<xcmin) xcmin=xc;
904     if (yc<ycmin) ycmin=yc;
905     }
906     xcmax++;xcmin--;
907     ycmax++;ycmin--;
908     if (xcmax!=xcmin) zoomx=Fenp->ClientWidth*1./(xcmax-xcmin); else zoomx=1E30;
909     if (ycmax!=ycmin) zoomy=Fenp->ClientHeight*1./(ycmax-ycmin); else zoomy=1E30;
910     if (zoomx>zoomy) zoom=zoomy; else zoom=zoomx;
911     zoom=zoom/1.15;
912     xcentre=(Fenp->ClientWidth/2.-zoom*(xcmin+xcmax)/2.);
913     ycentre=(Fenp->ClientHeight/2.-zoom*(ycmin+ycmax)/2.);
914     }
915     //---------------------------------------------------------------------------
916     void __fastcall TFenp::projection(float x,float y,float z,int *xc,int *yc,int complete)
917     {
918     float alpha,calpha,salpha,xx,yy;
919    
920    
921     if (Vueisometrique1->Checked==true)
922     {
923     alpha=PI/6.;
924     calpha=(float)cos((double)alpha);
925     salpha=(float)sin((double)alpha);
926     xx=(-calpha*rot[0][0]+calpha*rot[1][0])*x
927     +(-calpha*rot[0][1]+calpha*rot[1][1])*y
928     +(-calpha*rot[0][2]+calpha*rot[1][2])*z;
929     yy=(salpha*rot[0][0]+salpha*rot[1][0]-rot[2][0])*x
930     +(salpha*rot[0][1]+salpha*rot[1][1]-rot[2][1])*y
931     +(salpha*rot[0][2]+salpha*rot[1][2]-rot[2][2])*z;
932     }
933     if (VueXY1->Checked==true)
934     {
935     xx=rot[0][0]*x+rot[1][0]*y+rot[2][0]*z;
936     yy=(-(rot[0][1]*x+rot[1][1]*y+rot[2][1]*z));
937     }
938     if (VueXZ1->Checked==true)
939     {
940     xx=rot[0][0]*x+rot[1][0]*y+rot[2][0]*z;
941     yy=(-(rot[0][2]*x+rot[1][2]*y+rot[2][2]*z));
942     }
943     if (VueYZ1->Checked==true)
944     {
945     xx=rot[0][1]*x+rot[1][1]*y+rot[2][1]*z;
946     yy=(-(rot[0][2]*x+rot[1][2]*y+rot[2][2]*z));
947     }
948     if (complete==1)
949     {
950     xx=xx*zoom+xcentre;
951     yy=yy*zoom+ycentre;
952     }
953     if (complete==2)
954     {
955     xx=xx*zoom_p+xcentre_p;
956     yy=yy*zoom_p+ycentre_p;
957     }
958     *xc=(int)xx;
959     *yc=(int)yy;
960     }
961     //---------------------------------------------------------------------------
962    
963     void __fastcall TFenp::FormResize(TObject *Sender)
964     {
965     if (Aucun1->Checked==false)
966     {
967     norme();
968     Invalidate();
969     }
970     }
971     //---------------------------------------------------------------------------
972     void __fastcall TFenp::affiche_geo(void)
973     {
974     int i,n1,n2;
975     float x1,x2,y1,y2,z1,z2;
976     int xc1,xc2,yc1,yc2;
977    
978     Fenp->Canvas->Pen->Color=clWhite;
979     for (i=0;i<nb_segment;i++)
980     {
981     n1=segment[i].n1;
982     n2=segment[i].n2;
983     x1=point[n1].x;
984     y1=point[n1].y;
985     z1=point[n1].z;
986     x2=point[n2].x;
987     y2=point[n2].y;
988     z2=point[n2].z;
989     projection(x1,y1,z1,&xc1,&yc1,1);
990     projection(x2,y2,z2,&xc2,&yc2,1);
991     Fenp->Canvas->MoveTo(xc1,yc1);
992     Fenp->Canvas->LineTo(xc2,yc2);
993     }
994     }
995     //---------------------------------------------------------------------------
996     void __fastcall TFenp::affiche_1D(void)
997     {
998     int i,n1,n2;
999     float x1,x2,y1,y2,z1,z2;
1000     int xc1,xc2,yc1,yc2;
1001     char mess[20];
1002    
1003     Fenp->Canvas->Pen->Color=clRed;
1004     Fenp->Canvas->Font->Color=clFuchsia;
1005     for (i=0;i<nb_point;i++)
1006     {
1007     x1=point[i].x;
1008     y1=point[i].y;
1009     z1=point[i].z;
1010     projection(x1,y1,z1,&xc1,&yc1,1);
1011     Fenp->Canvas->MoveTo(xc1-2,yc1);
1012     Fenp->Canvas->LineTo(xc1+2,yc1);
1013     Fenp->Canvas->MoveTo(xc1,yc1-2);
1014     Fenp->Canvas->LineTo(xc1,yc1+2);
1015     SetBkMode(Fenp->Canvas->Handle,TRANSPARENT);
1016     if (Noeud1->Checked==true)
1017     {
1018     sprintf(mess,"%d",i);
1019     Fenp->Canvas->TextOut(xc1+2,yc1+2,mess);
1020     }
1021     }
1022     Fenp->Canvas->Font->Color=clYellow;
1023     for (i=0;i<nb_segment;i++)
1024     {
1025     if ((segment[i].select==0)&& (Debug1->Checked)) continue;
1026     n1=segment[i].n1;
1027     n2=segment[i].n2;
1028     x1=point[n1].x;
1029     y1=point[n1].y;
1030     z1=point[n1].z;
1031     x2=point[n2].x;
1032     y2=point[n2].y;
1033     z2=point[n2].z;
1034     projection(x1,y1,z1,&xc1,&yc1,1);
1035     projection(x2,y2,z2,&xc2,&yc2,1);
1036     Fenp->Canvas->MoveTo(xc1,yc1);
1037     Fenp->Canvas->LineTo(xc2,yc2);
1038     SetBkMode(Fenp->Canvas->Handle,TRANSPARENT);
1039     if (Maille2->Checked==true)
1040     {
1041     sprintf(mess,"%d",i);
1042     Fenp->Canvas->TextOut((int)((xc1+xc2)*0.5),(int)((yc1+yc2)*0.5),mess);
1043     }
1044     }
1045     if (numero_noeud>=0)
1046     {
1047     Fenp->Canvas->Font->Color=clWhite;
1048     x1=point[numero_noeud].x;
1049     y1=point[numero_noeud].y;
1050     z1=point[numero_noeud].z;
1051     projection(x1,y1,z1,&xc1,&yc1,1);
1052     sprintf(mess,"%d",numero_noeud);
1053     Fenp->Canvas->TextOut(xc1+2,yc1+2,mess);
1054     }
1055     if (numero_maille>=0)
1056     {
1057     Fenp->Canvas->Font->Color=clWhite;
1058     n1=segment[numero_maille].n1;
1059     n2=segment[numero_maille].n2;
1060     x1=point[n1].x;
1061     y1=point[n1].y;
1062     z1=point[n1].z;
1063     x2=point[n2].x;
1064     y2=point[n2].y;
1065     z2=point[n2].z;
1066     projection(x1,y1,z1,&xc1,&yc1,1);
1067     projection(x2,y2,z2,&xc2,&yc2,1);
1068     sprintf(mess,"%d",numero_maille);
1069     Fenp->Canvas->TextOut((int)((xc1+xc2)*0.5),(int)((yc1+yc2)*0.5),mess);
1070     }
1071     }
1072     //---------------------------------------------------------------------------
1073     void __fastcall TFenp::affiche_2D(void)
1074     {
1075     int i,n1,n2,n3;
1076     float x1,x2,y1,y2,z1,z2,x3,y3,z3;
1077     float ab[3],ac[3],g[3],crit;
1078     int xc1,xc2,yc1,yc2,xc3,yc3;
1079     TRect r;
1080     char mess[20];
1081    
1082     if (fc==1)
1083     {
1084     affiche_reel();
1085     return;
1086     }
1087     Fenp->Canvas->Pen->Color=clRed;
1088     if (Eclatee1->Checked==true) Fenp->Canvas->Pen->Color=clOlive;
1089     for (i=0;i<nb_triangle;i++)
1090     {
1091     if ((triangle[i].num_ent==numface) || (numface==(-1)))
1092     {
1093     if ((triangle[i].select==0) && (Debug1->Checked)) continue;
1094     n1=triangle[i].n1;
1095     n2=triangle[i].n2;
1096     n3=triangle[i].n3;
1097     x1=point[n1].x;
1098     y1=point[n1].y;
1099     z1=point[n1].z;
1100     x2=point[n2].x;
1101     y2=point[n2].y;
1102     z2=point[n2].z;
1103     x3=point[n3].x;
1104     y3=point[n3].y;
1105     z3=point[n3].z;
1106     if (Normal1->Checked==false)
1107     {
1108     if (Qualite1->Checked==true)
1109     {
1110     crit=crit_cal2d(n1,n2,n3);
1111     if (crit>0.5) Fenp->Canvas->Pen->Color=clLime;
1112     else if (crit>0.2) Fenp->Canvas->Pen->Color=clBlue;
1113     else if (crit>0.1) Fenp->Canvas->Pen->Color=clRed;
1114     else Fenp->Canvas->Pen->Color=clMaroon;
1115     }
1116     ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
1117     ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
1118     g[0]=x1+0.33333*(ab[0]+ac[0]);
1119     g[1]=y1+0.33333*(ab[1]+ac[1]);
1120     g[2]=z1+0.33333*(ab[2]+ac[2]);
1121     x1=g[0]+homo*(x1-g[0]);y1=g[1]+homo*(y1-g[1]);z1=g[2]+homo*(z1-g[2]);
1122     x2=g[0]+homo*(x2-g[0]);y2=g[1]+homo*(y2-g[1]);z2=g[2]+homo*(z2-g[2]);
1123     x3=g[0]+homo*(x3-g[0]);y3=g[1]+homo*(y3-g[1]);z3=g[2]+homo*(z3-g[2]);
1124     }
1125     projection(x1,y1,z1,&xc1,&yc1,1);
1126     projection(x2,y2,z2,&xc2,&yc2,1);
1127     projection(x3,y3,z3,&xc3,&yc3,1);
1128     Fenp->Canvas->MoveTo(xc1,yc1);
1129     Fenp->Canvas->LineTo(xc2,yc2);
1130     Fenp->Canvas->LineTo(xc3,yc3);
1131     Fenp->Canvas->LineTo(xc1,yc1);
1132     Fenp->Canvas->Font->Color=clFuchsia;
1133     SetBkMode(Fenp->Canvas->Handle,TRANSPARENT);
1134     if (Noeud1->Checked==true)
1135     {
1136     sprintf(mess,"%d",n1);
1137     projection(point[n1].x,point[n1].y,point[n1].z,&xc1,&yc1,1);
1138     Fenp->Canvas->TextOut(xc1+2,yc1+2,mess);
1139     sprintf(mess,"%d",n2);
1140     projection(point[n2].x,point[n2].y,point[n2].z,&xc2,&yc2,1);
1141     Fenp->Canvas->TextOut(xc2+2,yc2+2,mess);
1142     sprintf(mess,"%d",n3);
1143     projection(point[n3].x,point[n3].y,point[n3].z,&xc3,&yc3,1);
1144     Fenp->Canvas->TextOut(xc3+2,yc3+2,mess);
1145     }
1146     Fenp->Canvas->Font->Color=clYellow;
1147     if (Maille2->Checked==true)
1148     {
1149     sprintf(mess,"%d",i);
1150     Fenp->Canvas->TextOut((int)((xc1+xc2+xc3)*0.333333),(int)((yc1+yc2+yc3)*0.33333333),mess);
1151     }
1152     }
1153     }
1154     if (Qualite1->Checked==true)
1155     {
1156     Fenp->Canvas->TextOut(10,95,"Qualite");
1157     Fenp->Canvas->Brush->Color=clLime;
1158     r.Left=5;r.Top=113;r.Bottom=120;r.Right=15;
1159     Fenp->Canvas->FillRect(r);
1160     Fenp->Canvas->Brush->Color=clBlue;
1161     r.Left=5;r.Top=125;r.Bottom=132;r.Right=15;
1162     Fenp->Canvas->FillRect(r);
1163     Fenp->Canvas->Brush->Color=clRed;
1164     r.Left=5;r.Top=137;r.Bottom=144;r.Right=15;
1165     Fenp->Canvas->FillRect(r);
1166     Fenp->Canvas->Brush->Color=clMaroon;
1167     r.Left=5;r.Top=149;r.Bottom=156;r.Right=15;
1168     Fenp->Canvas->FillRect(r);
1169     Fenp->Canvas->Brush->Color=clBlack;
1170     Fenp->Canvas->TextOut(20,110,"Bonne");
1171     Fenp->Canvas->TextOut(20,122,"Moyenne");
1172     Fenp->Canvas->TextOut(20,134,"Passable");
1173     Fenp->Canvas->TextOut(20,146,"Mediocre");
1174     }
1175     if (numero_noeud>=0)
1176     {
1177     Fenp->Canvas->Font->Color=clWhite;
1178     x1=point[numero_noeud].x;
1179     y1=point[numero_noeud].y;
1180     z1=point[numero_noeud].z;
1181     projection(x1,y1,z1,&xc1,&yc1,1);
1182     sprintf(mess,"%d",numero_noeud);
1183     Fenp->Canvas->TextOut(xc1+2,yc1+2,mess);
1184     }
1185     if (numero_maille>=0)
1186     {
1187     Fenp->Canvas->Font->Color=clWhite;
1188     n1=triangle[numero_maille].n1;
1189     n2=triangle[numero_maille].n2;
1190     n3=triangle[numero_maille].n3;
1191     x1=point[n1].x;
1192     y1=point[n1].y;
1193     z1=point[n1].z;
1194     x2=point[n2].x;
1195     y2=point[n2].y;
1196     z2=point[n2].z;
1197     x3=point[n3].x;
1198     y3=point[n3].y;
1199     z3=point[n3].z;
1200     projection(x1,y1,z1,&xc1,&yc1,1);
1201     projection(x2,y2,z2,&xc2,&yc2,1);
1202     projection(x3,y3,z3,&xc3,&yc3,1);
1203     sprintf(mess,"%d",numero_maille);
1204     Fenp->Canvas->TextOut((int)((xc1+xc2+xc3)*0.333333),(int)((yc1+yc2+yc3)*0.33333333),mess);
1205     }
1206    
1207     }
1208     //---------------------------------------------------------------------------
1209     void __fastcall TFenp::affiche_3D(void)
1210     {
1211     int i,n1,n2,n3,n4;
1212     float x1,x2,y1,y2,z1,z2,x3,y3,z3,x4,y4,z4;
1213     float ab[3],ac[3],ad[3],g[3],crit;
1214     int xc1,xc2,yc1,yc2,xc3,yc3,xc4,yc4;
1215     char mess[20];
1216     TRect r;
1217    
1218     if ((Activerlerendu3D1->Checked==true)&&(fc==1))
1219     {
1220     affiche_reel();
1221     return;
1222     }
1223     Fenp->Canvas->Pen->Color=clRed;
1224     if (Eclatee1->Checked==true) Fenp->Canvas->Pen->Color=clOlive;
1225     for (i=0;i<nb_tetra;i++)
1226     {
1227     if ((tetra[i].select==0)&& (Debug1->Checked)) continue;
1228     n1=tetra[i].n1;
1229     n2=tetra[i].n2;
1230     n3=tetra[i].n3;
1231     n4=tetra[i].n4;
1232     x1=point[n1].x;
1233     y1=point[n1].y;
1234     z1=point[n1].z;
1235     x2=point[n2].x;
1236     y2=point[n2].y;
1237     z2=point[n2].z;
1238     x3=point[n3].x;
1239     y3=point[n3].y;
1240     z3=point[n3].z;
1241     x4=point[n4].x;
1242     y4=point[n4].y;
1243     z4=point[n4].z;
1244     if (Normal1->Checked==false)
1245     {
1246     if (Qualite1->Checked==true)
1247     {
1248     crit=crit_cal3d(n1,n2,n3,n4);
1249     if (crit>0.5) Fenp->Canvas->Pen->Color=clLime;
1250     else if (crit>0.2) Fenp->Canvas->Pen->Color=clBlue;
1251     else if (crit>0.1) Fenp->Canvas->Pen->Color=clRed;
1252     else Fenp->Canvas->Pen->Color=clMaroon;
1253     }
1254     ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
1255     ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
1256     ad[0]=x4-x1;ad[1]=y4-y1;ad[2]=z4-z1;
1257     g[0]=x1+0.25*(ab[0]+ac[0]+ad[0]);
1258     g[1]=y1+0.25*(ab[1]+ac[1]+ad[1]);
1259     g[2]=z1+0.25*(ab[2]+ac[2]+ad[2]);
1260     x1=g[0]+homo*(x1-g[0]);y1=g[1]+homo*(y1-g[1]);z1=g[2]+homo*(z1-g[2]);
1261     x2=g[0]+homo*(x2-g[0]);y2=g[1]+homo*(y2-g[1]);z2=g[2]+homo*(z2-g[2]);
1262     x3=g[0]+homo*(x3-g[0]);y3=g[1]+homo*(y3-g[1]);z3=g[2]+homo*(z3-g[2]);
1263     x4=g[0]+homo*(x4-g[0]);y4=g[1]+homo*(y4-g[1]);z4=g[2]+homo*(z4-g[2]);
1264     }
1265     projection(x1,y1,z1,&xc1,&yc1,1);
1266     projection(x2,y2,z2,&xc2,&yc2,1);
1267     projection(x3,y3,z3,&xc3,&yc3,1);
1268     projection(x4,y4,z4,&xc4,&yc4,1);
1269     Fenp->Canvas->MoveTo(xc1,yc1);
1270     Fenp->Canvas->LineTo(xc2,yc2);
1271     Fenp->Canvas->LineTo(xc3,yc3);
1272     Fenp->Canvas->LineTo(xc1,yc1);
1273     Fenp->Canvas->MoveTo(xc4,yc4);
1274     Fenp->Canvas->LineTo(xc1,yc1);
1275     Fenp->Canvas->MoveTo(xc4,yc4);
1276     Fenp->Canvas->LineTo(xc2,yc2);
1277     Fenp->Canvas->MoveTo(xc4,yc4);
1278     Fenp->Canvas->LineTo(xc3,yc3);
1279     Fenp->Canvas->Font->Color=clFuchsia;
1280     SetBkMode(Fenp->Canvas->Handle,TRANSPARENT);
1281     if (Noeud1->Checked==true)
1282     {
1283     sprintf(mess,"%d",n1);
1284     Fenp->Canvas->TextOut(xc1+2,yc1+2,mess);
1285     sprintf(mess,"%d",n2);
1286     Fenp->Canvas->TextOut(xc2+2,yc2+2,mess);
1287     sprintf(mess,"%d",n3);
1288     Fenp->Canvas->TextOut(xc3+2,yc3+2,mess);
1289     sprintf(mess,"%d",n4);
1290     Fenp->Canvas->TextOut(xc4+2,yc4+2,mess);
1291     }
1292     Fenp->Canvas->Font->Color=clYellow;
1293     if (Maille2->Checked==true)
1294     {
1295     sprintf(mess,"%d",i);
1296     Fenp->Canvas->TextOut((int)((xc1+xc2+xc3+xc4)*0.25),(int)((yc1+yc2+yc3+yc4)*0.25),mess);
1297     }
1298     }
1299     if (Qualite1->Checked==true)
1300     {
1301     Fenp->Canvas->TextOut(10,95,"Qualite");
1302     Fenp->Canvas->Brush->Color=clLime;
1303     r.Left=5;r.Top=113;r.Bottom=120;r.Right=15;
1304     Fenp->Canvas->FillRect(r);
1305     Fenp->Canvas->Brush->Color=clBlue;
1306     r.Left=5;r.Top=125;r.Bottom=132;r.Right=15;
1307     Fenp->Canvas->FillRect(r);
1308     Fenp->Canvas->Brush->Color=clRed;
1309     r.Left=5;r.Top=137;r.Bottom=144;r.Right=15;
1310     Fenp->Canvas->FillRect(r);
1311     Fenp->Canvas->Brush->Color=clMaroon;
1312     r.Left=5;r.Top=149;r.Bottom=156;r.Right=15;
1313     Fenp->Canvas->FillRect(r);
1314     Fenp->Canvas->Brush->Color=clBlack;
1315     Fenp->Canvas->TextOut(20,110,"Bonne");
1316     Fenp->Canvas->TextOut(20,122,"Moyenne");
1317     Fenp->Canvas->TextOut(20,134,"Passable");
1318     Fenp->Canvas->TextOut(20,146,"Mediocre");
1319     }
1320     if (numero_noeud>=0)
1321     {
1322     Fenp->Canvas->Font->Color=clWhite;
1323     x1=point[numero_noeud].x;
1324     y1=point[numero_noeud].y;
1325     z1=point[numero_noeud].z;
1326     projection(x1,y1,z1,&xc1,&yc1,1);
1327     sprintf(mess,"%d",numero_noeud);
1328     Fenp->Canvas->TextOut(xc1+2,yc1+2,mess);
1329     }
1330     if (numero_maille>=0)
1331     {
1332     Fenp->Canvas->Font->Color=clWhite;
1333     n1=tetra[numero_maille].n1;
1334     n2=tetra[numero_maille].n2;
1335     n3=tetra[numero_maille].n3;
1336     n4=tetra[numero_maille].n4;
1337     x1=point[n1].x;
1338     y1=point[n1].y;
1339     z1=point[n1].z;
1340     x2=point[n2].x;
1341     y2=point[n2].y;
1342     z2=point[n2].z;
1343     x3=point[n3].x;
1344     y3=point[n3].y;
1345     z3=point[n3].z;
1346     x4=point[n4].x;
1347     y4=point[n4].y;
1348     z4=point[n4].z;
1349     projection(x1,y1,z1,&xc1,&yc1,1);
1350     projection(x2,y2,z2,&xc2,&yc2,1);
1351     projection(x3,y3,z3,&xc3,&yc3,1);
1352     projection(x4,y4,z4,&xc4,&yc4,1);
1353     sprintf(mess,"%d",numero_maille);
1354     Fenp->Canvas->TextOut((int)((xc1+xc2+xc3+xc4)*0.25),(int)((yc1+yc2+yc3+yc4)*0.25),mess);
1355     }
1356    
1357    
1358     }
1359     //---------------------------------------------------------------------------
1360     void __fastcall TFenp::affiche_reel(void)
1361     {
1362     int *iordre;
1363     float *distance;
1364     int xpoint[8];
1365     TPoint ypoint[8];
1366     float xe,ye,ze,xee,yee,zee;
1367     float xa,ya,za;
1368     float xb,yb,zb;
1369     float xc,yc,zc;
1370     float xg,yg,zg;
1371     float nx,ny,nz;
1372     float g[4];
1373     char mess[20];
1374     struct s_triangle *tri;
1375     static float dismin,dismax;
1376     float diff;
1377     static float arot[3][3]={{-1.,-1.,-1.},{-1.,-1.,-1.},{-1.,-1.,-1.}};
1378     int i;
1379     int pareil,color;
1380    
1381     pareil=0;
1382     if (tete!=NULL)
1383     if (arot[0][0]==rot[0][0])
1384     if (arot[1][0]==rot[1][0])
1385     if (arot[2][0]==rot[2][0])
1386     if (arot[0][1]==rot[0][1])
1387     if (arot[1][1]==rot[1][1])
1388     if (arot[2][1]==rot[2][1])
1389     if (arot[0][2]==rot[0][2])
1390     if (arot[1][2]==rot[1][2])
1391     if (arot[2][2]==rot[2][2]) pareil=1;
1392    
1393     if (pareil==0)
1394     {
1395     tete=NULL;
1396     arot[0][0]=rot[0][0];
1397     arot[1][0]=rot[1][0];
1398     arot[2][0]=rot[2][0];
1399     arot[0][1]=rot[0][1];
1400     arot[1][1]=rot[1][1];
1401     arot[2][1]=rot[2][1];
1402     arot[0][2]=rot[0][2];
1403     arot[1][2]=rot[1][2];
1404     arot[2][2]=rot[2][2];
1405     /* oeuil */
1406     xe=1000.*maxcoord-0.5*(xmin+xmax);
1407     ye=1000.*maxcoord-0.5*(ymin+ymax);
1408     ze=1000.*maxcoord-0.5*(zmin+zmax);
1409     /* oeuil dans le repere local */
1410     xee=rot[0][0]*xe+rot[1][0]*ye+rot[2][0]*ze;
1411     yee=rot[0][1]*xe+rot[1][1]*ye+rot[2][1]*ze;
1412     zee=rot[0][2]*xe+rot[1][2]*ye+rot[2][2]*ze;
1413     iordre=(int *)calloc(nb_triangle+1,sizeof(int));
1414     distance=(float *)calloc(nb_triangle+1,sizeof(float));
1415     for (i=0;i<nb_triangle;i++)
1416     {
1417     triangle[i].dis=0.;
1418     triangle[i].suivant=NULL;
1419     xa=point[triangle[i].n1].x;
1420     ya=point[triangle[i].n1].y;
1421     za=point[triangle[i].n1].z;
1422     xb=point[triangle[i].n2].x;
1423     yb=point[triangle[i].n2].y;
1424     zb=point[triangle[i].n2].z;
1425     xc=point[triangle[i].n3].x;
1426     yc=point[triangle[i].n3].y;
1427     zc=point[triangle[i].n3].z;
1428     xg=0.333333*(xa+xb+xc);
1429     yg=0.333333*(ya+yb+yc);
1430     zg=0.333333*(za+zb+zc);
1431     triangle[i].dis=(xee-xg)*(xee-xg)+(yee-yg)*(yee-yg)+(zee-zg)*(zee-zg);
1432     if (i==0)
1433     {
1434     dismin=triangle[i].dis;
1435     dismax=triangle[i].dis;
1436     }
1437     else
1438     {
1439     if (triangle[i].dis<dismin) dismin=triangle[i].dis;
1440     if (triangle[i].dis>dismax) dismax=triangle[i].dis;
1441     }
1442     nx=(yb-ya)*(zc-za)-(zb-za)*(yc-ya);
1443     ny=(xc-xa)*(zb-za)-(xb-xa)*(zc-za);
1444     nz=(xb-xa)*(yc-ya)-(yb-ya)*(xc-xa);
1445     triangle[i].angle=(float)((nx*(xee-xg)+ny*(yee-yg)+nz*(zee-zg))/sqrt((double)((nx*nx+ny*ny+nz*nz)*((xee-xg)*(xee-xg)+(yee-yg)*(yee-yg)+(zee-zg)*(zee-zg)))));
1446     if (triangle[i].angle>=1.) triangle[i].angle=0.99999999;
1447     if (triangle[i].angle<=(-1.)) triangle[i].angle=(-0.99999999);
1448     distance[i]=triangle[i].dis;
1449     iordre[i]=i+1;
1450     }
1451     trirea(distance,&(nb_triangle),iordre);
1452     diff=dismax-dismin;
1453     dismin=dismin-0.025*diff;
1454     dismax=dismax+0.025*diff;
1455     }
1456     Fenp->Canvas->Pen->Color=Cshade[0];
1457     if (ContourInactif1->Checked==true) Fenp->Canvas->Pen->Style=psClear;
1458     Fenp->Canvas->Brush->Color=Cshade[1];
1459     for (i=nb_triangle-1;i>(-1);i--)
1460     {
1461     tri=&(triangle[iordre[i]-1]);
1462     if ((tri->select==0)&& (Debug1->Checked)) continue;
1463    
1464     if (((tri->num_ent==numface) || (numface==(-1))&&(tri->dis-dismin*loin-(1.-loin)*dismax>0.)))
1465     {
1466     xa=point[tri->n1].x;
1467     ya=point[tri->n1].y;
1468     za=point[tri->n1].z;
1469     xb=point[tri->n2].x;
1470     yb=point[tri->n2].y;
1471     zb=point[tri->n2].z;
1472     xc=point[tri->n3].x;
1473     yc=point[tri->n3].y;
1474     zc=point[tri->n3].z;
1475     if (Normal1->Checked==false)
1476     {
1477     g[0]=0.33333*(xa+xb+xc);
1478     g[1]=0.33333*(ya+yb+yc);
1479     g[2]=0.33333*(za+zb+zc);
1480     xa=g[0]+homo*(xa-g[0]);ya=g[1]+homo*(ya-g[1]);za=g[2]+homo*(za-g[2]);
1481     xb=g[0]+homo*(xb-g[0]);yb=g[1]+homo*(yb-g[1]);zb=g[2]+homo*(zb-g[2]);
1482     xc=g[0]+homo*(xc-g[0]);yc=g[1]+homo*(yc-g[1]);zc=g[2]+homo*(zc-g[2]);
1483     }
1484     projection(xa,ya,za,&xpoint[0],&xpoint[1],1);
1485     projection(xb,yb,zb,&xpoint[2],&xpoint[3],1);
1486     projection(xc,yc,zc,&xpoint[4],&xpoint[5],1);
1487     ypoint[0].x=xpoint[0];
1488     ypoint[0].y=xpoint[1];
1489     ypoint[1].x=xpoint[2];
1490     ypoint[1].y=xpoint[3];
1491     ypoint[2].x=xpoint[4];
1492     ypoint[2].y=xpoint[5];
1493     color=(int)(-10*fabs((double)(tri->angle))+10);
1494     if (color>10) color=10;
1495     if (color<1) color=1;
1496     Fenp->Canvas->Brush->Color=Cshade[color];
1497     Fenp->Canvas->Polygon(ypoint,2);
1498     Fenp->Canvas->Font->Color=clFuchsia;
1499     SetBkMode(Fenp->Canvas->Handle,TRANSPARENT);
1500     if (Noeud1->Checked==true)
1501     {
1502     sprintf(mess,"%d",tri->n1);
1503     Fenp->Canvas->TextOut(xpoint[0]+2,xpoint[1]+2,mess);
1504     sprintf(mess,"%d",tri->n2);
1505     Fenp->Canvas->TextOut(xpoint[2]+2,xpoint[3]+2,mess);
1506     sprintf(mess,"%d",tri->n3);
1507     Fenp->Canvas->TextOut(xpoint[4]+2,xpoint[5]+2,mess);
1508     }
1509     if (tri->n1==numero_noeud)
1510     {
1511     Fenp->Canvas->Font->Color=clWhite;
1512     sprintf(mess,"%d",tri->n1);
1513     Fenp->Canvas->TextOut(xpoint[0]+2,xpoint[1]+2,mess);
1514     }
1515     if (tri->n2==numero_noeud)
1516     {
1517     Fenp->Canvas->Font->Color=clWhite;
1518     sprintf(mess,"%d",tri->n2);
1519     Fenp->Canvas->TextOut(xpoint[2]+2,xpoint[3]+2,mess);
1520     }
1521     if (tri->n3==numero_noeud)
1522     {
1523     Fenp->Canvas->Font->Color=clWhite;
1524     sprintf(mess,"%d",tri->n3);
1525     Fenp->Canvas->TextOut(xpoint[4]+2,xpoint[5]+2,mess);
1526     }
1527     if (tri->num!=numero_maille) Fenp->Canvas->Font->Color=clYellow;
1528     else
1529     {
1530     Fenp->Canvas->Font->Color=clWhite;
1531     sprintf(mess,"%d",tri->num);
1532     Fenp->Canvas->TextOut((int)((xpoint[0]+xpoint[2]+xpoint[4])*0.333333),(int)((xpoint[1]+xpoint[3]+xpoint[5])*0.33333333),mess);
1533     }
1534     if (Maille2->Checked==true)
1535     {
1536     sprintf(mess,"%d",tri->num);
1537     Fenp->Canvas->TextOut((int)((xpoint[0]+xpoint[2]+xpoint[4])*0.333333),(int)((xpoint[1]+xpoint[3]+xpoint[5])*0.33333333),mess);
1538     }
1539     }
1540     }
1541     Fenp->Canvas->Pen->Style=psSolid;
1542     free(iordre);
1543     free(distance);
1544     }
1545     //---------------------------------------------------------------------------
1546     void __fastcall TFenp::FormKeyDown(TObject *Sender, WORD &Key,TShiftState Shift)
1547     {
1548     char mess[100];
1549     float val;
1550     int nb_maille;
1551    
1552     if (Key==112)
1553     {
1554     zoom=zoom*1.1;
1555     xcentre=(Fenp->ClientWidth/2.-1.1*(Fenp->ClientWidth/2.-xcentre));
1556     ycentre=(Fenp->ClientHeight/2.-1.1*(Fenp->ClientHeight/2.-ycentre));
1557     Invalidate();
1558     }
1559     if (Key==113)
1560     {
1561     zoom=zoom*0.90909090;
1562     xcentre=(Fenp->ClientWidth/2.-0.90909090*(Fenp->ClientWidth/2.-xcentre));
1563     ycentre=(Fenp->ClientHeight/2.-0.90909090*(Fenp->ClientHeight/2.-ycentre));
1564     Invalidate();
1565     }
1566     if (Key==114)
1567     {
1568     rot[0][0]=1.0;rot[1][0]=0.0;rot[2][0]=0.0;
1569     rot[0][1]=0.0;rot[1][1]=1.0;rot[2][1]=0.0;
1570     rot[0][2]=0.0;rot[1][2]=0.0;rot[2][2]=1.0;
1571     norme();
1572     Invalidate();
1573     }
1574     if (Key==115)
1575     {
1576     norme();
1577     Invalidate();
1578     }
1579     if (Key==116)
1580     {
1581     if (fc==1) fc=0; else fc=1;
1582     Invalidate();
1583     }
1584     if (Key==37)
1585     {
1586     xcentre=xcentre-4;
1587     Invalidate();
1588     }
1589     if (Key==39)
1590     {
1591     xcentre=xcentre+4;
1592     Invalidate();
1593     }
1594     if (Key==38)
1595     {
1596     ycentre=ycentre-4;
1597     Invalidate();
1598     }
1599     if (Key==40)
1600     {
1601     ycentre=ycentre+4;
1602     Invalidate();
1603     }
1604     if (Key==45)
1605     {
1606     rotation(0.1,1);
1607     Invalidate();
1608     }
1609     if (Key==46)
1610     {
1611     rotation(-0.1,1);
1612     Invalidate();
1613     }
1614     if (Key==36)
1615     {
1616     rotation(0.1,2);
1617     Invalidate();
1618     }
1619     if (Key==35)
1620     {
1621     rotation(-0.1,2);
1622     Invalidate();
1623     }
1624     if (Key==33)
1625     {
1626     rotation(0.1,3);
1627     Invalidate();
1628     }
1629     if (Key==34)
1630     {
1631     rotation(-0.1,3);
1632     Invalidate();
1633     }
1634     if (Key==109)
1635     {
1636     homo=homo/1.1;
1637     if (homo<0.0001) homo=0.0001;
1638     Invalidate();
1639     }
1640     if (Key==107)
1641     {
1642     homo=homo*1.1;
1643     if (homo>1.) homo=1.;
1644     Invalidate();
1645     }
1646     if (Key==105)
1647     {
1648     loin=1.;
1649     Toolbar->TrackBar1->Position=(int)(loin*100.);
1650     Invalidate();
1651     }
1652     if (Key==106)
1653     {
1654     loin=loin+0.01;
1655     if (loin>1.2) loin=1.2;
1656     else
1657     {
1658     if (existetool==1)
1659     {
1660     Toolbar->TrackBar1->Position=(int)(loin*100.);
1661     }
1662     Invalidate();
1663     }
1664     }
1665     if (Key==111)
1666     {
1667     loin=loin-0.01;
1668     if (loin<0.) loin=0.;
1669     else
1670     {
1671     if (existetool==1)
1672     {
1673     Toolbar->TrackBar1->Position=(int)(loin*100.);
1674     }
1675     Invalidate();
1676     }
1677     }
1678     if (Key==120)
1679     {
1680     strcpy(info,"Valeur du zoom ?");
1681     Valeur->ShowModal();
1682     strcpy(mess,Valeur->Edit1->Text.c_str());
1683     sscanf(mess,"%f",&val);
1684     zoom=zoom*val;
1685     xcentre=(Fenp->ClientWidth/2.-val*(Fenp->ClientWidth/2.-xcentre));
1686     ycentre=(Fenp->ClientHeight/2.-val*(Fenp->ClientHeight/2.-ycentre));
1687     Invalidate();
1688     }
1689     if (Key==121)
1690     {
1691     strcpy(info,"Valeur de la rotation suivant x ?");
1692     Valeur->ShowModal();
1693     strcpy(mess,Valeur->Edit1->Text.c_str());
1694     sscanf(mess,"%f",&val);
1695     rotation(val/180.*PI,1);
1696     Invalidate();
1697     }
1698     if (Key==122)
1699     {
1700     strcpy(info,"Valeur de la rotation suivant y ?");
1701     Valeur->ShowModal();
1702     strcpy(mess,Valeur->Edit1->Text.c_str());
1703     sscanf(mess,"%f",&val);
1704     rotation(val/180.*PI,2);
1705     Invalidate();
1706     }
1707     if (Key==123)
1708     {
1709     strcpy(info,"Valeur de la rotation suivant z ?");
1710     Valeur->ShowModal();
1711     strcpy(mess,Valeur->Edit1->Text.c_str());
1712     sscanf(mess,"%f",&val);
1713     rotation(val/180.*PI,3);
1714     Invalidate();
1715     }
1716     if (Key==117)
1717     {
1718     sprintf(info,"numero de noeud a afficher (0-%d)?",nb_point);
1719     Valeur->ShowModal();
1720     strcpy(mess,Valeur->Edit1->Text.c_str());
1721     sscanf(mess,"%d",&numero_noeud);
1722     if (numero_noeud>=nb_point) numero_noeud=nb_point;
1723     Invalidate();
1724     }
1725     if (Key==118)
1726     {
1727     nb_maille=nb_segment+nb_triangle+nb_tetra;
1728     sprintf(info,"numero de maille a afficher (0-%d)?",nb_maille);
1729     Valeur->ShowModal();
1730     strcpy(mess,Valeur->Edit1->Text.c_str());
1731     sscanf(mess,"%d",&numero_maille);
1732     if (numero_maille>=nb_maille) numero_maille=nb_maille;
1733     Invalidate();
1734     }
1735     if (Key==119)
1736     {
1737     strcpy(info,"Valeur de l'echelle ?");
1738     sprintf(mess,"%f",zoom);
1739     Valeur->Edit1->Text=mess;
1740     Valeur->ShowModal();
1741     strcpy(mess,Valeur->Edit1->Text.c_str());
1742     sscanf(mess,"%f",&zoom);
1743     Invalidate();
1744     }
1745    
1746    
1747     }
1748     //---------------------------------------------------------------------------
1749     void __fastcall TFenp::rotation(float angle,int type)
1750     {
1751     float resut[3][3],mrot[3][3],cangle,sangle;
1752     int xtmp,ytmp,xtmp2,ytmp2;
1753    
1754     cangle=(float)cos((double)angle);
1755     sangle=(float)sin((double)angle);
1756    
1757     projection(xpiece,ypiece,zpiece,&xtmp,&ytmp,1);
1758     if (type==1)
1759     {
1760     mrot[0][0]=1.;mrot[0][1]=0.;mrot[0][2]=0.;
1761     mrot[1][0]=0.;mrot[1][1]=cangle;mrot[1][2]=(-sangle);
1762     mrot[2][0]=0.;mrot[2][1]=sangle;mrot[2][2]=cangle;
1763     }
1764     if (type==2)
1765     {
1766     mrot[0][0]=cangle;mrot[0][1]=0.;mrot[0][2]=sangle;
1767     mrot[1][0]=0.;mrot[1][1]=1.;mrot[1][2]=0.;
1768     mrot[2][0]=(-sangle);mrot[2][1]=0.;mrot[2][2]=cangle;
1769     }
1770     if (type==3)
1771     {
1772     mrot[0][0]=cangle;mrot[0][1]=(-sangle);mrot[0][2]=0.;
1773     mrot[1][0]=sangle;mrot[1][1]=cangle;mrot[1][2]=0.;
1774     mrot[2][0]=0.;mrot[2][1]=0.;mrot[2][2]=1.;
1775     }
1776     resut[0][0]=rot[0][0]*mrot[0][0]+rot[0][1]*mrot[1][0]+rot[0][2]*mrot[2][0];
1777     resut[0][1]=rot[0][0]*mrot[0][1]+rot[0][1]*mrot[1][1]+rot[0][2]*mrot[2][1];
1778     resut[0][2]=rot[0][0]*mrot[0][2]+rot[0][1]*mrot[1][2]+rot[0][2]*mrot[2][2];
1779     resut[1][0]=rot[1][0]*mrot[0][0]+rot[1][1]*mrot[1][0]+rot[1][2]*mrot[2][0];
1780     resut[1][1]=rot[1][0]*mrot[0][1]+rot[1][1]*mrot[1][1]+rot[1][2]*mrot[2][1];
1781     resut[1][2]=rot[1][0]*mrot[0][2]+rot[1][1]*mrot[1][2]+rot[1][2]*mrot[2][2];
1782     resut[2][0]=rot[2][0]*mrot[0][0]+rot[2][1]*mrot[1][0]+rot[2][2]*mrot[2][0];
1783     resut[2][1]=rot[2][0]*mrot[0][1]+rot[2][1]*mrot[1][1]+rot[2][2]*mrot[2][1];
1784     resut[2][2]=rot[2][0]*mrot[0][2]+rot[2][1]*mrot[1][2]+rot[2][2]*mrot[2][2];
1785     rot[0][0]=resut[0][0];
1786     rot[1][0]=resut[1][0];
1787     rot[2][0]=resut[2][0];
1788     rot[0][1]=resut[0][1];
1789     rot[1][1]=resut[1][1];
1790     rot[2][1]=resut[2][1];
1791     rot[0][2]=resut[0][2];
1792     rot[1][2]=resut[1][2];
1793     rot[2][2]=resut[2][2];
1794     projection(xpiece,ypiece,zpiece,&xtmp2,&ytmp2,1);
1795     xcentre=xcentre+xtmp-xtmp2;
1796     ycentre=ycentre+ytmp-ytmp2;
1797     }
1798    
1799     void __fastcall TFenp::Normal1Click(TObject *Sender)
1800     {
1801     Normal1->Checked=true;
1802     Eclatee1->Checked=false;
1803     Qualite1->Checked=false;
1804     Invalidate();
1805     }
1806     //---------------------------------------------------------------------------
1807     void __fastcall TFenp::Eclatee1Click(TObject *Sender)
1808     {
1809     Normal1->Checked=false;
1810     Eclatee1->Checked=true;
1811     Qualite1->Checked=false;
1812     Invalidate();
1813    
1814     }
1815     //---------------------------------------------------------------------------
1816     void __fastcall TFenp::Qualite1Click(TObject *Sender)
1817     {
1818     Normal1->Checked=false;
1819     Eclatee1->Checked=false;
1820     Qualite1->Checked=true;
1821     Invalidate();
1822     }
1823     //---------------------------------------------------------------------------
1824     float __fastcall TFenp::crit_cal2d(int n1,int n2,int n3)
1825     {
1826     float x1,y1,z1,x2,y2,z2,x3,y3,z3,crits;
1827     double p,ab[3],ac[3],cb[3],dac,dab,dcb,dmax,crit;
1828    
1829     x1=point[n1].x;y1=point[n1].y;z1=point[n1].z;
1830     x2=point[n2].x;y2=point[n2].y;z2=point[n2].z;
1831     x3=point[n3].x;y3=point[n3].y;z3=point[n3].z;
1832     ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
1833     ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
1834     cb[0]=x2-x3;cb[1]=y2-y3;cb[2]=z2-z3;
1835     dab=sqrt(ab[0]*ab[0]+ab[1]*ab[1]+ab[2]*ab[2]);
1836     dac=sqrt(ac[0]*ac[0]+ac[1]*ac[1]+ac[2]*ac[2]);
1837     dcb=sqrt(cb[0]*cb[0]+cb[1]*cb[1]+cb[2]*cb[2]);
1838     dmax=dab;
1839     if (dac>dmax)dmax=dac;
1840     if (dcb>dmax)dmax=dcb;
1841     p=0.5*(dac+dab+dcb);
1842     crit = (p-dac)*(p-dab)*(p-dcb)/p ;
1843     crit = sqrt(crit) ;
1844     crit = crit /dmax ;
1845     crit = crit * 3.464101614 ;
1846     crits=(float)crit;
1847     return(crits);
1848     }
1849     //---------------------------------------------------------------------------
1850     float __fastcall TFenp::crit_cal3d(int n1,int n2,int n3,int n4)
1851     {
1852     float x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,crits;
1853     double ab[4],ac[4],cb[4],dac,dab,dcb,dmax,crit;
1854     double db[4],da[4],dc[4],dda,ddb,ddc,pvec[4],vol,som;
1855    
1856     x1=point[n1].x;y1=point[n1].y;z1=point[n1].z;
1857     x2=point[n2].x;y2=point[n2].y;z2=point[n2].z;
1858     x3=point[n3].x;y3=point[n3].y;z3=point[n3].z;
1859     x4=point[n4].x;y4=point[n4].y;z4=point[n4].z;
1860     ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
1861     ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
1862     cb[0]=x2-x3;cb[1]=y2-y3;cb[2]=z2-z3;
1863     db[0]=x2-x4;db[1]=y2-y4;db[2]=z2-z4;
1864     da[0]=x1-x4;da[1]=y1-y4;da[2]=z1-z4;
1865     dc[0]=x3-x4;dc[1]=y3-y4;dc[2]=z3-z4;
1866     dab=sqrt(ab[0]*ab[0]+ab[1]*ab[1]+ab[2]*ab[2]);
1867     dac=sqrt(ac[0]*ac[0]+ac[1]*ac[1]+ac[2]*ac[2]);
1868     dcb=sqrt(cb[0]*cb[0]+cb[1]*cb[1]+cb[2]*cb[2]);
1869     ddb=sqrt(db[0]*db[0]+db[1]*db[1]+db[2]*db[2]);
1870     dda=sqrt(da[0]*da[0]+da[1]*da[1]+da[2]*da[2]);
1871     ddc=sqrt(dc[0]*dc[0]+dc[1]*dc[1]+dc[2]*dc[2]);
1872     dmax=dab;
1873     if (dac>dmax)dmax=dac;
1874     if (dcb>dmax)dmax=dcb;
1875     if (ddb>dmax)dmax=ddb;
1876     if (dda>dmax)dmax=dda;
1877     if (ddc>dmax)dmax=ddc;
1878     PVEC(pvec,ab,ac);
1879     vol=pvec[0]*da[0]+pvec[1]*da[1]+pvec[2]*da[2];
1880     if (vol>0.) return(0.);
1881     vol=fabs(vol);
1882     NORME(pvec);
1883     som=pvec[3]/2.;
1884     PVEC(pvec,ab,da);
1885     NORME(pvec);
1886     som=som+pvec[3]/2.;
1887     PVEC(pvec,ac,dc);
1888     NORME(pvec);
1889     som=som+pvec[3]/2.;
1890     PVEC(pvec,cb,db);
1891     NORME(pvec);
1892     som=som+pvec[3]/2.;
1893     crit = vol/som ;
1894     crit = (crit/dmax)/0.408249 ;
1895     crits=(float)crit;
1896     return(crits) ;
1897     }
1898     //---------------------------------------------------------------------------
1899     void __fastcall TFenp::affiche_axe(void)
1900     {
1901     int xc,yc;
1902    
1903     Fenp->Canvas->Pen->Color=clBlue;
1904     projection(25.,0.,0.,&xc,&yc,0);
1905     Fenp->Canvas->MoveTo(45,45);
1906     Fenp->Canvas->LineTo(45+xc,45+yc);
1907     Fenp->Canvas->Pen->Color=clRed;
1908     projection(0.,25.,0.,&xc,&yc,0);
1909     Fenp->Canvas->MoveTo(45,45);
1910     Fenp->Canvas->LineTo(45+xc,45+yc);
1911     Fenp->Canvas->Pen->Color=clWhite;
1912     projection(0.,0.,25.,&xc,&yc,0);
1913     Fenp->Canvas->MoveTo(45,45);
1914     Fenp->Canvas->LineTo(45+xc,45+yc);
1915     }
1916     //---------------------------------------------------------------------------
1917    
1918     void __fastcall TFenp::FormMouseDown(TObject *Sender, TMouseButton Button,
1919     TShiftState Shift, int X, int Y)
1920     {
1921     if (Button==mbRight)
1922     {
1923     trans=1;
1924     xtmp=X;
1925     ytmp=Y;
1926     }
1927     }
1928     //---------------------------------------------------------------------------
1929     void __fastcall TFenp::FormMouseUp(TObject *Sender, TMouseButton Button,
1930     TShiftState Shift, int X, int Y)
1931     {
1932     if (Button==mbRight)
1933     {
1934     if (trans==1)
1935     {
1936     xcentre=xcentre+X-xtmp;
1937     ycentre=ycentre+Y-ytmp;
1938     Invalidate();
1939     }
1940     trans=0;
1941     }
1942     }
1943     //---------------------------------------------------------------------------
1944     void __fastcall TFenp::Noeud1Click(TObject *Sender)
1945     {
1946     if (Noeud1->Checked==true) Noeud1->Checked=false; else Noeud1->Checked=true;
1947     Invalidate();
1948     }
1949     //---------------------------------------------------------------------------
1950     void __fastcall TFenp::Maille2Click(TObject *Sender)
1951     {
1952     if (Maille2->Checked==true) Maille2->Checked=false; else Maille2->Checked=true;
1953     Invalidate();
1954     }
1955     //---------------------------------------------------------------------------
1956     void __fastcall TFenp::ancien1Click(TObject *Sender)
1957     {
1958     Ouvre(ancien_fichier[0]);
1959     Invalidate();
1960     }
1961     //---------------------------------------------------------------------------
1962     void __fastcall TFenp::ancien2Click(TObject *Sender)
1963     {
1964     Ouvre(ancien_fichier[1]);
1965     Invalidate();
1966     }
1967     //---------------------------------------------------------------------------
1968     void __fastcall TFenp::ancien3Click(TObject *Sender)
1969     {
1970     Ouvre(ancien_fichier[2]);
1971     Invalidate();
1972     }
1973     //---------------------------------------------------------------------------
1974     void __fastcall TFenp::ancien4Click(TObject *Sender)
1975     {
1976     Ouvre(ancien_fichier[3]);
1977     Invalidate();
1978     }
1979     //---------------------------------------------------------------------------
1980     void __fastcall TFenp::Acismesh1Click(TObject *Sender)
1981     {
1982     char mess[255];
1983     char arg1[255];
1984     char arg2[255];
1985     char arg3[255];
1986     char arg4[255];
1987     char arg5[255];
1988     char arg6[255];
1989     char arg7[255];
1990     char arg8[255];
1991     char arg9[255];
1992     char arg10[255];
1993     float dens,epsilon;
1994     int opt=5;
1995    
1996     epsilon=0.;
1997     Igsoption->Edit2->Text="5";
1998     Igsoption->GroupBox1->Caption=Fichier;
1999     Igsoption->Label3->Enabled=true;
2000     Igsoption->Edit3->Enabled=true;
2001     Igsoption->RadioButton1->Enabled=true;
2002     Igsoption->RadioButton2->Enabled=true;
2003     Igsoption->ShowModal();
2004     if (Igsoption->ok==1)
2005     {
2006     dens=0.;
2007     strcpy(mess,Igsoption->Edit1->Text.c_str());
2008     sscanf(mess,"%f",&dens);
2009     strcpy(mess,Igsoption->Edit2->Text.c_str());
2010     sscanf(mess,"%d",&opt);
2011     strcpy(mess,Igsoption->Edit3->Text.c_str());
2012     sscanf(mess,"%f",&epsilon);
2013     if (Igsoption->CheckBox1->Checked==true) strcpy(arg10,"-analyse"); else strcpy(arg10,"");
2014     if (Igsoption->RadioButton1->Checked==true) epsilon=(-epsilon);
2015     sprintf(arg1,"%s\\acismesh.exe",home);
2016     strcpy(arg2,"-fich");
2017     sprintf(arg3,"%s",Fichier);
2018     strcpy(arg4,"-dens");
2019     sprintf(arg5,"%f",dens);
2020     strcpy(arg6,"-opti2d");
2021     sprintf(arg7,"%d",opt);
2022     strcpy(arg8,"-epsilon");
2023     sprintf(arg9,"%f",epsilon);
2024     if ((epsilon<0.0001)&&(Igsoption->RadioButton2->Checked==true)) MessageBox(Handle,"Mauvaise valeur de epsilon","Erreur",0);
2025     else if ((epsilon>(-0.0001))&&(Igsoption->RadioButton1->Checked==true)) MessageBox(Handle,"Mauvaise valeur de epsilon","Erreur",0);
2026     else if (dens<0.0001) MessageBox(Handle,"Mauvaise valeur de densite","Erreur",0);
2027     else if (batch==false) spawnl(P_NOWAIT,arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,NULL);
2028     else fprintf(f_batch,"%s %s %s %s %s %s %s %s %s %s\n",arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
2029     }
2030     }
2031     //---------------------------------------------------------------------------
2032     void __fastcall TFenp::Acismesh2Click(TObject *Sender)
2033     {
2034     char mess[255];
2035     char arg1[255];
2036     char arg2[255];
2037     char arg3[255];
2038     char arg4[255];
2039     char arg5[255];
2040     char arg6[255];
2041     char arg7[255];
2042     char arg8[255];
2043     char arg9[255];
2044     char arg10[255];
2045     int opt=5;
2046     float zone;
2047    
2048     zone=0.;
2049     Rigsoption->Label3->Enabled=true;
2050     Rigsoption->Edit3->Enabled=true;
2051     Rigsoption->CheckBox1->Enabled=true;
2052     Rigsoption->Edit3->Text="1";
2053     Rigsoption->Edit2->Text="5";
2054     Rigsoption->GroupBox1->Caption=Fichier;
2055     Rigsoption->ShowModal();
2056     if (Rigsoption->ok==1)
2057     {
2058     strcpy(mess,Rigsoption->Edit2->Text.c_str());
2059     sscanf(mess,"%d",&opt);
2060     strcpy(mess,Rigsoption->Edit3->Text.c_str());
2061     sscanf(mess,"%f",&zone);
2062     if (Rigsoption->CheckBox1->Checked==true) strcpy(arg10,"-analyse"); else strcpy(arg10,"");
2063     mess[0]=0;
2064     strcpy(mess,Rigsoption->Edit1->Text.c_str());
2065     sprintf(arg1,"%s\\acismesh.exe",home);
2066     strcpy(arg2,"-fich");
2067     sprintf(arg3,"%s",Fichier);
2068     strcpy(arg4,"-mesh");
2069     strcpy(arg5,mess);
2070     strcpy(arg6,"-opti2d");
2071     sprintf(arg7,"%d",opt);
2072     strcpy(arg8,"-zone");
2073     sprintf(arg9,"%f",zone);
2074     chdir(home);
2075     if (zone<=0.0001) MessageBox(Handle,"Mauvaise valeur de zone","Erreur",0);
2076     else if (mess[0]==0) MessageBox(Handle,"Pas de fichier modele","Erreur",0);
2077     else if (batch==false) spawnl(P_NOWAIT,arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,NULL);
2078     else fprintf(f_batch,"%s %s %s %s %s %s %s %s %s %s \n",arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
2079     }
2080    
2081     }
2082     //---------------------------------------------------------------------------
2083     void __fastcall TFenp::Face1Click(TObject *Sender)
2084     {
2085     Face->ShowModal();
2086     Invalidate();
2087     }
2088     //---------------------------------------------------------------------------
2089     void __fastcall TFenp::Mailleur1Click(TObject *Sender)
2090     {
2091     char fich[255],mess[255];
2092     FILE *fic;
2093    
2094     Diamesh1->Enabled=false;
2095     if (batch==true) Diamesh1->Enabled=true;
2096     if (Acismesh1->Enabled==true)
2097     {
2098     strcpy(fich,Fichier);
2099     fich[strlen(fich)-4]=0;
2100     strcpy(mess,fich);
2101     strcat(mess,"_2D.mai");
2102     fic=fopen(mess,"rt");
2103     if (fic!=NULL)
2104     {
2105     Diamesh1->Enabled=true;
2106     fclose(fic);
2107     }
2108     }
2109     }
2110     //---------------------------------------------------------------------------
2111     void __fastcall TFenp::Diamesh1Click(TObject *Sender)
2112     {
2113     char arg1[255];
2114     char arg2[255];
2115     char arg3[255];
2116     char arg4[255];
2117     char arg5[255];
2118    
2119     Diaoption->GroupBox1->Caption=Fichier;
2120     Diaoption->CheckBox1->Enabled=true;
2121     Diaoption->ShowModal();
2122     if (Diaoption->ok==1)
2123     {
2124     sprintf(arg1,"%s\\diamesh.exe",home);
2125     strcpy(arg2,"-file");
2126     sprintf(arg3,"%s",Fichier);
2127     arg3[strlen(arg3)-4]=0;
2128     strcat(arg3,"_2D.mai");
2129     if (Diaoption->CheckBox1->Checked==true) strcpy(arg4,"-skin"); else strcpy(arg4,"");
2130     if (Diaoption->CheckBox2->Checked==true) strcpy(arg5,"-nosmooth"); else strcpy(arg5,"");
2131     if (batch==false) spawnl(P_NOWAIT,arg1,arg1,arg2,arg3,arg4,arg5,NULL);
2132     else fprintf(f_batch,"%s %s %s %s %s\n",arg1,arg1,arg2,arg3,arg4,arg5);
2133     }
2134    
2135     }
2136     //---------------------------------------------------------------------------
2137     void __fastcall TFenp::Aproposde2Click(TObject *Sender)
2138     {
2139     Application->CreateForm(__classid(Tsignature), &signature);
2140     signature->Left=Fenp->Left+29;
2141     signature->Top=Fenp->Top+37;
2142     signature->ShowModal();
2143    
2144     }
2145     //---------------------------------------------------------------------------
2146     void __fastcall TFenp::ConfigureShade1Click(TObject *Sender)
2147     {
2148     Application->CreateForm(__classid(TCcolor), &Ccolor);
2149     Ccolor->Left=(int)((Screen->Width-Ccolor->Width)/2.);
2150     Ccolor->Top=(int)((Screen->Height-Ccolor->Height)/2.);
2151     Ccolor->ShowModal();
2152     Invalidate();
2153     }
2154     //---------------------------------------------------------------------------
2155     void __fastcall TFenp::Toolbar1Click(TObject *Sender)
2156     {
2157     Affichetoolbar();
2158     }
2159     //---------------------------------------------------------------------------
2160     void __fastcall TFenp::Affichetoolbar(void)
2161     {
2162     if (existetool==0)
2163     {
2164     Application->CreateForm(__classid(TToolbar), &Toolbar);
2165     Toolbar->Show();
2166     }
2167     }
2168    
2169     void __fastcall TFenp::FormShow(TObject *Sender)
2170     {
2171     static pass=0;
2172     if ((tool==1) && (pass==0))
2173     {
2174     pass=1;
2175     Affichetoolbar();
2176     }
2177     }
2178     //---------------------------------------------------------------------------
2179     void __fastcall TFenp::Enregistrerconfiguration1Click(TObject *Sender)
2180     {
2181     wininit();
2182     }
2183     //---------------------------------------------------------------------------
2184     void __fastcall TFenp::Remaillage3D1Click(TObject *Sender)
2185     {
2186     int i,j;
2187     FILE *fic;
2188     char fich[255];
2189     char mess[255];
2190    
2191     Geometrie1->Checked=false;
2192     Front3D1->Checked=false;
2193     Maillage1D1->Checked=false;
2194     Maillage2D1->Checked=false;
2195     Remaillage2D1->Checked=false;
2196     Maillage3D1->Checked=false;
2197     Maillage3D2->Checked=false;
2198     Remaillage3D1->Checked=true;
2199     Face1->Enabled=false;
2200     Aucun1->Checked=false;
2201     Activerlerendu3D1->Enabled=true;
2202     Activerlerendu3D1->Checked=false;
2203     if (point!=NULL) free(point);
2204     if (segment!=NULL) free(segment);
2205     if (triangle!=NULL) free(triangle);
2206     if (tetra!=NULL) free(tetra);
2207     nb_point=0;point=NULL;
2208     nb_segment=0;segment=NULL;
2209     nb_triangle=0;triangle=NULL;
2210     nb_tetra=0;tetra=NULL;
2211     tete=NULL;
2212     strcpy(fich,Fichier);
2213     fich[strlen(fich)-4]=0;
2214     strcat(fich,"r_3D.mai");
2215     fic=fopen(fich,"rt");
2216     fgets(mess,255,fic);
2217     sscanf(mess,"%d %d",&nb_point,&nb_tetra);
2218     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
2219     tetra=(struct s_tetra *)calloc(nb_tetra,sizeof(struct s_tetra));
2220     xpiece=0.;ypiece=0.;zpiece=0.;
2221     for (i=0;i<nb_point;i++)
2222     {
2223     fgets(mess,255,fic);
2224     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
2225     if (i==0)
2226     {
2227     xmin=point[i].x;
2228     xmax=point[i].x;
2229     ymin=point[i].y;
2230     ymax=point[i].y;
2231     zmin=point[i].z;
2232     zmax=point[i].z;
2233     maxcoord=point[i].x;
2234     }
2235     if (point[i].x<xmin) xmin=point[i].x;
2236     if (point[i].x>xmax) xmax=point[i].x;
2237     if (point[i].y<ymin) ymin=point[i].y;
2238     if (point[i].y>ymax) ymax=point[i].y;
2239     if (point[i].z<zmin) zmin=point[i].z;
2240     if (point[i].z>zmax) zmax=point[i].z;
2241     if (fabs((double)point[i].x)>maxcoord) maxcoord=(float)fabs((double)point[i].x);
2242     if (fabs((double)point[i].y)>maxcoord) maxcoord=(float)fabs((double)point[i].y);
2243     if (fabs((double)point[i].z)>maxcoord) maxcoord=(float)fabs((double)point[i].z);
2244     xpiece=xpiece+point[i].x;
2245     ypiece=ypiece+point[i].y;
2246     zpiece=zpiece+point[i].z;
2247     }
2248     xpiece=xpiece/nb_point;
2249     ypiece=ypiece/nb_point;
2250     zpiece=zpiece/nb_point;
2251     for (i=0;i<nb_tetra;i++)
2252     {
2253     fgets(mess,255,fic);
2254     sscanf(mess,"%d %d %d %d %d",&j,&tetra[i].n1,&tetra[i].n2,&tetra[i].n3,&tetra[i].n4);
2255     tetra[i].n1=tetra[i].n1-1;
2256     tetra[i].n2=tetra[i].n2-1;
2257     tetra[i].n3=tetra[i].n3-1;
2258     tetra[i].n4=tetra[i].n4-1;
2259     tetra[i].num=i;
2260     point[tetra[i].n1].tetra[point[tetra[i].n1].nb_tetra]=&(tetra[i]);
2261     point[tetra[i].n1].nb_tetra++;
2262     point[tetra[i].n2].tetra[point[tetra[i].n2].nb_tetra]=&(tetra[i]);
2263     point[tetra[i].n2].nb_tetra++;
2264     point[tetra[i].n3].tetra[point[tetra[i].n3].nb_tetra]=&(tetra[i]);
2265     point[tetra[i].n3].nb_tetra++;
2266     point[tetra[i].n4].tetra[point[tetra[i].n4].nb_tetra]=&(tetra[i]);
2267     point[tetra[i].n4].nb_tetra++;
2268     }
2269     fclose(fic);
2270     if (passe_norme==0)
2271     {
2272     norme();
2273     passe_norme=1;
2274     }
2275     Invalidate();
2276    
2277     }
2278     //---------------------------------------------------------------------------
2279     void __fastcall TFenp::Remaillage2D1Click(TObject *Sender)
2280     {
2281     int i,j;
2282     FILE *fic;
2283     int *test_face,maxface;
2284     char fich[255];
2285     char mess[255];
2286    
2287     Geometrie1->Checked=false;
2288     Front3D1->Checked=false;
2289     Maillage1D1->Checked=false;
2290     Maillage2D1->Checked=false;
2291     Remaillage2D1->Checked=true;
2292     Maillage3D1->Checked=false;
2293     Maillage3D2->Checked=false;
2294     Remaillage3D1->Checked=false;
2295     Activerlerendu3D1->Enabled=false;
2296     Activerlerendu3D1->Checked=false;
2297     Aucun1->Checked=false;
2298     Face1->Enabled=true;
2299     Face->ListBox1->Items->Clear();
2300     Face->ListBox1->Items->Add("Toutes");
2301     Face->ListBox1->ItemIndex=0;
2302     Fenp->numface=(-1);
2303     if (point!=NULL) free(point);
2304     if (segment!=NULL) free(segment);
2305     if (triangle!=NULL) free(triangle);
2306     if (tetra!=NULL) free(tetra);
2307     nb_point=0;point=NULL;
2308     nb_segment=0;segment=NULL;
2309     nb_triangle=0;triangle=NULL;
2310     nb_tetra=0;tetra=NULL;
2311     tete=NULL;
2312     strcpy(fich,Fichier);
2313     fich[strlen(fich)-4]=0;
2314     strcat(fich,"r_2D.mai");
2315     fic=fopen(fich,"rt");
2316     fgets(mess,255,fic);
2317     sscanf(mess,"%d %d",&nb_point,&nb_triangle);
2318     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
2319     triangle=(struct s_triangle *)calloc(nb_triangle,sizeof(struct s_triangle));
2320     xpiece=0.;ypiece=0.;zpiece=0.;
2321     for (i=0;i<nb_point;i++)
2322     {
2323     fgets(mess,255,fic);
2324     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
2325     if (i==0)
2326     {
2327     xmin=point[i].x;
2328     xmax=point[i].x;
2329     ymin=point[i].y;
2330     ymax=point[i].y;
2331     zmin=point[i].z;
2332     zmax=point[i].z;
2333     maxcoord=point[i].x;
2334     }
2335     if (point[i].x<xmin) xmin=point[i].x;
2336     if (point[i].x>xmax) xmax=point[i].x;
2337     if (point[i].y<ymin) ymin=point[i].y;
2338     if (point[i].y>ymax) ymax=point[i].y;
2339     if (point[i].z<zmin) zmin=point[i].z;
2340     if (point[i].z>zmax) zmax=point[i].z;
2341     if (fabs((double)point[i].x)>maxcoord) maxcoord=(float)fabs((double)point[i].x);
2342     if (fabs((double)point[i].y)>maxcoord) maxcoord=(float)fabs((double)point[i].y);
2343     if (fabs((double)point[i].z)>maxcoord) maxcoord=(float)fabs((double)point[i].z);
2344     xpiece=xpiece+point[i].x;
2345     ypiece=ypiece+point[i].y;
2346     zpiece=zpiece+point[i].z;
2347     }
2348     xpiece=xpiece/nb_point;
2349     ypiece=ypiece/nb_point;
2350     zpiece=zpiece/nb_point;
2351     maxface=0;
2352     for (i=0;i<nb_triangle;i++)
2353     {
2354     fgets(mess,255,fic);
2355     sscanf(mess,"%d %d %d %d %s %d",&j,&triangle[i].n1,&triangle[i].n2,&triangle[i].n3,&triangle[i].type,&triangle[i].num_ent);
2356     triangle[i].n1=triangle[i].n1-1;
2357     triangle[i].n2=triangle[i].n2-1;
2358     triangle[i].n3=triangle[i].n3-1;
2359     triangle[i].num=i;
2360     if (triangle[i].num_ent>maxface) maxface=triangle[i].num_ent;
2361     point[triangle[i].n1].triangle[point[triangle[i].n1].nb_triangle]=&(triangle[i]);
2362     point[triangle[i].n1].nb_triangle++;
2363     point[triangle[i].n2].triangle[point[triangle[i].n2].nb_triangle]=&(triangle[i]);
2364     point[triangle[i].n2].nb_triangle++;
2365     point[triangle[i].n3].triangle[point[triangle[i].n3].nb_triangle]=&(triangle[i]);
2366     point[triangle[i].n3].nb_triangle++;
2367     }
2368     fclose(fic);
2369     test_face=(int *)calloc(maxface+1,sizeof(int));
2370     for (i=0;i<nb_triangle;i++)
2371     test_face[triangle[i].num_ent]=1;
2372     for (i=0;i<maxface+1;i++)
2373     if (test_face[i]==1)
2374     {
2375     sprintf(mess,"%d",i);
2376     Face->ListBox1->Items->Add(mess);
2377     }
2378     free(test_face);
2379     if (passe_norme==0)
2380     {
2381     norme();
2382     passe_norme=1;
2383     }
2384     Invalidate();
2385     }
2386     //---------------------------------------------------------------------------
2387     void __fastcall TFenp::Imprimer1Click(TObject *Sender)
2388     {
2389     char mess[255];
2390    
2391     strcpy(info,"Entrez la dimension du graphique en pourcentage de la feuille ?");
2392     Valeur->Edit1->Text="100";
2393     Valeur->ShowModal();
2394     strcpy(mess,Valeur->Edit1->Text.c_str());
2395     sscanf(mess,"%f",&rapport);
2396     rapport=rapport/100.;
2397     if (PrintDialog1->Execute()) imprime();
2398     }
2399     //---------------------------------------------------------------------------
2400     void __fastcall TFenp::Configurationdelimpression1Click(TObject *Sender)
2401     {
2402     PrinterSetupDialog1->Execute();
2403     }
2404     //---------------------------------------------------------------------------
2405     void __fastcall TFenp::Activerlerendu3D1Click(TObject *Sender)
2406     {
2407     int i,j,nb_tri=0,nb_tri2,gtrouve1,gtrouve2,gtrouve3,gtrouve4;
2408     struct s_triangle *tri,*tr;
2409    
2410     Fenp->Cursor=crHourGlass;
2411     if (Activerlerendu3D1->Checked==false)
2412     {
2413     Activerlerendu3D1->Checked=true;
2414     tri=(struct s_triangle *)calloc(nb_tetra*4,sizeof(struct s_triangle));
2415     for (i=0;i<nb_tetra;i++)
2416     {
2417     gtrouve1=(-1);
2418     gtrouve2=(-1);
2419     gtrouve3=(-1);
2420     gtrouve4=(-1);
2421     for (j=0;j<point[tetra[i].n1].nb_triangle;j++)
2422     {
2423     tr=point[tetra[i].n1].triangle[j];
2424     if (((tr->n1==tetra[i].n1) && (tr->n2==tetra[i].n2) && (tr->n3==tetra[i].n3))
2425     || ((tr->n1==tetra[i].n1) && (tr->n3==tetra[i].n2) && (tr->n2==tetra[i].n3))
2426     || ((tr->n2==tetra[i].n1) && (tr->n1==tetra[i].n2) && (tr->n3==tetra[i].n3))
2427     || ((tr->n2==tetra[i].n1) && (tr->n3==tetra[i].n2) && (tr->n1==tetra[i].n3))
2428     || ((tr->n3==tetra[i].n1) && (tr->n1==tetra[i].n2) && (tr->n2==tetra[i].n3))
2429     || ((tr->n3==tetra[i].n1) && (tr->n2==tetra[i].n2) && (tr->n1==tetra[i].n3)))
2430     gtrouve1=tr->num;
2431     if (((tr->n1==tetra[i].n1) && (tr->n2==tetra[i].n2) && (tr->n3==tetra[i].n4))
2432     || ((tr->n1==tetra[i].n1) && (tr->n3==tetra[i].n2) && (tr->n2==tetra[i].n4))
2433     || ((tr->n2==tetra[i].n1) && (tr->n1==tetra[i].n2) && (tr->n3==tetra[i].n4))
2434     || ((tr->n2==tetra[i].n1) && (tr->n3==tetra[i].n2) && (tr->n1==tetra[i].n4))
2435     || ((tr->n3==tetra[i].n1) && (tr->n1==tetra[i].n2) && (tr->n2==tetra[i].n4))
2436     || ((tr->n3==tetra[i].n1) && (tr->n2==tetra[i].n2) && (tr->n1==tetra[i].n4)))
2437     gtrouve3=tr->num;
2438     if (((tr->n1==tetra[i].n1) && (tr->n2==tetra[i].n3) && (tr->n3==tetra[i].n4))
2439     || ((tr->n1==tetra[i].n1) && (tr->n3==tetra[i].n3) && (tr->n2==tetra[i].n4))
2440     || ((tr->n2==tetra[i].n1) && (tr->n1==tetra[i].n3) && (tr->n3==tetra[i].n4))
2441     || ((tr->n2==tetra[i].n1) && (tr->n3==tetra[i].n3) && (tr->n1==tetra[i].n4))
2442     || ((tr->n3==tetra[i].n1) && (tr->n1==tetra[i].n3) && (tr->n2==tetra[i].n4))
2443     || ((tr->n3==tetra[i].n1) && (tr->n2==tetra[i].n3) && (tr->n1==tetra[i].n4)))
2444     gtrouve4=tr->num;
2445     }
2446     if (gtrouve1==(-1))
2447     {
2448     tri[nb_tri].n1=tetra[i].n1;
2449     tri[nb_tri].n2=tetra[i].n2;
2450     tri[nb_tri].n3=tetra[i].n3;
2451     tri[nb_tri].num_ent=1;
2452     tri[nb_tri].num=nb_tri;
2453     point[tri[nb_tri].n1].triangle[point[tri[nb_tri].n1].nb_triangle]=&tri[nb_tri];
2454     (point[tri[nb_tri].n1].nb_triangle)++;
2455     point[tri[nb_tri].n2].triangle[point[tri[nb_tri].n2].nb_triangle]=&tri[nb_tri];
2456     (point[tri[nb_tri].n2].nb_triangle)++;
2457     point[tri[nb_tri].n3].triangle[point[tri[nb_tri].n3].nb_triangle]=&tri[nb_tri];
2458     (point[tri[nb_tri].n3].nb_triangle)++;
2459     nb_tri++;
2460     }
2461     else tri[gtrouve1].num_ent++;
2462     if (gtrouve3==(-1))
2463     {
2464     tri[nb_tri].n1=tetra[i].n1;
2465     tri[nb_tri].n2=tetra[i].n2;
2466     tri[nb_tri].n3=tetra[i].n4;
2467     tri[nb_tri].num=nb_tri;
2468     tri[nb_tri].num_ent=1;
2469     point[tri[nb_tri].n1].triangle[point[tri[nb_tri].n1].nb_triangle]=&tri[nb_tri];
2470     (point[tri[nb_tri].n1].nb_triangle)++;
2471     point[tri[nb_tri].n2].triangle[point[tri[nb_tri].n2].nb_triangle]=&tri[nb_tri];
2472     (point[tri[nb_tri].n2].nb_triangle)++;
2473     point[tri[nb_tri].n3].triangle[point[tri[nb_tri].n3].nb_triangle]=&tri[nb_tri];
2474     (point[tri[nb_tri].n3].nb_triangle)++;
2475     nb_tri++;
2476     }
2477     else tri[gtrouve3].num_ent++;
2478     if (gtrouve4==(-1))
2479     {
2480     tri[nb_tri].n1=tetra[i].n1;
2481     tri[nb_tri].n2=tetra[i].n3;
2482     tri[nb_tri].n3=tetra[i].n4;
2483     tri[nb_tri].num=nb_tri;
2484     tri[nb_tri].num_ent=1;
2485     point[tri[nb_tri].n1].triangle[point[tri[nb_tri].n1].nb_triangle]=&tri[nb_tri];
2486     (point[tri[nb_tri].n1].nb_triangle)++;
2487     point[tri[nb_tri].n2].triangle[point[tri[nb_tri].n2].nb_triangle]=&tri[nb_tri];
2488     (point[tri[nb_tri].n2].nb_triangle)++;
2489     point[tri[nb_tri].n3].triangle[point[tri[nb_tri].n3].nb_triangle]=&tri[nb_tri];
2490     (point[tri[nb_tri].n3].nb_triangle)++;
2491     nb_tri++;
2492     }
2493     else tri[gtrouve4].num_ent++;
2494     for (j=0;j<point[tetra[i].n2].nb_triangle;j++)
2495     {
2496     tr=point[tetra[i].n2].triangle[j];
2497     if (((tr->n1==tetra[i].n2) && (tr->n2==tetra[i].n3) && (tr->n3==tetra[i].n4))
2498     || ((tr->n1==tetra[i].n2) && (tr->n3==tetra[i].n3) && (tr->n2==tetra[i].n4))
2499     || ((tr->n2==tetra[i].n2) && (tr->n1==tetra[i].n3) && (tr->n3==tetra[i].n4))
2500     || ((tr->n2==tetra[i].n2) && (tr->n3==tetra[i].n3) && (tr->n1==tetra[i].n4))
2501     || ((tr->n3==tetra[i].n2) && (tr->n1==tetra[i].n3) && (tr->n2==tetra[i].n4))
2502     || ((tr->n3==tetra[i].n2) && (tr->n2==tetra[i].n3) && (tr->n1==tetra[i].n4)))
2503     gtrouve2=tr->num;
2504     }
2505     if (gtrouve2==(-1))
2506     {
2507     tri[nb_tri].n1=tetra[i].n2;
2508     tri[nb_tri].n2=tetra[i].n3;
2509     tri[nb_tri].n3=tetra[i].n4;
2510     tri[nb_tri].num=nb_tri;
2511     tri[nb_tri].num_ent=1;
2512     point[tri[nb_tri].n1].triangle[point[tri[nb_tri].n1].nb_triangle]=&tri[nb_tri];
2513     (point[tri[nb_tri].n1].nb_triangle)++;
2514     point[tri[nb_tri].n2].triangle[point[tri[nb_tri].n2].nb_triangle]=&tri[nb_tri];
2515     (point[tri[nb_tri].n2].nb_triangle)++;
2516     point[tri[nb_tri].n3].triangle[point[tri[nb_tri].n3].nb_triangle]=&tri[nb_tri];
2517     (point[tri[nb_tri].n3].nb_triangle)++;
2518     nb_tri++;
2519     }
2520     else tri[gtrouve2].num_ent++;
2521    
2522     }
2523    
2524     nb_triangle=0;nb_tri2=0;
2525     for (i=0;i<nb_tri;i++)
2526     if (tri[i].num_ent==1) nb_triangle++;
2527     triangle=(struct s_triangle *)calloc(nb_triangle,sizeof(struct s_triangle));
2528     for (i=0;i<nb_point;i++)
2529     point[i].nb_triangle=0;
2530     for (i=0;i<nb_tri;i++)
2531     if (tri[i].num_ent==1)
2532     {
2533     triangle[nb_tri2].n1=tri[i].n1;
2534     triangle[nb_tri2].n2=tri[i].n2;
2535     triangle[nb_tri2].n3=tri[i].n3;
2536     triangle[nb_tri2].num=nb_tri2;
2537     point[triangle[nb_tri2].n1].triangle[point[triangle[nb_tri2].n1].nb_triangle]=&(triangle[nb_tri2]);
2538     (point[triangle[nb_tri2].n1].nb_triangle)++;
2539     point[triangle[nb_tri2].n2].triangle[point[triangle[nb_tri2].n2].nb_triangle]=&(triangle[nb_tri2]);
2540     (point[triangle[nb_tri2].n2].nb_triangle)++;
2541     point[triangle[nb_tri2].n3].triangle[point[triangle[nb_tri2].n3].nb_triangle]=&(triangle[nb_tri2]);
2542     (point[triangle[nb_tri2].n3].nb_triangle)++;
2543     nb_tri2++;
2544     }
2545     free(tri);
2546     }
2547     Fenp->Cursor=crDefault;
2548     Invalidate();
2549     }
2550     //---------------------------------------------------------------------------
2551     void __fastcall TFenp::Purgerletude1Click(TObject *Sender)
2552     {
2553     char fich[500],mess[500];
2554    
2555     strcpy(fich,Fichier);
2556     fich[strlen(fich)-4]=0;
2557    
2558     strcpy(mess,fich);
2559     strcat(mess,".oct");
2560     remove(mess);
2561     strcpy(mess,fich);
2562     strcat(mess,".qua");
2563     remove(mess);
2564     strcpy(mess,fich);
2565     strcat(mess,".geo");
2566     remove(mess);
2567     strcpy(mess,fich);
2568     strcat(mess,".res");
2569     remove(mess);
2570     strcpy(mess,fich);
2571     strcat(mess,"_1D.mai");
2572     remove(mess);
2573     strcpy(mess,fich);
2574     strcat(mess,"_2D.mai");
2575     remove(mess);
2576     strcpy(mess,fich);
2577     strcat(mess,"_3D.mai");
2578     remove(mess);
2579     strcpy(mess,fich);
2580     strcat(mess,"_2D.skin");
2581     remove(mess);
2582     strcpy(mess,fich);
2583     strcat(mess,"_2D.res");
2584     remove(mess);
2585     strcpy(mess,fich);
2586     strcat(mess,"r_2D.mai");
2587     remove(mess);
2588     strcpy(mess,fich);
2589     strcat(mess,"r_3D.mai");
2590     remove(mess);
2591     strcpy(mess,fich);
2592     strcat(mess,"c_3D.mai");
2593     remove(mess);
2594     strcpy(mess,fich);
2595     strcat(mess,"r_2D.skin");
2596     remove(mess);
2597     strcpy(mess,fich);
2598     strcat(mess,"r_2D.res");
2599     remove(mess);
2600     strcpy(mess,fich);
2601     strcat(mess,"_2D.REC");
2602     remove(mess);
2603     strcpy(mess,fich);
2604     strcat(mess,"r_2D.REC");
2605     remove(mess);
2606     strcpy(mess,fich);
2607     strcat(mess,"f_2D.REC");
2608     remove(mess);
2609     }
2610     //---------------------------------------------------------------------------
2611     void __fastcall TFenp::CreerunesessionClick(TObject *Sender)
2612     {
2613     char mess[255];
2614    
2615     OpenDialog2->InitialDir=dir_defaut;
2616     if (OpenDialog2->Execute()==true)
2617     {
2618     Creerunesession->Enabled=false;
2619     Fermerlasession1->Enabled=true;
2620     batch=true;
2621     strcpy(mess,OpenDialog2->FileName.c_str());
2622     strcat(mess,".ses");
2623     f_batch=fopen(mess,"wt");
2624     }
2625     }
2626     //---------------------------------------------------------------------------
2627     void __fastcall TFenp::Fermerlasession1Click(TObject *Sender)
2628     {
2629     Creerunesession->Enabled=true;
2630     Fermerlasession1->Enabled=false;
2631     batch=false;
2632     fclose(f_batch);
2633     }
2634     //---------------------------------------------------------------------------
2635     void __fastcall TFenp::Lancerunesession1Click(TObject *Sender)
2636     {
2637     Application->CreateForm(__classid(Tcsession), &csession);
2638    
2639     csession->ShowModal();
2640     }
2641     //---------------------------------------------------------------------------
2642     void __fastcall TFenp::Paramesh1Click(TObject *Sender)
2643     {
2644     char mess[255];
2645     char arg1[255];
2646     char arg2[255];
2647     char arg3[255];
2648     char arg4[255];
2649     char arg5[255];
2650     char arg6[255];
2651     char arg7[255];
2652     char arg8[255];
2653     char arg9[255];
2654     char arg10[255];
2655     int opt=5;
2656    
2657     Rigsoption->Label3->Enabled=false;
2658     Rigsoption->Edit3->Enabled=false;
2659     Rigsoption->Edit2->Text="5";
2660     Rigsoption->CheckBox1->Enabled=true;
2661     Rigsoption->GroupBox1->Caption=Fichier;
2662     Rigsoption->ShowModal();
2663     if (Rigsoption->ok==1)
2664     {
2665     strcpy(mess,Rigsoption->Edit2->Text.c_str());
2666     sscanf(mess,"%d",&opt);
2667     mess[0]=0;
2668     strcpy(mess,Rigsoption->Edit1->Text.c_str());
2669     sprintf(arg1,"%s\\paramesh.exe",home);
2670     strcpy(arg2,"-fich");
2671     sprintf(arg3,"%s",Fichier);
2672     strcpy(arg4,"-mesh");
2673     strcpy(arg5,mess);
2674     strcpy(arg6,"-opti2d");
2675     sprintf(arg7,"%d",opt);
2676     if (Rigsoption->CheckBox1->Checked==true) strcpy(arg8,"-analyse"); else strcpy(arg8,"");
2677     chdir(home);
2678     if (mess[0]==0) MessageBox(Handle,"Pas de fichier modele","Erreur",0);
2679     else if (batch==false) spawnl(P_NOWAIT,arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,NULL);
2680     else fprintf(f_batch,"%s %s %s %s %s %s %s %s %s %s \n",arg1,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
2681     }
2682    
2683     }
2684     //---------------------------------------------------------------------------
2685     void __fastcall TFenp::Maillage3D2Click(TObject *Sender)
2686     {
2687     int i,j;
2688     FILE *fic;
2689     char fich[255];
2690     char mess[255];
2691    
2692     Geometrie1->Checked=false;
2693     Maillage1D1->Checked=false;
2694     Front3D1->Checked=false;
2695     Maillage2D1->Checked=false;
2696     Remaillage2D1->Checked=false;
2697     Maillage3D1->Checked=false;
2698     Maillage3D2->Checked=true;
2699     Remaillage3D1->Checked=false;
2700     Activerlerendu3D1->Enabled=true;
2701     Activerlerendu3D1->Checked=false;
2702     Face1->Enabled=false;
2703     Aucun1->Checked=false;
2704     if (point!=NULL) free(point);
2705     if (segment!=NULL) free(segment);
2706     if (triangle!=NULL) free(triangle);
2707     if (tetra!=NULL) free(tetra);
2708     nb_point=0;point=NULL;
2709     nb_segment=0;segment=NULL;
2710     nb_triangle=0;triangle=NULL;
2711     nb_tetra=0;tetra=NULL;
2712     tete=NULL;
2713     strcpy(fich,Fichier);
2714     fich[strlen(fich)-4]=0;
2715     strcat(fich,"c_3D.mai");
2716     fic=fopen(fich,"rt");
2717     fgets(mess,255,fic);
2718     sscanf(mess,"%d %d",&nb_point,&nb_tetra);
2719     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
2720     tetra=(struct s_tetra *)calloc(nb_tetra,sizeof(struct s_tetra));
2721     xpiece=0.;ypiece=0.;zpiece=0.;
2722     for (i=0;i<nb_point;i++)
2723     {
2724     fgets(mess,255,fic);
2725     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
2726     if (i==0)
2727     {
2728     xmin=point[i].x;
2729     xmax=point[i].x;
2730     ymin=point[i].y;
2731     ymax=point[i].y;
2732     zmin=point[i].z;
2733     zmax=point[i].z;
2734     maxcoord=point[i].x;
2735     }
2736     if (point[i].x<xmin) xmin=point[i].x;
2737     if (point[i].x>xmax) xmax=point[i].x;
2738     if (point[i].y<ymin) ymin=point[i].y;
2739     if (point[i].y>ymax) ymax=point[i].y;
2740     if (point[i].z<zmin) zmin=point[i].z;
2741     if (point[i].z>zmax) zmax=point[i].z;
2742     if (fabs((double)point[i].x)>maxcoord) maxcoord=(float)fabs((double)point[i].x);
2743     if (fabs((double)point[i].y)>maxcoord) maxcoord=(float)fabs((double)point[i].y);
2744     if (fabs((double)point[i].z)>maxcoord) maxcoord=(float)fabs((double)point[i].z);
2745     xpiece=xpiece+point[i].x;
2746     ypiece=ypiece+point[i].y;
2747     zpiece=zpiece+point[i].z;
2748     }
2749     xpiece=xpiece/nb_point;
2750     ypiece=ypiece/nb_point;
2751     zpiece=zpiece/nb_point;
2752     for (i=0;i<nb_tetra;i++)
2753     {
2754     fgets(mess,255,fic);
2755     sscanf(mess,"%d %d %d %d %d",&j,&tetra[i].n1,&tetra[i].n2,&tetra[i].n3,&tetra[i].n4);
2756     tetra[i].n1=tetra[i].n1-1;
2757     tetra[i].n2=tetra[i].n2-1;
2758     tetra[i].n3=tetra[i].n3-1;
2759     tetra[i].n4=tetra[i].n4-1;
2760     tetra[i].num=i;
2761     point[tetra[i].n1].tetra[point[tetra[i].n1].nb_tetra]=&(tetra[i]);
2762     point[tetra[i].n1].nb_tetra++;
2763     point[tetra[i].n2].tetra[point[tetra[i].n2].nb_tetra]=&(tetra[i]);
2764     point[tetra[i].n2].nb_tetra++;
2765     point[tetra[i].n3].tetra[point[tetra[i].n3].nb_tetra]=&(tetra[i]);
2766     point[tetra[i].n3].nb_tetra++;
2767     point[tetra[i].n4].tetra[point[tetra[i].n4].nb_tetra]=&(tetra[i]);
2768     point[tetra[i].n4].nb_tetra++;
2769     }
2770     fclose(fic);
2771     if (passe_norme==0)
2772     {
2773     norme();
2774     passe_norme=1;
2775     }
2776     Invalidate();
2777     }
2778     //---------------------------------------------------------------------------
2779     void __fastcall TFenp::Editeur1Click(TObject *Sender)
2780     {
2781     Application->CreateForm(__classid(TEditeur), &Editeur);
2782     Editeur->Show();
2783     }
2784     //---------------------------------------------------------------------------
2785     void __fastcall TFenp::Transsat1Click(TObject *Sender)
2786     {
2787     char arg1[255];
2788    
2789     sprintf(arg1,"%s\\transsat.exe",home);
2790     spawnl(P_NOWAIT,arg1,arg1,NULL);
2791     }
2792     //---------------------------------------------------------------------------
2793     void __fastcall TFenp::ContourInactif1Click(TObject *Sender)
2794     {
2795     if (ContourInactif1->Checked==true) ContourInactif1->Checked=false;
2796     else ContourInactif1->Checked=true;
2797     Invalidate();
2798     }
2799     //---------------------------------------------------------------------------
2800     void __fastcall TFenp::Barrevisible1Click(TObject *Sender)
2801     {
2802     if (Barrevisible1->Checked==false) Barrevisible1->Checked=true;
2803     else Barrevisible1->Checked=false;
2804     if (existetool!=0)
2805     if (Barrevisible1->Checked==false) Toolbar->FormStyle=fsNormal;
2806     else Toolbar->FormStyle=fsStayOnTop;
2807     }
2808     //---------------------------------------------------------------------------
2809     void __fastcall TFenp::Front3D1Click(TObject *Sender)
2810     {
2811     int i,j;
2812     FILE *fic;
2813     int *test_face,maxface;
2814     char fich[255];
2815     char mess[255];
2816    
2817     Geometrie1->Checked=false;
2818     Maillage1D1->Checked=false;
2819     Front3D1->Checked=true;
2820     Maillage2D1->Checked=false;
2821     Remaillage2D1->Checked=false;
2822     Maillage3D1->Checked=false;
2823     Maillage3D2->Checked=false;
2824     Remaillage3D1->Checked=false;
2825     Activerlerendu3D1->Enabled=false;
2826     Activerlerendu3D1->Checked=false;
2827     Aucun1->Checked=false;
2828     Face1->Enabled=true;
2829     Face->ListBox1->Items->Clear();
2830     Face->ListBox1->Items->Add("Toutes");
2831     Face->ListBox1->ItemIndex=0;
2832     Fenp->numface=(-1);
2833     if (point!=NULL) free(point);
2834     if (segment!=NULL) free(segment);
2835     if (triangle!=NULL) free(triangle);
2836     if (tetra!=NULL) free(tetra);
2837     nb_point=0;point=NULL;
2838     nb_segment=0;segment=NULL;
2839     nb_triangle=0;triangle=NULL;
2840     nb_tetra=0;tetra=NULL;
2841     tete=NULL;
2842     strcpy(fich,Fichier);
2843     fich[strlen(fich)-4]=0;
2844     strcat(fich,"f_2D.mai");
2845     fic=fopen(fich,"rt");
2846     fgets(mess,255,fic);
2847     sscanf(mess,"%d %d",&nb_point,&nb_triangle);
2848     point=(struct s_point *)calloc(nb_point,sizeof(struct s_point));
2849     triangle=(struct s_triangle *)calloc(nb_triangle,sizeof(struct s_triangle));
2850     xpiece=0.;ypiece=0.;zpiece=0.;
2851     for (i=0;i<nb_point;i++)
2852     {
2853     fgets(mess,255,fic);
2854     sscanf(mess,"%d %f %f %f",&j,&point[i].x,&point[i].y,&point[i].z);
2855     if (i==0)
2856     {
2857     xmin=point[i].x;
2858     xmax=point[i].x;
2859     ymin=point[i].y;
2860     ymax=point[i].y;
2861     zmin=point[i].z;
2862     zmax=point[i].z;
2863     maxcoord=point[i].x;
2864     }
2865     if (point[i].x<xmin) xmin=point[i].x;
2866     if (point[i].x>xmax) xmax=point[i].x;
2867     if (point[i].y<ymin) ymin=point[i].y;
2868     if (point[i].y>ymax) ymax=point[i].y;
2869     if (point[i].z<zmin) zmin=point[i].z;
2870     if (point[i].z>zmax) zmax=point[i].z;
2871     if (fabs((double)point[i].x)>maxcoord) maxcoord=(float)fabs((double)point[i].x);
2872     if (fabs((double)point[i].y)>maxcoord) maxcoord=(float)fabs((double)point[i].y);
2873     if (fabs((double)point[i].z)>maxcoord) maxcoord=(float)fabs((double)point[i].z);
2874     xpiece=xpiece+point[i].x;
2875     ypiece=ypiece+point[i].y;
2876     zpiece=zpiece+point[i].z;
2877     }
2878     xpiece=xpiece/nb_point;
2879     ypiece=ypiece/nb_point;
2880     zpiece=zpiece/nb_point;
2881     maxface=0;
2882     for (i=0;i<nb_triangle;i++)
2883     {
2884     fgets(mess,255,fic);
2885     sscanf(mess,"%d %d %d %d %s %d",&j,&triangle[i].n1,&triangle[i].n2,&triangle[i].n3,&triangle[i].type,&triangle[i].num_ent);
2886     triangle[i].n1=triangle[i].n1-1;
2887     triangle[i].n2=triangle[i].n2-1;
2888     triangle[i].n3=triangle[i].n3-1;
2889     triangle[i].num=i;
2890     if (triangle[i].num_ent>maxface) maxface=triangle[i].num_ent;
2891     point[triangle[i].n1].triangle[point[triangle[i].n1].nb_triangle]=&(triangle[i]);
2892     point[triangle[i].n1].nb_triangle++;
2893     point[triangle[i].n2].triangle[point[triangle[i].n2].nb_triangle]=&(triangle[i]);
2894     point[triangle[i].n2].nb_triangle++;
2895     point[triangle[i].n3].triangle[point[triangle[i].n3].nb_triangle]=&(triangle[i]);
2896     point[triangle[i].n3].nb_triangle++;
2897     }
2898     fclose(fic);
2899     test_face=(int *)calloc(maxface+1,sizeof(int));
2900     for (i=0;i<nb_triangle;i++)
2901     test_face[triangle[i].num_ent]=1;
2902     for (i=0;i<maxface+1;i++)
2903     if (test_face[i]==1)
2904     {
2905     sprintf(mess,"%d",i);
2906     Face->ListBox1->Items->Add(mess);
2907     }
2908     free(test_face);
2909     if (passe_norme==0)
2910     {
2911     norme();
2912     passe_norme=1;
2913     }
2914     Invalidate();
2915     }
2916     //---------------------------------------------------------------------------
2917     void __fastcall TFenp::Enregistrerlhistoriquedesrotations1Click(TObject *Sender)
2918     {
2919     char mess[255];
2920     FILE *out;
2921    
2922     OpenDialog3->InitialDir=home;
2923     if (OpenDialog3->Execute()==true)
2924     {
2925     strcpy(mess,OpenDialog3->FileName.c_str());
2926     strcat(mess,".ori");
2927     out=fopen(mess,"wt");
2928     fprintf(out,"%f\n",rot[0][0]);
2929     fprintf(out,"%f\n",rot[0][1]);
2930     fprintf(out,"%f\n",rot[0][2]);
2931     fprintf(out,"%f\n",rot[1][0]);
2932     fprintf(out,"%f\n",rot[1][1]);
2933     fprintf(out,"%f\n",rot[1][2]);
2934     fprintf(out,"%f\n",rot[2][0]);
2935     fprintf(out,"%f\n",rot[2][1]);
2936     fprintf(out,"%f\n",rot[2][2]);
2937     fclose(out);
2938     }
2939    
2940     }
2941     //---------------------------------------------------------------------------
2942     void __fastcall TFenp::Chargeruneorientation1Click(TObject *Sender)
2943     {
2944     char mess[255];
2945     FILE *out;
2946    
2947     OpenDialog3->InitialDir=home;
2948     if (OpenDialog3->Execute()==true)
2949     {
2950     strcpy(mess,OpenDialog3->FileName.c_str());
2951     out=fopen(mess,"rt");
2952     fgets(mess,255,out);
2953     sscanf(mess,"%f",&(rot[0][0]));
2954     fgets(mess,255,out);
2955     sscanf(mess,"%f",&(rot[0][1]));
2956     fgets(mess,255,out);
2957     sscanf(mess,"%f",&(rot[0][2]));
2958     fgets(mess,255,out);
2959     sscanf(mess,"%f",&(rot[1][0]));
2960     fgets(mess,255,out);
2961     sscanf(mess,"%f",&(rot[1][1]));
2962     fgets(mess,255,out);
2963     sscanf(mess,"%f",&(rot[1][2]));
2964     fgets(mess,255,out);
2965     sscanf(mess,"%f",&(rot[2][0]));
2966     fgets(mess,255,out);
2967     sscanf(mess,"%f",&(rot[2][1]));
2968     fgets(mess,255,out);
2969     sscanf(mess,"%f",&(rot[2][2]));
2970     fclose(out);
2971     Invalidate();
2972     }
2973    
2974     }
2975     //---------------------------------------------------------------------------
2976     void __fastcall TFenp::InfoPice1Click(TObject *Sender)
2977     {
2978     Application->CreateForm(__classid(TInfo_piece), &Info_piece);
2979     Info_piece->Left=Fenp->Left+29;
2980     Info_piece->Top=Fenp->Top+37;
2981     Info_piece->ShowModal();
2982     }
2983     //---------------------------------------------------------------------------
2984     void __fastcall TFenp::Normal2Click(TObject *Sender)
2985     {
2986     int i;
2987     if (Fenp->Normal2->Checked==false)
2988     {
2989     Fenp->Normal2->Checked=true;
2990     Fenp->Debug1->Checked=false;
2991     Fendebug->Close();
2992     Fenp->Left=posx;
2993     Fenp->Top=posy;
2994     Fenp->Width=posdx;
2995     Fenp->Height=posdy;
2996     Mai1->Enabled=true;
2997     Fichier1->Enabled=true;
2998     for (i=0;i<nb_segment;i++) segment[i].select=0;
2999     for (i=0;i<nb_triangle;i++) triangle[i].select=0;
3000     for (i=0;i<nb_tetra;i++) tetra[i].select=0;
3001     }
3002     }
3003     //---------------------------------------------------------------------------
3004    
3005     void __fastcall TFenp::Debug1Click(TObject *Sender)
3006     {
3007     if (Geometrie1->Checked==true)
3008     {
3009     MessageBox(Handle,"Option interdite sur la geometrie","Erreur",0);
3010     return;
3011     }
3012     if (Fenp->Debug1->Checked==false)
3013     {
3014     Fenp->Normal2->Checked=false;
3015     Fenp->Debug1->Checked=true;
3016     Application->CreateForm(__classid(TFendebug), &Fendebug);
3017     posx=Fenp->Left;
3018     posy=Fenp->Top;
3019     posdx=Fenp->Width;
3020     posdy=Fenp->Height;
3021     Fenp->Top=0;
3022     Fenp->Height=(int)(0.5*Screen->Height);
3023     Fendebug->Left=Fenp->Left;
3024     Fendebug->Top=Fenp->Height+1;
3025     Fendebug->Height=Screen->Height-Fendebug->Top;
3026     Fendebug->Width=Screen->Width-Fendebug->Left;
3027     Fendebug->Show();
3028     Mai1->Enabled=false;
3029     Fichier1->Enabled=false;
3030     }
3031     }
3032     //---------------------------------------------------------------------------
3033