MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mstruct_groupe_forme.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 //####// mstruct_groupe_forme.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:57 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "mstruct_groupe_forme.h"
23 #include "mg_cg_forme.h"
24 #include "mg_cg_forme_volume.h"
26 #include "mg_cg_modele.h"
27 #include "parse.h"
28 #include "pars_argument.h"
29 #include <sstream>
30 
32 {
33 
34 }
35 
37 {
38  m_nom=nom;
39 }
40 
42 {
43 
44 }
45 
47 {
48  m_nom=mdd.m_nom;
50  for(MG_CG_FORME* forme=mdd.m_tpl_map_forme.get_premier(it);forme!=NULL;forme=mdd.m_tpl_map_forme.get_suivant(it))
51  {
52  m_tpl_map_forme.ajouter(forme);
53  }
55 }
56 
57 int GROUPE_FORME::ajouter_donnee_forme(MG_CG_FORME* mgcg_forme, std::string donnee)
58 {
59  m_map_donnees_forme.insert(std::pair<long,std::string>(mgcg_forme->get_id(),donnee));
60 return 0;
61 
62 }
63 
65 {
66  return m_map_donnees_forme.count(mgcg_forme->get_id());
67 }
68 
69 std::string GROUPE_FORME::get_premiere_donnee_forme(MG_CG_FORME* mgcg_forme, std::multimap< long int, std::string >::iterator& it)
70 {
71  std::pair<std::multimap<long,std::string>::iterator,std::multimap<long,std::string>::iterator> ret;
72  ret=m_map_donnees_forme.equal_range(mgcg_forme->get_id());
73  it=ret.first;
74  if(it==ret.second) return "";
75  return (*it).second;
76 }
77 
78 std::string GROUPE_FORME::get_suivante_donnee_forme(MG_CG_FORME* mgcg_forme, std::multimap< long int, std::string >::iterator& it)
79 {
80  std::pair<std::multimap<long,std::string>::iterator,std::multimap<long,std::string>::iterator> ret;
81  ret=m_map_donnees_forme.equal_range(mgcg_forme->get_id());
82  it++;
83  if(it==ret.second) return "";
84  return (*it).second;
85 }
86 
88 {
89  TPL_MAP_ENTITE<MG_VOLUME*> tpl_map_volume;
91  for(MG_CG_FORME* forme=m_tpl_map_forme.get_premier(it);forme!=NULL;forme=m_tpl_map_forme.get_suivant(it))
92  {
93  if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::VOLUME)
94  {
95  MG_CG_FORME_VOLUME* forme_volume = (MG_CG_FORME_VOLUME*)forme;
96  tpl_map_volume.ajouter(forme_volume->get_mg_volume());
97  }
98  else if(forme->get_type_forme()==MG_CG_FORME::TYPE_FORME::MULTI_VOLUME)
99  {
100  MG_CG_FORME_MULTI_VOLUME* forme_multi_volume = (MG_CG_FORME_MULTI_VOLUME*)forme;
101  std::map<long,MG_VOLUME*>::iterator it_volume;
102  for(MG_VOLUME* volume=forme_multi_volume->get_premier_mg_volume(it_volume);volume!=NULL;volume=forme_multi_volume->get_suivant_mg_volume(it_volume))
103  {
104  tpl_map_volume.ajouter(volume);
105  }
106  }
107  }
108  return tpl_map_volume;
109 }
110 
111 int GROUPE_FORME::ajouter_id_forme_ini(MG_CG_FORME* mgcg_forme, long int id)
112 {
113  char data[500];
114  sprintf(data,"ID_FORME_INI=(%li)",id);
115  ajouter_donnee_forme(mgcg_forme,std::string(data));
116  return OK;
117 }
118 
119 int GROUPE_FORME::get_id_forme_ini(MG_CG_FORME* mgcg_forme, long int& id)
120 {
121  PARS_ARGUMENT param[100];
122  PARSE parse;
123  bool trouve=false;
124  std::multimap< long int, std::string >::iterator it_data;
125  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
126  while(trouve==false && it_data!=m_map_donnees_forme.end())
127  {
128  parse.decode(data.c_str(),"@=(@)",param);
129  if(param[0].argument[0]=="ID_FORME_INI")
130  {
131  trouve=true;
132  id = atol(param[1].argument[0].c_str());
133  return OK;
134  }
135  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
136  }
137  return FAIL;
138 }
139 
140 int GROUPE_FORME::ajouter_centre_forme(MG_CG_FORME* mgcg_forme, double* centre_xyz)
141 {
142  char data[500];
143  sprintf(data,"CENTRE=(%.15lf,%.15lf,%.15lf)",centre_xyz[0],centre_xyz[1],centre_xyz[2]);
144  ajouter_donnee_forme(mgcg_forme,std::string(data));
145  return OK;
146 }
147 
148 int GROUPE_FORME::get_centre_forme(MG_CG_FORME* mgcg_forme, double* centre_xyz)
149 {
150  PARS_ARGUMENT param[100];
151  PARSE parse;
152  bool trouve=false;
153  std::multimap< long int, std::string >::iterator it_data;
154  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
155  while(trouve==false && it_data!=m_map_donnees_forme.end())
156  {
157  parse.decode(data.c_str(),"@=(@,@,@)",param);
158  if(param[0].argument[0]=="CENTRE")
159  {
160  trouve=true;
161  centre_xyz[0] = atof(param[1].argument[0].c_str());
162  centre_xyz[1] = atof(param[2].argument[0].c_str());
163  centre_xyz[2] = atof(param[3].argument[0].c_str());
164  return OK;
165  }
166  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
167  }
168  return FAIL;
169 }
170 
171 int GROUPE_FORME::ajouter_extremite_forme(MG_CG_FORME* mgcg_forme, double* extremite_xyz)
172 {
173  char data[500];
174  sprintf(data,"EXTREMITE=(%.15lf,%.15lf,%.15lf)",extremite_xyz[0],extremite_xyz[1],extremite_xyz[2]);
175  ajouter_donnee_forme(mgcg_forme,std::string(data));
176  return OK;
177 }
178 
179 int GROUPE_FORME::get_extremite_forme(MG_CG_FORME* mgcg_forme, double* extremite_xyz)
180 {
181  PARS_ARGUMENT param[100];
182  PARSE parse;
183  bool trouve=false;
184  std::multimap< long int, std::string >::iterator it_data;
185  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
186  while(trouve==false && it_data!=m_map_donnees_forme.end())
187  {
188  parse.decode(data.c_str(),"@=(@,@,@)",param);
189  if(param[0].argument[0]=="EXTREMITE")
190  {
191  trouve=true;
192  extremite_xyz[0] = atof(param[1].argument[0].c_str());
193  extremite_xyz[1] = atof(param[2].argument[0].c_str());
194  extremite_xyz[2] = atof(param[3].argument[0].c_str());
195  return OK;
196  }
197  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
198  }
199  return FAIL;
200 }
201 
202 int GROUPE_FORME::ajouter_position_relative(MG_CG_FORME* mgcg_forme, std::string str)
203 {
204  char data[500];
205  sprintf(data,"POSITION_RELATIVE=(%s)",str.c_str());
206  ajouter_donnee_forme(mgcg_forme,std::string(data));
207  return OK;
208 }
209 
210 int GROUPE_FORME::get_position_relative(MG_CG_FORME* mgcg_forme, std::string& str)
211 {
212  PARS_ARGUMENT param[100];
213  PARSE parse;
214  bool trouve=false;
215  std::multimap< long int, std::string >::iterator it_data;
216  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
217  while(trouve==false && it_data!=m_map_donnees_forme.end())
218  {
219  parse.decode(data.c_str(),"@=(@)",param);
220  if(param[0].argument[0]=="POSITION_RELATIVE")
221  {
222  trouve=true;
223  str = param[1].argument[0];
224  return OK;
225  }
226  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
227  }
228  return FAIL;
229 }
230 
231 
232 int GROUPE_FORME::ajouter_axe_forme(MG_CG_FORME* mgcg_forme, double* axe_xyz)
233 {
234  char data[500];
235  sprintf(data,"AXE=(%.15lf,%.15lf,%.15lf)",axe_xyz[0],axe_xyz[1],axe_xyz[2]);
236  ajouter_donnee_forme(mgcg_forme,std::string(data));
237  return OK;
238 }
239 
240 int GROUPE_FORME::get_axe_forme(MG_CG_FORME* mgcg_forme, double* axe_xyz)
241 {
242  PARS_ARGUMENT param[100];
243  PARSE parse;
244  bool trouve=false;
245  std::multimap< long int, std::string >::iterator it_data;
246  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
247  while(trouve==false && data!="")
248  {
249  parse.decode(data.c_str(),"@=(@,@,@)",param);
250  if(param[0].argument[0]=="AXE")
251  {
252  trouve=true;
253  axe_xyz[0] = atof(param[1].argument[0].c_str());
254  axe_xyz[1] = atof(param[2].argument[0].c_str());
255  axe_xyz[2] = atof(param[3].argument[0].c_str());
256  return OK;
257  }
258  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
259  }
260  return FAIL;
261 }
262 
263 int GROUPE_FORME::ajouter_rayon_forme(MG_CG_FORME* mgcg_forme, double rayon)
264 {
265  char data[500];
266  sprintf(data,"RAYON=(%.15lf)",rayon);
267  ajouter_donnee_forme(mgcg_forme,std::string(data));
268  return OK;
269 }
270 
271 int GROUPE_FORME::get_rayon_forme(MG_CG_FORME* mgcg_forme, double& rayon)
272 {
273  PARS_ARGUMENT param[100];
274  PARSE parse;
275  bool trouve=false;
276  std::multimap< long int, std::string >::iterator it_data;
277  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
278  while(trouve==false && it_data!=m_map_donnees_forme.end())
279  {
280  parse.decode(data.c_str(),"@=(@)",param);
281  if(param[0].argument[0]=="RAYON")
282  {
283  trouve=true;
284  rayon = atof(param[1].argument[0].c_str());
285  return OK;
286  }
287  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
288  }
289  return FAIL;
290 }
291 
292 int GROUPE_FORME::ajouter_longueur_forme(MG_CG_FORME* mgcg_forme, double longueur)
293 {
294  char data[500];
295  sprintf(data,"LONGUEUR=(%.15lf)",longueur);
296  ajouter_donnee_forme(mgcg_forme,std::string(data));
297  return OK;
298 }
299 
300 int GROUPE_FORME::get_longueur_forme(MG_CG_FORME* mgcg_forme, double& longueur)
301 {
302  PARS_ARGUMENT param[100];
303  PARSE parse;
304  bool trouve=false;
305  std::multimap< long int, std::string >::iterator it_data;
306  std::string data = get_premiere_donnee_forme(mgcg_forme,it_data);
307  while(trouve==false && it_data!=m_map_donnees_forme.end())
308  {
309  parse.decode(data.c_str(),"@=(@)",param);
310  if(param[0].argument[0]=="LONGUEUR")
311  {
312  trouve=true;
313  longueur = atof(param[1].argument[0].c_str());
314  return OK;
315  }
316  else data = get_suivante_donnee_forme(mgcg_forme,it_data);
317  }
318  return FAIL;
319 }
320 
321 void GROUPE_FORME::exporter(std::ofstream& f)
322 {
323  f << "GROUPE_MG_CG_FORME " << m_nom << std::endl;
324  f << "NB_MG_CG_FORME " << m_tpl_map_forme.get_nb() << std::endl;
326  for(MG_CG_FORME* forme=m_tpl_map_forme.get_premier(it);forme!=NULL;forme=m_tpl_map_forme.get_suivant(it))
327  {
328  long id = forme->get_id();
329  f << id
330  << " " << get_nb_donnee_forme(forme);
331  std::multimap< long int,std::string >::iterator it;
332  for(std::string donnee = get_premiere_donnee_forme(forme,it);donnee!="";donnee=get_suivante_donnee_forme(forme,it))
333  {
334  f << " " << donnee;
335  }
336  f << std::endl;
337  }
338 }
339 
340 void GROUPE_FORME::importer(std::ifstream& f, MG_CG_MODELE* mgcg_modele)
341 {
342  char ligne[10000];
343  f.getline(ligne,10000);
344  char nom[500];
345  sscanf(ligne,"%*s %s",nom);
346  m_nom=nom;
347  long nb_forme;
348  f.getline(ligne,10000);
349  sscanf(ligne,"%*s %li",&nb_forme);
350  for(long i=0;i<nb_forme;i++)
351  {
352  char val[500];
353  f.getline(val,500,' ');
354  long id_forme;
355  sscanf(val,"%li",&id_forme);
356  MG_CG_FORME* forme = mgcg_modele->get_mgcg_formeid(id_forme);
357  m_tpl_map_forme.ajouter(forme);
358  f.getline(val,500,' ');
359  long nb_donnees;
360  sscanf(val,"%li",&nb_donnees);
361  for(int j=0;j<nb_donnees;j++)
362  {
363  if(j==nb_donnees-1) f.getline(val,500);
364  else f.getline(val,500,' ');
365  char chr_donnee[500];
366  sscanf(val,"%s",chr_donnee);
367  std::string donnee(chr_donnee);
368  ajouter_donnee_forme(forme,donnee);
369  }
370  }
371 }
372 
373 std::string GROUPE_FORME::get_nom(void)
374 {
375  return m_nom;
376 }
377 
379 {
380  return m_tpl_map_forme;
381 }
382 
GROUPE_FORME::get_nom
std::string get_nom(void)
Definition: mstruct_groupe_forme.cpp:373
GROUPE_FORME::m_nom
std::string m_nom
Definition: mstruct_groupe_forme.h:69
GROUPE_FORME::get_extremite_forme
int get_extremite_forme(MG_CG_FORME *mgcg_forme, double *extremite_xyz)
Definition: mstruct_groupe_forme.cpp:179
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
GROUPE_FORME::get_tpl_map_volume
TPL_MAP_ENTITE< MG_VOLUME * > get_tpl_map_volume(void)
Definition: mstruct_groupe_forme.cpp:87
mg_cg_forme.h
mg_cg_forme_multi_volume.h
GROUPE_FORME::ajouter_longueur_forme
int ajouter_longueur_forme(MG_CG_FORME *mgcg_forme, double longueur)
Definition: mstruct_groupe_forme.cpp:292
GROUPE_FORME::ajouter_extremite_forme
int ajouter_extremite_forme(MG_CG_FORME *mgcg_forme, double *extremite_xyz)
Definition: mstruct_groupe_forme.cpp:171
GROUPE_FORME::ajouter_donnee_forme
int ajouter_donnee_forme(MG_CG_FORME *mgcg_forme, std::string donnee)
Definition: mstruct_groupe_forme.cpp:57
GROUPE_FORME::ajouter_id_forme_ini
int ajouter_id_forme_ini(MG_CG_FORME *mgcg_forme, long id)
Definition: mstruct_groupe_forme.cpp:111
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
FAIL
const int FAIL
Definition: mg_definition.h:39
mg_cg_forme_volume.h
GROUPE_FORME::ajouter_axe_forme
int ajouter_axe_forme(MG_CG_FORME *mgcg_forme, double *axe_xyz)
Definition: mstruct_groupe_forme.cpp:232
GROUPE_FORME::get_premiere_donnee_forme
std::string get_premiere_donnee_forme(MG_CG_FORME *mgcg_forme, std::multimap< long, std::string >::iterator &it)
Definition: mstruct_groupe_forme.cpp:69
GROUPE_FORME::get_id_forme_ini
int get_id_forme_ini(MG_CG_FORME *mgcg_forme, long &id)
Definition: mstruct_groupe_forme.cpp:119
MG_CG_FORME_MULTI_VOLUME::get_suivant_mg_volume
virtual MG_VOLUME * get_suivant_mg_volume(std::map< long, MG_VOLUME * >::iterator &it)
Definition: mg_cg_forme_multi_volume.cpp:138
GROUPE_FORME
Definition: mstruct_groupe_forme.h:35
OK
const int OK
Definition: mg_definition.h:38
MG_VOLUME
Definition: mg_volume.h:33
MG_CG_FORME_MULTI_VOLUME
Definition: mg_cg_forme_multi_volume.h:35
GROUPE_FORME::get_centre_forme
int get_centre_forme(MG_CG_FORME *mgcg_forme, double *centre_xyz)
Definition: mstruct_groupe_forme.cpp:148
GROUPE_FORME::get_rayon_forme
int get_rayon_forme(MG_CG_FORME *mgcg_forme, double &rayon)
Definition: mstruct_groupe_forme.cpp:271
GROUPE_FORME::m_map_donnees_forme
std::multimap< long, std::string > m_map_donnees_forme
Definition: mstruct_groupe_forme.h:71
GROUPE_FORME::importer
void importer(std::ifstream &f, MG_CG_MODELE *mgcg_modele)
Definition: mstruct_groupe_forme.cpp:340
parse.h
mstruct_groupe_forme.h
GROUPE_FORME::get_nb_donnee_forme
long get_nb_donnee_forme(MG_CG_FORME *mgcg_forme)
Definition: mstruct_groupe_forme.cpp:64
MG_CG_FORME_MULTI_VOLUME::get_premier_mg_volume
virtual MG_VOLUME * get_premier_mg_volume(std::map< long, MG_VOLUME * >::iterator &it)
Definition: mg_cg_forme_multi_volume.cpp:131
GROUPE_FORME::get_tpl_map_forme
TPL_MAP_ENTITE< MG_CG_FORME * > & get_tpl_map_forme(void)
Definition: mstruct_groupe_forme.cpp:378
MG_CG_FORME
Definition: mg_cg_forme.h:41
f
double f(double x, long nb, double *xfonc, double *fonc, double eng, double eni, double lambda, double nor, double *fonc2)
Definition: fct_generateur_calibrage.cpp:96
GROUPE_FORME::get_position_relative
int get_position_relative(MG_CG_FORME *mgcg_forme, std::string &str)
Definition: mstruct_groupe_forme.cpp:210
GROUPE_FORME::exporter
void exporter(std::ofstream &f)
Definition: mstruct_groupe_forme.cpp:321
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
GROUPE_FORME::get_suivante_donnee_forme
std::string get_suivante_donnee_forme(MG_CG_FORME *mgcg_forme, std::multimap< long, std::string >::iterator &it)
Definition: mstruct_groupe_forme.cpp:78
GROUPE_FORME::ajouter_centre_forme
int ajouter_centre_forme(MG_CG_FORME *mgcg_forme, double *centre_xyz)
Definition: mstruct_groupe_forme.cpp:140
MG_CG_MODELE
Definition: mg_cg_modele.h:41
PARSE::decode
void decode(char *code, std::string masque, class PARS_ARGUMENT *arg)
Definition: parse.cpp:71
MG_CG_FORME_VOLUME::get_mg_volume
virtual MG_VOLUME * get_mg_volume(void)
Definition: mg_cg_forme_volume.cpp:68
MG_CG_MODELE::get_mgcg_formeid
virtual MG_CG_FORME * get_mgcg_formeid(long id)
Definition: mg_cg_modele.cpp:298
PARSE
Definition: parse.h:32
mg_cg_modele.h
GROUPE_FORME::get_longueur_forme
int get_longueur_forme(MG_CG_FORME *mgcg_forme, double &longueur)
Definition: mstruct_groupe_forme.cpp:300
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
PARS_ARGUMENT::argument
std::vector< std::string > argument
Definition: pars_argument.h:44
GROUPE_FORME::~GROUPE_FORME
~GROUPE_FORME(void)
Definition: mstruct_groupe_forme.cpp:41
GROUPE_FORME::m_tpl_map_forme
TPL_MAP_ENTITE< MG_CG_FORME * > m_tpl_map_forme
Definition: mstruct_groupe_forme.h:70
PARS_ARGUMENT
Definition: pars_argument.h:37
GROUPE_FORME::get_axe_forme
int get_axe_forme(MG_CG_FORME *mgcg_forme, double *axe_xyz)
Definition: mstruct_groupe_forme.cpp:240
GROUPE_FORME::ajouter_position_relative
int ajouter_position_relative(MG_CG_FORME *mgcg_forme, std::string str)
Definition: mstruct_groupe_forme.cpp:202
GROUPE_FORME::ajouter_rayon_forme
int ajouter_rayon_forme(MG_CG_FORME *mgcg_forme, double rayon)
Definition: mstruct_groupe_forme.cpp:263
pars_argument.h
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
MG_CG_FORME_VOLUME
Definition: mg_cg_forme_volume.h:36
GROUPE_FORME::GROUPE_FORME
GROUPE_FORME(void)
Definition: mstruct_groupe_forme.cpp:31