MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
pir_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 //####// pir_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 #ifdef BREP_PIRATE
26 
27 
28 #include "affiche.h"
29 #include "pir_import.h"
30 #include "magic.h"
31 #include "message.h"
32 #include "lc_point.h"
33 #include "mg_identificateur.h"
34 #include "mg_point.h"
35 #include "mg_courbe.h"
36 #include "mg_surface.h"
37 #include "mg_sommet.h"
38 #include "mg_cosommet.h"
39 #include "mg_arete.h"
40 #include "mg_coarete.h"
41 #include "mg_boucle.h"
42 #include "mg_coface.h"
43 #include "mg_face.h"
44 #include "mg_coquille.h"
45 #include "mg_volume.h"
46 #include "mg_geometrie.h"
47 #include "mg_gestionnaire.h"
48 #include "pgpoint.h"
49 #include "pgcourbe.h"
50 #include "pgface.h"
51 #include "pgboucle.h"
52 #include "pgsurfac.h"
53 #include "pggeo.h"
54 #include "pgarete.h"
55 #include "pgvolume.h"
56 #include "pgfacass.h"
57 #include "pgareass.h"
58 #include "pgcoquil.h"
59 #include "pgsomass.h"
60 #include "pgsommet.h"
61 #include "pgpos0d.h"
62 #include "pgpos2d.h"
63 #include "pifich.h"
64 #include "pir_point.h"
65 #include "pir_courbe.h"
66 #include "pir_surface.h"
67 #include "pmmai.h"
68 #include "ptlagr.h"
69 #include "pmzone.h"
70 
71 
72 
73 
74 
75 
76 
77 PIR_IMPORT::PIR_IMPORT()
78 {
79 }
80 
81 
82 MG_GEOMETRIE* PIR_IMPORT::importer(MG_GESTIONNAIRE& gest,PI_FICHIER_IMPORT& fichier,char *geo,int *volume)
83 {
84  if (fichier.analyser_syntaxe()!=0) return NULL;
85  if (geo!=NULL)
86  {
87  P__IDENTIFICATEUR idgeo(geo);
88  PG_GEOMETRIE *pggeo=fichier.trouver_geometrie(idgeo);
89  if (pggeo==NULL)
90  {
91  afficheur << ERRGEOMETRIE << enderr;
92  return NULL;
93  }
94  MG_GEOMETRIE *mggeo=new MG_GEOMETRIE("PIRATE",fichier.get_id(),pggeo->get_id());
95  gest.ajouter_mg_geometrie(mggeo);
96  if (volume!=NULL)
97  {
98  PG_VOLUME *pgvol=pggeo->trouver_volume(*volume);
99  importer_volume(mggeo,pggeo,pgvol);
100  }
101  else importer_volume(mggeo,pggeo);
102  return mggeo;
103  }
104  return NULL;
105 }
106 
107 
108 
109 
110 PIR_IMPORT::~PIR_IMPORT()
111 {
112 }
113 
114 
115 
116 void PIR_IMPORT::importer_volume(MG_GEOMETRIE* mggeo,PG_GEOMETRIE* pggeo,PG_VOLUME* pgvoldesire)
117 {
118  for (int nbvol=0;nbvol<pggeo->get_nbvolumes();nbvol++)
119  {
120  PG_VOLUME* pgvol=pggeo->get_volume(nbvol);
121  if ((pgvoldesire==NULL)||((pgvoldesire!=NULL)&&(pgvol==pgvoldesire)))
122  {
123  MG_VOLUME* mgvol=new MG_VOLUME;
124  mggeo->ajouter_mg_volume(mgvol);
125  for (int ii=0;ii<pgvol->get_nbcoquilles();ii++)
126  {
127  const PG_COQUILLE* pgcoq=pgvol->get_coquille(ii);
128  MG_COQUILLE* mgcoq=new MG_COQUILLE(mgvol);
129  mggeo->ajouter_mg_coquille(mgcoq,mgvol);
130  for (int jj=0;jj<pgcoq->get_nbfacesassociees();jj++)
131  {
132  const PG_FACE_ASSOCIEE* pgfaceass=pgcoq->get_faceassociee(jj);
133  const PG_FACE& pgface=pgfaceass->get_face();
134  const PG_SURFACE& pgsurface=pgface.get_position()->get_surface();
135  MG_SURFACE* mgsrf=trouver((PG_SURFACE*)&pgsurface);
136  if (mgsrf==NULL)
137  {
138  PIR_SURFACE* pirsrf=new PIR_SURFACE((PG_SURFACE*)&pgsurface);
139  mgsrf=pirsrf;
140  mggeo->ajouter_mg_surface(mgsrf);
141  relation((PG_SURFACE*)&pgsurface,mgsrf);
142  }
143  MG_FACE* mgface=trouver((PG_FACE*)&pgface);
144  if (mgface==NULL)
145  {
146  mgface=new MG_FACE(mgsrf,MEME_SENS);
147  mggeo->ajouter_mg_face(mgface);
148  relation((PG_FACE*)&pgface,mgface);
149  }
150  int sens;
151  if (pgfaceass->get_orientation()==1) sens=1;
152  else sens=-1;
153  MG_COFACE *mgcoface=mggeo->ajouter_mg_coface(mgface,mgcoq,sens);
154  mgcoq->ajouter_mg_coface(mgcoface);
155  for (int i=0;i<pgface.get_nbboucles();i++)
156  {
157  const PG_BOUCLE* pgboucle=pgface.get_boucle(i);
158  MG_BOUCLE* mgboucle=new MG_BOUCLE(mgface);
159  mggeo->ajouter_mg_boucle(mgboucle,mgface);
160  for (int j=0;j<pgboucle->get_nbaretesassociees();j++)
161  {
162  const PG_ARETE_ASSOCIEE* pgareteass=pgboucle->get_areteassociee(j);
163  const PG_ARETE& pgarete=pgareteass->get_arete();
164  const PG_POSITION1D *pos1d=pgarete.get_position();
165  const PG_COURBE& pcrb=pos1d->get_courbe();
166  MG_COURBE* mgcrb=trouver((PG_COURBE*)&pcrb);
167  if (mgcrb==NULL)
168  {
169  PIR_COURBE *pircrb=new PIR_COURBE((PG_COURBE* )&pcrb);
170  mgcrb=pircrb;
171  mggeo->ajouter_mg_courbe(mgcrb);
172  relation((PG_COURBE*)&pcrb,mgcrb);
173  }
174  const PG_SOMMET& psom1=pgarete.get_sommetassocie1()->get_sommet();
175  const PG_SOMMET& psom2=pgarete.get_sommetassocie2()->get_sommet();
176  double coo[3];
177  MG_SOMMET* mgsom=trouver((PG_SOMMET*)&psom1);
178  if (mgsom==NULL)
179  {
180  psom1.get_position()->get_coord(coo);
181  LC_POINT* lcpt=new LC_POINT(coo);
182  MG_POINT* mgpt=lcpt;
183  mggeo->ajouter_mg_point(mgpt);
184  mgsom=new MG_SOMMET(mgpt);
185  mggeo->ajouter_mg_sommet(mgsom);
186  relation((PG_SOMMET*)&psom1,mgsom);
187  }
188  MG_SOMMET* mgsom2=trouver((PG_SOMMET*)&psom2);
189  if (mgsom2==NULL)
190  {
191  psom2.get_position()->get_coord(coo);
192  LC_POINT* lcpt=new LC_POINT(coo);
193  MG_POINT* mgpt2=lcpt;
194  mggeo->ajouter_mg_point(mgpt2);
195  mgsom2=new MG_SOMMET(mgpt2);
196  mggeo->ajouter_mg_sommet(mgsom2);
197  relation((PG_SOMMET*)&psom2,mgsom2);
198  }
199  MG_ARETE* mgarete=trouver((PG_ARETE*)&pgarete);
200  if (mgarete==NULL)
201  {
202  mgarete=new MG_ARETE(mgcrb,MEME_SENS);
203  mggeo->ajouter_mg_arete(mgarete);
204  relation((PG_ARETE*)&pgarete,mgarete);
205  MG_COSOMMET* mgcosom1=mggeo->ajouter_mg_cosommet(mgarete,mgsom);
206  MG_COSOMMET* mgcosom2=mggeo->ajouter_mg_cosommet(mgarete,mgsom2);
207  mgarete->changer_cosommet1(mgcosom1);
208  mgarete->changer_cosommet2(mgcosom2);
209  }
210  int sens;
211  if (pgareteass->get_orientation_arete()==1) sens=1;
212  else sens=-1;
213  MG_COARETE* mgcoarete=mggeo->ajouter_mg_coarete(mgarete,mgboucle,sens);
214  mgboucle->ajouter_mg_coarete(mgcoarete);
215  }
216  }
217  }
218  }
219  }
220  }
221 
222 
223 }
224 
225 
226 void PIR_IMPORT::transferer_maillage_arete(MG_GEOMETRIE& mggeo,PM_MAILLAGE& mai,int *arete)
227 {
228  MG_ARETE* mgarete=NULL;
229  if (arete!=NULL) mgarete=mggeo.get_mg_areteid(*arete);
230  for (int i=0;i<mggeo.get_nb_mg_arete();i++)
231  {
232  MG_ARETE* mgarete_courante=mggeo.get_mg_arete(i);
233  if ((mgarete==NULL) || (mgarete_courante==mgarete))
234  {
235  PG_ARETE* pgarete=trouver(mgarete_courante);
236  P__IDENTIFICATEUR nomZone("dicretisationDeLArete");
237  nomZone += pgarete->get_id();
238  P_TMPL_CHAMP_MEMOIRE_REF<int> cnc;
239  PM_ZONE* pmzone=mai.ajouter_zone( nomZone,*PT_INTERPOLANT_LAGRANGE::getLagrLigne02(), &cnc, pgarete->get_id() );
240  TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*> * lien_maillage = mgarete_courante->get_lien_maillage();
242  MG_ELEMENT_MAILLAGE* element;
243  for (element = lien_maillage->get_premier(it); element; element = lien_maillage->get_suivant(it) )
244  {
245  MG_SEGMENT* mgsegment=(MG_SEGMENT*)element;
246  MG_NOEUD* noeud1=mgsegment->get_noeud1();
247  MG_NOEUD* noeud2=mgsegment->get_noeud2();
248  int cncDeElm[2]={noeud1->get_nouveau_numero(),noeud2->get_nouveau_numero()};
249  pmzone->ajouter_cncelement( cncDeElm );
250  }
251 
252  }
253  }
254 }
255 
256 void PIR_IMPORT::transferer_maillage_face(MG_GEOMETRIE& mggeo,PM_MAILLAGE& mai,int *face)
257 {
258  MG_FACE* mgface=NULL;
259  if (face!=NULL) mgface=mggeo.get_mg_faceid(*face);
260  for (int i=0;i<mggeo.get_nb_mg_face();i++)
261  {
262  MG_FACE* mgface_courante=mggeo.get_mg_face(i);
263  if ((mgface==NULL) || (mgface_courante==mgface))
264  {
265  PG_FACE* pgface=trouver(mgface_courante);
266  P__IDENTIFICATEUR nomZone("dicretisationDeLaFace");
267  nomZone += pgface->get_id();
268  P_TMPL_CHAMP_MEMOIRE_REF<int> cnc;
269  PM_ZONE* pmzone=mai.ajouter_zone( nomZone,*PT_INTERPOLANT_LAGRANGE::getLagrTrian03(), &cnc, pgface->get_id() );
270  TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*> * lien_maillage = mface_courante->get_lien_maillage();
272  MG_ELEMENT_MAILLAGE* element;
273  for (element = lien_maillage->get_premier(it); element; element = lien_maillage->get_suivant(it) )
274  {
275  MG_TRIANGLE* mgtri=(MG_TRIANGLE*)element;
276  MG_NOEUD* noeud1=mgtri->get_noeud1();
277  MG_NOEUD* noeud2=mgtri->get_noeud2();
278  MG_NOEUD* noeud3=mgtri->get_noeud3();
279  int cncDeElm[3]={noeud1->get_nouveau_numero(),noeud2->get_nouveau_numero(),noeud3->get_nouveau_numero()};
280  pmzone->ajouter_cncelement( cncDeElm );
281  }
282 
283  }
284  }
285 }
286 
287 
288 void PIR_IMPORT::transferer_noeud(MG_MAILLAGE& mgmai,PM_MAILLAGE& pmmai)
289 {
290  P_TMPL_CHAMP_MEMOIRE_REF<double> coord("", P__CHAMP_REF_DATA(3));
291  P_TMPL_CHAMP_MEMOIRE_REF<int> codes("", P__CHAMP_REF_DATA(1));
292  for (int i=0;i<mgmai.get_nb_mg_noeud();i++)
293  {
294  MG_NOEUD* mgnoeud=mgmai.get_mg_noeud(i);
295  double coordDuNoeud[3];
296  mgnoeud->get_coord(coordDuNoeud);
297  coord.ajouter_groupes(coordDuNoeud);
298  MG_ELEMENT_TOPOLOGIQUE* mg_topo=mgnoeud->get_lien_topologie();
299  int dim=mg_topo->get_dimension();
300  int code;
301  switch (dim)
302  {
303  case 0:
304  code=trouver((MG_SOMMET*)mg_topo)->get_id();
305  break;
306  case 1:
307  code=trouver((MG_ARETE*)mg_topo)->get_id();
308  break;
309  case 2:
310  code=trouver((MG_FACE*)mg_topo)->get_id();
311  break;
312  // case 3:code=trouver((MG_VOLUME*)mg_topo)->get_id();break; pour plus tard;
313  };
314  codes.ajouter_groupes(&code);
315  mgnoeud->change_nouveau_numero(i+1);
316  pmmai.changer_champ_coordonnees(&coord);
317  pmmai.changer_champ_codesnoeuds(&codes);
318  }
319 
320 }
321 
322 
323 #endif
324 
325 
326 
virtual void changer_cosommet1(class MG_COSOMMET *cosom)
Definition: mg_arete.cpp:73
virtual void changer_cosommet2(class MG_COSOMMET *cosom)
Definition: mg_arete.cpp:77
virtual void ajouter_mg_coarete(class MG_COARETE *mgcoarete)
Definition: mg_boucle.cpp:73
virtual void ajouter_mg_coface(class MG_COFACE *mgcoface)
Definition: mg_coquille.cpp:71
virtual int get_nouveau_numero(void)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual void change_nouveau_numero(int num)
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
virtual int get_dimension(void)=0
virtual int ajouter_mg_courbe(MG_COURBE *mgcrb)
unsigned int get_nb_mg_arete(void)
virtual int ajouter_mg_face(MG_FACE *mgface)
virtual int ajouter_mg_coquille(MG_COQUILLE *mgcoq)
unsigned int get_nb_mg_face(void)
virtual int ajouter_mg_surface(MG_SURFACE *mgsrf)
virtual int ajouter_mg_point(MG_POINT *mgpt)
virtual int ajouter_mg_coarete(MG_COARETE *mgcoarete)
virtual int ajouter_mg_volume(MG_VOLUME *mgvol)
virtual int ajouter_mg_arete(MG_ARETE *mgarete)
MG_ARETE * get_mg_arete(unsigned int num)
MG_FACE * get_mg_face(unsigned int num)
virtual int ajouter_mg_cosommet(MG_COSOMMET *mgcosom)
MG_FACE * get_mg_faceid(unsigned long num)
virtual int ajouter_mg_boucle(MG_BOUCLE *mgboucle)
virtual int ajouter_mg_sommet(MG_SOMMET *mgsom)
MG_ARETE * get_mg_areteid(unsigned long num)
virtual int ajouter_mg_coface(MG_COFACE *mgcoface)
int ajouter_mg_geometrie(MG_GEOMETRIE *mggeo)
unsigned int get_nb_mg_noeud(void)
MG_NOEUD * get_mg_noeud(unsigned int num)
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_segment.cpp:108
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
const int MEME_SENS
Definition: mg_definition.h:35