ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/criaqoperation/src/criaqoperators.cpp
Revision: 707
Committed: Mon Aug 31 20:05:40 2015 UTC (9 years, 11 months ago) by sattarpa
File size: 127951 byte(s)
Log Message:
debager sample-point-projection en CAD et scan models

File Contents

# User Rev Content
1 sattarpa 554 #include <stdio.h>
2     #include "mg_file.h"
3     #include "criaqoperators.h"
4 sattarpa 596 #include "tpl_grille.h"
5     #include "ot_mathematique.h"
6     #include <math.h>
7     #include "tpl_octree.h"
8 sattarpa 609 #include "fem_maillage_outils.h"
9     #include "mg_maillage_outils.h"
10 sattarpa 646 #include <sstream>
11     #include <string.h>
12 sattarpa 554
13 sattarpa 596 CRIAQOPERATORS::CRIAQOPERATORS():MAILLEUR(false)
14 sattarpa 554 {
15     }
16 sattarpa 596 CRIAQOPERATORS::~CRIAQOPERATORS()
17 sattarpa 554 {
18     }
19 sattarpa 673
20     void CRIAQOPERATORS::bumparea_calcul(char* magicfilename,int nummai,int mgsolid,double tolerance,char* areamagicfilename,int defnodid)
21     {
22     MG_FILE gest(magicfilename);
23     MG_MAILLAGE* mai;
24     if (nummai==0) mai=gest.get_mg_maillage(nummai); else mai=gest.get_mg_maillageid(nummai);
25 sattarpa 695
26 sattarpa 673 MG_SOLUTION* mgsol=gest.get_mg_solutionid(mgsolid);
27     mgsol->active_solution(0);
28     MG_NOEUD* defnd;
29     LISTE_MG_NOEUD::iterator itnd;
30     for(MG_NOEUD* nd=mai->get_premier_noeud(itnd);nd!=NULL;nd=mai->get_suivant_noeud(itnd))
31     {
32     if (nd->get_id()==defnodid)
33     defnd=nd;
34     }
35     cout<<defnd->get_solution()<<endl;
36     double max_dist=defnd->get_solution();
37     TPL_MAP_ENTITE<MG_TRIANGLE*> areatris;
38     for (int i=0;i<defnd->get_lien_triangle()->get_nb();i++)
39     {
40     MG_TRIANGLE* trii=defnd->get_lien_triangle()->get(i);
41 sattarpa 695 double avdis=(trii->get_noeud1()->get_solution()+trii->get_noeud2()->get_solution()+trii->get_noeud3()->get_solution())/3.;
42     if (avdis>tolerance)
43     areatris.ajouter(trii);
44 sattarpa 673 }
45     int stoplvl=0;
46     while (areatris.get_nb()>stoplvl)
47     {
48     stoplvl=areatris.get_nb();
49     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itareatris;
50     for(MG_TRIANGLE* trii=areatris.get_premier(itareatris);trii!=NULL;trii=areatris.get_suivant(itareatris))
51     {
52     for(int i=0;i<trii->get_segment1()->get_lien_triangle()->get_nb();i++)
53     {
54     MG_TRIANGLE* trineib=trii->get_segment1()->get_lien_triangle()->get(i);
55     double avdis=(trineib->get_noeud1()->get_solution()+trineib->get_noeud2()->get_solution()+trineib->get_noeud3()->get_solution())/3.;
56     if (avdis>tolerance)
57     areatris.ajouter(trineib);
58     }
59     for(int i=0;i<trii->get_segment2()->get_lien_triangle()->get_nb();i++)
60     {
61     MG_TRIANGLE* trineib=trii->get_segment2()->get_lien_triangle()->get(i);
62     double avdis=(trineib->get_noeud1()->get_solution()+trineib->get_noeud2()->get_solution()+trineib->get_noeud3()->get_solution())/3.;
63     if (avdis>tolerance)
64     areatris.ajouter(trineib);
65     }
66     for(int i=0;i<trii->get_segment3()->get_lien_triangle()->get_nb();i++)
67     {
68     MG_TRIANGLE* trineib=trii->get_segment3()->get_lien_triangle()->get(i);
69     double avdis=(trineib->get_noeud1()->get_solution()+trineib->get_noeud2()->get_solution()+trineib->get_noeud3()->get_solution())/3.;
70     if (avdis>tolerance)
71     areatris.ajouter(trineib);
72     }
73     }
74     }
75     double area=0.;
76     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itareatris;
77     for(MG_TRIANGLE* tri=areatris.get_premier(itareatris);tri!=NULL;tri=areatris.get_suivant(itareatris))
78     {
79     OT_VECTEUR_3D v1(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord());
80     OT_VECTEUR_3D v2(tri->get_noeud1()->get_coord(),tri->get_noeud3()->get_coord());
81     OT_VECTEUR_3D area1=v1&v2;
82     double area2=0.5*area1.get_longueur();
83     area=area+area2;
84     }
85     cout<<"area= "<<area<<endl;
86    
87     MG_MAILLAGE* mai1;
88     if (nummai==0) mai1=gest.get_mg_maillage(nummai); else mai1=gest.get_mg_maillageid(nummai);
89     TPL_MAP_ENTITE<MG_TRIANGLE*> deltris;
90     LISTE_MG_TRIANGLE::iterator ittri;
91     for (MG_TRIANGLE* tri=mai1->get_premier_triangle(ittri);tri!=NULL;tri=mai1->get_suivant_triangle(ittri))
92     {
93 sattarpa 695 //int triexist=0;
94 sattarpa 673 for(MG_TRIANGLE* triarea=areatris.get_premier(itareatris);triarea!=NULL;triarea=areatris.get_suivant(itareatris))
95     {
96     if (triarea==tri)
97 sattarpa 695 tri->change_origine(IMPOSE);
98     //triexist++;
99 sattarpa 673 }
100 sattarpa 695 //if (triexist<1)
101     //deltris.ajouter(tri);
102 sattarpa 673 }
103 sattarpa 695 /* for(MG_TRIANGLE* tridel=deltris.get_premier(itareatris);tridel!=NULL;tridel=deltris.get_suivant(itareatris))
104 sattarpa 673 {
105 sattarpa 695 tridel->change_origine(IMPOSE);
106     //mai1->supprimer_mg_triangleid(tridel->get_id());
107     }*/
108 sattarpa 673
109     gest.ajouter_mg_maillage(mai1);
110     gest.enregistrer(areamagicfilename);
111     }
112 sattarpa 662 void CRIAQOPERATORS::samplepoints_compare(char* samplepoints1,char* samplepoints2,char* sortedsmplpnts)
113     {
114     std::vector<double*> lstsamplepoints1;
115     FILE *in1=fopen(samplepoints1,"rt");
116     if (in1==NULL) affiche((char*) "file is not available");
117     while(!feof(in1))
118     {
119     char chaine[500];
120     char* res=fgets(chaine,500,in1);
121     if(res!=NULL)
122     {
123     double x,y,z;
124     double q1,q2,q3;
125     double* pcoordbc=new double[6];
126     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
127     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
128     else if(nb==6)
129     {
130     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
131     lstsamplepoints1.push_back(pcoordbc);
132     }
133     }
134     }
135     fclose(in1);
136     std::vector<double*> lstsamplepoints2;
137     FILE *in2=fopen(samplepoints2,"rt");
138     if (in2==NULL) affiche((char*) "file is not available");
139     while(!feof(in2))
140     {
141     char chaine[500];
142     char* res=fgets(chaine,500,in2);
143     if(res!=NULL)
144     {
145     double x,y,z;
146     double q1,q2,q3;
147     double* pcoordbc=new double[6];
148     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
149     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
150     else if(nb==6)
151     {
152     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
153     lstsamplepoints2.push_back(pcoordbc);
154     }
155     }
156     }
157     fclose(in2);
158     cout<<lstsamplepoints1.size()<<endl;
159     cout<<lstsamplepoints2.size()<<endl;
160    
161     std::vector<double*> lstsortedsmplpnts;
162     for(std::vector<double*>::iterator itlstsamplepoints1=lstsamplepoints1.begin();itlstsamplepoints1!=lstsamplepoints1.end();itlstsamplepoints1++)
163     {
164     double* pcoordbc=new double[7];
165     int countsmpcomp=0;
166     double* xyzsmp1=(*itlstsamplepoints1);
167     for(std::vector<double*>::iterator itlstsamplepoints2=lstsamplepoints2.begin();itlstsamplepoints2!=lstsamplepoints2.end();itlstsamplepoints2++)
168     {
169     double* xyzsmp2=(*itlstsamplepoints2);
170     if(xyzsmp1[0]==xyzsmp2[0] && xyzsmp1[1]==xyzsmp2[1] && xyzsmp1[2]==xyzsmp2[2] && xyzsmp1[3]==xyzsmp2[3] && xyzsmp1[4]==xyzsmp2[4] && xyzsmp1[5]==xyzsmp2[5])
171     countsmpcomp++;
172     }
173     if(countsmpcomp==0)
174     {
175     pcoordbc[0]=0; pcoordbc[1]=xyzsmp1[0]; pcoordbc[2]=xyzsmp1[1]; pcoordbc[3]=xyzsmp1[2]; pcoordbc[4]=xyzsmp1[3]; pcoordbc[5]=xyzsmp1[4]; pcoordbc[6]=xyzsmp1[5];
176     lstsortedsmplpnts.push_back(pcoordbc);
177     }
178     else if (countsmpcomp>0)
179     {
180     pcoordbc[0]=1; pcoordbc[1]=xyzsmp1[0]; pcoordbc[2]=xyzsmp1[1]; pcoordbc[3]=xyzsmp1[2]; pcoordbc[4]=xyzsmp1[3]; pcoordbc[5]=xyzsmp1[4]; pcoordbc[6]=xyzsmp1[5];
181     lstsortedsmplpnts.push_back(pcoordbc);
182     }
183    
184    
185     }
186     cout<<lstsortedsmplpnts.size()<<endl;
187    
188    
189     FILE* insmp=fopen(sortedsmplpnts,"wt");
190     for(std::vector<double*>::iterator itlstsortedsmplpnts=lstsortedsmplpnts.begin();itlstsortedsmplpnts!=lstsortedsmplpnts.end();itlstsortedsmplpnts++)
191     {
192     double* xyzsmpsort=(*itlstsortedsmplpnts);
193     //cout<<xyzsmpsort[0]<<" "<<xyzsmpsort[1]<<endl;
194     fprintf(insmp,"%le %le %le %le %le %le %le \n",xyzsmpsort[0],xyzsmpsort[1],xyzsmpsort[2],xyzsmpsort[3],xyzsmpsort[4],xyzsmpsort[5],xyzsmpsort[6]);
195     }
196     fclose(insmp);
197    
198     }
199    
200 sattarpa 695 void CRIAQOPERATORS::meshdistance_compare(char* referencemagicfilename,int refmeshno,char* comparemagicfilename,int compmeshno,char* outputcomparefile,char* solfilename)
201 sattarpa 554 {
202 sattarpa 596 MG_FILE refgest(referencemagicfilename);
203     MG_MAILLAGE* refmgmai;
204 sattarpa 600 if (refmeshno==0) refmgmai=refgest.get_mg_maillage(refmeshno); else refmgmai=refgest.get_mg_maillageid(refmeshno);
205 sattarpa 596 MG_FILE compgest(comparemagicfilename);
206     MG_MAILLAGE* compmgmai;
207 sattarpa 600 if (compmeshno==0) compmgmai=compgest.get_mg_maillage(compmeshno); else compmgmai=compgest.get_mg_maillageid(compmeshno);
208 sattarpa 658
209     //octree initialization
210 sattarpa 596 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
211     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
212     LISTE_MG_NOEUD::iterator it;
213     for (MG_NOEUD* no=refmgmai->get_premier_noeud(it);no!=NULL;no=refmgmai->get_suivant_noeud(it))
214     {
215     if (no->get_x()<xmin) xmin=no->get_x();
216     if (no->get_y()<ymin) ymin=no->get_y();
217     if (no->get_z()<zmin) zmin=no->get_z();
218     if (no->get_x()>xmax) xmax=no->get_x();
219     if (no->get_y()>ymax) ymax=no->get_y();
220     if (no->get_z()>zmax) zmax=no->get_z();
221     }
222     for (MG_NOEUD* no=compmgmai->get_premier_noeud(it);no!=NULL;no=compmgmai->get_suivant_noeud(it))
223     {
224     if (no->get_x()<xmin) xmin=no->get_x();
225     if (no->get_y()<ymin) ymin=no->get_y();
226     if (no->get_z()<zmin) zmin=no->get_z();
227     if (no->get_x()>xmax) xmax=no->get_x();
228     if (no->get_y()>ymax) ymax=no->get_y();
229     if (no->get_z()>zmax) zmax=no->get_z();
230     lstnoeud.ajouter(no);
231     }
232     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
233     OT_VECTEUR_3D vec(vecmmax,vecmin);
234    
235     //double search_radius=0.001*(vec.get_longueur());
236     double search_radius=3.;
237     OT_VECTEUR_3D min(xmin,ymin,zmin); OT_VECTEUR_3D max(xmax,ymax,zmax); OT_VECTEUR_3D average=(min+max)/2.; OT_VECTEUR_3D lengthvec(min,max);
238     double length=sqrt(lengthvec*lengthvec); double bxr=1.1;
239     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
240     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
241    
242     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octree;
243     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
244     for (MG_NOEUD* no=compmgmai->get_premier_noeud(it);no!=NULL;no=compmgmai->get_suivant_noeud(it))
245     octree.inserer(no);
246    
247 sattarpa 695 MG_SOLUTION* mgsol=new MG_SOLUTION(refmgmai,1,solfilename,1,(char*)"Normaldistance",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
248 sattarpa 596 refgest.ajouter_mg_solution(mgsol);
249     mgsol->change_legende(0,"Normaldistance");
250     int i=0;
251     for (MG_NOEUD* nop=refmgmai->get_premier_noeud(it);nop!=NULL;nop=refmgmai->get_suivant_noeud(it))
252     {
253     TPL_MAP_ENTITE<MG_NOEUD*> lstneiclose;
254     int neindnb=lstneiclose.get_nb();
255     while(neindnb==0)
256     {
257     octree.rechercher(nop->get_x(),nop->get_y(),nop->get_z(),search_radius,lstneiclose);
258     neindnb=lstneiclose.get_nb();
259     }
260     map<double,MG_NOEUD*,std::less<double> > lstdist;
261     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itnop;
262     for(MG_NOEUD* no=lstneiclose.get_premier(itnop);no!=NULL;no=lstneiclose.get_suivant(itnop))
263     {
264 sattarpa 679 //double distns=sqrt(pow(nop->get_x()-no->get_x(),2)+pow(nop->get_y()-no->get_y(),2)+pow(nop->get_z()-no->get_z(),2));
265 sattarpa 596
266     OT_VECTEUR_3D w_n_tot(0.,0.,0.);
267     double norme_w_n_tot=0.;
268     OT_VECTEUR_3D w2_n_tot(0.,0.,0.);
269     double norme_w2_n_tot=0.;
270 sattarpa 679 //int nbtri=nop->get_lien_triangle()->get_nb();
271     int nbtri=no->get_lien_triangle()->get_nb();
272 sattarpa 596 for (int i=0;i<nbtri;i++)
273     {
274 sattarpa 679 //MG_TRIANGLE* tri=(MG_TRIANGLE*)nop->get_lien_triangle()->get(i);
275     MG_TRIANGLE* tri=(MG_TRIANGLE*)no->get_lien_triangle()->get(i);
276 sattarpa 596 double *xyzn1=tri->get_noeud1()->get_coord();
277     double *xyzn2=tri->get_noeud2()->get_coord();
278     double *xyzn3=tri->get_noeud3()->get_coord();
279    
280     OT_VECTEUR_3D vec1(xyzn1,xyzn3);
281     OT_VECTEUR_3D vec2(xyzn1,xyzn2);
282     OT_VECTEUR_3D n_tri=vec1&vec2; // Normale au triangle
283    
284     double w=n_tri.get_longueur(); // 2 fois l'aire du triangle (pour éviter une division par 2)
285     n_tri.norme();
286     OT_VECTEUR_3D w_n=w*n_tri;
287     double norme_w_n=w_n.get_longueur();
288     w_n_tot=w_n_tot+w_n;
289     norme_w_n_tot=norme_w_n_tot+norme_w_n;
290     }
291    
292     OT_VECTEUR_3D n=w_n_tot/norme_w_n_tot; // Normale à la surface au noeud
293     n.norme();
294     OT_VECTEUR_3D distvec(nop->get_coord(),no->get_coord());
295     double normaldistance=distvec*n;
296     double normaldistanceabs=fabs(normaldistance);
297     //cout<<"normaldistanceabs= "<<normaldistanceabs<<endl;
298     lstdist.insert(pair<double,MG_NOEUD*>(normaldistanceabs,nop));
299     }
300     map<double,MG_NOEUD*,std::less<double> >::iterator itlstdist=lstdist.begin();
301     double distnsclos=(*itlstdist).first;
302     MG_NOEUD* nodcls=(*itlstdist).second;
303     //cout<<"distnsclos= "<<distnsclos<<endl;
304     mgsol->ecrire(distnsclos,i,0,0);
305     //mgsol->ecrire(distnsclos,1,0,0);
306     i++;
307 sattarpa 554 }
308 sattarpa 596 refgest.enregistrer(outputcomparefile);
309     }
310 sattarpa 609 void CRIAQOPERATORS::deformed_correspond_mgmaiadd(char* magicfilename,int meshno,int numsol1,int numsol2,int numsol3,int numchamp1,int numchamp2,int numchamp3,double coef)
311     {
312     MG_FILE gest(magicfilename);
313     FEM_MAILLAGE* femmai;
314     if (meshno==0) femmai=gest.get_fem_maillage(meshno); else femmai=gest.get_fem_maillageid(meshno);
315     FEM_SOLUTION* sol1=gest.get_fem_solutionid(numsol1);
316     FEM_SOLUTION* sol2=gest.get_fem_solutionid(numsol2);
317     FEM_SOLUTION* sol3=gest.get_fem_solutionid(numsol3);
318     femmai->calcul_deforme(sol1,numchamp1,sol2,numchamp2,sol3,numchamp3);
319     if (coef>1e-16)
320     {
321     cout<<" Création du maillage deforme avec correspondence text file"<<endl;
322     MG_MAILLAGE* defmgmai=new MG_MAILLAGE(gest.get_mg_geometrie(0));
323     gest.ajouter_mg_maillage(defmgmai);
324     {
325     if (femmai->get_degre()==1)
326     {
327     //gest=femmai->get_mg_maillage()->get_gestionnaire();
328     //gest->ajouter_mg_maillage(this);
329     std::vector<unsigned long*> lstcores;//sasan
330     LISTE_FEM_NOEUD::iterator it;
331     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
332     {
333     double x=no->get_x(coef);
334     double y=no->get_y(coef);
335     double z=no->get_z(coef);
336     MG_NOEUD *newno=new MG_NOEUD(no->get_lien_topologie(),x,y,z,DEFORME);
337     defmgmai->ajouter_mg_noeud(newno);
338     no->change_numero(newno->get_id());
339     unsigned long* correscad_defcad=new unsigned long[2];//sasan
340     correscad_defcad[0]=no->get_mg_element_maillage()->get_id();//sasan
341     correscad_defcad[1]=newno->get_id();//sasan
342     lstcores.push_back(correscad_defcad);//sasan
343     }
344     //sasan
345     FILE* in1=fopen("correspond_deform_mgmaill.txt","wt");
346 sattarpa 659 fprintf(in1,"MG_MAILLAGE No. : deformed_MAILLAGE No.\n");
347 sattarpa 609 fprintf(in1,"%lu %lu\n",femmai->get_mg_maillage()->get_id(),defmgmai->get_id());
348     for(std::vector<unsigned long*>::iterator itlstpinsert=lstcores.begin();itlstpinsert!=lstcores.end();itlstpinsert++)
349     {
350     unsigned long* xyzpins1;
351     xyzpins1=(*itlstpinsert);
352     //cout<<" xyzpins1[0]= "<<xyzpins1[0]<<" xyzpins1[1]= "<<xyzpins1[1]<<endl;
353     fprintf(in1,"%lu %lu\n",xyzpins1[0],xyzpins1[1]);
354     }
355     fclose(in1);
356     //sasan till
357     LISTE_FEM_ELEMENT1::iterator it1;
358     for (FEM_ELEMENT1 *ele=femmai->get_premier_element1(it1);ele!=NULL;ele=femmai->get_suivant_element1(it1))
359     {
360     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
361     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
362     MG_SEGMENT *seg=new MG_SEGMENT(ele->get_lien_topologie(),no1,no2,DEFORME);
363     defmgmai->ajouter_mg_segment(seg);
364     }
365     LISTE_FEM_ELEMENT2::iterator it2;
366     for (FEM_ELEMENT2 *ele=femmai->get_premier_element2(it2);ele!=NULL;ele=femmai->get_suivant_element2(it2))
367     {
368     if (ele->get_nb_fem_noeud()==3)
369     {
370     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
371     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
372     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
373     defmgmai->ajouter_mg_triangle(ele->get_lien_topologie(),no1,no2,no3,DEFORME);
374     }
375     if (ele->get_nb_fem_noeud()==4)
376     {
377     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
378     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
379     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
380     MG_NOEUD* no4=defmgmai->get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
381     defmgmai->ajouter_mg_quadrangle(ele->get_lien_topologie(),no1,no2,no3,no4,DEFORME);
382     }
383     }
384     LISTE_FEM_ELEMENT3::iterator it3;
385     for (FEM_ELEMENT3 *ele=femmai->get_premier_element3(it3);ele!=NULL;ele=femmai->get_suivant_element3(it3))
386     {
387     if (ele->get_nb_fem_noeud()==4)
388     {
389     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
390     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
391     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
392     MG_NOEUD* no4=defmgmai->get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
393     defmgmai->ajouter_mg_tetra(ele->get_lien_topologie(),no1,no2,no3,no4,DEFORME);
394     }
395     if (ele->get_nb_fem_noeud()==8)
396     {
397     MG_NOEUD* no1=defmgmai->get_mg_noeudid(ele->get_fem_noeud(0)->get_numero());
398     MG_NOEUD* no2=defmgmai->get_mg_noeudid(ele->get_fem_noeud(1)->get_numero());
399     MG_NOEUD* no3=defmgmai->get_mg_noeudid(ele->get_fem_noeud(2)->get_numero());
400     MG_NOEUD* no4=defmgmai->get_mg_noeudid(ele->get_fem_noeud(3)->get_numero());
401     MG_NOEUD* no5=defmgmai->get_mg_noeudid(ele->get_fem_noeud(4)->get_numero());
402     MG_NOEUD* no6=defmgmai->get_mg_noeudid(ele->get_fem_noeud(5)->get_numero());
403     MG_NOEUD* no7=defmgmai->get_mg_noeudid(ele->get_fem_noeud(6)->get_numero());
404     MG_NOEUD* no8=defmgmai->get_mg_noeudid(ele->get_fem_noeud(7)->get_numero());
405     defmgmai->ajouter_mg_hexa(ele->get_lien_topologie(),no1,no2,no3,no4,no5,no6,no7,no8,DEFORME);
406     }
407     }
408    
409     }
410     }
411     }
412     cout<<" Enregistrement"<<endl;
413     gest.enregistrer(magicfilename);
414     }
415 sattarpa 650 void CRIAQOPERATORS::curvtur_crit_remvsmp(char* magicfilename,char* correspondfilename,char* gnifinspointfile,char* out_gnifinspointfile_removondefect,double search_radius,double curvdif_coef,int gmsh_affiche,double relet_search_rad,int relet_curvature)
416 sattarpa 609 {
417     MG_FILE gest(magicfilename);
418     map<unsigned long, unsigned long> coresspondndidlst;
419     FILE* in1=fopen(correspondfilename,"rt");
420     if (in1==NULL) cout<<"correspondfile is not available"<<endl;
421     char mess[500];
422     char *res=fgets(mess,500,in1);
423 sattarpa 655 if(feof(in1))
424     cout<<"correspondfile has not been well written"<<endl;
425 sattarpa 609 res=fgets(mess,500,in1);
426 sattarpa 655 if(feof(in1))
427     cout<<"correspondfile has not been well written"<<endl;
428 sattarpa 609 int cadmeshno;
429     int defcadmeshno;
430 sattarpa 659 int nb1=sscanf(mess,"%d %d",&cadmeshno,&defcadmeshno);
431 sattarpa 609 while (!feof(in1))
432     {
433     char chaine[500];
434 sattarpa 655 res=fgets(chaine,500,in1);
435     if(res!=NULL)
436     {
437 sattarpa 609 unsigned long cadndid;
438     unsigned long defcadndid;
439     int nb=sscanf(chaine,"%lu %lu",&cadndid,&defcadndid);
440     if (nb!=-1 && nb!=2) cout<<"Wrong file format"<<endl;
441     else if (nb==2)
442     {
443     coresspondndidlst.insert(pair<unsigned long, unsigned long> (defcadndid,cadndid) );
444     }
445 sattarpa 655 }
446 sattarpa 609 }
447     fclose(in1);
448 sattarpa 650
449     cout<<"cadmeshno= "<<cadmeshno<<" defcadmeshno= "<<defcadmeshno<<endl;
450 sattarpa 609 MG_MAILLAGE* cadmgmai;
451     if (cadmeshno==0) cadmgmai=gest.get_mg_maillage(cadmeshno); else cadmgmai=gest.get_mg_maillageid(cadmeshno);
452     MG_MAILLAGE* defcadmgmai;
453     if (defcadmeshno==0) defcadmgmai=gest.get_mg_maillage(defcadmeshno); else defcadmgmai=gest.get_mg_maillageid(defcadmeshno);
454 sattarpa 650
455     cout<<"octree initialization "<<endl;
456     //CAD octree initialization
457     LISTE_MG_NOEUD::iterator itcadndcurv;
458     double xmincad=1e308,ymincad=1e308,zmincad=1e308,xmaxcad=-1e308,ymaxcad=-1e308,zmaxcad=-1e308;
459     TPL_MAP_ENTITE<MG_NOEUD*> lstcadnoeud;
460     for(MG_NOEUD* cadndcurv=cadmgmai->get_premier_noeud(itcadndcurv);cadndcurv!=NULL;cadndcurv=cadmgmai->get_suivant_noeud(itcadndcurv))
461     {
462     if (cadndcurv->get_x()<xmincad) xmincad=cadndcurv->get_x();
463     if (cadndcurv->get_y()<ymincad) ymincad=cadndcurv->get_y();
464     if (cadndcurv->get_z()<zmincad) zmincad=cadndcurv->get_z();
465     if (cadndcurv->get_x()>xmaxcad) xmaxcad=cadndcurv->get_x();
466     if (cadndcurv->get_y()>ymaxcad) ymaxcad=cadndcurv->get_y();
467     if (cadndcurv->get_z()>zmaxcad) zmaxcad=cadndcurv->get_z();
468     lstcadnoeud.ajouter(cadndcurv);
469     }
470     OT_VECTEUR_3D vecmincad(xmincad,ymincad,zmincad);
471     OT_VECTEUR_3D vecmmaxcad(xmaxcad,ymaxcad,zmaxcad);
472     OT_VECTEUR_3D vecad(vecmmaxcad,vecmincad);
473     OT_VECTEUR_3D mincad(xmincad,ymincad,zmincad); OT_VECTEUR_3D maxcad(xmaxcad,ymaxcad,zmaxcad); OT_VECTEUR_3D averagecad=(mincad+maxcad)/2.; OT_VECTEUR_3D lengthvecad(mincad,maxcad);
474     double lengthcad=sqrt(lengthvecad*lengthvecad); double bxrcad=1.1;
475     xmincad=averagecad.get_x()-(lengthcad*bxrcad);ymincad=averagecad.get_y()-(lengthcad*bxrcad);zmincad=averagecad.get_z()-(lengthcad*bxrcad);
476     xmaxcad=averagecad.get_x()+(lengthcad*bxrcad);ymaxcad=averagecad.get_y()+(lengthcad*bxrcad);zmaxcad=averagecad.get_z()+(lengthcad*bxrcad);
477     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreecad;
478     octreecad.initialiser(&lstcadnoeud,1,xmincad,ymincad,zmincad,xmaxcad,ymaxcad,zmaxcad);
479     for(MG_NOEUD* cadndcurv=cadmgmai->get_premier_noeud(itcadndcurv);cadndcurv!=NULL;cadndcurv=cadmgmai->get_suivant_noeud(itcadndcurv))
480     octreecad.inserer(cadndcurv);
481     //deformed_CAD octree initialization
482     LISTE_MG_NOEUD::iterator itdefcadndcurv;
483     double xmindefcad=1e308,ymindefcad=1e308,zmindefcad=1e308,xmaxdefcad=-1e308,ymaxdefcad=-1e308,zmaxdefcad=-1e308;
484     TPL_MAP_ENTITE<MG_NOEUD*> lstdefcadnoeud;
485     for(MG_NOEUD* defcadndcurv=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadndcurv!=NULL;defcadndcurv=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
486     {
487     if (defcadndcurv->get_x()<xmindefcad) xmindefcad=defcadndcurv->get_x();
488     if (defcadndcurv->get_y()<ymindefcad) ymindefcad=defcadndcurv->get_y();
489     if (defcadndcurv->get_z()<zmindefcad) zmindefcad=defcadndcurv->get_z();
490     if (defcadndcurv->get_x()>xmaxdefcad) xmaxdefcad=defcadndcurv->get_x();
491     if (defcadndcurv->get_y()>ymaxdefcad) ymaxdefcad=defcadndcurv->get_y();
492     if (defcadndcurv->get_z()>zmaxdefcad) zmaxdefcad=defcadndcurv->get_z();
493     lstdefcadnoeud.ajouter(defcadndcurv);
494     }
495     OT_VECTEUR_3D vecmindefcad(xmindefcad,ymindefcad,zmindefcad);OT_VECTEUR_3D vecmmaxdefcad(xmaxdefcad,ymaxdefcad,zmaxdefcad);
496     OT_VECTEUR_3D vecdefcad(vecmmaxdefcad,vecmindefcad);
497     OT_VECTEUR_3D mindefcad(xmindefcad,ymindefcad,zmindefcad); OT_VECTEUR_3D maxdefcad(xmaxdefcad,ymaxdefcad,zmaxdefcad); OT_VECTEUR_3D averagedefcad=(mindefcad+maxdefcad)/2.; OT_VECTEUR_3D lengthvecdefcad(mindefcad,maxdefcad);
498     double lengthdefcad=sqrt(lengthvecdefcad*lengthvecdefcad); double bxrdefcad=1.1;
499     xmindefcad=averagedefcad.get_x()-(lengthdefcad*bxrdefcad);ymindefcad=averagedefcad.get_y()-(lengthdefcad*bxrdefcad);zmindefcad=averagedefcad.get_z()-(lengthdefcad*bxrdefcad);
500     xmaxdefcad=averagedefcad.get_x()+(lengthdefcad*bxrdefcad);ymaxdefcad=averagedefcad.get_y()+(lengthdefcad*bxrdefcad);zmaxdefcad=averagedefcad.get_z()+(lengthdefcad*bxrdefcad);
501     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreedefcad;
502     octreedefcad.initialiser(&lstdefcadnoeud,1,xmindefcad,ymindefcad,zmindefcad,xmaxdefcad,ymaxdefcad,zmaxdefcad);
503     for(MG_NOEUD* defcadndcurv=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadndcurv!=NULL;defcadndcurv=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
504     octreedefcad.inserer(defcadndcurv);
505    
506 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_cadmgmai;
507     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_cadmgmai;
508 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_cadmgmai;
509 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_defcadmgmai;
510     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_defcadmgmai;
511 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_defcadmgmai;
512 sattarpa 650 map<MG_NOEUD*,double > lstkmin_cad;
513     map<MG_NOEUD*,double > lstkmax_cad;
514     map<MG_NOEUD*,double > lstkgau_cad;
515     map<MG_NOEUD*,double > lstkmin_defcad;
516     map<MG_NOEUD*,double > lstkmax_defcad;
517     map<MG_NOEUD*,double > lstkgau_defcad;
518     multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_relt_cadmgmai;
519     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_relt_cadmgmai;
520     multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_relt_cadmgmai;
521     multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_relt_defcadmgmai;
522     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_relt_defcadmgmai;
523     multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_relt_defcadmgmai;
524 sattarpa 609 std::map<std::string,double> liste_kmin;
525     std::map<std::string,double> liste_kmax;
526     std::map<std::string,double> liste_gau;
527     std::map<std::string,double> liste_courburemax1;
528     std::map<std::string,double> liste_courburemax2;
529     std::map<std::string,double> liste_courburemax3;
530     std::map<std::string,double> liste_courburemax4;
531     std::map<std::string,double> liste_courburemax5;
532     int opensurafece=1;
533 sattarpa 650
534 sattarpa 609 cout<<"calcul courbure cadmgmai"<<endl;
535     // calcul courbure cadmgmai ********************************
536     for (MG_NOEUD* cadmgnd=cadmgmai->get_premier_noeud(itcadndcurv);cadmgnd!=NULL;cadmgnd=cadmgmai->get_suivant_noeud(itcadndcurv))
537     {
538     double kmin1=0.;
539     double kmax1=0.;
540     double kmin2=0.;
541     double kmax2=0.;
542     MG_MAILLAGE_OUTILS *cou;
543     cou->calcul_courbure_face_arete_sommet(cadmgnd,kmin1,kmax1,kmin2,kmax2,liste_kmin,liste_kmax,liste_gau,liste_courburemax1,liste_courburemax2,liste_courburemax3,liste_courburemax4,liste_courburemax5,opensurafece);
544     }
545     for (MG_NOEUD* cadmgnd=cadmgmai->get_premier_noeud(itcadndcurv);cadmgnd!=NULL;cadmgnd=cadmgmai->get_suivant_noeud(itcadndcurv))
546     {
547 sattarpa 650
548 sattarpa 609 unsigned long idface=cadmgnd->get_lien_topologie()->get_id();
549     unsigned long idnoeud=cadmgnd->get_id();
550     char mess[500];
551     sprintf(mess,"%lu_%lu",idnoeud,idface);
552     for(std::map<std::string,double>::iterator itkmin=liste_kmin.begin();itkmin!=liste_kmin.end();itkmin++)
553     {
554     if(mess==(*itkmin).first)
555 sattarpa 650 {
556 sattarpa 609 lstkmin_cadmgmai.insert(pair<double,MG_NOEUD*>((*itkmin).second,cadmgnd) );
557 sattarpa 650 lstkmin_cad.insert(pair<MG_NOEUD*,double>(cadmgnd,(*itkmin).second));
558     }
559 sattarpa 609 }
560     for(std::map<std::string,double>::iterator itkmax=liste_kmax.begin();itkmax!=liste_kmax.end();itkmax++)
561     {
562     if(mess==(*itkmax).first)
563 sattarpa 650 {
564 sattarpa 609 lstkmax_cadmgmai.insert(pair<double,MG_NOEUD*>((*itkmax).second,cadmgnd) );
565 sattarpa 650 lstkmax_cad.insert(pair<MG_NOEUD*,double>(cadmgnd,(*itkmax).second));
566     }
567 sattarpa 609 }
568 sattarpa 646 for(std::map<std::string,double>::iterator itkgau=liste_gau.begin();itkgau!=liste_gau.end();itkgau++)
569     {
570     if(mess==(*itkgau).first)
571 sattarpa 650 {
572 sattarpa 646 lstkgau_cadmgmai.insert(pair<double,MG_NOEUD*>((*itkgau).second,cadmgnd) );
573 sattarpa 650 lstkgau_cad.insert(pair<MG_NOEUD*,double>(cadmgnd,(*itkgau).second));
574     }
575 sattarpa 646 }
576 sattarpa 609 }
577 sattarpa 650 //calc reletive curvature CAD
578     map<MG_NOEUD*,double >::iterator itlstkmin_cad;
579     map<MG_NOEUD*,double >::iterator itlstkmax_cad;
580     map<MG_NOEUD*,double >::iterator itlstkgau_cad;
581     for (MG_NOEUD* cadmgnd=cadmgmai->get_premier_noeud(itcadndcurv);cadmgnd!=NULL;cadmgnd=cadmgmai->get_suivant_noeud(itcadndcurv))
582     {
583     itlstkmin_cad=lstkmin_cad.find(cadmgnd);
584     double relet_kmincad=(*itlstkmin_cad).second;
585     itlstkmax_cad=lstkmax_cad.find(cadmgnd);
586     double relet_kmaxcad=(*itlstkmax_cad).second;
587     itlstkgau_cad=lstkgau_cad.find(cadmgnd);
588     double relet_kgaucad=(*itlstkgau_cad).second;
589     TPL_MAP_ENTITE<MG_NOEUD*> lstnei_relcad;
590     int relcad_neindnb=lstnei_relcad.get_nb();
591     double relet_search_rad1=relet_search_rad;
592     while(relcad_neindnb<1)
593     {
594     octreecad.rechercher(cadmgnd->get_x(),cadmgnd->get_y(),cadmgnd->get_z(),relet_search_rad1,lstnei_relcad);
595     relcad_neindnb=lstnei_relcad.get_nb();
596     relet_search_rad1=relet_search_rad1+0.1*relet_search_rad;
597     }
598     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
599     for(MG_NOEUD* cadndnei=lstnei_relcad.get_premier(itndnei);cadndnei!=NULL;cadndnei=lstnei_relcad.get_suivant(itndnei))
600     {
601     itlstkmin_cad=lstkmin_cad.find(cadndnei);
602     relet_kmincad=relet_kmincad+(*itlstkmin_cad).second;
603     itlstkmax_cad=lstkmax_cad.find(cadndnei);
604     relet_kmaxcad=relet_kmaxcad+(*itlstkmax_cad).second;
605     itlstkgau_cad=lstkgau_cad.find(cadndnei);
606     relet_kgaucad=relet_kgaucad+(*itlstkgau_cad).second;
607     }
608     relet_kmincad=relet_kmincad/lstnei_relcad.get_nb();
609     relet_kmaxcad=relet_kmaxcad/lstnei_relcad.get_nb();
610     relet_kgaucad=relet_kgaucad/lstnei_relcad.get_nb();
611     lstkmin_relt_cadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmincad,cadmgnd));
612     lstkmax_relt_cadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmaxcad,cadmgnd));
613     lstkgau_relt_cadmgmai.insert(pair<double,MG_NOEUD*> (relet_kgaucad,cadmgnd));
614     }
615     // affichage reletive sur GMSH ******************************
616     if (gmsh_affiche>1)
617     {
618     cout<<"affiche: calcul_courbure_cadmgmai_relet "<<endl;
619     std::ostringstream oss;
620     oss << "calcul_courbure_cadmgmai_curvdif_relet_coef:" <<curvdif_coef ;
621     std::string namefic = oss.str();
622     char *cstr = new char[namefic.length() + 1];
623     strcpy(cstr, namefic.c_str());
624     MG_SOLUTION* sol1=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
625     gest.ajouter_mg_solution(sol1);
626     sol1->change_legende(0,"Kmin_relet");
627     sol1->change_legende(1,"Kmax_relet");
628     sol1->change_legende(2,"K_gau_relet");
629     LISTE_MG_TRIANGLE::iterator ittri;
630     int compte=0;
631     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
632     {
633     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_cadmgmai;
634     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_cadmgmai;
635     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_cadmgmai;
636     MG_NOEUD *no1=tri->get_noeud1();
637     MG_NOEUD *no2=tri->get_noeud2();
638     MG_NOEUD *no3=tri->get_noeud3();
639     double valeur0;
640     double valeur1;
641     double valeur2;
642     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
643     {
644     if (no1==(*itlstkmin_relt_cadmgmai).second)
645     valeur0=(*itlstkmin_relt_cadmgmai).first;
646     }
647     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
648     {
649     if (no1==(*itlstkmax_relt_cadmgmai).second)
650     valeur1=(*itlstkmax_relt_cadmgmai).first;
651     }
652     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
653     {
654     if (no1==(*itlstkgau_relt_cadmgmai).second)
655     valeur2=(*itlstkgau_relt_cadmgmai).first;
656     }
657     sol1->ecrire(valeur0,compte,0,0);
658     sol1->ecrire(valeur1,compte,1,0);
659     sol1->ecrire(valeur2,compte,2,0);
660     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
661     {
662     if (no2==(*itlstkmin_relt_cadmgmai).second)
663     valeur0=(*itlstkmin_relt_cadmgmai).first;
664     }
665     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
666     {
667     if (no2==(*itlstkmax_relt_cadmgmai).second)
668     valeur1=(*itlstkmax_relt_cadmgmai).first;
669     }
670     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
671     {
672     if (no2==(*itlstkgau_relt_cadmgmai).second)
673     valeur2=(*itlstkgau_relt_cadmgmai).first;
674     }
675     sol1->ecrire(valeur0,compte,0,1);
676     sol1->ecrire(valeur1,compte,1,1);
677     sol1->ecrire(valeur2,compte,2,1);
678     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
679     {
680     if (no3==(*itlstkmin_relt_cadmgmai).second)
681     valeur0=(*itlstkmin_relt_cadmgmai).first;
682     }
683     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
684     {
685     if (no3==(*itlstkmax_relt_cadmgmai).second)
686     valeur1=(*itlstkmax_relt_cadmgmai).first;
687     }
688     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
689     {
690     if (no3==(*itlstkgau_relt_cadmgmai).second)
691     valeur2=(*itlstkgau_relt_cadmgmai).first;
692     }
693     sol1->ecrire(valeur0,compte,0,2);
694     sol1->ecrire(valeur1,compte,1,2);
695     sol1->ecrire(valeur2,compte,2,2);
696     compte++;
697     }
698     }
699 sattarpa 646 // affichage sur GMSH ******************************
700     if (gmsh_affiche>1)
701     {
702     cout<<"affiche: calcul_courbure_cadmgmai "<<endl;
703     std::ostringstream oss;
704     oss << "calcul_courbure_cadmgmai_curvdif_coef:" <<curvdif_coef ;
705     std::string namefic = oss.str();
706     char *cstr = new char[namefic.length() + 1];
707     strcpy(cstr, namefic.c_str());
708     MG_SOLUTION* sol1=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
709     gest.ajouter_mg_solution(sol1);
710     sol1->change_legende(0,"Kmin");
711     sol1->change_legende(1,"Kmax");
712     sol1->change_legende(2,"K_gau");
713     LISTE_MG_TRIANGLE::iterator ittri;
714     int compte=0;
715     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
716     {
717     MG_NOEUD *no1=tri->get_noeud1();
718     MG_NOEUD *no2=tri->get_noeud2();
719     MG_NOEUD *no3=tri->get_noeud3();
720     char mess[500];
721     sprintf(mess,"%lu_%lu",no1->get_id(),tri->get_lien_topologie()->get_id());
722     double valeur0=liste_kmin[mess];
723     double valeur1=liste_kmax[mess];
724     double valeur2=liste_gau[mess];
725     sol1->ecrire(valeur0,compte,0,0);
726     sol1->ecrire(valeur1,compte,1,0);
727     sol1->ecrire(valeur2,compte,2,0);
728     sprintf(mess,"%lu_%lu",no2->get_id(),tri->get_lien_topologie()->get_id());
729     valeur0=liste_kmin[mess];
730     valeur1=liste_kmax[mess];
731     valeur2=liste_gau[mess];
732     sol1->ecrire(valeur0,compte,0,1);
733     sol1->ecrire(valeur1,compte,1,1);
734     sol1->ecrire(valeur2,compte,2,1);
735     sprintf(mess,"%lu_%lu",no3->get_id(),tri->get_lien_topologie()->get_id());
736     valeur0=liste_kmin[mess];
737     valeur1=liste_kmax[mess];
738     valeur2=liste_gau[mess];
739     sol1->ecrire(valeur0,compte,0,2);
740     sol1->ecrire(valeur1,compte,1,2);
741     sol1->ecrire(valeur2,compte,2,2);
742     compte++;
743     }
744     }
745 sattarpa 609 liste_kmin.clear();liste_kmax.clear();liste_gau.clear();liste_courburemax1.clear();liste_courburemax2.clear();liste_courburemax3.clear();liste_courburemax4.clear();liste_courburemax5.clear();
746 sattarpa 650
747     cout<<"calcul courbure defcadmgmai"<<endl;
748 sattarpa 609 // calcul courbure defcadmgmai ********************************
749 sattarpa 554
750 sattarpa 609 for (MG_NOEUD* defcadmgnd=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadmgnd!=NULL;defcadmgnd=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
751     {
752     double kmin1=0.;
753     double kmax1=0.;
754     double kmin2=0.;
755     double kmax2=0.;
756     MG_MAILLAGE_OUTILS *cou;
757     cou->calcul_courbure_face_arete_sommet(defcadmgnd,kmin1,kmax1,kmin2,kmax2,liste_kmin,liste_kmax,liste_gau,liste_courburemax1,liste_courburemax2,liste_courburemax3,liste_courburemax4,liste_courburemax5,opensurafece);
758     }
759     for (MG_NOEUD* defcadmgnd=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadmgnd!=NULL;defcadmgnd=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
760     {
761     unsigned long idface=defcadmgnd->get_lien_topologie()->get_id();
762     unsigned long idnoeud=defcadmgnd->get_id();
763     char mess[500];
764     sprintf(mess,"%lu_%lu",idnoeud,idface);
765     for(std::map<std::string,double>::iterator itkmin=liste_kmin.begin();itkmin!=liste_kmin.end();itkmin++)
766     {
767     if(mess==(*itkmin).first)
768 sattarpa 650 {
769 sattarpa 609 lstkmin_defcadmgmai.insert(pair<double,MG_NOEUD*>((*itkmin).second,defcadmgnd) );
770 sattarpa 650 lstkmin_defcad.insert(pair<MG_NOEUD*,double>(defcadmgnd,(*itkmin).second));
771     }
772 sattarpa 609 }
773     for(std::map<std::string,double>::iterator itkmax=liste_kmax.begin();itkmax!=liste_kmax.end();itkmax++)
774     {
775     if(mess==(*itkmax).first)
776 sattarpa 650 {
777 sattarpa 609 lstkmax_defcadmgmai.insert(pair<double,MG_NOEUD*>((*itkmax).second,defcadmgnd) );
778 sattarpa 650 lstkmax_defcad.insert(pair<MG_NOEUD*,double>(defcadmgnd,(*itkmax).second));
779     }
780 sattarpa 609 }
781 sattarpa 646 for(std::map<std::string,double>::iterator itkgau=liste_gau.begin();itkgau!=liste_gau.end();itkgau++)
782     {
783     if(mess==(*itkgau).first)
784 sattarpa 650 {
785 sattarpa 646 lstkgau_defcadmgmai.insert(pair<double,MG_NOEUD*>((*itkgau).second,defcadmgnd) );
786 sattarpa 650 lstkgau_defcad.insert(pair<MG_NOEUD*,double>(defcadmgnd,(*itkgau).second));
787     }
788 sattarpa 646 }
789 sattarpa 609 }
790 sattarpa 650 //calc reletive curvature defCAD
791     map<MG_NOEUD*,double >::iterator itlstkmin_defcad;
792     map<MG_NOEUD*,double >::iterator itlstkmax_defcad;
793     map<MG_NOEUD*,double >::iterator itlstkgau_defcad;
794     for (MG_NOEUD* defcadmgnd=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadmgnd!=NULL;defcadmgnd=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
795     {
796     itlstkmin_defcad=lstkmin_defcad.find(defcadmgnd);
797     double relet_kmindefcad=(*itlstkmin_defcad).second;
798     itlstkmax_defcad=lstkmax_defcad.find(defcadmgnd);
799     double relet_kmaxdefcad=(*itlstkmax_defcad).second;
800     itlstkgau_defcad=lstkgau_cad.find(defcadmgnd);
801     double relet_kgaudefcad=(*itlstkgau_defcad).second;
802     TPL_MAP_ENTITE<MG_NOEUD*> lstnei_reldefcad;
803     int reldefcad_neindnb=lstnei_reldefcad.get_nb();
804     double relet_search_rad1=relet_search_rad;
805     while(reldefcad_neindnb<1)
806     {
807     octreecad.rechercher(defcadmgnd->get_x(),defcadmgnd->get_y(),defcadmgnd->get_z(),relet_search_rad1,lstnei_reldefcad);
808     reldefcad_neindnb=lstnei_reldefcad.get_nb();
809     relet_search_rad1=relet_search_rad1+0.1*relet_search_rad;
810     }
811     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
812     for(MG_NOEUD* defcadndnei=lstnei_reldefcad.get_premier(itndnei);defcadndnei!=NULL;defcadndnei=lstnei_reldefcad.get_suivant(itndnei))
813     {
814     itlstkmin_cad=lstkmin_cad.find(defcadndnei);
815     relet_kmindefcad=relet_kmindefcad+(*itlstkmin_defcad).second;
816     itlstkmax_cad=lstkmax_cad.find(defcadndnei);
817     relet_kmaxdefcad=relet_kmaxdefcad+(*itlstkmax_defcad).second;
818     itlstkgau_cad=lstkgau_cad.find(defcadndnei);
819     relet_kgaudefcad=relet_kgaudefcad+(*itlstkgau_defcad).second;
820     }
821     relet_kmindefcad=relet_kmindefcad/lstnei_reldefcad.get_nb();
822     relet_kmaxdefcad=relet_kmaxdefcad/lstnei_reldefcad.get_nb();
823     relet_kgaudefcad=relet_kgaudefcad/lstnei_reldefcad.get_nb();
824     lstkmin_relt_defcadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmindefcad,defcadmgnd));
825     lstkmax_relt_defcadmgmai.insert(pair<double,MG_NOEUD*> (relet_kmaxdefcad,defcadmgnd));
826     lstkgau_relt_defcadmgmai.insert(pair<double,MG_NOEUD*> (relet_kgaudefcad,defcadmgnd));
827     }
828     // affichage reletive defcad sur GMSH ******************************
829     if (gmsh_affiche>1)
830     {
831     cout<<"affiche: calcul_courbure_cadmgmai_relet "<<endl;
832     std::ostringstream oss;
833     oss << "calcul_courbure_cadmgmai_curvdif_relet_coef:" <<curvdif_coef ;
834     std::string namefic = oss.str();
835     char *cstr = new char[namefic.length() + 1];
836     strcpy(cstr, namefic.c_str());
837     MG_SOLUTION* sol1=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
838     gest.ajouter_mg_solution(sol1);
839     sol1->change_legende(0,"Kmin_relet");
840     sol1->change_legende(1,"Kmax_relet");
841     sol1->change_legende(2,"K_gau_relet");
842     LISTE_MG_TRIANGLE::iterator ittri;
843     int compte=0;
844     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
845     {
846     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_cadmgmai;
847     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_cadmgmai;
848     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_cadmgmai;
849     MG_NOEUD *no1=tri->get_noeud1();
850     MG_NOEUD *no2=tri->get_noeud2();
851     MG_NOEUD *no3=tri->get_noeud3();
852     double valeur0;
853     double valeur1;
854     double valeur2;
855     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
856     {
857     if (no1==(*itlstkmin_relt_cadmgmai).second)
858     valeur0=(*itlstkmin_relt_cadmgmai).first;
859     }
860     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
861     {
862     if (no1==(*itlstkmax_relt_cadmgmai).second)
863     valeur1=(*itlstkmax_relt_cadmgmai).first;
864     }
865     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
866     {
867     if (no1==(*itlstkgau_relt_cadmgmai).second)
868     valeur2=(*itlstkgau_relt_cadmgmai).first;
869     }
870     sol1->ecrire(valeur0,compte,0,0);
871     sol1->ecrire(valeur1,compte,1,0);
872     sol1->ecrire(valeur2,compte,2,0);
873     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
874     {
875     if (no2==(*itlstkmin_relt_cadmgmai).second)
876     valeur0=(*itlstkmin_relt_cadmgmai).first;
877     }
878     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
879     {
880     if (no2==(*itlstkmax_relt_cadmgmai).second)
881     valeur1=(*itlstkmax_relt_cadmgmai).first;
882     }
883     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
884     {
885     if (no2==(*itlstkgau_relt_cadmgmai).second)
886     valeur2=(*itlstkgau_relt_cadmgmai).first;
887     }
888     sol1->ecrire(valeur0,compte,0,1);
889     sol1->ecrire(valeur1,compte,1,1);
890     sol1->ecrire(valeur2,compte,2,1);
891     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
892     {
893     if (no3==(*itlstkmin_relt_cadmgmai).second)
894     valeur0=(*itlstkmin_relt_cadmgmai).first;
895     }
896     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
897     {
898     if (no3==(*itlstkmax_relt_cadmgmai).second)
899     valeur1=(*itlstkmax_relt_cadmgmai).first;
900     }
901     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
902     {
903     if (no3==(*itlstkgau_relt_cadmgmai).second)
904     valeur2=(*itlstkgau_relt_cadmgmai).first;
905     }
906     sol1->ecrire(valeur0,compte,0,2);
907     sol1->ecrire(valeur1,compte,1,2);
908     sol1->ecrire(valeur2,compte,2,2);
909     compte++;
910     }
911     }
912 sattarpa 646 // affichage sur GMSH ******************************
913     if (gmsh_affiche>1)
914     {
915     cout<<"affiche: calcul_courbure_defcadmgmai "<<endl;
916     std::ostringstream oss;
917     oss << "calcul_courbure_defcadmgmai_curvdif_coef:" <<curvdif_coef ;
918     std::string namefic = oss.str();
919     char *cstr = new char[namefic.length() + 1];
920     strcpy(cstr, namefic.c_str());
921     MG_SOLUTION* sol2=new MG_SOLUTION(defcadmgmai,3,cstr,1,(char*)"discrete_curboure_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
922     gest.ajouter_mg_solution(sol2);
923     sol2->change_legende(0,"Kmin");
924     sol2->change_legende(1,"Kmax");
925     sol2->change_legende(2,"K_gau");
926     LISTE_MG_TRIANGLE::iterator ittri;
927     int compte=0;
928     for (MG_TRIANGLE* tri=defcadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=defcadmgmai->get_suivant_triangle(ittri))
929     {
930     MG_NOEUD *no1=tri->get_noeud1();
931     MG_NOEUD *no2=tri->get_noeud2();
932     MG_NOEUD *no3=tri->get_noeud3();
933     char mess[500];
934     sprintf(mess,"%lu_%lu",no1->get_id(),tri->get_lien_topologie()->get_id());
935     double valeur0=liste_kmin[mess];
936     double valeur1=liste_kmax[mess];
937     double valeur2=liste_gau[mess];
938     sol2->ecrire(valeur0,compte,0,0);
939     sol2->ecrire(valeur1,compte,1,0);
940     sol2->ecrire(valeur2,compte,2,0);
941     sprintf(mess,"%lu_%lu",no2->get_id(),tri->get_lien_topologie()->get_id());
942     valeur0=liste_kmin[mess];
943     valeur1=liste_kmax[mess];
944     valeur2=liste_gau[mess];
945     sol2->ecrire(valeur0,compte,0,1);
946     sol2->ecrire(valeur1,compte,1,1);
947     sol2->ecrire(valeur2,compte,2,1);
948     sprintf(mess,"%lu_%lu",no3->get_id(),tri->get_lien_topologie()->get_id());
949     valeur0=liste_kmin[mess];
950     valeur1=liste_kmax[mess];
951     valeur2=liste_gau[mess];
952     sol2->ecrire(valeur0,compte,0,2);
953     sol2->ecrire(valeur1,compte,1,2);
954     sol2->ecrire(valeur2,compte,2,2);
955     compte++;
956     }
957 sattarpa 673
958 sattarpa 646 }
959     liste_kmin.clear();liste_kmax.clear();liste_gau.clear();liste_courburemax1.clear();liste_courburemax2.clear();liste_courburemax3.clear();liste_courburemax4.clear();liste_courburemax5.clear();
960    
961    
962     ///make correspondence between cadmgmai and defcadmgmai nodes
963 sattarpa 609 map<unsigned long, unsigned long>::iterator itcoresspondndidlst;
964     for(MG_NOEUD* defcadndcurv=defcadmgmai->get_premier_noeud(itdefcadndcurv);defcadndcurv!=NULL;defcadndcurv=defcadmgmai->get_suivant_noeud(itdefcadndcurv))
965     {
966     itcoresspondndidlst=coresspondndidlst.find(defcadndcurv->get_id());
967     defcadndcurv->change_nouveau_numero((*itcoresspondndidlst).second);
968     }
969    
970     cout<<"solution calculation"<<endl;
971     multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_diff;
972     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_diff;
973 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_diff;
974 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_cadmgmai;
975     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_cadmgmai;
976 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_cadmgmai;
977 sattarpa 609 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_defcadmgmai;
978     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_defcadmgmai;
979 sattarpa 646 multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_defcadmgmai;
980 sattarpa 609 cout<<"lstkmin_cadmgmai.size()= "<<lstkmin_cadmgmai.size()<<endl;
981     cout<<"lstkmin_defcadmgmai.size()= "<<lstkmin_defcadmgmai.size()<<endl;
982 sattarpa 646 cout<<"kmin diff. calc. started"<<endl;
983 sattarpa 650
984 sattarpa 609 for(itlstkmin_cadmgmai=lstkmin_cadmgmai.begin();itlstkmin_cadmgmai!=lstkmin_cadmgmai.end();itlstkmin_cadmgmai++)
985 sattarpa 554 {
986 sattarpa 609 MG_NOEUD* cadndcurv=(*itlstkmin_cadmgmai).second;
987     double kmindcad;
988     double kmindcad_def;
989     kmindcad=(*itlstkmin_cadmgmai).first;
990     for(itlstkmin_defcadmgmai=lstkmin_defcadmgmai.begin();itlstkmin_defcadmgmai!=lstkmin_defcadmgmai.end();itlstkmin_defcadmgmai++)
991     {
992     MG_NOEUD* defcadndcurv=(*itlstkmin_defcadmgmai).second;
993     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
994     kmindcad_def=(*itlstkmin_defcadmgmai).first;
995     }
996    
997     double kmin_diff=kmindcad_def-kmindcad;
998     lstkmin_diff.insert(pair<double,MG_NOEUD*>(kmin_diff,cadndcurv) );
999     }
1000 sattarpa 646 cout<<"kmax diff. calc. started"<<endl;
1001 sattarpa 609 for(itlstkmax_cadmgmai=lstkmax_cadmgmai.begin();itlstkmax_cadmgmai!=lstkmax_cadmgmai.end();itlstkmax_cadmgmai++)
1002     {
1003     MG_NOEUD* cadndcurv=(*itlstkmax_cadmgmai).second;
1004     double kmaxndcad;
1005     double kmaxndcad_def;
1006     kmaxndcad=(*itlstkmax_cadmgmai).first;
1007     for(itlstkmax_defcadmgmai=lstkmax_defcadmgmai.begin();itlstkmax_defcadmgmai!=lstkmax_defcadmgmai.end();itlstkmax_defcadmgmai++)
1008     {
1009     MG_NOEUD* defcadndcurv=(*itlstkmax_defcadmgmai).second;
1010     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1011     {
1012     kmaxndcad_def=(*itlstkmax_defcadmgmai).first;
1013     }
1014     }
1015     double kmax_diff=kmaxndcad_def-kmaxndcad;
1016     lstkmax_diff.insert(pair<double,MG_NOEUD*>(kmax_diff,cadndcurv) );
1017     }
1018 sattarpa 646 cout<<"kgau diff. calc. started"<<endl;
1019     for(itlstkgau_cadmgmai=lstkgau_cadmgmai.begin();itlstkgau_cadmgmai!=lstkgau_cadmgmai.end();itlstkgau_cadmgmai++)
1020     {
1021     MG_NOEUD* cadndcurv=(*itlstkgau_cadmgmai).second;
1022     double kgaundcad;
1023     double kgaundcad_def;
1024     kgaundcad=(*itlstkgau_cadmgmai).first;
1025     for(itlstkgau_defcadmgmai=lstkgau_defcadmgmai.begin();itlstkgau_defcadmgmai!=lstkgau_defcadmgmai.end();itlstkgau_defcadmgmai++)
1026     {
1027     MG_NOEUD* defcadndcurv=(*itlstkgau_defcadmgmai).second;
1028     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1029     {
1030     kgaundcad_def=(*itlstkgau_defcadmgmai).first;
1031     }
1032     }
1033     double kgau_diff=kgaundcad_def-kgaundcad;
1034     lstkgau_diff.insert(pair<double,MG_NOEUD*>(kgau_diff,cadndcurv) );
1035     }
1036 sattarpa 673 // mean diff
1037 sattarpa 650 multimap<double,MG_NOEUD*,std::greater<double> > lstkmin_relt_diff;
1038     multimap<double,MG_NOEUD*,std::greater<double> > lstkmax_relt_diff;
1039     multimap<double,MG_NOEUD*,std::greater<double> > lstkgau_relt_diff;
1040     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_cadmgmai;
1041     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_cadmgmai;
1042     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_cadmgmai;
1043     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_defcadmgmai;
1044     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_defcadmgmai;
1045     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_defcadmgmai;
1046 sattarpa 658 cout<<"kmin _relt diff. calc. started"<<endl;
1047     for(itlstkmin_relt_cadmgmai=lstkmin_relt_cadmgmai.begin();itlstkmin_relt_cadmgmai!=lstkmin_relt_cadmgmai.end();itlstkmin_relt_cadmgmai++)
1048 sattarpa 650 {
1049     MG_NOEUD* cadndcurv=(*itlstkmin_relt_cadmgmai).second;
1050     double kmindcad;
1051     double kmindcad_relt_def;
1052     kmindcad=(*itlstkmin_relt_cadmgmai).first;
1053     for(itlstkmin_relt_defcadmgmai=lstkmin_relt_defcadmgmai.begin();itlstkmin_relt_defcadmgmai!=lstkmin_relt_defcadmgmai.end();itlstkmin_relt_defcadmgmai++)
1054     {
1055     MG_NOEUD* defcadndcurv=(*itlstkmin_relt_defcadmgmai).second;
1056     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1057     kmindcad_relt_def=(*itlstkmin_relt_defcadmgmai).first;
1058     }
1059    
1060     double kmin_relt_diff=kmindcad_relt_def-kmindcad;
1061     lstkmin_relt_diff.insert(pair<double,MG_NOEUD*>(kmin_relt_diff,cadndcurv) );
1062     }
1063     cout<<"kmax _relt diff. calc. started"<<endl;
1064     for(itlstkmax_relt_cadmgmai=lstkmax_relt_cadmgmai.begin();itlstkmax_relt_cadmgmai!=lstkmax_relt_cadmgmai.end();itlstkmax_relt_cadmgmai++)
1065     {
1066     MG_NOEUD* cadndcurv=(*itlstkmax_relt_cadmgmai).second;
1067     double kmaxndcad;
1068     double kmaxndcad_relt_def;
1069     kmaxndcad=(*itlstkmax_relt_cadmgmai).first;
1070     for(itlstkmax_relt_defcadmgmai=lstkmax_relt_defcadmgmai.begin();itlstkmax_relt_defcadmgmai!=lstkmax_relt_defcadmgmai.end();itlstkmax_relt_defcadmgmai++)
1071     {
1072     MG_NOEUD* defcadndcurv=(*itlstkmax_relt_defcadmgmai).second;
1073     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1074     {
1075     kmaxndcad_relt_def=(*itlstkmax_relt_defcadmgmai).first;
1076     }
1077     }
1078     double kmax_relt_diff=kmaxndcad_relt_def-kmaxndcad;
1079     lstkmax_relt_diff.insert(pair<double,MG_NOEUD*>(kmax_relt_diff,cadndcurv) );
1080     }
1081     cout<<"kgau_relt diff. calc. started"<<endl;
1082     for(itlstkgau_relt_cadmgmai=lstkgau_relt_cadmgmai.begin();itlstkgau_relt_cadmgmai!=lstkgau_relt_cadmgmai.end();itlstkgau_relt_cadmgmai++)
1083     {
1084     MG_NOEUD* cadndcurv=(*itlstkgau_relt_cadmgmai).second;
1085     double kgaundcad;
1086     double kgaundcad_relt_def;
1087     kgaundcad=(*itlstkgau_relt_cadmgmai).first;
1088     for(itlstkgau_relt_defcadmgmai=lstkgau_relt_defcadmgmai.begin();itlstkgau_relt_defcadmgmai!=lstkgau_relt_defcadmgmai.end();itlstkgau_relt_defcadmgmai++)
1089     {
1090     MG_NOEUD* defcadndcurv=(*itlstkgau_relt_defcadmgmai).second;
1091     if(defcadndcurv->get_nouveau_numero()==cadndcurv->get_id())
1092     {
1093     kgaundcad_relt_def=(*itlstkgau_relt_defcadmgmai).first;
1094     }
1095     }
1096     double kgau_relt_diff=kgaundcad_relt_def-kgaundcad;
1097     lstkgau_relt_diff.insert(pair<double,MG_NOEUD*>(kgau_relt_diff,cadndcurv) );
1098     }
1099     // affichage reletive diff sur GMSH ******************************
1100     if (gmsh_affiche>0)
1101     {
1102     cout<<"affiche: calcul_relet_difference_courbure "<<endl;
1103     std::ostringstream oss;
1104     oss << "KMaxMinGaudiff_curvdifcoef_relet:" <<curvdif_coef ;
1105     std::string namefic = oss.str();
1106     char *cstr = new char[namefic.length() + 1];
1107     strcpy(cstr, namefic.c_str());
1108     MG_SOLUTION* sol4=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"Kdiff_relt_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
1109     gest.ajouter_mg_solution(sol4);
1110     sol4->change_legende(0,"Kmin_diff");
1111     sol4->change_legende(1,"Kmax_diff");
1112     sol4->change_legende(2,"Kgau_diff");
1113     LISTE_MG_TRIANGLE::iterator ittri;
1114     int compte=0;
1115     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
1116     {
1117     MG_NOEUD *no1=tri->get_noeud1();
1118     MG_NOEUD *no2=tri->get_noeud2();
1119     MG_NOEUD *no3=tri->get_noeud3();
1120     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_diff;
1121     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_diff;
1122     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_relt_diff;
1123     double valeurKmin1, valeurKmin2, valeurKmin3;
1124     double valeurKmax1, valeurKmax2, valeurKmax3;
1125     double valeurKgau1, valeurKgau2, valeurKgau3;
1126     for (itlstkmin_relt_diff=lstkmin_relt_diff.begin();itlstkmin_relt_diff!=lstkmin_relt_diff.end();itlstkmin_relt_diff++)
1127     {
1128     if (no1==(*itlstkmin_relt_diff).second)
1129     valeurKmin1=(*itlstkmin_relt_diff).first;
1130     if (no2==(*itlstkmin_relt_diff).second)
1131     valeurKmin2=(*itlstkmin_relt_diff).first;
1132     if (no3==(*itlstkmin_relt_diff).second)
1133     valeurKmin3=(*itlstkmin_relt_diff).first;
1134     }
1135     for (itlstkmax_relt_diff=lstkmax_relt_diff.begin();itlstkmax_relt_diff!=lstkmax_relt_diff.end();itlstkmax_relt_diff++)
1136     {
1137     if (no1==(*itlstkmax_relt_diff).second)
1138     valeurKmax1=(*itlstkmax_relt_diff).first;
1139     if (no2==(*itlstkmax_relt_diff).second)
1140     valeurKmax2=(*itlstkmax_relt_diff).first;
1141     if (no3==(*itlstkmax_relt_diff).second)
1142     valeurKmax3=(*itlstkmax_relt_diff).first;
1143     }
1144     for (itlstkgau_relt_diff=lstkgau_relt_diff.begin();itlstkgau_relt_diff!=lstkgau_relt_diff.end();itlstkgau_relt_diff++)
1145     {
1146     if (no1==(*itlstkgau_relt_diff).second)
1147     valeurKgau1=(*itlstkgau_relt_diff).first;
1148     if (no2==(*itlstkgau_relt_diff).second)
1149     valeurKgau2=(*itlstkgau_relt_diff).first;
1150     if (no3==(*itlstkgau_relt_diff).second)
1151     valeurKgau3=(*itlstkgau_relt_diff).first;
1152     }
1153     sol4->ecrire(valeurKmin1,compte,0,0);
1154     sol4->ecrire(valeurKmax1,compte,1,0);
1155     sol4->ecrire(valeurKgau1,compte,2,0);
1156    
1157     sol4->ecrire(valeurKmin2,compte,0,1);
1158     sol4->ecrire(valeurKmax2,compte,1,1);
1159     sol4->ecrire(valeurKgau2,compte,2,1);
1160    
1161     sol4->ecrire(valeurKmin3,compte,0,2);
1162     sol4->ecrire(valeurKmax3,compte,1,2);
1163     sol4->ecrire(valeurKgau3,compte,2,2);
1164     compte++;
1165     }
1166     }
1167    
1168 sattarpa 646 // affichage sur GMSH ******************************
1169 sattarpa 658 if (gmsh_affiche>1)
1170 sattarpa 646 {
1171     cout<<"affiche: calcul_difference_courbure "<<endl;
1172     std::ostringstream oss;
1173     oss << "KMaxMinGaudiff_curvdifcoef:" <<curvdif_coef ;
1174     std::string namefic = oss.str();
1175     char *cstr = new char[namefic.length() + 1];
1176     strcpy(cstr, namefic.c_str());
1177     MG_SOLUTION* sol3=new MG_SOLUTION(cadmgmai,3,cstr,1,(char*)"Kdiff_solution",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
1178     gest.ajouter_mg_solution(sol3);
1179     sol3->change_legende(0,"Kmin_diff");
1180     sol3->change_legende(1,"Kmax_diff");
1181     sol3->change_legende(2,"Kgau_diff");
1182     LISTE_MG_TRIANGLE::iterator ittri;
1183     int compte=0;
1184     for (MG_TRIANGLE* tri=cadmgmai->get_premier_triangle(ittri);tri!=NULL;tri=cadmgmai->get_suivant_triangle(ittri))
1185     {
1186     MG_NOEUD *no1=tri->get_noeud1();
1187     MG_NOEUD *no2=tri->get_noeud2();
1188     MG_NOEUD *no3=tri->get_noeud3();
1189     //char mess[500];
1190     //sprintf(mess,"%lu_%lu",no1->get_id(),tri->get_lien_topologie()->get_id());
1191     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_diff;
1192     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_diff;
1193     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkgau_diff;
1194     double valeurKmin1, valeurKmin2, valeurKmin3;
1195     double valeurKmax1, valeurKmax2, valeurKmax3;
1196     double valeurKgau1, valeurKgau2, valeurKgau3;
1197     for (itlstkmin_diff=lstkmin_diff.begin();itlstkmin_diff!=lstkmin_diff.end();itlstkmin_diff++)
1198     {
1199     if (no1==(*itlstkmin_diff).second)
1200     valeurKmin1=(*itlstkmin_diff).first;
1201     if (no2==(*itlstkmin_diff).second)
1202     valeurKmin2=(*itlstkmin_diff).first;
1203     if (no3==(*itlstkmin_diff).second)
1204     valeurKmin3=(*itlstkmin_diff).first;
1205     }
1206     for (itlstkmax_diff=lstkmax_diff.begin();itlstkmax_diff!=lstkmax_diff.end();itlstkmax_diff++)
1207     {
1208     if (no1==(*itlstkmax_diff).second)
1209     valeurKmax1=(*itlstkmax_diff).first;
1210     if (no2==(*itlstkmax_diff).second)
1211     valeurKmax2=(*itlstkmax_diff).first;
1212     if (no3==(*itlstkmax_diff).second)
1213     valeurKmax3=(*itlstkmax_diff).first;
1214     }
1215     for (itlstkgau_diff=lstkgau_diff.begin();itlstkgau_diff!=lstkgau_diff.end();itlstkgau_diff++)
1216     {
1217     if (no1==(*itlstkgau_diff).second)
1218     valeurKgau1=(*itlstkgau_diff).first;
1219     if (no2==(*itlstkgau_diff).second)
1220     valeurKgau2=(*itlstkgau_diff).first;
1221     if (no3==(*itlstkgau_diff).second)
1222     valeurKgau3=(*itlstkgau_diff).first;
1223     }
1224     sol3->ecrire(valeurKmin1,compte,0,0);
1225     sol3->ecrire(valeurKmax1,compte,1,0);
1226     sol3->ecrire(valeurKgau1,compte,2,0);
1227 sattarpa 609
1228 sattarpa 646 sol3->ecrire(valeurKmin2,compte,0,1);
1229     sol3->ecrire(valeurKmax2,compte,1,1);
1230     sol3->ecrire(valeurKgau2,compte,2,1);
1231    
1232     sol3->ecrire(valeurKmin3,compte,0,2);
1233     sol3->ecrire(valeurKmax3,compte,1,2);
1234     sol3->ecrire(valeurKgau3,compte,2,2);
1235     compte++;
1236     }
1237 sattarpa 673
1238     }
1239    
1240     char chaine[1000];
1241 sattarpa 646 char* p;
1242     p=strrchr(magicfilename,'.');
1243     strncpy(chaine,magicfilename,p-magicfilename);
1244     std::string namfic=chaine;
1245     namfic=namfic + "courbcal.magic";
1246     gest.enregistrer(namfic.c_str());
1247 sattarpa 673 cout<<"read insert points in lstpinsert"<<endl;
1248 sattarpa 609 //read insert points in lstpinsert
1249     std::vector<double*> lstpinsert;
1250     double prop=0.001;
1251     FILE *in=fopen(gnifinspointfile,"rt");
1252     if (in==NULL) cout<<"file is not available"<<endl;
1253     while (!feof(in))
1254     {
1255     char chaine[500];
1256 sattarpa 655 char* res=fgets(chaine,500,in);
1257     if(res!=NULL)
1258     {
1259 sattarpa 609 double x,y,z;
1260     double q1,q2,q3;
1261     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
1262     q1=prop*q1;
1263     q2=prop*q2;
1264     q3=prop*q3;
1265     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
1266     else if (nb==6)
1267     {
1268     double* pcoordbc=new double[6];
1269     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
1270     lstpinsert.push_back(pcoordbc);
1271     }
1272 sattarpa 655 }
1273 sattarpa 609 }
1274     fclose(in);
1275 sattarpa 650 if (relet_curvature<1)
1276     {
1277 sattarpa 609 //criterion
1278 sattarpa 658 multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmin_diff=lstkmin_diff.rbegin();
1279     multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmax_diff=lstkmax_diff.rbegin();
1280     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_diff=lstkmin_diff.begin();
1281     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_diff=lstkmax_diff.begin();
1282     double kmin_diff_min=(*ritlstkmin_diff).first;
1283     double kmin_diff_max=(*itlstkmin_diff).first;
1284     double kmax_diff_min=(*ritlstkmax_diff).first;
1285     double kmax_diff_max=(*itlstkmax_diff).first;
1286     cout<<"kmin_diff_min= "<<kmin_diff_min<<" kmin_diff_max= "<<kmin_diff_max<<endl;
1287     cout<<"kmax_diff_min= "<<kmax_diff_min<<" kmax_diff_max= "<<kmax_diff_max<<endl;
1288    
1289     double crikmin_min=curvdif_coef*kmin_diff_min;
1290     double crikmin_max=curvdif_coef*kmin_diff_max;
1291     double crikmax_min=curvdif_coef*kmax_diff_min;
1292     double crikmax_max=curvdif_coef*kmax_diff_max;
1293     cout<<"crikmin_min= "<<crikmin_min<<" crikmin_max= "<<crikmin_max<<" crikmax_min= "<<crikmax_min<<" crikmax_max= "<<crikmax_max<<endl;
1294 sattarpa 609 cout<<"lstkmin_diff.size()= "<<lstkmin_diff.size()<<endl;
1295     cout<<"lstkmax_diff.size()= "<<lstkmax_diff.size()<<endl;
1296 sattarpa 650
1297     cout<<"for Kmin"<<endl;
1298 sattarpa 609 TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1299     for (itlstkmin_diff=lstkmin_diff.begin();itlstkmin_diff!=lstkmin_diff.end();itlstkmin_diff++)
1300     {
1301     {
1302     if((crikmin_max<(*itlstkmin_diff).first) || (crikmin_min>(*itlstkmin_diff).first))
1303     {
1304     MG_NOEUD* piefect=(*itlstkmin_diff).second;
1305     int neindnb=lstneipdefect.get_nb();
1306     double search_radius1=search_radius;
1307     while(neindnb==0)
1308     {
1309 sattarpa 650 octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1310 sattarpa 609 neindnb=lstneipdefect.get_nb();
1311     search_radius1=search_radius1+0.1*search_radius;
1312     }
1313     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1314     for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1315     {
1316     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1317     {
1318     double* xyzpins;
1319     xyzpins=(*itlstpinsert);
1320 sattarpa 650 if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1321     lstpinsert.erase(itlstpinsert);
1322 sattarpa 609 }
1323     }
1324     lstneipdefect.vide();
1325     }
1326     }
1327     }
1328     cout<<"for Kmax"<<endl;
1329     for (itlstkmax_diff=lstkmax_diff.begin();itlstkmax_diff!=lstkmax_diff.end();itlstkmax_diff++)
1330     {
1331     if((crikmax_max<(*itlstkmax_diff).first) || (crikmax_min>(*itlstkmax_diff).first))
1332     {
1333     MG_NOEUD* piefect=(*itlstkmax_diff).second;
1334     TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1335     int neindnb=lstneipdefect.get_nb();
1336     double search_radius1=search_radius;
1337     while(neindnb==0)
1338     {
1339 sattarpa 650 octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1340 sattarpa 609 neindnb=lstneipdefect.get_nb();
1341     search_radius1=search_radius1+0.1*search_radius;
1342     }
1343     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1344     for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1345     {
1346     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1347     {
1348     double* xyzpins;
1349     xyzpins=(*itlstpinsert);
1350     if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1351     lstpinsert.erase(itlstpinsert);
1352     }
1353     }
1354    
1355     }
1356     }
1357 sattarpa 650 }
1358     if (relet_curvature>0)
1359     {
1360     //criterion
1361 sattarpa 658 multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmin_relt_diff=lstkmin_relt_diff.rbegin();
1362     multimap<double,MG_NOEUD*,std::greater<double> >::reverse_iterator ritlstkmax_relt_diff=lstkmax_relt_diff.rbegin();
1363     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmin_relt_diff=lstkmin_relt_diff.begin();
1364     multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstkmax_relt_diff=lstkmax_relt_diff.begin();
1365     double kmin_relt_diff_min=(*ritlstkmin_relt_diff).first;
1366     double kmin_relt_diff_max=(*itlstkmin_relt_diff).first;
1367     double kmax_relt_diff_min=(*ritlstkmax_relt_diff).first;
1368     double kmax_relt_diff_max=(*itlstkmax_relt_diff).first;
1369     cout<<"kmin_relt_diff_min= "<<kmin_relt_diff_min<<" kmin_relt_diff_max= "<<kmin_relt_diff_max<<endl;
1370     cout<<"kmax_relt_diff_min= "<<kmax_relt_diff_min<<" kmax_relt_diff_max= "<<kmax_relt_diff_max<<endl;
1371 sattarpa 673 /*
1372 sattarpa 658 double crikmin_min=curvdif_coef*kmin_relt_diff_min;
1373     double crikmin_max=curvdif_coef*kmin_relt_diff_max;
1374     double crikmax_min=curvdif_coef*kmax_relt_diff_min;
1375 sattarpa 673 double crikmax_max=curvdif_coef*kmax_relt_diff_max;*/
1376     double crikmin_min=-curvdif_coef;
1377     double crikmin_max=curvdif_coef;
1378     double crikmax_min=-curvdif_coef;
1379     double crikmax_max=curvdif_coef;
1380    
1381 sattarpa 658 cout<<"crikmin_min= "<<crikmin_min<<" crikmin_max= "<<crikmin_max<<" crikmax_min= "<<crikmax_min<<" crikmax_max= "<<crikmax_max<<endl;
1382 sattarpa 650 cout<<"lstkmin_diff.size()= "<<lstkmin_diff.size()<<endl;
1383     cout<<"lstkmax_diff.size()= "<<lstkmax_diff.size()<<endl;
1384    
1385 sattarpa 658 cout<<"for Kmin_relet_diff"<<endl;
1386     cout<<"lstkmin_relt_diff.size()= "<<lstkmin_relt_diff.size()<<endl;
1387 sattarpa 650 TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1388     for (itlstkmin_relt_diff=lstkmin_relt_diff.begin();itlstkmin_relt_diff!=lstkmin_relt_diff.end();itlstkmin_relt_diff++)
1389     {
1390     {
1391     if((crikmin_max<(*itlstkmin_relt_diff).first) || (crikmin_min>(*itlstkmin_relt_diff).first))
1392     {
1393     MG_NOEUD* piefect=(*itlstkmin_relt_diff).second;
1394     int neindnb=lstneipdefect.get_nb();
1395     double search_radius1=search_radius;
1396     while(neindnb==0)
1397     {
1398     octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1399     neindnb=lstneipdefect.get_nb();
1400     search_radius1=search_radius1+0.1*search_radius;
1401     }
1402     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1403     for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1404     {
1405     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1406     {
1407     double* xyzpins;
1408     xyzpins=(*itlstpinsert);
1409 sattarpa 658
1410 sattarpa 650 if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1411 sattarpa 658 {
1412 sattarpa 650 lstpinsert.erase(itlstpinsert);
1413 sattarpa 658 itlstpinsert=lstpinsert.begin();
1414     }
1415    
1416 sattarpa 650 }
1417     }
1418     lstneipdefect.vide();
1419     }
1420     }
1421     }
1422 sattarpa 658 cout<<"for Kmax_relet_diff"<<endl;
1423    
1424 sattarpa 650 for (itlstkmax_relt_diff=lstkmax_relt_diff.begin();itlstkmax_relt_diff!=lstkmax_relt_diff.end();itlstkmax_relt_diff++)
1425     {
1426     if((crikmax_max<(*itlstkmax_relt_diff).first) || (crikmax_min>(*itlstkmax_relt_diff).first))
1427     {
1428     MG_NOEUD* piefect=(*itlstkmax_relt_diff).second;
1429     TPL_MAP_ENTITE<MG_NOEUD*> lstneipdefect;
1430     int neindnb=lstneipdefect.get_nb();
1431     double search_radius1=search_radius;
1432     while(neindnb==0)
1433     {
1434     octreecad.rechercher(piefect->get_x(),piefect->get_y(),piefect->get_z(),search_radius1,lstneipdefect);
1435     neindnb=lstneipdefect.get_nb();
1436     search_radius1=search_radius1+0.1*search_radius;
1437     }
1438     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itndnei;
1439     for(MG_NOEUD* ndnei=lstneipdefect.get_premier(itndnei);ndnei!=NULL;ndnei=lstneipdefect.get_suivant(itndnei))
1440     {
1441     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1442     {
1443     double* xyzpins;
1444     xyzpins=(*itlstpinsert);
1445     if(ndnei->get_x()==xyzpins[0] && ndnei->get_y()==xyzpins[1] && ndnei->get_z()==xyzpins[2])
1446 sattarpa 658 {
1447     lstpinsert.erase(itlstpinsert);
1448     itlstpinsert=lstpinsert.begin();
1449     }
1450 sattarpa 650 }
1451     }
1452    
1453     }
1454     }
1455     }
1456 sattarpa 609 FILE* in2=fopen(out_gnifinspointfile_removondefect,"wt");
1457 sattarpa 655 int countfuck=0;
1458 sattarpa 609 for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1459     {
1460     double* xyzpins1;
1461     xyzpins1=(*itlstpinsert);
1462 sattarpa 658 fprintf(in2,"%le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
1463 sattarpa 609 }
1464 sattarpa 650 fclose(in2);
1465 sattarpa 609 }
1466     void CRIAQOPERATORS::vm_crit_remvsmp(int femmeshno,char* magicfilename,int femsolid,int femsubsolno,char* gnifinspointfile,char* out_gnifinspointfile_removondefect,double search_radius,double vm_coef)
1467     {
1468 sattarpa 554 MG_FILE gest(magicfilename);
1469 sattarpa 596 FEM_MAILLAGE* femmai;
1470     if (femmeshno==0) femmai=gest.get_fem_maillage(femmeshno); else femmai=gest.get_fem_maillageid(femmeshno);
1471     FEM_SOLUTION* femsol=gest.get_fem_solutionid(femsolid);
1472     femsol->active_solution(femsubsolno);
1473    
1474     std::map<double,FEM_NOEUD*,std::greater<double> > mpsol;
1475     LISTE_FEM_NOEUD::iterator itfemnds;
1476     for(FEM_NOEUD* nod=femmai->get_premier_noeud(itfemnds);nod!=NULL;nod=femmai->get_suivant_noeud(itfemnds))
1477     {
1478 sattarpa 609 nod->get_mg_element_maillage()->get_id();
1479 sattarpa 596 mpsol.insert(pair<double,FEM_NOEUD*> (nod->get_solution(),nod));
1480     //cout<<"nod->get_solution()= "<<nod->get_solution()<<endl;
1481     //if(nod->get_solution()<=1.e-20 && nod->get_solution()!=0.)
1482     //cout<<nod->get_id()<<" : "<<nod->get_solution()<<endl;
1483     }
1484     std::map<double,FEM_NOEUD*,std::greater<double> >::iterator itmpsol=mpsol.begin();
1485    
1486     double maxi=(*itmpsol).first;
1487     itmpsol=mpsol.end();
1488     double mini=(*itmpsol).first;
1489 sattarpa 673 //double crit=vm_coef*(maxi+mini)/2.;
1490     double crit=vm_coef;
1491     cout<<"critreion value= "<<crit<<endl;
1492 sattarpa 596 std::vector<double*> lstpinsert;
1493     double prop=0.001;
1494     FILE *in=fopen(gnifinspointfile,"rt");
1495     if (in==NULL) cout<<"file is not available"<<endl;
1496     while (!feof(in))
1497     {
1498     char chaine[500];
1499 sattarpa 655 char* res=fgets(chaine,500,in);
1500     if(res!=NULL)
1501     {
1502 sattarpa 596 double x,y,z;
1503     double q1,q2,q3;
1504     int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
1505     q1=prop*q1;
1506     q2=prop*q2;
1507     q3=prop*q3;
1508     if (nb!=-1 && nb!=6) cout<<"Wrong file format"<<endl;
1509     else if (nb==6)
1510     {
1511     double* pcoordbc=new double[6];
1512     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
1513     lstpinsert.push_back(pcoordbc);
1514     }
1515 sattarpa 655 }
1516 sattarpa 596 }
1517     fclose(in);
1518    
1519    
1520     //octree initialization
1521     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
1522     TPL_MAP_ENTITE<FEM_NOEUD*> lstnoeud;
1523     LISTE_FEM_NOEUD::iterator it;
1524     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
1525     {
1526     if (no->get_x()<xmin) xmin=no->get_x();
1527     if (no->get_y()<ymin) ymin=no->get_y();
1528     if (no->get_z()<zmin) zmin=no->get_z();
1529     if (no->get_x()>xmax) xmax=no->get_x();
1530     if (no->get_y()>ymax) ymax=no->get_y();
1531     if (no->get_z()>zmax) zmax=no->get_z();
1532     lstnoeud.ajouter(no);
1533     }
1534     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
1535     OT_VECTEUR_3D vec(vecmmax,vecmin);
1536    
1537     //double search_radius=0.001*(vec.get_longueur());
1538 sattarpa 609 //double search_radius=2.; //sasan this should be as a parameter
1539 sattarpa 596 OT_VECTEUR_3D min(xmin,ymin,zmin); OT_VECTEUR_3D max(xmax,ymax,zmax); OT_VECTEUR_3D average=(min+max)/2.; OT_VECTEUR_3D lengthvec(min,max);
1540     double length=sqrt(lengthvec*lengthvec); double bxr=1.1;
1541     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
1542     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
1543    
1544     TPL_OCTREE<FEM_NOEUD*,FEM_NOEUD*> octree;
1545     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
1546     for (FEM_NOEUD* no=femmai->get_premier_noeud(it);no!=NULL;no=femmai->get_suivant_noeud(it))
1547     octree.inserer(no);
1548    
1549     for (itmpsol=mpsol.begin();itmpsol!=mpsol.end();itmpsol++)
1550     {
1551     if(crit<(*itmpsol).first)
1552     {
1553     FEM_NOEUD* pdefect=(*itmpsol).second;
1554     TPL_MAP_ENTITE<FEM_NOEUD*> lstneipdefect;
1555     int neindnb=lstneipdefect.get_nb();
1556 sattarpa 609 double search_radius1=search_radius;
1557 sattarpa 596 while(neindnb==0)
1558     {
1559 sattarpa 609 octree.rechercher(pdefect->get_x(),pdefect->get_y(),pdefect->get_z(),search_radius1,lstneipdefect);
1560 sattarpa 596 neindnb=lstneipdefect.get_nb();
1561 sattarpa 609 search_radius1=search_radius1+0.1*search_radius;
1562 sattarpa 596 }
1563     TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR itfendnei;
1564     for(FEM_NOEUD* fendnei=lstneipdefect.get_premier(itfendnei);fendnei!=NULL;fendnei=lstneipdefect.get_suivant(itfendnei))
1565     {
1566     // std::map<double*,double*,std::less<double*> >::iterator itlstpinsert=lstpinsert.begin();//itlstpinsert!=lstpinsert.end();itlstpinsert++
1567     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1568     {
1569     double* xyzpins;
1570     xyzpins=(*itlstpinsert);
1571     if(fendnei->get_x()==xyzpins[0] && fendnei->get_y()==xyzpins[1] && fendnei->get_z()==xyzpins[2])
1572     {
1573     lstpinsert.erase(itlstpinsert);
1574 sattarpa 658 itlstpinsert=lstpinsert.begin();
1575 sattarpa 596 }
1576     }
1577     }
1578    
1579     }
1580    
1581     }
1582    
1583     FILE* in1=fopen(out_gnifinspointfile_removondefect,"wt");
1584     for(std::vector<double*>::iterator itlstpinsert=lstpinsert.begin();itlstpinsert!=lstpinsert.end();itlstpinsert++)
1585     {
1586     double* xyzpins1;
1587     xyzpins1=(*itlstpinsert);
1588 sattarpa 658 fprintf(in1,"%le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
1589 sattarpa 596 }
1590     fclose(in1);
1591     }
1592     void CRIAQOPERATORS::surfmaker_e1(char* outputfilename,int meshno,char* magicfilename)
1593     {
1594     MG_FILE gest(magicfilename);
1595 sattarpa 554 MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
1596     MG_MAILLAGE* mai;
1597     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
1598     //MG_FILE gest((char*)"longflxprtwithpockets_3d_3mm.magic");
1599     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
1600     //MG_MAILLAGE* mai=gest.get_mg_maillageid(5674824);
1601     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
1602     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
1603     gestnew->ajouter_mg_geometrie(geonew);
1604     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
1605     gestnew->ajouter_mg_maillage(mainew);
1606    
1607     LISTE_MG_NOEUD::iterator itnod;
1608     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
1609     {
1610     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
1611     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
1612     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
1613     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
1614 sattarpa 596
1615     if(facevert->get_id()==76
1616     || aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==13 || aretver->get_id()==110||aretver->get_id()==98
1617     || aretver->get_id()==81 || aretver->get_id()==83 || aretver->get_id()==10|| aretver->get_id()==12|| aretver->get_id()==90|| aretver->get_id()==97
1618     /* facevert->get_id()==133
1619 sattarpa 554 || aretver->get_id()==355 || aretver->get_id()==362|| aretver->get_id()==374|| aretver->get_id()==298 || aretver->get_id()==291||aretver->get_id()==338
1620     || aretver->get_id()==326 || aretver->get_id()==333|| aretver->get_id()==319|| aretver->get_id()==312 || aretver->get_id()==305||aretver->get_id()==169
1621     || aretver->get_id()==162 || aretver->get_id()==141|| aretver->get_id()==174|| aretver->get_id()==148 || aretver->get_id()==155||aretver->get_id()==217
1622     || aretver->get_id()==212 || aretver->get_id()==191|| aretver->get_id()==184|| aretver->get_id()==64 || aretver->get_id()==280||aretver->get_id()==32
1623     || aretver->get_id()==387 || aretver->get_id()==198|| aretver->get_id()==205|| aretver->get_id()==269 || aretver->get_id()==262||aretver->get_id()==234
1624     || aretver->get_id()==227 || aretver->get_id()==255|| aretver->get_id()==248|| aretver->get_id()==241 || aretver->get_id()==380||aretver->get_id()==96
1625     || aretver->get_id()==369 || aretver->get_id()==344|| aretver->get_id()==128|| aretver->get_id()==274
1626     || sometver->get_id()==368|| sometver->get_id()==361|| sometver->get_id()==106|| sometver->get_id()==122|| sometver->get_id()==74|| sometver->get_id()==90
1627     || sometver->get_id()==233|| sometver->get_id()==240|| sometver->get_id()==247|| sometver->get_id()==254|| sometver->get_id()==261|| sometver->get_id()==268
1628     || sometver->get_id()==226|| sometver->get_id()==224|| sometver->get_id()==190|| sometver->get_id()==197|| sometver->get_id()==204|| sometver->get_id()==211
1629     || sometver->get_id()==183|| sometver->get_id()==181|| sometver->get_id()==154|| sometver->get_id()==147|| sometver->get_id()==140|| sometver->get_id()==161
1630     || sometver->get_id()==168|| sometver->get_id()==138|| sometver->get_id()==318|| sometver->get_id()==311|| sometver->get_id()==304|| sometver->get_id()==297
1631     || sometver->get_id()==325|| sometver->get_id()==332|| sometver->get_id()==290|| sometver->get_id()==288|| sometver->get_id()==42|| sometver->get_id()==58
1632 sattarpa 596 || sometver->get_id()==352|| sometver->get_id()==354|| sometver->get_id()==10|| sometver->get_id()==26*/
1633    
1634     )
1635 sattarpa 554 {
1636     double x=vertices->get_x();
1637     double y=vertices->get_y();
1638     double z=vertices->get_z();
1639     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
1640     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
1641     mainew->ajouter_mg_noeud(newno);
1642     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
1643     }
1644     }
1645    
1646     LISTE_MG_SEGMENT::iterator itSeg;
1647     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
1648     {
1649     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
1650     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
1651     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
1652     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
1653     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
1654 sattarpa 596 if (faceseg->get_id()==76
1655     || aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==13 || aretver->get_id()==110||aretver->get_id()==98
1656     //faceseg->get_id()==133
1657     //|| aretver->get_id()==355 || aretver->get_id()==362|| aretver->get_id()==374|| aretver->get_id()==298 || aretver->get_id()==291||aretver->get_id()==338
1658     //|| aretver->get_id()==326 || aretver->get_id()==333|| aretver->get_id()==319|| aretver->get_id()==312 || aretver->get_id()==305||aretver->get_id()==169
1659     //|| aretver->get_id()==162 || aretver->get_id()==141|| aretver->get_id()==174|| aretver->get_id()==148 || aretver->get_id()==155||aretver->get_id()==217
1660     //|| aretver->get_id()==212 || aretver->get_id()==191|| aretver->get_id()==184|| aretver->get_id()==64 || aretver->get_id()==280||aretver->get_id()==32
1661     //|| aretver->get_id()==387 || aretver->get_id()==198|| aretver->get_id()==205|| aretver->get_id()==269 || aretver->get_id()==262||aretver->get_id()==234
1662     // || aretver->get_id()==227 || aretver->get_id()==255|| aretver->get_id()==248|| aretver->get_id()==241 || aretver->get_id()==380||aretver->get_id()==96
1663     // || aretver->get_id()==369 || aretver->get_id()==344|| aretver->get_id()==128|| aretver->get_id()==274
1664    
1665     )
1666 sattarpa 554 {
1667     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
1668     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
1669     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
1670     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
1671     mainew->ajouter_mg_segment(seg);
1672     }
1673     }
1674    
1675     LISTE_MG_TRIANGLE::iterator itTri;
1676     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
1677     {
1678     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
1679 sattarpa 596 if (facetri->get_id()==76)
1680 sattarpa 554 {
1681     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
1682     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
1683     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
1684     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
1685     }
1686     }
1687    
1688     //gestnew->enregistrer("scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump.magic");
1689     gestnew->enregistrer(outputfilename);
1690     //////////////////
1691    
1692     ////////////////////////
1693    
1694    
1695     /*
1696     mainew->supprimer_mg_triangleid(106625);
1697     mainew->supprimer_mg_triangleid(106662);
1698     mainew->supprimer_mg_triangleid(106626);
1699     mainew->supprimer_mg_triangleid(106701);
1700     mainew->supprimer_mg_triangleid(106702);
1701     mainew->supprimer_mg_triangleid(106639);*/
1702     //cout<<"output mesh no.= 495557 "<<endl;
1703     //gest.enregistrer("2dsurfmesh_cad.magic"); //CAD model output
1704     //scanned part output
1705    
1706    
1707     }
1708 sattarpa 596 void CRIAQOPERATORS::surfmaker_e2(char* outputfilename,int meshno,char* magicfilename)
1709 sattarpa 554 {
1710     // surfmeshgenerator a partially scanned (deformed CAD model) for GNIF examples for simple exam with hole (badisplacenmentvector + smplwithpocket)
1711     MG_FILE gest(magicfilename);
1712     MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
1713     MG_MAILLAGE* mai;
1714     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
1715     //MG_FILE gest((char*)"2d_smplwithole_23mm.magic");
1716     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
1717     //MG_MAILLAGE* mai=gest.get_mg_maillageid(1197);
1718     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
1719     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
1720     gestnew->ajouter_mg_geometrie(geonew);
1721     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
1722     gestnew->ajouter_mg_maillage(mainew);
1723    
1724     LISTE_MG_NOEUD::iterator itnod;
1725     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
1726     {
1727     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
1728     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
1729     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
1730     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
1731     if(facevert->get_id()==76
1732     || aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==98 || aretver->get_id()==13||aretver->get_id()==110
1733     || sometver->get_id()==10|| sometver->get_id()==12|| sometver->get_id()==81|| sometver->get_id()==83|| sometver->get_id()==90|| sometver->get_id()==97)
1734     {
1735     double x=vertices->get_x();
1736     double y=vertices->get_y();
1737     double z=vertices->get_z();
1738     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
1739     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
1740     mainew->ajouter_mg_noeud(newno);
1741     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
1742     }
1743     }
1744    
1745     LISTE_MG_SEGMENT::iterator itSeg;
1746     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
1747     {
1748     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
1749     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
1750     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
1751     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
1752     //cout<<"faceseg->get_id()= "<<faceseg->get_id()<<endl;
1753     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
1754     //cout<<"aretver->get_id()= "<<aretver->get_id()<<endl;
1755     if (faceseg->get_id()==76 ||
1756     aretver->get_id()==84 || aretver->get_id()==103|| aretver->get_id()==91|| aretver->get_id()==98 || aretver->get_id()==13|| aretver->get_id()==110)
1757     {
1758     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
1759     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
1760     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
1761     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
1762     mainew->ajouter_mg_segment(seg);
1763     }
1764     }
1765    
1766     LISTE_MG_TRIANGLE::iterator itTri;
1767     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
1768     {
1769     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
1770     if (facetri->get_id()==76)
1771     {
1772     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
1773     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
1774     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
1775     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
1776     }
1777     }
1778    
1779     //gestnew->enregistrer("cadsurfmsh_smplwithole_23mm.magic");
1780     gestnew->enregistrer(outputfilename);
1781     }
1782 sattarpa 596 void CRIAQOPERATORS::surfmaker_e2t(char* outputfilename,int meshno,char* magicfilename)
1783 sattarpa 554 {
1784     // surfmeshgenerator a partially scanned (deformed CAD model) for GNIF examples for simple exam with hole (badisplacenmentvector + smplwithpocket)
1785     MG_FILE gest(magicfilename);
1786     MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
1787     MG_MAILLAGE* mai;
1788     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
1789     //MG_FILE gest((char*)"2d_smplwithole_23mm.magic");
1790     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
1791     //MG_MAILLAGE* mai=gest.get_mg_maillageid(1197);
1792     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
1793     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
1794     gestnew->ajouter_mg_geometrie(geonew);
1795     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
1796     gestnew->ajouter_mg_maillage(mainew);
1797    
1798     LISTE_MG_NOEUD::iterator itnod;
1799     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
1800     {
1801     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
1802     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
1803     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
1804     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
1805     if(facevert->get_id()==37
1806     || aretver->get_id()==20 || aretver->get_id()==108|| aretver->get_id()==113|| aretver->get_id()==101 || aretver->get_id()==59||aretver->get_id()==64
1807     || aretver->get_id()==45 || aretver->get_id()==52|| aretver->get_id()==93|| aretver->get_id()==74 || aretver->get_id()==81||aretver->get_id()==88
1808     || sometver->get_id()==10|| sometver->get_id()==19|| sometver->get_id()==51|| sometver->get_id()==58|| sometver->get_id()==42|| sometver->get_id()==44
1809     || sometver->get_id()==87|| sometver->get_id()==73|| sometver->get_id()==80|| sometver->get_id()==71|| sometver->get_id()==100|| sometver->get_id()==107
1810     //for e2t
1811     //|| aretver->get_id()==20 || aretver->get_id()==141|| aretver->get_id()==129|| aretver->get_id()==136 || aretver->get_id()==66||aretver->get_id()==59
1812     //|| aretver->get_id()==73 || aretver->get_id()==78|| aretver->get_id()==45|| aretver->get_id()==52 || aretver->get_id()==95||aretver->get_id()==102
1813     //|| aretver->get_id()==88 || aretver->get_id()==121|| aretver->get_id()==116|| aretver->get_id()==109
1814     //|| sometver->get_id()==10|| sometver->get_id()==19|| sometver->get_id()==65|| sometver->get_id()==58|| sometver->get_id()==51|| sometver->get_id()==42
1815     //|| sometver->get_id()==44|| sometver->get_id()==72|| sometver->get_id()==115|| sometver->get_id()==87|| sometver->get_id()==108|| sometver->get_id()==101
1816     //|| sometver->get_id()==94|| sometver->get_id()==85|| sometver->get_id()==128|| sometver->get_id()==135
1817     )
1818     {
1819     double x=vertices->get_x();
1820     double y=vertices->get_y();
1821     double z=vertices->get_z();
1822     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
1823     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
1824     mainew->ajouter_mg_noeud(newno);
1825     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
1826     }
1827     }
1828    
1829     LISTE_MG_SEGMENT::iterator itSeg;
1830     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
1831     {
1832     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
1833     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
1834     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
1835     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
1836     //cout<<"faceseg->get_id()= "<<faceseg->get_id()<<endl;
1837     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
1838     //cout<<"aretver->get_id()= "<<aretver->get_id()<<endl;
1839     if (faceseg->get_id()==37
1840     || aretver->get_id()==20 || aretver->get_id()==108|| aretver->get_id()==113|| aretver->get_id()==101 || aretver->get_id()==59||aretver->get_id()==64
1841     || aretver->get_id()==45 || aretver->get_id()==52|| aretver->get_id()==93|| aretver->get_id()==74 || aretver->get_id()==81||aretver->get_id()==88
1842     //|| aretver->get_id()==20 || aretver->get_id()==141|| aretver->get_id()==129|| aretver->get_id()==136 || aretver->get_id()==66||aretver->get_id()==59
1843     //|| aretver->get_id()==73 || aretver->get_id()==78|| aretver->get_id()==45|| aretver->get_id()==52 || aretver->get_id()==95||aretver->get_id()==102
1844     //|| aretver->get_id()==88 || aretver->get_id()==121|| aretver->get_id()==116|| aretver->get_id()==109
1845    
1846     )
1847     {
1848     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
1849     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
1850     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
1851     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
1852     mainew->ajouter_mg_segment(seg);
1853     }
1854     }
1855    
1856     LISTE_MG_TRIANGLE::iterator itTri;
1857     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
1858     {
1859     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
1860     if (facetri->get_id()==37)
1861     {
1862     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
1863     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
1864     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
1865     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
1866     }
1867     }
1868    
1869     //gestnew->enregistrer("cadsurfmsh_smplwithole_23mm.magic");
1870     gestnew->enregistrer(outputfilename);
1871     }
1872 sattarpa 596 void CRIAQOPERATORS::surfmaker_e3(char* outputfilename,int meshno,char* magicfilename)
1873 sattarpa 554 {
1874     //surfmesh maker (smplwithpocket+smpl withpocket)
1875     MG_FILE gest(magicfilename);
1876     MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
1877     MG_MAILLAGE* mai;
1878     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
1879     //MG_FILE gest((char*)"smplwithpocket_3d_13mm.magic");
1880     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
1881     //MG_MAILLAGE* mai=gest.get_mg_maillageid(2982821);
1882     MG_GESTIONNAIRE* gestnew=new MG_GESTIONNAIRE();
1883     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
1884     gestnew->ajouter_mg_geometrie(geonew);
1885     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
1886     gestnew->ajouter_mg_maillage(mainew);
1887    
1888     LISTE_MG_NOEUD::iterator itnod;
1889     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
1890     {
1891     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
1892     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
1893     MG_ARETE* aretver=(MG_ARETE*) (vertices->get_lien_topologie());
1894     MG_SOMMET* sometver=(MG_SOMMET*) (vertices->get_lien_topologie());
1895     if(facevert->get_id()==5
1896     || aretver->get_id()==32 || aretver->get_id()==61|| aretver->get_id()==42|| aretver->get_id()==56 || aretver->get_id()==49||aretver->get_id()==27
1897     || aretver->get_id()==85 || aretver->get_id()==90|| aretver->get_id()==78|| aretver->get_id()==71 || aretver->get_id()==20||aretver->get_id()==13
1898     || sometver->get_id()==10|| sometver->get_id()==26|| sometver->get_id()==41|| sometver->get_id()==55|| sometver->get_id()==39|| sometver->get_id()==48
1899     || sometver->get_id()==84|| sometver->get_id()==77|| sometver->get_id()==70|| sometver->get_id()==68|| sometver->get_id()==12|| sometver->get_id()==19)
1900     {
1901     double x=vertices->get_x();
1902     double y=vertices->get_y();
1903     double z=vertices->get_z();
1904     //MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,vertices->get_origine());
1905     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
1906     mainew->ajouter_mg_noeud(newno);
1907     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
1908     }
1909     }
1910    
1911     LISTE_MG_SEGMENT::iterator itSeg;
1912     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
1913     {
1914     //%275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010);
1915     //NOEUD linked with a topology (get_lien_topologie => $10 ) -> and %10=SOMMET(1,$9,0); %9=POINT_OCC(1);
1916     //%390=SEGMENT($13,$275,$277,1010); => %13=ARETE(3,$8,$14,$15,1,0); %275=NOEUD($10,93.94800850483597,-250.0000000000000,0.000000000000000,1010); %277=NOEUD($13,89.09047601136933,-249.4243468871926,0.000000000000000,1010);
1917     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
1918     //cout<<"faceseg->get_id()= "<<faceseg->get_id()<<endl;
1919     MG_ARETE* aretver=(MG_ARETE*) (segment->get_lien_topologie());
1920     //cout<<"aretver->get_id()= "<<aretver->get_id()<<endl;
1921     if (faceseg->get_id()==5
1922     || aretver->get_id()==32 || aretver->get_id()==61|| aretver->get_id()==42|| aretver->get_id()==56 || aretver->get_id()==49||aretver->get_id()==27
1923     || aretver->get_id()==85 || aretver->get_id()==90|| aretver->get_id()==78|| aretver->get_id()==71 || aretver->get_id()==20||aretver->get_id()==13)
1924     {
1925     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
1926     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
1927     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
1928     //MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
1929     mainew->ajouter_mg_segment(seg);
1930     }
1931     }
1932    
1933     LISTE_MG_TRIANGLE::iterator itTri;
1934     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
1935     {
1936     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
1937     if (facetri->get_id()==5)
1938     {
1939     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
1940     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
1941     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
1942     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
1943     }
1944     }
1945    
1946     //gestnew->enregistrer("scnsurf_smplwithpocket_3d_13mm_232mmdeform.magic");
1947     gestnew->enregistrer(outputfilename);
1948     }
1949 sattarpa 596 void CRIAQOPERATORS::gnifformatmaker(char* elementxtoutfile,char* nodtxtoutfile,int meshno,char* magicfilename)
1950 sattarpa 554 {
1951     // gnifformatmaker
1952     MG_FILE gest(magicfilename);
1953     MG_MAILLAGE* mai;
1954     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
1955     //MG_FILE gest((char*)"scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump.magic");
1956     // MG_MAILLAGE* mai=gest.get_mg_maillageid(2);
1957     //std::string fichiermaillage="CAD_output_elements.txt";
1958     //FILE* in=fopen(fichiermaillage.c_str(),"wt");
1959     //FILE* in1=fopen("scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump_nodes.txt","wt");
1960     FILE* in1=fopen(nodtxtoutfile,"wt");
1961     //FILE* in1=fopen("scannedsurface_nodes.txt","wt");
1962     LISTE_MG_NOEUD::iterator itnod;
1963     unsigned long firstno=mai->get_premier_noeud(itnod)->get_id();
1964     firstno=firstno-1;
1965     cout<<firstno<<endl;
1966     int counter1=1;
1967     cout<<"mai->get_nb_mg_noeud()="<<mai->get_nb_mg_noeud()<<endl;
1968     for (MG_NOEUD* nod=mai->get_premier_noeud(itnod);nod!=NULL;nod=mai->get_suivant_noeud(itnod))
1969     {
1970     nod->change_nouveau_numero(counter1);
1971     //nod->change_id(counter1);
1972     //fprintf(in1,"%d node coordinate %le %le %le\n",nod->get_id(), nod->get_x(),nod->get_y(), nod->get_z() );
1973 sattarpa 658 //fprintf(in,"%d node coordinate %le %le %le\n",nod->get_id(), nod->get_x(),nod->get_y(), nod->get_z() );
1974     fprintf(in1,"%19d%32.9le%16.9le%8d\n",nod->get_nouveau_numero(), nod->get_x(),nod->get_y(),nod->get_nouveau_numero());
1975     fprintf(in1,"%7d%16.9le\n",nod->get_nouveau_numero(), nod->get_z());
1976 sattarpa 554 counter1++;
1977     }
1978     //FILE* in2=fopen("scnsurf_longflxprtwithpockets_3d_3mm_8mmdef_0bump_elements.txt","wt"); // CAD text output elements
1979     FILE* in2=fopen(elementxtoutfile,"wt");
1980     //FILE* in2=fopen("scannedsurface_elements.txt","wt"); //scanned text output elements
1981     int counter=1;
1982     LISTE_MG_TRIANGLE::iterator ittri;
1983     for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittri);tri!=NULL;tri=mai->get_suivant_triangle(ittri))
1984     {
1985     fprintf(in2,"%10d 1%8d%8d%8d\n",counter,tri->get_noeud1()->get_nouveau_numero(),tri->get_noeud2()->get_nouveau_numero(),tri->get_noeud3()->get_nouveau_numero() );
1986     counter++;
1987     }
1988     fclose(in1);
1989     fclose(in2);
1990     }
1991 sattarpa 596 void CRIAQOPERATORS::rmovscnprtfromdefrmdcad(char* outputfilename,int meshno,char* magicfilename)
1992 sattarpa 554 {
1993     MG_FILE gest(magicfilename);
1994     MG_MAILLAGE* mai;
1995     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
1996 sattarpa 596 MG_GESTIONNAIRE* newgest=new MG_GESTIONNAIRE();
1997 sattarpa 554 MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
1998 sattarpa 596 newgest->ajouter_mg_geometrie(geonew);
1999 sattarpa 554 MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2000 sattarpa 596 newgest->ajouter_mg_maillage(mainew);
2001    
2002 sattarpa 554 LISTE_MG_NOEUD::iterator itnod;
2003     for (MG_NOEUD* vertices=mai->get_premier_noeud(itnod);vertices!=NULL;vertices=mai->get_suivant_noeud(itnod))
2004     {
2005     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2006     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2007 sattarpa 596 //if(facevert->get_id()!=76 && topnd->get_dimension()!=3) //e1
2008     //if(facevert->get_id()!=5 && topnd->get_dimension()!=3) //e2
2009 sattarpa 554 {
2010     double x=vertices->get_x();
2011     double y=vertices->get_y();
2012     double z=vertices->get_z();
2013     MG_NOEUD *newno=new MG_NOEUD(vertices->get_lien_topologie(),x,y,z,vertices->get_origine());
2014     mainew->ajouter_mg_noeud(newno);
2015     vertices->change_nouveau_numero(newno->get_id()); // what does this do?
2016     }
2017     }
2018 sattarpa 596
2019 sattarpa 554 LISTE_MG_SEGMENT::iterator itSeg;
2020     for (MG_SEGMENT * segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2021     {
2022     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
2023     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2024 sattarpa 596 //if (faceseg->get_id()!=76 && topseg->get_dimension()!=3)
2025     if(faceseg->get_id()!=5 && topseg->get_dimension()!=3) //e2
2026 sattarpa 554 {
2027     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2028     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2029     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2030     mainew->ajouter_mg_segment(seg);
2031     }
2032     }
2033 sattarpa 596
2034 sattarpa 554 LISTE_MG_TRIANGLE::iterator itTri;
2035     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2036     {
2037     MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
2038     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2039 sattarpa 596 // if (facetri->get_id()!=76 && toptri->get_dimension()!=3)
2040     if (facetri->get_id()!=5 && toptri->get_dimension()!=3) //e2
2041 sattarpa 554 {
2042     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2043     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2044     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2045     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2046     }
2047     }
2048 sattarpa 596 newgest->enregistrer(outputfilename);
2049 sattarpa 554 //gest.enregistrer("deformedcad_sansscannedpart.magic");
2050    
2051     }
2052 sattarpa 596 void CRIAQOPERATORS::msh2dmakerfrommsh3d(char* outputfilename,int meshno,char* magicfilename)
2053 sattarpa 554 {
2054     //to make a 2D mesh out of 3D mesh :)
2055     /*
2056     MG_MAILLAGE* mainew=mai->dupliquer(&gest);
2057     LISTE_MG_TETRA::iterator ittet;
2058     for(MG_TETRA* )
2059     {
2060    
2061     }
2062    
2063     cout<<"mainew->get_nb_mg_noeud()= "<<mainew->get_nb_mg_noeud()<<endl;
2064     cout<<"mainew->get_nb_mg_segment()= "<<mainew->get_nb_mg_segment()<<endl;
2065     cout<<"mainew->get_nb_mg_triangle()= "<<mainew->get_nb_mg_triangle()<<endl;
2066     cout<<"mainew->get_nb_mg_tetra()= "<<mainew->get_nb_mg_tetra()<<endl;
2067    
2068     LISTE_MG_TRIANGLE::iterator ittri;
2069     for (MG_TRIANGLE* triangle=mainew->get_premier_triangle(ittri);triangle!=NULL;triangle=mainew->get_suivant_triangle(ittri))
2070     {
2071     MG_ELEMENT_TOPOLOGIQUE *top=triangle->get_lien_topologie();
2072     int topdimension=top->get_dimension();
2073     if (topdimension==3)
2074     mainew->supprimer_mg_triangleid(triangle->get_id());
2075     }
2076    
2077     LISTE_MG_TETRA::iterator ittet;
2078     for (MG_TETRA* tetra=mainew->get_premier_tetra(ittet);tetra!=NULL;tetra=mainew->get_suivant_tetra(ittet))
2079     mainew->supprimer_mg_tetraid(tetra->get_id());
2080     //MG_FACE* face=geo->get_mg_faceid(5);
2081    
2082    
2083     LISTE_MG_SEGMENT::iterator itseg;
2084     for (MG_SEGMENT* segment=mainew->get_premier_segment(itseg);segment!=NULL;segment=mainew->get_suivant_segment(itseg))
2085     {
2086     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
2087     if (faceseg->get_id()!=181)
2088     mainew->supprimer_mg_segmentid(segment->get_id());
2089    
2090     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
2091     if(topseg->get_dimension()==3)
2092     cout<<"topseg->get_dimension()==3"<<endl;
2093     }
2094    
2095     LISTE_MG_NOEUD::iterator itnod;
2096     for (MG_NOEUD* vertices=mainew->get_premier_noeud(itnod);vertices!=NULL;vertices=mainew->get_suivant_noeud(itnod))
2097     {
2098     MG_ELEMENT_TOPOLOGIQUE *topnd=vertices->get_lien_topologie();
2099     MG_FACE* facevert=(MG_FACE*) (vertices->get_lien_topologie());
2100     //if (facevert->get_id()!=181)
2101     if (topnd->get_dimension()==0)
2102     mainew->supprimer_mg_segmentid(vertices->get_id());
2103     }
2104    
2105     for (MG_TRIANGLE* triangle=mainew->get_premier_triangle(ittri);triangle!=NULL;triangle=mainew->get_suivant_triangle(ittri))
2106     {
2107     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
2108     if (facetri->get_id()!=181)
2109     mainew->supprimer_mg_triangleid(triangle->get_id());
2110     }
2111     */
2112 sattarpa 596
2113     MG_FILE gest(magicfilename);
2114     MG_MAILLAGE* mai;
2115     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2116 sattarpa 554 MG_GESTIONNAIRE* newgest=new MG_GESTIONNAIRE();
2117     MG_GEOMETRIE* geonew=mai->get_mg_geometrie();
2118     newgest->ajouter_mg_geometrie(geonew);
2119     MG_MAILLAGE* mainew=new MG_MAILLAGE(geonew);
2120     newgest->ajouter_mg_maillage(mainew);
2121    
2122     LISTE_MG_NOEUD::iterator itNod;
2123     for (MG_NOEUD* nd=mai->get_premier_noeud(itNod);nd!=NULL;nd=mai->get_suivant_noeud(itNod))
2124     {
2125     MG_ELEMENT_TOPOLOGIQUE *topnd=nd->get_lien_topologie();
2126     if(topnd->get_dimension()<3)
2127     {
2128     double x=nd->get_x();
2129     double y=nd->get_y();
2130     double z=nd->get_z();
2131     MG_NOEUD *newno=new MG_NOEUD(nd->get_lien_topologie(),x,y,z,nd->get_origine());
2132     mainew->ajouter_mg_noeud(newno);
2133     nd->change_nouveau_numero(newno->get_id());
2134     }
2135     }
2136     LISTE_MG_SEGMENT::iterator itSeg;
2137     for (MG_SEGMENT* segment =mai->get_premier_segment(itSeg); segment; segment=mai->get_suivant_segment(itSeg))
2138     {
2139     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
2140     if(topseg->get_dimension()<3)
2141     {
2142     MG_NOEUD* no1=mainew->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2143     MG_NOEUD* no2=mainew->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2144     MG_SEGMENT *seg=new MG_SEGMENT(segment->get_lien_topologie(),no1,no2,segment->get_origine());
2145     mainew->ajouter_mg_segment(seg);
2146     }
2147     }
2148     LISTE_MG_TRIANGLE::iterator itTri;
2149     for (MG_TRIANGLE * triangle =mai->get_premier_triangle(itTri); triangle; triangle=mai->get_suivant_triangle(itTri))
2150     {
2151     MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
2152     if(toptri->get_dimension()<3)
2153     {
2154     MG_NOEUD* no1=mainew->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
2155     MG_NOEUD* no2=mainew->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
2156     MG_NOEUD* no3=mainew->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
2157     mainew->ajouter_mg_triangle(triangle->get_lien_topologie(),no1,no2,no3,triangle->get_origine());
2158     }
2159     }
2160 sattarpa 596 newgest->enregistrer(outputfilename);
2161 sattarpa 554 }
2162 sattarpa 596 void CRIAQOPERATORS::bumpmaker(char* outputfilename,int bumpndid, double bumptip,int meshno,char* magicfilename)
2163 sattarpa 554 {
2164     MG_FILE gest(magicfilename);
2165     //MG_GEOMETRIE* geo=gest.get_mg_geometrie(0);
2166     MG_MAILLAGE* mai;
2167     if (meshno==0) mai=gest.get_mg_maillage(meshno); else mai=gest.get_mg_maillageid(meshno);
2168     //MG_FILE gest((char*)"scnsurf_smplwithpocket_3d_13mm_64mmdeform.magic");
2169     //MG_GEOMETRIE* geo=gest.get_mg_geometrieid(1);
2170     //MG_MAILLAGE* mai=gest.get_mg_maillageid(2);
2171     MG_NOEUD* bptipnd;
2172     TPL_MAP_ENTITE<MG_NOEUD*> usednd;
2173     LISTE_MG_NOEUD::iterator itnod;
2174     for (MG_NOEUD* nd=mai->get_premier_noeud(itnod);nd!=NULL;nd=mai->get_suivant_noeud(itnod))
2175     {
2176     MG_ELEMENT_TOPOLOGIQUE *topnd=nd->get_lien_topologie();
2177     if (topnd->get_dimension() <3 && nd->get_id()==bumpndid)
2178     {
2179     bptipnd=nd;
2180     double new_xyz[3];
2181     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+bumptip;
2182     nd->change_coord(new_xyz);
2183     usednd.ajouter(nd);
2184     }
2185     }
2186     TPL_MAP_ENTITE<MG_NOEUD*> usedndnd;
2187     TPL_MAP_ENTITE<MG_NOEUD*> neignd;
2188     for(int ineignd=0;ineignd<bptipnd->get_lien_segment()->get_nb();ineignd++)
2189     {
2190     MG_SEGMENT* segnei=bptipnd->get_lien_segment()->get(ineignd);
2191     if(segnei->get_noeud1()!=bptipnd) neignd.ajouter(segnei->get_noeud1());
2192     else if(segnei->get_noeud2()!=bptipnd) neignd.ajouter(segnei->get_noeud2());
2193     }
2194     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itneignd;
2195     for (MG_NOEUD* nd=neignd.get_premier(itneignd);nd!=NULL;nd=neignd.get_suivant(itneignd))
2196     {
2197     double new_xyz[3];
2198     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+(bumptip*3./4.);
2199     nd->change_coord(new_xyz);
2200     usednd.ajouter(nd);
2201     usedndnd.ajouter(nd);
2202     }
2203    
2204     TPL_MAP_ENTITE<MG_NOEUD*> neignd1;
2205     TPL_MAP_ENTITE<MG_NOEUD*> usedndnd1;
2206     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itusednd;
2207     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itusedndnd;
2208     for(MG_NOEUD* nd=usedndnd.get_premier(itusedndnd);nd!=NULL;nd=usedndnd.get_suivant(itusedndnd))
2209     {
2210     for(int ineignd=0;ineignd<nd->get_lien_segment()->get_nb();ineignd++)
2211     {
2212     MG_SEGMENT* segnei=nd->get_lien_segment()->get(ineignd);
2213     int sgnd1=0;
2214     int sgnd2=0;
2215     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2216     {
2217     if(segnei->get_noeud1()==nd1) sgnd1++;
2218     }
2219     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2220     {
2221     if(segnei->get_noeud2()==nd1) sgnd2++;
2222     }
2223     if(sgnd1==0) neignd1.ajouter(segnei->get_noeud1());
2224     else if(sgnd2==0) neignd1.ajouter(segnei->get_noeud2());
2225     }
2226     }
2227     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itneignd1;
2228     for (MG_NOEUD* nd=neignd1.get_premier(itneignd1);nd!=NULL;nd=neignd1.get_suivant(itneignd1))
2229     {
2230     double new_xyz[3];
2231     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+(bumptip*2./4.);
2232     nd->change_coord(new_xyz);
2233     usednd.ajouter(nd);
2234     usedndnd1.ajouter(nd);
2235     }
2236    
2237     TPL_MAP_ENTITE<MG_NOEUD*> neignd2;
2238     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itusedndnd1;
2239     for(MG_NOEUD* nd=usedndnd1.get_premier(itusedndnd1);nd!=NULL;nd=usedndnd1.get_suivant(itusedndnd1))
2240     {
2241     for(int ineignd=0;ineignd<nd->get_lien_segment()->get_nb();ineignd++)
2242     {
2243     MG_SEGMENT* segnei=nd->get_lien_segment()->get(ineignd);
2244     int sgnd1=0;
2245     int sgnd2=0;
2246     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2247     {
2248     if(segnei->get_noeud1()==nd1) sgnd1++;
2249     }
2250     for(MG_NOEUD* nd1=usednd.get_premier(itusednd);nd1!=NULL;nd1=usednd.get_suivant(itusednd))
2251     {
2252     if(segnei->get_noeud2()==nd1) sgnd2++;
2253     }
2254     if(sgnd1==0) neignd2.ajouter(segnei->get_noeud1());
2255     else if(sgnd2==0) neignd2.ajouter(segnei->get_noeud2());
2256     }
2257     }
2258     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itneignd2;
2259     for (MG_NOEUD* nd=neignd2.get_premier(itneignd2);nd!=NULL;nd=neignd2.get_suivant(itneignd2))
2260     {
2261     double new_xyz[3];
2262     new_xyz[0]=nd->get_x(); new_xyz[1]=nd->get_y(); new_xyz[2]=nd->get_z()+(bumptip*1./4.);
2263     nd->change_coord(new_xyz);
2264     }
2265    
2266    
2267     //gest.enregistrer("scnsurf_smplwithpocket_3d_13mm_64mmdeform_withbump5mm.magic");
2268     gest.enregistrer(outputfilename);
2269     }
2270 sattarpa 596 int CRIAQOPERATORS::import_triangulation_gnif(char* outputfilename,char* triangulationfile)
2271     {
2272     FILE* in=fopen(triangulationfile,"rt");
2273     if (in==NULL) return 0;
2274 sattarpa 554
2275    
2276 sattarpa 596 MG_GESTIONNAIRE gesttmp;
2277     MG_MAILLAGE* mai=new MG_MAILLAGE(NULL);
2278     gesttmp.ajouter_mg_maillage(mai);
2279     char mess[500];
2280 sattarpa 554
2281 sattarpa 596 double xmax=-1e308;
2282     double xmin=1e308;
2283     double ymax=-1e308;
2284     double ymin=1e308;
2285     double zmax=-1e308;
2286     double zmin=1e308;
2287     while (!feof(in))
2288     {
2289     double x,y,z;
2290     char nom[20];
2291     char *res=fgets(mess,500,in);
2292     if (feof(in)) break;
2293 sattarpa 655 if(res!=NULL)
2294     {
2295 sattarpa 658 sscanf(mess,"%le %le %le",&x,&y,&z);
2296 sattarpa 596 if (x<xmin) xmin=x;
2297     if (x>xmax) xmax=x;
2298     if (y<ymin) ymin=y;
2299     if (y>ymax) ymax=y;
2300     if (z<zmin) zmin=z;
2301     if (z>zmax) zmax=z;
2302     if (feof(in)) return 1;
2303     MG_NOEUD* noeud1=mai->ajouter_mg_noeud(NULL,x,y,z,TRIANGULATION);
2304     noeud1->change_nouveau_numero(-1);
2305     res=fgets(mess,500,in);
2306     if (feof(in)) break;
2307 sattarpa 658 sscanf(mess,"%le %le %le",&x,&y,&z);
2308 sattarpa 596 if (x<xmin) xmin=x;
2309     if (x>xmax) xmax=x;
2310     if (y<ymin) ymin=y;
2311     if (y>ymax) ymax=y;
2312     if (z<zmin) zmin=z;
2313     if (z>zmax) zmax=z;
2314     if (feof(in)) return 1;
2315     res=fgets(mess,500,in);
2316     if (feof(in)) break;
2317     MG_NOEUD* noeud2=mai->ajouter_mg_noeud(NULL,x,y,z,TRIANGULATION);
2318     noeud2->change_nouveau_numero(-1);
2319 sattarpa 658 sscanf(mess,"%le %le %le",&x,&y,&z);
2320 sattarpa 596 if (x<xmin) xmin=x;
2321     if (x>xmax) xmax=x;
2322     if (y<ymin) ymin=y;
2323     if (y>ymax) ymax=y;
2324     if (z<zmin) zmin=z;
2325     if (z>zmax) zmax=z;
2326     if (feof(in)) return 1;
2327     MG_NOEUD* noeud3=mai->ajouter_mg_noeud(NULL,x,y,z,TRIANGULATION);
2328     noeud3->change_nouveau_numero(-1);
2329     mai->ajouter_mg_triangle(NULL,noeud1,noeud2,noeud3,TRIANGULATION);
2330 sattarpa 655 }
2331 sattarpa 596 }
2332     fclose(in);
2333     //to merge the nodes of each triangulation which are close (the same)
2334     double eps=1e-4;
2335     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
2336     double rayon=boite.get_rayon()*1.1;
2337     double x=boite.get_xcentre();
2338     double y=boite.get_ycentre();
2339     double z=boite.get_zcentre();
2340     boite.reinit(x-rayon,y-rayon,z-rayon,x+rayon,y+rayon,z+rayon);
2341     TPL_GRILLE<MG_NOEUD*> grille;
2342     int nb_noeud=mai->get_nb_mg_noeud();
2343     int pas=(int)(pow(nb_noeud,0.33333333333333333))+1;
2344     grille.initialiser(boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax(),pas,pas,pas);
2345     std::vector<MG_NOEUD*> lst_noeud;
2346     LISTE_MG_NOEUD::iterator it;
2347     int i=0;
2348     for (MG_NOEUD* noeud=mai->get_premier_noeud(it);noeud!=NULL;noeud=mai->get_suivant_noeud(it))
2349     {
2350     //MG_NOEUD* noeud=mai->get_mg_noeud(i);
2351     grille.inserer(noeud);
2352     noeud->change_nouveau_numero(i);
2353     lst_noeud.insert(lst_noeud.end(),noeud);
2354     i++;
2355     }
2356 sattarpa 554
2357 sattarpa 596 int nb_cell=grille.get_nb_cellule();
2358     for (int i=0;i<nb_cell;i++)
2359     {
2360     TPL_CELLULE_GRILLE<MG_NOEUD*> *cell=grille.get_cellule(i);
2361     int nb_noeud_cell=cell->get_nb_entite();
2362     for (int j=0;j<nb_noeud_cell;j++)
2363     {
2364     MG_NOEUD* noeud1=cell->get_entite(j);
2365     // if (noeud1->get_nouveau_numero()!=(-1)) continue;
2366     // noeud1->change_nouveau_numero(noeud1->get_id());
2367     double *xyz1=noeud1->get_coord();
2368     int nb=noeud1->get_lien_segment()->get_nb();
2369     double longref=0.;
2370     for (int jj=0;jj<nb;jj++)
2371     longref=longref+noeud1->get_lien_segment()->get(jj)->get_longueur();
2372     longref=longref/nb;
2373     for (int k=j+1;k<nb_noeud_cell;k++)
2374     {
2375     MG_NOEUD* noeud2=cell->get_entite(k);
2376     double *xyz2=noeud2->get_coord();
2377     OT_VECTEUR_3D vec(xyz1,xyz2);
2378     double longueur=vec.get_longueur();
2379     if (longueur<eps*longref)
2380     {
2381     lst_noeud[noeud2->get_nouveau_numero()]=noeud1;
2382     }
2383     }
2384     }
2385     }
2386     MG_GESTIONNAIRE gest;
2387     MG_MAILLAGE* mai2=new MG_MAILLAGE(NULL);
2388     gest.ajouter_mg_maillage(mai2);
2389     for (int i=0;i<nb_noeud;i++)
2390     {
2391     MG_NOEUD* noeud=lst_noeud[i];
2392     MG_NOEUD* nvnoeud;
2393     if (noeud->get_nouveau_numero()==i) nvnoeud=mai2->ajouter_mg_noeud(NULL,noeud->get_x(),noeud->get_y(),noeud->get_z(),TRIANGULATION);
2394     else nvnoeud=lst_noeud[noeud->get_nouveau_numero()];
2395     lst_noeud[i]=nvnoeud;
2396     }
2397     int nb_tri=mai->get_nb_mg_triangle();
2398     for (int i=0;i<nb_tri;i++)
2399     {
2400     MG_TRIANGLE* tri=mai->get_mg_triangle(i);
2401     MG_NOEUD* noeud1=tri->get_noeud1();
2402     MG_NOEUD* noeud2=tri->get_noeud2();
2403     MG_NOEUD* noeud3=tri->get_noeud3();
2404     mai2->ajouter_mg_triangle(NULL,lst_noeud[noeud1->get_nouveau_numero()],lst_noeud[noeud2->get_nouveau_numero()],lst_noeud[noeud3->get_nouveau_numero()],TRIANGULATION);
2405     }
2406     gest.enregistrer(outputfilename);
2407     return 1;
2408     }
2409 sattarpa 699 std::vector<double*> CRIAQOPERATORS::sp_project_onCAD(char* magicfilename,int nummai,char* samplepoints1)
2410 sattarpa 695 {
2411     std::vector<double*> lstsmplpoints;
2412 sattarpa 699 std::vector<double*> lstsmplpoints_afterprojectioncad;
2413 sattarpa 695 FILE *in=fopen(samplepoints1,"rt");
2414     if (in==NULL) cout<<"file is not available"<<endl;//affiche((char*) "file is not available");
2415     while(!feof(in))
2416     {
2417     char chaine[500];
2418     char* res=fgets(chaine,500,in);
2419     if(res!=NULL)
2420     {
2421     double x,y,z;
2422     int nb=sscanf(chaine,"%le %le %le",&x,&y,&z);
2423     double* pcoordbc=new double[3];
2424     if (nb!=-1 && nb!=3)
2425     cout<<"Wrong file format"<<endl;
2426     if(nb==3)
2427     {
2428     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z;
2429     lstsmplpoints.push_back(pcoordbc);
2430     }
2431     }
2432     }
2433 sattarpa 707 //cout<<"lstsmplpoints.size()= "<<lstsmplpoints.size()<<endl;
2434 sattarpa 695 for(std::vector<double*>::iterator ilstsmplpoints=lstsmplpoints.begin();ilstsmplpoints!=lstsmplpoints.end();ilstsmplpoints++)
2435     {
2436     double* p=(*ilstsmplpoints);
2437     MG_FILE gest(magicfilename);
2438     MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
2439     int geonb=gest.get_nb_mg_geometrie();
2440     int nogeo=0;
2441     MG_GEOMETRIE* geo;
2442     if(geonb>0)
2443     geo=gest.get_mg_geometrie(0);
2444     else if(geonb<1)
2445     {
2446     nogeo++;
2447     cout<<"no geometry is found !!!"<<endl;
2448     }
2449    
2450     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
2451     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
2452     LISTE_MG_NOEUD::iterator it;
2453     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2454     {
2455     if (no->get_x()<xmin) xmin=no->get_x();
2456     if (no->get_y()<ymin) ymin=no->get_y();
2457     if (no->get_z()<zmin) zmin=no->get_z();
2458     if (no->get_x()>xmax) xmax=no->get_x();
2459     if (no->get_y()>ymax) ymax=no->get_y();
2460     if (no->get_z()>zmax) zmax=no->get_z();
2461     lstnoeud.ajouter(no);
2462     }
2463     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
2464     OT_VECTEUR_3D vecmax(xmax,ymax,zmax);
2465     OT_VECTEUR_3D lengthvec(vecmin,vecmax);
2466     double search_radius=0.0000001;
2467     //double search_radius=0.001*(lengthvec.get_longueur());
2468     //char bboxdiag[1000];
2469     //sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
2470     //affiche((char*) bboxdiag);
2471     OT_VECTEUR_3D average=(vecmin+vecmax)/2.;
2472     double length=sqrt(lengthvec*lengthvec);
2473     double bxr=1.1;
2474     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
2475     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
2476     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree;
2477     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2478     LISTE_MG_TRIANGLE::iterator it9;
2479     for (MG_TRIANGLE* tri=mai->get_premier_triangle(it9);tri!=NULL;tri=mai->get_suivant_triangle(it9))
2480     octree.inserer(tri);
2481     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreends;
2482     octreends.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2483     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2484     octreends.inserer(no);
2485    
2486     // determine the normal of geometry in the inserting point coordination and saving in "normale"
2487     double normale[3];
2488     std::multimap<double,MG_TRIANGLE*,std::less<double> > delinsqualtri;
2489     int insideface=0;
2490     std::multimap<double,MG_FACE*,std::less<double> > lstfacepointdist;
2491     int facenb=geo->get_nb_mg_face();
2492     LISTE_MG_FACE::iterator itf;
2493     double xyz[3];
2494     xyz[0]=p[0];
2495     xyz[1]=p[1];
2496     xyz[2]=p[2];
2497     for(MG_FACE* fac=geo->get_premier_face(itf);fac!=NULL;fac=geo->get_suivant_face(itf))
2498     {
2499     double uv[2];
2500     fac->inverser(uv,xyz);
2501     double xyz2[3];
2502     fac->evaluer(uv,xyz2);
2503     OT_VECTEUR_3D vechk(xyz,xyz2);
2504     lstfacepointdist.insert(pair<double,MG_FACE*> (vechk.get_longueur(),fac));
2505     //double dis;
2506     //MG_GEOMETRIE_OUTILS f1;
2507     //int ch=f1.calcule_distance_contour_face_xyz(xyz,fac,&dis);
2508     ////cout<<"xyz= "<<xyz[0]<<" xyz= "<<xyz[1]<<" xyz= "<<xyz[2]<<" xyz2= "<<xyz2[0]<<" xyz2= "<<xyz2[1]<<" xyz2= "<<xyz2[2]<<endl;
2509     //cout<<"dis= "<<dis<<" vechk.get_longueur()= "<<vechk.get_longueur()<<endl;
2510     //if (ch==1 && dis>=0.)
2511     // if (vechk.get_longueur()<5e-3)
2512     }
2513     std::multimap<double,MG_FACE*,std::less<double> >::iterator itlstfacepointdist=lstfacepointdist.begin();
2514     if (lstfacepointdist.size()>0)
2515     {
2516 sattarpa 707 //cout<<"lstfacepointdist.size()= "<<lstfacepointdist.size()<<endl;
2517 sattarpa 695 //cout<<"(*itlstfacepointdist).first= "<<(*itlstfacepointdist).first<<endl;
2518     MG_FACE* face=(*itlstfacepointdist).second;
2519     double uv[2];
2520     face->inverser(uv,xyz);
2521     face->calcul_normale_unitaire(uv,normale);
2522     MG_COFACE *coface=face->get_mg_coface(0);
2523     int signe=coface->get_orientation();
2524    
2525     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
2526     int neitrinb=lstneitri.get_nb();
2527     while(neitrinb==0)
2528     {
2529     octree.rechercher(p[0],p[1],p[2],search_radius,lstneitri);
2530     neitrinb=lstneitri.get_nb();
2531     search_radius=search_radius+0.01*search_radius;
2532     }
2533     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itnormtst;
2534     OT_VECTEUR_3D normale_discrete(0.,0.,0.);
2535     for (MG_TRIANGLE* tri1=lstneitri.get_premier(itnormtst);tri1!=NULL;tri1=lstneitri.get_suivant(itnormtst))
2536     {
2537     OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
2538     OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
2539     OT_VECTEUR_3D normtst=(vec1&vec2); normtst.norme();
2540     normale_discrete=normtst+normale_discrete;
2541     }
2542     normale_discrete.norme();
2543     double n_ps=normale_discrete*normale;
2544     n_ps=n_ps*-1;
2545     if (n_ps>1.) n_ps=1.;
2546     if (n_ps<-1.) n_ps=-1.;
2547     double n_angle=acos(n_ps);
2548     //cout<<"n_angle= "<<n_angle<<endl;
2549     if(n_angle<(0.5*3.14159265358979323846) || n_angle>-(0.5*3.14159265358979323846))
2550     insideface++;
2551     }
2552     //cout<<"normale= "<<normale[0]<<"normale= "<<normale[1]<<"normale= "<<normale[2]<<endl;
2553     //cout<<"insideface= "<<insideface<<endl;
2554     if(insideface<1)
2555     cout<<"insideface is not found !!!"<<endl;
2556     if(insideface>0)
2557     {
2558     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri1;
2559     int neitrinb=lstneitri1.get_nb();
2560     double search_radius1=0.01;
2561     while(neitrinb==0)
2562     {
2563 sattarpa 699 octree.rechercher(p[0],p[1],p[2],500.*search_radius1,lstneitri1);//sasan
2564 sattarpa 695 neitrinb=lstneitri1.get_nb();
2565     search_radius1=search_radius1+0.00001*search_radius1;
2566     }
2567     //cout<<"lstneitri1.get_nb()= "<<lstneitri1.get_nb()<<endl;
2568     double pproj[3];
2569     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR inspi;
2570     int tri_found=0;
2571     int beshmar=0;
2572    
2573    
2574     for (MG_TRIANGLE* insphertri=lstneitri1.get_premier(inspi);insphertri!=NULL;insphertri=lstneitri1.get_suivant(inspi))
2575     {
2576 sattarpa 699 //cout<<insphertri->get_id()<<endl;
2577 sattarpa 695 //while (tri_found<1 || beshmar<lstneitri.get_nb())
2578     {
2579     beshmar++;
2580     MG_NOEUD* inspnd1=insphertri->get_noeud1();
2581     MG_NOEUD* inspnd2=insphertri->get_noeud2();
2582     MG_NOEUD* inspnd3=insphertri->get_noeud3();
2583     OT_VECTEUR_3D tvec1(inspnd1->get_coord(),inspnd2->get_coord());
2584     OT_VECTEUR_3D tvec2(inspnd1->get_coord(),inspnd3->get_coord());
2585     OT_VECTEUR_3D tnorm=(tvec1&tvec2); tnorm.norme();
2586 sattarpa 699 OT_VECTEUR_3D norm=tnorm;//normale;
2587 sattarpa 695
2588     double parallel=norm*tnorm;
2589     //cout<<"parallel= "<<parallel<<endl;
2590     if (parallel>0.7 || parallel<-0.7)
2591     {
2592     //cout<<"itis"<<endl;
2593     OT_VECTEUR_3D vvec(inspnd1->get_coord(),p);
2594     double t= (tnorm*vvec)/parallel;
2595     t=-t;
2596     pproj[0]=p[0]+t*norm.get_x();
2597     pproj[1]=p[1]+t*norm.get_y();
2598     pproj[2]=p[2]+t*norm.get_z();
2599     //////////////////////////////////////////////////////////////
2600     //check if the projected p is inside the triangle !!!!!
2601     MG_MAILLAGE_OUTILS tribas;
2602     int tribasval=tribas.estdansletriangle(insphertri,pproj[0],pproj[1],pproj[2]);
2603     int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
2604     int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
2605     int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
2606     //printf("projection before is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
2607 sattarpa 699 //cout<<"intri= "<<intri<<endl;
2608 sattarpa 695 if(intri==1)
2609     {
2610 sattarpa 699 //printf("projection is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
2611     double* proj=new double[3];
2612     proj[0]=pproj[0]; proj[1]=pproj[1]; proj[2]=pproj[2];
2613     lstsmplpoints_afterprojectioncad.push_back(proj);
2614 sattarpa 695 tri_found++;
2615 sattarpa 707 break;
2616 sattarpa 699
2617 sattarpa 695 }
2618    
2619     }
2620     }
2621     }
2622     }
2623     }
2624 sattarpa 699
2625     //for(std::vector<double*>::iterator itsprojcad=lstsmplpoints_afterprojectioncad.begin();itsprojcad!=lstsmplpoints_afterprojectioncad.end();itsprojcad++)
2626     {
2627     //double* xyz_cadproj=(*itsprojcad);
2628     //cout<<"xyz_cadproj[0]= "<<xyz_cadproj[0]<<" xyz_cadproj[1]= "<<xyz_cadproj[1]<<" xyz_cadproj[2]= "<<xyz_cadproj[2]<<endl;
2629    
2630     }
2631     return lstsmplpoints_afterprojectioncad;
2632 sattarpa 695 }
2633 sattarpa 699 std::vector<double*> CRIAQOPERATORS::sp_project_onSCAN(char* magicfilename,int nummai,char* samplepoints1)
2634 sattarpa 695 {
2635     std::vector<double*> lstsmplpoints;
2636     std::vector<double*> lstsmplpoints_afterprojection;
2637     FILE *in=fopen(samplepoints1,"rt");
2638     if (in==NULL) cout<<"file is not available"<<endl;//affiche((char*) "file is not available");
2639     while(!feof(in))
2640     {
2641     char chaine[500];
2642     char* res=fgets(chaine,500,in);
2643     if(res!=NULL)
2644     {
2645     double x,y,z;
2646     int nb=sscanf(chaine,"%le %le %le",&x,&y,&z);
2647     double* pcoordbc=new double[3];
2648     if (nb!=-1 && nb!=3)
2649     cout<<"Wrong file format"<<endl;
2650     if(nb==3)
2651     {
2652     pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z;
2653     lstsmplpoints.push_back(pcoordbc);
2654     }
2655     }
2656     }
2657 sattarpa 707 //cout<<"lstsmplpoints.size()= "<<lstsmplpoints.size()<<endl;
2658 sattarpa 695 for(std::vector<double*>::iterator ilstsmplpoints=lstsmplpoints.begin();ilstsmplpoints!=lstsmplpoints.end();ilstsmplpoints++)
2659     {
2660     double* p=(*ilstsmplpoints);
2661     MG_FILE gest(magicfilename);
2662     MG_MAILLAGE* mai=gest.get_mg_maillageid(nummai);
2663    
2664     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
2665     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
2666     LISTE_MG_NOEUD::iterator it;
2667     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2668     {
2669     if (no->get_x()<xmin) xmin=no->get_x();
2670     if (no->get_y()<ymin) ymin=no->get_y();
2671     if (no->get_z()<zmin) zmin=no->get_z();
2672     if (no->get_x()>xmax) xmax=no->get_x();
2673     if (no->get_y()>ymax) ymax=no->get_y();
2674     if (no->get_z()>zmax) zmax=no->get_z();
2675     lstnoeud.ajouter(no);
2676     }
2677     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
2678     OT_VECTEUR_3D vecmax(xmax,ymax,zmax);
2679     OT_VECTEUR_3D lengthvec(vecmin,vecmax);
2680     double search_radius=0.0000001;
2681     //double search_radius=0.001*(lengthvec.get_longueur());
2682     //char bboxdiag[1000];
2683     //sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
2684     //affiche((char*) bboxdiag);
2685     OT_VECTEUR_3D average=(vecmin+vecmax)/2.;
2686     double length=sqrt(lengthvec*lengthvec);
2687 sattarpa 707 double bxr=10.1; //this can be changed sasan
2688 sattarpa 695 xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
2689     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
2690     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree;
2691     octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2692     LISTE_MG_TRIANGLE::iterator it9;
2693     for (MG_TRIANGLE* tri=mai->get_premier_triangle(it9);tri!=NULL;tri=mai->get_suivant_triangle(it9))
2694     octree.inserer(tri);
2695     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreends;
2696     octreends.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2697     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2698     octreends.inserer(no);
2699    
2700     // determine the normal of geometry in the inserting point coordination and saving in "normale"
2701     double normale[3];
2702     //////////////////////////////// if no geometry
2703    
2704     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
2705     int neitrinb=lstneitri.get_nb();
2706     while(neitrinb==0)
2707     {
2708 sattarpa 707 octree.rechercher(p[0],p[1],p[2],10*search_radius,lstneitri);
2709 sattarpa 695 neitrinb=lstneitri.get_nb();
2710     search_radius=search_radius+0.00001*search_radius;
2711     }
2712     //cout<<"lstneitri.get_nb()= "<<lstneitri.get_nb()<<endl;
2713     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itnormtst;
2714     OT_VECTEUR_3D normale_discrete(0.,0.,0.);
2715     for (MG_TRIANGLE* tri1=lstneitri.get_premier(itnormtst);tri1!=NULL;tri1=lstneitri.get_suivant(itnormtst))
2716     {
2717     OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
2718     OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
2719     OT_VECTEUR_3D normtst=(vec1&vec2); normtst.norme();
2720     //cout<<"normtst.get_x()= "<<normtst.get_x()<<" normtst.get_y()= "<<normtst.get_y()<<" normtst.get_z()= "<<normtst.get_z()<<endl;
2721     normale_discrete=normtst+normale_discrete;
2722     }
2723     normale_discrete.norme();
2724     normale[0]=normale_discrete.get_x(); normale[1]=normale_discrete.get_y(); normale[2]=normale_discrete.get_z();
2725     //cout<<"normale[0]= "<<normale[0]<<" normale[1]= "<<normale[1]<<" normale[2]= "<<normale[2]<<endl;
2726     ////////////////////////////////
2727    
2728     TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri1;
2729     int neitrinb1=lstneitri1.get_nb();
2730     double search_radius1=0.01;
2731     while(neitrinb1==0)
2732     {
2733     octree.rechercher(p[0],p[1],p[2],search_radius1,lstneitri1);
2734     neitrinb1=lstneitri1.get_nb();
2735     search_radius1=search_radius1+0.00001*search_radius1;
2736     }
2737     //cout<<"lstneitri1.get_nb()= "<<lstneitri1.get_nb()<<endl;
2738     double pproj[3];
2739     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR inspi;
2740     int tri_found=0;
2741     int beshmar=0;
2742    
2743    
2744     for (MG_TRIANGLE* insphertri=lstneitri1.get_premier(inspi);insphertri!=NULL;insphertri=lstneitri1.get_suivant(inspi))
2745     {
2746     //while (tri_found<1 || beshmar<lstneitri.get_nb())
2747    
2748     beshmar++;
2749     MG_NOEUD* inspnd1=insphertri->get_noeud1();
2750     MG_NOEUD* inspnd2=insphertri->get_noeud2();
2751     MG_NOEUD* inspnd3=insphertri->get_noeud3();
2752     OT_VECTEUR_3D tvec1(inspnd1->get_coord(),inspnd2->get_coord());
2753     OT_VECTEUR_3D tvec2(inspnd1->get_coord(),inspnd3->get_coord());
2754     OT_VECTEUR_3D tnorm=(tvec1&tvec2); tnorm.norme();
2755     OT_VECTEUR_3D norm=normale;
2756    
2757     double parallel=norm*tnorm;
2758     //cout<<"parallel= "<<parallel<<endl;
2759     if (parallel>0.7 || parallel<-0.7)
2760     {
2761     //cout<<"itis"<<endl;
2762     OT_VECTEUR_3D vvec(inspnd1->get_coord(),p);
2763     double t= (tnorm*vvec)/parallel;
2764     t=-t;
2765     pproj[0]=p[0]+t*norm.get_x();
2766     pproj[1]=p[1]+t*norm.get_y();
2767     pproj[2]=p[2]+t*norm.get_z();
2768     //////////////////////////////////////////////////////////////
2769     //check if the projected p is inside the triangle !!!!!
2770     MG_MAILLAGE_OUTILS tribas;
2771     int tribasval=tribas.estdansletriangle(insphertri,pproj[0],pproj[1],pproj[2]);
2772     int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
2773     int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
2774     int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
2775     //printf("projection before is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
2776     if(intri==1)
2777     {
2778 sattarpa 699 //printf("projection is: %16.14lf %16.14lf %16.14lf \n",pproj[0],pproj[1],pproj[2]);
2779     double* proj=new double[3];
2780     proj[0]=pproj[0]; proj[1]=pproj[1]; proj[2]=pproj[2];
2781     lstsmplpoints_afterprojection.push_back(proj);
2782 sattarpa 695 tri_found++;
2783     //break;
2784     }
2785     }
2786    
2787     }
2788     }
2789 sattarpa 699 return lstsmplpoints_afterprojection;
2790     }
2791     void CRIAQOPERATORS::sp_project_onCAD_SCAN(char* magicfilenamecad,int nummaicad,char* samplepointscad,char* magicfilenamescn,int nummaiscn,char* samplepointsscn,char* outputspbcfilename)
2792     {
2793     std::vector<double*> sprojcad;
2794     sprojcad=sp_project_onCAD(magicfilenamecad,nummaicad,samplepointscad);
2795     std::vector<double*> sprojscn;
2796     sprojscn=sp_project_onSCAN(magicfilenamescn,nummaiscn,samplepointsscn);
2797    
2798    
2799     int sizesm;
2800     if(sprojcad.size()==sprojscn.size())
2801     sizesm=sprojcad.size();
2802     else
2803     cout<<"not sprojcad.size()==sprojscn.size() !!!!!!!!!!!"<<endl;
2804     cout<<"sprojcad.size()= "<<sprojcad.size()<<endl;
2805     cout<<"sprojscn.size()= "<<sprojscn.size()<<endl;
2806     FILE* insmp=fopen(outputspbcfilename,"wt");/*
2807     for(std::vector<double*>::iterator itsprojcad=sprojcad.begin();itsprojcad!=sprojcad.end();itsprojcad++)
2808     {
2809     double* xyz_cadproj=(*itsprojcad);
2810     cout<<"xyz_cadproj[0]= "<<xyz_cadproj[0]<<endl;
2811    
2812     }*/
2813     std::vector<double*>::iterator itsprojcad=sprojcad.begin();
2814     std::vector<double*>::iterator itsprojscn=sprojscn.begin();
2815    
2816     for(int iitt=0;iitt<sizesm;iitt++)
2817     {
2818     if(iitt>0)
2819     {
2820     itsprojcad++;
2821     itsprojscn++;
2822     }
2823     double* xyz_cadproj=(*itsprojcad);
2824     double* xyz_scnproj=(*itsprojscn);
2825     fprintf(insmp,"%le %le %le %le %le %le \n",xyz_cadproj[0],xyz_cadproj[1],xyz_cadproj[2],(xyz_scnproj[0]-xyz_cadproj[0]),(xyz_scnproj[1]-xyz_cadproj[1]),(xyz_scnproj[2]-xyz_cadproj[2]));
2826     }
2827     fclose(insmp);
2828    
2829    
2830 sattarpa 695 }