MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mailleur2d_mergemai.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// mailleur2d_mergemai.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "mailleur2d_mergemai.h"
23 #include "gestionversion.h"
24 #include "mg_gestionnaire.h"
25 #include "mg_maillage_outils.h"
26 #include <string.h>
27 #include "mg_geometrie.h"
28 #include <stdio.h>
29 #include "gestionversion.h"
30 #include "mailleur2d_ins_noeud.h"
31 #include "mg_gestionnaire.h"
32 #include "robustpredicates.hxx"
33 #include <math.h>
34 #include <map>
35 #include "mg_maillage_outils.h"
36 #include "mg_file.h"
37 #include "occ_import.h"
38 #include "fct_generateur_3d.h"
39 #include "mg_geometrie_outils.h"
40 #include "ot_mathematique.h"
42 #include "mg_sommet_noeud.h"
43 
44 MAILLEUR2D_MERGEMAI::MAILLEUR2D_MERGEMAI(char* cadfilenametmp,char* scanfilenametmp, char* mergefilenametmp,int cadmeshnotmp,int scnmeshnotmp)
45 :MAILLEUR(false),cadfilename(cadfilenametmp),scanfilename(scanfilenametmp),mergefilename(mergefilenametmp),cadmeshno(cadmeshnotmp),scnmeshno(scnmeshnotmp)//MAILLEUR(false): since it is a child of MAILLEUR
46 {
47 }
49 :MAILLEUR(mdd),cadfilename(mdd.cadfilename),scanfilename(mdd.scanfilename),mergefilename(mdd.mergefilename),cadmeshno(mdd.cadmeshno),scnmeshno(mdd.scnmeshno)
50 {
51 }
53 {
54 }
55 
57 {
58  affiche((char*) "merging started");
59  MG_FILE gestcad(cadfilename); //deformedcad_sansscannedpart.magic
60  MG_FILE gestscn(scanfilename); //3dsurfmesh_scanned.magic
62  MG_MAILLAGE* maicad;
63  MG_MAILLAGE* maiscn;
64  MG_MAILLAGE* maimrg=new MG_MAILLAGE(NULL);
66  if (cadmeshno==0) maicad=gestcad.get_mg_maillageid(cadmeshno); else maicad=gestcad.get_mg_maillageid(cadmeshno);//256171
67  if (scnmeshno==0) maiscn=gestscn.get_mg_maillageid(scnmeshno); else maiscn=gestscn.get_mg_maillageid(scnmeshno);//1669364
68 
69  LISTE_MG_NOEUD::iterator itnds;
70  LISTE_MG_SEGMENT::iterator itSeg;
71  LISTE_MG_TRIANGLE::iterator itTri;
72  //read scan and cad mesh
73  for(MG_NOEUD* cadnd=maicad->get_premier_noeud(itnds);cadnd!=NULL;cadnd=maicad->get_suivant_noeud(itnds))
74  {
75  double x=cadnd->get_x();
76  double y=cadnd->get_y();
77  double z=cadnd->get_z();
78  MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,cadnd->get_origine());
79  maimrg->ajouter_mg_noeud(newno);
80  cadnd->change_nouveau_numero(newno->get_id());
81  newno->change_nouveau_numero(1); //cadmesh nds in merge mesh has nouveau_numero=1
82  }
83  for (MG_SEGMENT * segment =maicad->get_premier_segment(itSeg); segment!=NULL; segment=maicad->get_suivant_segment(itSeg))
84  {
85  MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
86  MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
87  MG_NOEUD* no1=maimrg->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
88  MG_NOEUD* no2=maimrg->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
89  MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
91  }
92  for (MG_TRIANGLE * triangle =maicad->get_premier_triangle(itTri); triangle; triangle=maicad->get_suivant_triangle(itTri))
93  {
94  MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
95  MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
96  MG_NOEUD* no1=maimrg->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
97  MG_NOEUD* no2=maimrg->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
98  MG_NOEUD* no3=maimrg->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
99  maimrg->ajouter_mg_triangle(NULL,no1,no2,no3,triangle->get_origine());
100  }
101  for(MG_NOEUD* cadnd=maiscn->get_premier_noeud(itnds);cadnd!=NULL;cadnd=maiscn->get_suivant_noeud(itnds))
102  {
103  double x=cadnd->get_x();
104  double y=cadnd->get_y();
105  double z=cadnd->get_z();
106  MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,cadnd->get_origine());
107  maimrg->ajouter_mg_noeud(newno);
108  cadnd->change_nouveau_numero(newno->get_id());
109  newno->change_nouveau_numero(2); //scanmesh nds in merge mesh has nouveau_numero=2
110  }
111  for (MG_SEGMENT * segment =maiscn->get_premier_segment(itSeg); segment!=NULL; segment=maiscn->get_suivant_segment(itSeg))
112  {
113  MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
114  MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
115  MG_NOEUD* no1=maimrg->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
116  MG_NOEUD* no2=maimrg->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
117  MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
119  }
120  for (MG_TRIANGLE * triangle =maiscn->get_premier_triangle(itTri); triangle; triangle=maiscn->get_suivant_triangle(itTri))
121  {
122  MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
123  MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
124  MG_NOEUD* no1=maimrg->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
125  MG_NOEUD* no2=maimrg->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
126  MG_NOEUD* no3=maimrg->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
127  maimrg->ajouter_mg_triangle(NULL,no1,no2,no3,triangle->get_origine());
128  }
129 
131  TPL_MAP_ENTITE<MG_SEGMENT*> lst_sgcad;
132  TPL_MAP_ENTITE<MG_NOEUD*> lst_ndcad;
133  for (MG_SEGMENT * segment =maimrg->get_premier_segment(itSeg); segment!=NULL; segment=maimrg->get_suivant_segment(itSeg))
134  {
135  if(segment->get_noeud1()->get_nouveau_numero()==1 && segment->get_noeud2()->get_nouveau_numero()==1)
136  {
137  lst_ndcad.ajouter(segment->get_noeud1());
138  lst_ndcad.ajouter(segment->get_noeud2());
139  lst_sgcad.ajouter(segment);
140  }
141  }
143 
144  //find the boundary elements
145  TPL_MAP_ENTITE<MG_SEGMENT*> edgsegcad;
146  TPL_MAP_ENTITE<MG_NOEUD*> edgndcad;
147  TPL_MAP_ENTITE<MG_SEGMENT*> edgsegscn;
148  TPL_MAP_ENTITE<MG_NOEUD*> edgndscn;
149  TPL_MAP_ENTITE<MG_SEGMENT*> bndryseglstcad;
150  TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstcad;
151  TPL_MAP_ENTITE<MG_SEGMENT*> bndryseglstscan;
152  TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstscan;
153  for(MG_SEGMENT* segmnt=maimrg->get_premier_segment(itSeg);segmnt!=NULL;segmnt=maimrg->get_suivant_segment(itSeg))
154  {
155  if(segmnt->get_lien_triangle()->get_nb()==1)
156  {
157  if(segmnt->get_noeud1()->get_nouveau_numero()==1 && segmnt->get_noeud2()->get_nouveau_numero()==1)
158  {
159  segmnt->get_noeud1()->change_nouveau_numero(3);
160  segmnt->get_noeud2()->change_nouveau_numero(3);
161  bndryseglstcad.ajouter(segmnt);
162  edgsegcad.ajouter(segmnt);
163  bndryndlstcad.ajouter(segmnt->get_noeud1());
164  bndryndlstcad.ajouter(segmnt->get_noeud2());
165  edgndcad.ajouter(segmnt->get_noeud1());
166  edgndcad.ajouter(segmnt->get_noeud2());
167  }
168  if(segmnt->get_noeud1()->get_nouveau_numero()==2 && segmnt->get_noeud2()->get_nouveau_numero()==2)
169  {
170  segmnt->get_noeud1()->change_nouveau_numero(4);
171  segmnt->get_noeud2()->change_nouveau_numero(4);
172  bndryseglstscan.ajouter(segmnt);
173  edgsegscn.ajouter(segmnt);
174  bndryndlstscan.ajouter(segmnt->get_noeud1());
175  bndryndlstscan.ajouter(segmnt->get_noeud2());
176  edgndscn.ajouter(segmnt->get_noeud1());
177  edgndscn.ajouter(segmnt->get_noeud2());
178  }
179  }
180 
181  }
182 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
184 LISTE_MG_NOEUD::iterator it;
185 for (MG_NOEUD* no=maimrg->get_premier_noeud(it);no!=NULL;no=maimrg->get_suivant_noeud(it))
186  {
187  if (no->get_x()<xmin) xmin=no->get_x();
188  if (no->get_y()<ymin) ymin=no->get_y();
189  if (no->get_z()<zmin) zmin=no->get_z();
190  if (no->get_x()>xmax) xmax=no->get_x();
191  if (no->get_y()>ymax) ymax=no->get_y();
192  if (no->get_z()>zmax) zmax=no->get_z();
193  lstnoeud.ajouter(no);
194  }
195  OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
196  OT_VECTEUR_3D vec(vecmmax,vecmin);
197  double search_radius=0.001*(vec.get_longueur());
198  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);
199  double length=sqrt(lengthvec*lengthvec); double bxr=2.1;
200  xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
201  xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
202 
204 octreends.initialiser(&bndryndlstcad,1,xmin,ymin,zmin,xmax,ymax,zmax);
206 for(MG_NOEUD* no1=bndryndlstcad.get_premier(itbndryndlstcad);no1!=NULL;no1=bndryndlstcad.get_suivant(itbndryndlstcad))
207  octreends.inserer(no1);
208 
210 LISTE_MG_SEGMENT::iterator itseg;
211 octreesegs.initialiser(&lst_ndcad,1,xmin,ymin,zmin,xmax,ymax,zmax);
213 for(MG_SEGMENT* seg=lst_sgcad.get_premier(itbndryseglstcad);seg!=NULL;seg=lst_sgcad.get_suivant(itbndryseglstcad))
214  octreesegs.inserer(seg);
215 
219 
220 for(MG_SEGMENT* seg=maimrg->get_premier_segment(itseg);seg!=NULL;seg=maimrg->get_suivant_segment(itseg))
221 {
222  //if(seg->get_lien_triangle()->get_nb()<1 || seg->get_lien_triangle()->get_nb()>2)
223  //cout<<"seg->get_lien_triangle()->get_nb()= "<<seg->get_lien_triangle()->get_nb()<<endl;
224 }
225 
226 double proximity_coof=20.1*search_radius; //can be based on the size of scan mesh
227 int beshmar1=0;
229 for(MG_NOEUD* nd=bndryndlstscan.get_premier(itmpnd);nd!=NULL;nd=bndryndlstscan.get_suivant(itmpnd))
230 {
231  beshmar1++;
232  //cout<<" beshmar1= "<<beshmar1<<endl;
233  //cout<<"bndryndlstscan.get_nb()= "<<bndryndlstscan.get_nb()<<endl;
235 }
236 
237 TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstscan_afterprox;
238 for(MG_NOEUD* nd=bndryndlstscan.get_premier(itmpnd);nd!=NULL;nd=bndryndlstscan.get_suivant(itmpnd))
239 {
240  int should_remove=0;
241  TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itremovescnbndnd;
242  for(MG_NOEUD* ndbnd=removescnbndnd.get_premier(itremovescnbndnd);ndbnd!=NULL;ndbnd=removescnbndnd.get_suivant(itremovescnbndnd))
243  {
244  if(ndbnd==nd)
245  should_remove++;
246  }
247  if(should_remove==0)
248  bndryndlstscan_afterprox.ajouter(nd);
249 }
250 int testbeshmr=0;
252 for(MG_NOEUD* bndscnd=bndryndlstscan_afterprox.get_premier(itmpnd);bndscnd!=NULL;bndscnd=bndryndlstscan_afterprox.get_suivant(itmpnd))
253 {
254  testbeshmr++;
255  //cout<<"testbeshmr= "<<testbeshmr<<endl;
256  //if (testbeshmr<5)
258 }
259  TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstscan_afterproxseg;
260 for(MG_NOEUD* nd=bndryndlstscan_afterprox.get_premier(itmpnd);nd!=NULL;nd=bndryndlstscan_afterprox.get_suivant(itmpnd))
261 {
262  int should_remove=0;
263  TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itremovescnbndnd;
264  for(MG_NOEUD* ndbnd=removescnbndnd_prxseg.get_premier(itremovescnbndnd);ndbnd!=NULL;ndbnd=removescnbndnd_prxseg.get_suivant(itremovescnbndnd))
265  {
266  if(ndbnd==nd)
267  should_remove++;
268  }
269  if(should_remove==0)
270  bndryndlstscan_afterproxseg.ajouter(nd);
271 }
273 }
274 
275 void MAILLEUR2D_MERGEMAI::proxndmerg(MG_MAILLAGE* maimrg, double search_radius,MG_NOEUD* nd,TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> &octreends,double proximity_coof,
277 {
279 int lstndneinb=lstndnei.get_nb();
280 double search_radius1=search_radius;
281 
282 {
283  octreends.rechercher(nd->get_x(),nd->get_y(),nd->get_z(),search_radius1,lstndnei);
284  lstndneinb=lstndnei.get_nb();
285  //if(lstndneinb<1)
286  //maimrg->supprimer_mg_triangleid(nd->get_lien_triangle()->get(0)->get_id());
287 
288  if(lstndneinb>0)
289  {
290  //cout<<"lstndnei.get_nb() before:= "<<lstndnei.get_nb()<<endl;
292  for(MG_NOEUD* ndclosecad=lstndnei.get_premier(itmpnd1);ndclosecad!=NULL;ndclosecad=lstndnei.get_suivant(itmpnd1))
293  {
294  double dist=sqrt(pow(ndclosecad->get_x()-nd->get_x(),2)+pow(ndclosecad->get_y()-nd->get_y(),2)+pow(ndclosecad->get_z()-nd->get_z(),2));
295  //cout<<" distdist= "<<dist<<endl;
296  if(ndclosecad->get_nouveau_numero()!=3)
297  lstndnei.supprimer(ndclosecad);
298  }
299  lstndneinb=lstndnei.get_nb();
300  }
301 
302  search_radius1=search_radius1+0.1*search_radius;
303 }
304 
305 std::multimap<double,MG_NOEUD*,std::less<double> > closends;
306 if(lstndnei.get_nb()>0)
307 {
309 for(MG_NOEUD* ndclosecad=lstndnei.get_premier(itmpnd2);ndclosecad!=NULL;ndclosecad=lstndnei.get_suivant(itmpnd2))
310 {
311  if(ndclosecad->get_nouveau_numero()==3)
312  {
313  double dist=sqrt(pow(ndclosecad->get_x()-nd->get_x(),2)+pow(ndclosecad->get_y()-nd->get_y(),2)+pow(ndclosecad->get_z()-nd->get_z(),2));
314  closends.insert(std::pair<double,MG_NOEUD*> (dist,ndclosecad));
315  }
316 }
317 
319 for(std::multimap<double,MG_NOEUD*,std::less<double> >::iterator itclosends=closends.begin();itclosends!=closends.end();itclosends++)
320 {
321  double distancenew=(*itclosends).first;
322  //cout<<"distancenew= "<<distancenew<<endl;
323  if(distancenew<proximity_coof)
324  proxnds.ajouter((*itclosends).second);
325 }
326 /*
327 LISTE_MG_SEGMENT::iterator itseg1;
328 for(MG_SEGMENT* seg=maimrg->get_premier_segment(itseg1);seg!=NULL;seg=maimrg->get_suivant_segment(itseg1))
329 {
330  if(seg->get_lien_triangle()->get_nb()<1 || seg->get_lien_triangle()->get_nb()>2)
331  cout<<"seg->get_lien_triangle()->get_nb()11111111111111= "<<seg->get_lien_triangle()->get_nb()<<endl;
332 }
333 */
335  for(MG_NOEUD* ndprx=proxnds.get_premier(itmpnd3);ndprx!=NULL;ndprx=proxnds.get_suivant(itmpnd3))
336 {
337  // cout<<"ndprx->get_lien_triangle()->get_nb()= "<<ndprx->get_lien_triangle()->get_nb()<<endl;
338 
339  //TPL_MAP_ENTITE<MG_SEGMENT*> lstseg_conestprox;
340  std::map<MG_SEGMENT*,MG_TRIANGLE*> lstseg_conestprox;
341  TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri_conestprox;
342  TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri_added;
343  for(int nbsg=0;nbsg<ndprx->get_lien_triangle()->get_nb();nbsg++)
344  {
345  int countr_ndsg1=0;
346  int countr_ndsg2=0;
347  int countr_ndsg3=0;
348  MG_TRIANGLE* tripr=ndprx->get_lien_triangle()->get(nbsg);
349  lsttri_conestprox.ajouter(tripr);
351  if(tripr->get_segment1()->get_noeud1()!=ndprx && tripr->get_segment1()->get_noeud2()!=ndprx)
352  {
353  /*for(MG_NOEUD* ndprx1=proxnds.get_premier(itmpnd4);ndprx1!=NULL;ndprx1=proxnds.get_suivant(itmpnd4))
354  {
355  if(tripr->get_segment1()->get_noeud1()==ndprx1 || tripr->get_segment1()->get_noeud2()==ndprx1)
356  countr_ndsg1++;
357  }
358  if(countr_ndsg1==0)*/
359  lstseg_conestprox.insert(std::pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment1()),tripr));
360  //lstseg_conestprox.ajouter(tripr->get_segment1());
361  }
362 
363  if(tripr->get_segment2()->get_noeud1()!=ndprx && tripr->get_segment2()->get_noeud2()!=ndprx)
364  {
365  /*for(MG_NOEUD* ndprx1=proxnds.get_premier(itmpnd4);ndprx1!=NULL;ndprx1=proxnds.get_suivant(itmpnd4))
366  {
367  if(tripr->get_segment2()->get_noeud1()==ndprx1 || tripr->get_segment2()->get_noeud2()==ndprx1)
368  countr_ndsg2++;
369  }
370  if(countr_ndsg2==0)*/
371  lstseg_conestprox.insert(std::pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment2()),tripr));
372  //lstseg_conestprox.ajouter(tripr->get_segment2());
373  }
374 
375  if(tripr->get_segment3()->get_noeud1()!=ndprx && tripr->get_segment3()->get_noeud2()!=ndprx)
376  {
377  /*for(MG_NOEUD* ndprx1=proxnds.get_premier(itmpnd4);ndprx1!=NULL;ndprx1=proxnds.get_suivant(itmpnd4))
378  {
379  if(tripr->get_segment3()->get_noeud1()==ndprx1 || tripr->get_segment3()->get_noeud2()==ndprx1)
380  countr_ndsg3++;
381  }
382  if(countr_ndsg3==0)*/
383  lstseg_conestprox.insert(std::pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment3()),tripr));
384  //lstseg_conestprox.ajouter(tripr->get_segment3());
385  }
386 
387  }
388 
390 for(std::map<MG_SEGMENT*,MG_TRIANGLE*>::iterator itlstseg_conestprox=lstseg_conestprox.begin();itlstseg_conestprox!=lstseg_conestprox.end();itlstseg_conestprox++)
391 {
392  MG_SEGMENT* segconctprx=(*itlstseg_conestprox).first;
393  //cout<<"segconctprx->get_lien_triangle()->get_nb()= "<<segconctprx->get_lien_triangle()->get_nb()<<endl;
394  //cout<<"segconctprx->get_noeud1()->get_nouveau_numero()= "<<segconctprx->get_noeud1()->get_nouveau_numero()<<endl;
395  //cout<<"segconctprx->get_noeud2()->get_nouveau_numero()= "<<segconctprx->get_noeud2()->get_nouveau_numero()<<endl;
396  //if(segconctprx->get_lien_triangle()->get_nb()!=0)
397  {
398  //MG_TRIANGLE* trioppose=segconctprx->get_lien_triangle()->get(0);
399  MG_TRIANGLE* trioppose=(*itlstseg_conestprox).second;
400  int triorintation=0;
401  if(segconctprx->get_noeud1()==trioppose->get_noeud1() && segconctprx->get_noeud2()==trioppose->get_noeud2())
402  triorintation++;
403  if(segconctprx->get_noeud1()==trioppose->get_noeud2() && segconctprx->get_noeud2()==trioppose->get_noeud3())
404  triorintation++;
405  if(segconctprx->get_noeud1()==trioppose->get_noeud3() && segconctprx->get_noeud2()==trioppose->get_noeud1())
406  triorintation++;
407 
408  if(triorintation==0)
409  {
410  MG_TRIANGLE* triad=maimrg->ajouter_mg_triangle(NULL,segconctprx->get_noeud2(),segconctprx->get_noeud1(),nd,MAGIC::ORIGINE::IMPOSE);
411  nd->change_nouveau_numero(3);
412  segadded.ajouter(triad->get_segment1());
413  segadded.ajouter(triad->get_segment2());
414  segadded.ajouter(triad->get_segment3());
415 }
416 
417  else if(triorintation>0)
418  {
419  MG_TRIANGLE* triad= maimrg->ajouter_mg_triangle(NULL,segconctprx->get_noeud1(),segconctprx->get_noeud2(),nd,MAGIC::ORIGINE::IMPOSE);
420  nd->change_nouveau_numero(3);
421  segadded.ajouter(triad->get_segment1());
422  segadded.ajouter(triad->get_segment2());
423  segadded.ajouter(triad->get_segment3());
424  }
425  }
426 }
428 octreends.supprimer(ndprx);
429 
431 for(MG_SEGMENT* segaded=segadded.get_premier(itsegadded);segaded!=NULL;segaded=segadded.get_suivant(itsegadded))
432  octreesegs.inserer(segaded);
433 
434 
436 for(MG_TRIANGLE* tridelet=lsttri_conestprox.get_premier(itmptri);tridelet!=NULL;tridelet=lsttri_conestprox.get_suivant(itmptri))
437 {
438  octreesegs.supprimer(tridelet->get_segment1());
439  octreesegs.supprimer(tridelet->get_segment2());
440  octreesegs.supprimer(tridelet->get_segment3());
441  maimrg->supprimer_mg_triangleid(tridelet->get_id());
442 }
443 
444 
445 
446 
447 }
448 }
449 }
450 
451 void MAILLEUR2D_MERGEMAI::proxsegmrg(MG_MAILLAGE* maimrg, double search_radius,MG_NOEUD* bndscnd,TPL_OCTREE<MG_SEGMENT*,MG_NOEUD*> &octreesegs,TPL_MAP_ENTITE<MG_NOEUD*> &removescnbndnd_prxseg)
452 {
453  //cout<<"the second part started"<<endl;
455  TPL_LISTE_ENTITE<MG_SEGMENT*> lstasupprimer;
456  int lstneisgnb=lstneisg.get_nb();
457  double search_radius1=search_radius;
458  //while(lstneisgnb==0)
459  {
460  octreesegs.rechercher(bndscnd->get_x(),bndscnd->get_y(),bndscnd->get_z(),search_radius1,lstneisg);
461  lstneisgnb=lstneisg.get_nb();
462  search_radius1=search_radius1+0.1*search_radius;
463  if(lstneisgnb>0)
464  {
465  //cout<<" lstneisgnb = "<<lstneisgnb<<endl;
467  for(MG_SEGMENT* clsgcad=lstneisg.get_premier(itmpsg1);clsgcad!=NULL;clsgcad=lstneisg.get_suivant(itmpsg1))
468  {
469  if(clsgcad->get_noeud1()->get_nouveau_numero()!=3 && clsgcad->get_noeud2()->get_nouveau_numero()!=3)
470  lstasupprimer.ajouter(clsgcad);
471 
472  OT_VECTEUR_3D vec1(clsgcad->get_noeud1()->get_coord(),bndscnd->get_coord());
473  OT_VECTEUR_3D vec2(clsgcad->get_noeud1()->get_coord(),clsgcad->get_noeud2()->get_coord());
474  double val1=vec1*vec2;
475  double val2=vec2*vec2;
476 
477  if(val1<0 || val1>val2)
478  {
479  //cout<<" vec1*vec2= "<<val1<<" vec1*vec1= "<<val2<<endl;
480  //cout<<" vec1= "<<vec1.get_longueur()<<" vec1= "<<vec2.get_longueur()<<endl;
481  lstasupprimer.ajouter(clsgcad);
482  }
483  else
484  {
485  //cout<<" yeki moondehhhh"<<endl;
486  //cout<<"?????? vec1*vec2= "<<val1<<" vec1*vec1= "<<val2<<endl;
487  //cout<<"?????? vec1= "<<vec1.get_longueur()<<" vec1= "<<vec2.get_longueur()<<endl;
488  }
489 
490  //cout<<"clsgcad->get_lien_triangle()->get_nb()="<<clsgcad->get_lien_triangle()->get_nb()<<endl;
491  //if(clsgcad->get_lien_triangle()->get_nb()>1)
492  // lstneisg.supprimer(clsgcad);
493  }
494  }
495  }
496  for (int i=0;i<lstasupprimer.get_nb();i++)
497  {
498  MG_SEGMENT* seg=lstasupprimer.get(i);
499  lstneisg.supprimer(seg);
500  }
501  //if(lstneisg.get_nb()==0)
502  //cout<<" lstneisg.get_nb()==0 lstneisg.get_nb()==0 lstneisg.get_nb()==0"<<endl;
503  if(lstneisg.get_nb()>0)
504  {
505  std::multimap<double,MG_SEGMENT*,std::less<double> > closesegscad;
507  for(MG_SEGMENT* clsgcad=lstneisg.get_premier(itmpsg2);clsgcad!=NULL;clsgcad=lstneisg.get_suivant(itmpsg2))
508  {
509  if(clsgcad->get_noeud1()->get_nouveau_numero()!=2 || clsgcad->get_noeud2()->get_nouveau_numero()!=2)
510  {
511  //the distance between a point and a segment is not accurate in 3D
512  /*
513  double distns1=sqrt(pow(clsgcad->get_noeud1()->get_x()-bndscnd->get_x(),2)+pow(clsgcad->get_noeud1()->get_y()-bndscnd->get_y(),2)+pow(clsgcad->get_noeud1()->get_z()-bndscnd->get_z(),2));
514  double distns2=sqrt(pow(clsgcad->get_noeud2()->get_x()-bndscnd->get_x(),2)+pow(clsgcad->get_noeud2()->get_y()-bndscnd->get_y(),2)+pow(clsgcad->get_noeud2()->get_z()-bndscnd->get_z(),2));
515  double distns=(distns1+distns2)/2.;
516  */
517  OT_VECTEUR_3D vec1(clsgcad->get_noeud1()->get_coord(),bndscnd->get_coord());
518  OT_VECTEUR_3D vec2(clsgcad->get_noeud1()->get_coord(),clsgcad->get_noeud2()->get_coord());
519  double val1=vec1*vec2;
520  double val2=vec2*vec2;
521  OT_VECTEUR_3D vec3=(val1/(vec1.get_longueur()*vec1.get_longueur()))*vec1;
522  OT_VECTEUR_3D vec4=vec3-vec2;
523  double distns=vec4.get_longueur();
524  closesegscad.insert(std::pair<double,MG_SEGMENT*>(distns,clsgcad));
525  }
526  }
527  //for(multimap<double,MG_SEGMENT*,std::less<double> >::iterator itclosgs=closesegscad.begin();itclosgs!=closesegscad.end();itclosgs++)
528  std::multimap<double,MG_SEGMENT*,std::less<double> >::iterator itclosgs=closesegscad.begin();
529  {
530  MG_SEGMENT* cadsegprx=(*itclosgs).second;
531  MG_TRIANGLE* tricont=cadsegprx->get_lien_triangle()->get(0);
532  TPL_MAP_ENTITE<MG_SEGMENT*> tricontsgs;
533  if(tricont->get_segment1()!=cadsegprx)
534  tricontsgs.ajouter(tricont->get_segment1());
535  if(tricont->get_segment2()!=cadsegprx)
536  tricontsgs.ajouter(tricont->get_segment2());
537  if(tricont->get_segment3()!=cadsegprx)
538  tricontsgs.ajouter(tricont->get_segment3());
541  for(MG_SEGMENT* seg=tricontsgs.get_premier(ittricontsgs);seg!=NULL;seg=tricontsgs.get_suivant(ittricontsgs))
542  {
543  int newtriorient=0;
544  if(seg->get_noeud1()==tricont->get_noeud1() && seg->get_noeud2()==tricont->get_noeud2())
545  newtriorient++;
546  if(seg->get_noeud1()==tricont->get_noeud2() && seg->get_noeud2()==tricont->get_noeud3())
547  newtriorient++;
548  if(seg->get_noeud1()==tricont->get_noeud3() && seg->get_noeud2()==tricont->get_noeud1())
549  newtriorient++;
550  if(newtriorient==0)
551  {
552  MG_TRIANGLE* triad= maimrg->ajouter_mg_triangle(NULL,seg->get_noeud2(),seg->get_noeud1(),bndscnd,MAGIC::ORIGINE::IMPOSE);
554  segadded.ajouter(triad->get_segment1());
555  segadded.ajouter(triad->get_segment2());
556  segadded.ajouter(triad->get_segment3());
557  }
558  else if(newtriorient>0)
559  {
560  MG_TRIANGLE* triad=maimrg->ajouter_mg_triangle(NULL,seg->get_noeud1(),seg->get_noeud2(),bndscnd,MAGIC::ORIGINE::IMPOSE);
562  segadded.ajouter(triad->get_segment1());
563  segadded.ajouter(triad->get_segment2());
564  segadded.ajouter(triad->get_segment3());
565  }
566  }
568 for(MG_SEGMENT* segaded=segadded.get_premier(itsegadded);segaded!=NULL;segaded=segadded.get_suivant(itsegadded))
569  octreesegs.inserer(segaded);
570 
571  octreesegs.supprimer(tricont->get_segment1());
572  octreesegs.supprimer(tricont->get_segment2());
573  octreesegs.supprimer(tricont->get_segment3());
575  }
577  }
578 
579 }
TPL_MAP_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_map_entite.h:69
MG_GESTIONNAIRE::enregistrer
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
Definition: mg_gestionnaire.cpp:1070
fct_generateur_3d.h
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
MG_TRIANGLE::get_segment1
virtual MG_SEGMENT * get_segment1(void)
Definition: mg_triangle.cpp:142
MG_SEGMENT
Definition: mg_segment.h:38
mg_geometrie.h
MG_MAILLAGE::get_premier_noeud
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:548
gestionversion.h
MG_MAILLAGE::ajouter_mg_segment
MG_SEGMENT * ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0, unsigned long num=0)
Definition: mg_maillage.cpp:565
TPL_MAP_ENTITE< MG_SEGMENT * >
MAILLEUR2D_MERGEMAI::search_radius
double search_radius
Definition: mailleur2d_mergemai.h:51
mg_gestionnaire.h
robustpredicates.hxx
MG_SEGMENT::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MG_TRIANGLE::get_segment2
virtual MG_SEGMENT * get_segment2(void)
Definition: mg_triangle.cpp:147
mg_file.h
TPL_OCTREE::supprimer
virtual void supprimer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:918
mailleur2d_ins_noeud.h
MAGIC_AFFICHE::affiche
virtual void affiche(char *mess)
Definition: magic_affiche.cpp:43
MAILLEUR2D_MERGEMAI::mergegest
MG_GESTIONNAIRE * mergegest
Definition: mailleur2d_mergemai.h:55
MG_TRIANGLE
Definition: mg_triangle.h:38
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
MG_TRIANGLE::get_segment3
virtual MG_SEGMENT * get_segment3(void)
Definition: mg_triangle.cpp:152
MG_MAILLAGE::get_premier_segment
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
Definition: mg_maillage.cpp:630
occ_import.h
MAILLEUR2D_MERGEMAI::mergmsh
virtual void mergmsh(void)
Definition: mailleur2d_mergemai.cpp:56
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
TPL_OCTREE::inserer
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:897
MG_GESTIONNAIRE::ajouter_mg_maillage
int ajouter_mg_maillage(MG_MAILLAGE *mgmai)
Definition: mg_gestionnaire.cpp:521
mg_maillage_outils.h
mailleur2d_optimisation.h
MG_MAILLAGE::get_premier_triangle
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:912
MAILLEUR2D_MERGEMAI::proxndmerg
virtual void proxndmerg(MG_MAILLAGE *maimrg, double search_radius, MG_NOEUD *nd, TPL_OCTREE< MG_NOEUD *, MG_NOEUD * > &octreends, double proximity_coof, TPL_MAP_ENTITE< MG_NOEUD * > &removescnbndnd, TPL_OCTREE< MG_SEGMENT *, MG_NOEUD * > &octreesegs)
Definition: mailleur2d_mergemai.cpp:275
MAILLEUR2D_MERGEMAI::bndscnd
MG_NOEUD * bndscnd
Definition: mailleur2d_mergemai.h:65
MG_MAILLAGE::ajouter_mg_triangle
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
Definition: mg_maillage.cpp:731
MG_SEGMENT::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_segment.cpp:243
MG_SEGMENT::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_segment.cpp:108
MG_MAILLAGE::supprimer_mg_triangleid
int supprimer_mg_triangleid(unsigned long num)
Definition: mg_maillage.cpp:820
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
MG_NOEUD
Definition: mg_noeud.h:41
MAGIC::ORIGINE::IMPOSE
@ IMPOSE
Definition: mg_definition.h:79
MG_MAILLAGE::get_suivant_segment
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
Definition: mg_maillage.cpp:638
TPL_OCTREE::rechercher
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:606
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
MAILLEUR2D_MERGEMAI::gestcad
MG_GESTIONNAIRE * gestcad
Definition: mailleur2d_mergemai.h:53
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
mailleur2d_mergemai.h
MAILLEUR2D_MERGEMAI::~MAILLEUR2D_MERGEMAI
~MAILLEUR2D_MERGEMAI()
Definition: mailleur2d_mergemai.cpp:52
MG_ELEMENT_MAILLAGE::change_nouveau_numero
virtual void change_nouveau_numero(int num)
Definition: mg_element_maillage.cpp:76
mg_sommet_noeud.h
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
MAILLEUR2D_MERGEMAI::scanfilename
char * scanfilename
Definition: mailleur2d_mergemai.h:57
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
MG_FILE
Definition: mg_file.h:31
MAILLEUR2D_MERGEMAI::removescnbndnd
TPL_MAP_ENTITE< MG_NOEUD * > removescnbndnd
Definition: mailleur2d_mergemai.h:61
MAILLEUR2D_MERGEMAI::scnmeshno
int scnmeshno
Definition: mailleur2d_mergemai.h:67
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
MAILLEUR2D_MERGEMAI::MAILLEUR2D_MERGEMAI
MAILLEUR2D_MERGEMAI(char *cadfilename, char *scanfilename, char *mergefilename, int cadmeshno, int scnmeshno)
Definition: mailleur2d_mergemai.cpp:44
MG_MAILLAGE::get_mg_noeudid
MG_NOEUD * get_mg_noeudid(unsigned long num)
Definition: mg_maillage.cpp:451
MG_NOEUD::get_x
virtual double get_x(void)
Definition: mg_noeud.cpp:77
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
MAILLEUR2D_MERGEMAI::proxsegmrg
virtual void proxsegmrg(MG_MAILLAGE *maimrg, double search_radius, MG_NOEUD *bndscnd, TPL_OCTREE< MG_SEGMENT *, MG_NOEUD * > &octreesegs, TPL_MAP_ENTITE< MG_NOEUD * > &removescnbndnd_prxseg)
Definition: mailleur2d_mergemai.cpp:451
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_GESTIONNAIRE::get_mg_maillageid
MG_MAILLAGE * get_mg_maillageid(unsigned long num)
Definition: mg_gestionnaire.cpp:538
MAILLEUR2D_MERGEMAI::cadfilename
char * cadfilename
Definition: mailleur2d_mergemai.h:56
MAILLEUR2D_MERGEMAI::mergefilename
char * mergefilename
Definition: mailleur2d_mergemai.h:58
MAILLEUR2D_MERGEMAI::proximity_coof
double proximity_coof
Definition: mailleur2d_mergemai.h:52
mg_geometrie_outils.h
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
MAILLEUR
Definition: mailleur.h:33
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MG_MAILLAGE::get_suivant_triangle
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:920
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
MG_MAILLAGE
Definition: mg_maillage.h:62
TPL_LISTE_ENTITE< MG_SEGMENT * >
MG_FACE
Definition: mg_face.h:34
MG_ELEMENT_MAILLAGE::get_origine
virtual int get_origine(void)
Definition: mg_element_maillage.cpp:91
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
MAILLEUR2D_MERGEMAI::maimrg
MG_MAILLAGE * maimrg
Definition: mailleur2d_mergemai.h:63
MAILLEUR2D_MERGEMAI::octreesegs
TPL_OCTREE< MG_SEGMENT *, MG_NOEUD * > octreesegs
Definition: mailleur2d_mergemai.h:60
TPL_OCTREE::initialiser
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: tpl_octree.h:366
MAILLEUR2D_MERGEMAI::removescnbndnd_prxseg
TPL_MAP_ENTITE< MG_NOEUD * > removescnbndnd_prxseg
Definition: mailleur2d_mergemai.h:62
TPL_OCTREE< MG_NOEUD *, MG_NOEUD * >
MG_MAILLAGE::get_suivant_noeud
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:556
MAILLEUR2D_MERGEMAI
Definition: mailleur2d_mergemai.h:36
MAILLEUR2D_MERGEMAI::cadmeshno
int cadmeshno
Definition: mailleur2d_mergemai.h:66
MAILLEUR2D_MERGEMAI::octreends
TPL_OCTREE< MG_NOEUD *, MG_NOEUD * > octreends
Definition: mailleur2d_mergemai.h:59
MG_NOEUD::get_y
virtual double get_y(void)
Definition: mg_noeud.cpp:82
MG_MAILLAGE::ajouter_mg_noeud
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
Definition: mg_maillage.cpp:421