MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
stl_import.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 //####// stl_import.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 
26 
27 #pragma hdrstop
28 
29 #include "stl_import.h"
30 
31 
32 #pragma package(smart_init)
33 
34 #include <stdio.h>
35 #include <math.h>
36 #include "mg_gestionnaire.h"
37 #include "tpl_grille.h"
38 #include "ot_mathematique.h"
39 #include <map>
40 
41 
43 {
44 }
45 
47 {
48 }
49 
50 
51 
53 {
54 public:
55  NOEUDCLASSE(double xx,double yy,double zz):x(xx),y(yy),z(zz) {};
56  NOEUDCLASSE(NOEUDCLASSE &mdd):x(mdd.x),y(mdd.y),z(mdd.z) {};
57  NOEUDCLASSE(const NOEUDCLASSE &mdd):x(mdd.x),y(mdd.y),z(mdd.z) {};
59 
60  bool operator<(const NOEUDCLASSE mdd) const
61  {
62  if (x<mdd.x) return true;
63  else if ((x==mdd.x) && (y<mdd.y)) return true;
64  else if ((x==mdd.x) && (y==mdd.y) && (z<mdd.z)) return true;
65  return false;
66 
67  }
68 float x;
69 float y;
70 float z;
71 
72 };
73 
74 
75 int STL_IMPORT::importer(class MG_GESTIONNAIRE& gest,char *path)
76 {
77  FILE* in=fopen(path,"rt");
78  if (in==NULL) return 0;
79 
80 
81  MG_GESTIONNAIRE gesttmp;
82  MG_MAILLAGE* mai=new MG_MAILLAGE(NULL);
83  gesttmp.ajouter_mg_maillage(mai);
84  char mess[500];
85  char *res=fgets(mess,500,in);
86  if (feof(in)) return 1;
87  res=fgets(mess,500,in);
88  if (feof(in)) return 1;
89  res=fgets(mess,500,in);
90  if (feof(in)) return 1;
91 
92  while (!feof(in))
93  {
94  double x,y,z;
95  char nom[20];
96  char *res=fgets(mess,500,in);
97  sscanf(mess,"%s %lf %lf %lf",nom,&x,&y,&z);
98  if (feof(in)) return 1;
100  noeud1->change_nouveau_numero(-1);
101  res=fgets(mess,500,in);
102  sscanf(mess,"%s %lf %lf %lf",nom,&x,&y,&z);
103  if (feof(in)) return 1;
104  res=fgets(mess,500,in);
106  noeud2->change_nouveau_numero(-1);
107  sscanf(mess,"%s %lf %lf %lf",nom,&x,&y,&z);
108  if (feof(in)) return 1;
110  noeud3->change_nouveau_numero(-1);
111  mai->ajouter_mg_triangle(NULL,noeud1,noeud2,noeud3,MAGIC::ORIGINE::TRIANGULATION);
112  res=fgets(mess,500,in);
113  if (feof(in)) break;
114  res=fgets(mess,500,in);
115  if (feof(in)) break;
116  res=fgets(mess,500,in);
117  if (feof(in)) break;
118  res=fgets(mess,500,in);
119  if (feof(in)) break;
120  }
121  fclose(in);
122  std::map<NOEUDCLASSE,MG_NOEUD* > listenoeudunique;
123  LISTE_MG_NOEUD::iterator it;
124  int i=0;
125  std::vector<MG_NOEUD*> lst_noeud;
126  for (MG_NOEUD* noeud=mai->get_premier_noeud(it);noeud!=NULL;noeud=mai->get_suivant_noeud(it))
127  {
128  lst_noeud.insert(lst_noeud.end(),noeud);
129  noeud->change_nouveau_numero(i);
130  NOEUDCLASSE nclasse(noeud->get_x(),noeud->get_y(),noeud->get_z());
131  std::pair<NOEUDCLASSE,MG_NOEUD*> pairtmp(nclasse,noeud);
132  std::pair<std::map<NOEUDCLASSE,MG_NOEUD*>::iterator,bool> tmp=listenoeudunique.insert(pairtmp);
133  if (!tmp.second)
134  {
135  lst_noeud[noeud->get_nouveau_numero()]=tmp.first->second;
136  }
137  else
138  {
139  /*std::map<NOEUDCLASSE,MG_NOEUD*>::iterator itmap;
140  for (itmap=listenoeudunique.begin();itmap!=listenoeudunique.end();itmap++)
141  std::cout << itmap->first.x << " " << itmap->first.y << " " << itmap->first.z << " " << std::endl;
142  std::cout << std::endl;*/
143 
144  }
145  i++;
146  }
147 
148 
149  /*std::map<NOEUDCLASSE,MG_NOEUD*>::iterator itmap;
150  for (itmap=listenoeudunique.begin();itmap!=listenoeudunique.end();itmap++)
151  std::cout << itmap->first.x << " " << itmap->first.y << " " << itmap->first.z << " " << std::endl;*/
152  int nb_noeud=mai->get_nb_mg_noeud();
153  MG_MAILLAGE* mai2=new MG_MAILLAGE(NULL);
154  gest.ajouter_mg_maillage(mai2);
155  for (int i=0;i<nb_noeud;i++)
156  {
157  MG_NOEUD* noeud=lst_noeud[i];
158  MG_NOEUD* nvnoeud;
159  if (noeud->get_nouveau_numero()==i) nvnoeud=mai2->ajouter_mg_noeud(NULL,noeud->get_x(),noeud->get_y(),noeud->get_z(),MAGIC::ORIGINE::TRIANGULATION);
160  else nvnoeud=lst_noeud[noeud->get_nouveau_numero()];
161  lst_noeud[i]=nvnoeud;
162  }
163  LISTE_MG_TRIANGLE::iterator ittri;
164  for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittri);tri!=NULL;tri=mai->get_suivant_triangle(ittri))
165  {
166  MG_NOEUD* noeud1=tri->get_noeud1();
167  MG_NOEUD* noeud2=tri->get_noeud2();
168  MG_NOEUD* noeud3=tri->get_noeud3();
169  mai2->ajouter_mg_triangle(NULL,lst_noeud[noeud1->get_nouveau_numero()],lst_noeud[noeud2->get_nouveau_numero()],lst_noeud[noeud3->get_nouveau_numero()],MAGIC::ORIGINE::TRIANGULATION);
170  }
171  return 1;
172 
173 }
174 
175 
176 
178  {
179  importer(gest,path);
180  MG_MAILLAGE* mai=gest.get_mg_maillage(gest.get_nb_mg_maillage()-1);
181  LISTE_MG_TRIANGLE::iterator ittri;
182  std::vector<TPL_LISTE_ENTITE<MG_TRIANGLE*> > liste_surface(1);
183  TPL_MAP_ENTITE<MG_TRIANGLE*> liste_unique_surface;
184  //LISTE_MG_TRIANGLE::iterator ittri;
185  int num=-1;
186  for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittri);tri!=NULL;tri=mai->get_suivant_triangle(ittri))
187  {
188  int nbavant=liste_unique_surface.get_nb();
189  liste_unique_surface.ajouter(tri);
190  int nbapres=liste_unique_surface.get_nb();
191  if (nbavant==nbapres) continue;
192  num++;
193  liste_surface.resize(num+1);
194  liste_surface[num].ajouter(tri);
195  for (int itri=0;itri<liste_surface[num].get_nb();itri++)
196  {
197  MG_TRIANGLE *tri2=liste_surface[num].get(itri);
198  for (int i=0;i<tri2->get_noeud1()->get_lien_triangle()->get_nb();i++)
199  {
200  int nbavant=liste_unique_surface.get_nb();
201  liste_unique_surface.ajouter(tri2->get_noeud1()->get_lien_triangle()->get(i));
202  int nbapres=liste_unique_surface.get_nb();
203  if (nbavant!=nbapres) liste_surface[num].ajouter(tri2->get_noeud1()->get_lien_triangle()->get(i));
204  }
205  for (int i=0;i<tri2->get_noeud2()->get_lien_triangle()->get_nb();i++)
206  {
207  int nbavant=liste_unique_surface.get_nb();
208  liste_unique_surface.ajouter(tri2->get_noeud2()->get_lien_triangle()->get(i));
209  int nbapres=liste_unique_surface.get_nb();
210  if (nbavant!=nbapres) liste_surface[num].ajouter(tri2->get_noeud2()->get_lien_triangle()->get(i));
211  }
212  for (int i=0;i<tri2->get_noeud3()->get_lien_triangle()->get_nb();i++)
213  {
214  int nbavant=liste_unique_surface.get_nb();
215  liste_unique_surface.ajouter(tri2->get_noeud3()->get_lien_triangle()->get(i));
216  int nbapres=liste_unique_surface.get_nb();
217  if (nbavant!=nbapres) liste_surface[num].ajouter(tri2->get_noeud3()->get_lien_triangle()->get(i));
218  }
219  }
220 
221  }
222  /*std::cout << "Surface nb = " << liste_unique_surface.get_nb() << std::endl;
223  for (int i=0;i<liste_surface.size();i++)
224  std::cout << "Surface "<< i << "=" << liste_surface[i].get_nb() << std::endl; */
225  for (int i=0;i<liste_surface.size();i++)
226  {
227  if (liste_surface[i].get_nb()<0.1*liste_unique_surface.get_nb())
228  for (int itri=0;itri<liste_surface[i].get_nb();itri++)
229  mai->supprimer_mg_triangleid(liste_surface[i].get(itri)->get_id());
230  }
231  return 1;
232 }
233 
234 
235 
NOEUDCLASSE
Definition: stl_import.cpp:52
MG_MAILLAGE::get_premier_noeud
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:548
gestionversion.h
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
mg_gestionnaire.h
NOEUDCLASSE::~NOEUDCLASSE
~NOEUDCLASSE()
Definition: stl_import.cpp:58
STL_IMPORT::STL_IMPORT
STL_IMPORT()
Definition: stl_import.cpp:42
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
MG_NOEUD::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_noeud.cpp:153
STL_IMPORT::importer
int importer(class MG_GESTIONNAIRE &gest, char *path)
Definition: stl_import.cpp:75
MG_TRIANGLE
Definition: mg_triangle.h:38
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
NOEUDCLASSE::NOEUDCLASSE
NOEUDCLASSE(NOEUDCLASSE &mdd)
Definition: stl_import.cpp:56
NOEUDCLASSE::NOEUDCLASSE
NOEUDCLASSE(double xx, double yy, double zz)
Definition: stl_import.cpp:55
MG_GESTIONNAIRE::ajouter_mg_maillage
int ajouter_mg_maillage(MG_MAILLAGE *mgmai)
Definition: mg_gestionnaire.cpp:521
STL_IMPORT::importer_en_otant_bruit
int importer_en_otant_bruit(class MG_GESTIONNAIRE &gest, char *path)
Definition: stl_import.cpp:177
MG_ELEMENT_MAILLAGE::get_nouveau_numero
virtual int get_nouveau_numero(void)
Definition: mg_element_maillage.cpp:81
NOEUDCLASSE::x
float x
Definition: stl_import.cpp:68
MG_MAILLAGE::get_premier_triangle
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:912
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_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
NOEUDCLASSE::z
float z
Definition: stl_import.cpp:70
MG_NOEUD
Definition: mg_noeud.h:41
tpl_grille.h
MG_GESTIONNAIRE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(unsigned int num)
Definition: mg_gestionnaire.cpp:550
MG_ELEMENT_MAILLAGE::change_nouveau_numero
virtual void change_nouveau_numero(int num)
Definition: mg_element_maillage.cpp:76
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
MG_NOEUD::get_x
virtual double get_x(void)
Definition: mg_noeud.cpp:77
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
STL_IMPORT::~STL_IMPORT
virtual ~STL_IMPORT()
Definition: stl_import.cpp:46
MG_GESTIONNAIRE::get_nb_mg_maillage
unsigned int get_nb_mg_maillage(void)
Definition: mg_gestionnaire.cpp:579
NOEUDCLASSE::NOEUDCLASSE
NOEUDCLASSE(const NOEUDCLASSE &mdd)
Definition: stl_import.cpp:57
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
MG_MAILLAGE::get_nb_mg_noeud
unsigned int get_nb_mg_noeud(void)
Definition: mg_maillage.cpp:476
MG_MAILLAGE::get_suivant_triangle
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:920
MG_MAILLAGE
Definition: mg_maillage.h:62
res
#define res(i, j)
NOEUDCLASSE::y
float y
Definition: stl_import.cpp:69
MAGIC::ORIGINE::TRIANGULATION
@ TRIANGULATION
Definition: mg_definition.h:79
MG_MAILLAGE::get_suivant_noeud
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:556
stl_import.h
NOEUDCLASSE::operator<
bool operator<(const NOEUDCLASSE mdd) const
Definition: stl_import.cpp:60
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