ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/fichier/src/mg_file.cpp
Revision: 64
Committed: Fri Feb 1 18:27:30 2008 UTC (17 years, 3 months ago) by foucault
Original Path: magic/lib/fichier/fichier/src/mg_file.cpp
File size: 53320 byte(s)
Log Message:
mise a jour final these Gilles Foucault

File Contents

# User Rev Content
1 foucault 27 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_file.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27     #pragma hdrstop
28    
29     #include "mg_file.h"
30     #include "pars_argument.h"
31     #include "parse.h"
32     #include "step_surface.h"
33     #include "step_courbe.h"
34     #include "step_point.h"
35     #include "acis_surface.h"
36     #include "acis_courbe.h"
37     #include "acis_point.h"
38     #include "sld_point.h"
39     #include "sld_courbe.h"
40     #include "sld_surface.h"
41     #include "sld_fonction.h"
42     #include "lc_point.h"
43    
44     //---------------------------------------------------------------------------
45     // CAD4FE Headers
46     #include "CAD4FE_MCEdge.h"
47     #include "CAD4FE_MCFace.h"
48     #include "CAD4FE_MCVertex.h"
49     #include "CAD4FE_PolySurface.h"
50     #include "CAD4FE_PolyCurve.h"
51     #include "CAD4FE_MCNode.h"
52     #include "CAD4FE_MCSegment.h"
53     #include "CAD4FE_MCTriangle.h"
54     #include "CAD4FE_m3d_MCTriangle.h"
55     //---------------------------------------------------------------------------
56    
57    
58     //---------------------------------------------------------------------------
59     #pragma package(smart_init)
60    
61     MG_FILE::MG_FILE():MG_GESTIONNAIRE()
62     {
63     }
64    
65     MG_FILE::MG_FILE(char* chemin):MG_GESTIONNAIRE()
66     {
67     code_de_lecture=lire(chemin);
68     }
69    
70     MG_FILE::~MG_FILE()
71     {
72     }
73    
74     int MG_FILE::get_code_de_lecture(void)
75     {
76     return code_de_lecture;
77     }
78    
79     long MG_FILE::cid(std::string str)
80     {
81     const char *p=str.c_str();
82     if (*p=='$') return atol(p+1);
83     return -1;
84     }
85    
86     int MG_FILE::lire(char* chemin)
87     {
88     FILE *in;
89     char ligne[3000];
90     in=fopen(chemin,"rt");
91     if (in==NULL) return 0;
92     PARS_ARGUMENT param[100];
93     PARSE parse;
94    
95     MG_GEOMETRIE *mggeo;
96     std::multimap<CAD4FE::MCVertex*, unsigned long> mapMergedRefVertices;
97     bool updatedMergedRefVertices = false;
98    
99     do
100     {
101     int ierr;
102     std::string ligne=parse.lire(in,';',&ierr);
103     parse.decode(ligne.c_str(),"@;",param);
104     const char *chaine=param[0].argument[0].c_str();
105     if ((chaine[0]=='/') && (chaine[1]=='/'))
106     {
107     if ((chaine[2]=='*')&&(chaine[3]=='i'))
108     {
109     unsigned long id;
110     sscanf(chaine,"//*i:%lu;",&id);
111     entiteidmax=id;
112     }
113     }
114     else if (param[0].argument[0]!="FIN")
115     {
116     parse.decode(ligne.c_str(),"%@=@(@);",param);
117     std::string entite=param[1].argument[0];
118     long id=atol(param[0].argument[0].c_str());
119     std::string data=param[2].argument[0] ;
120     MG_MAILLAGE *mgmai;
121     FEM_MAILLAGE *femmai;
122     if (entite=="GEOMETRIE")
123     {
124     parse.decode(data.c_str(),"@,@,@,@",param+2);
125     double unite=atof(param[2].argument[0].c_str());
126     std::string typegeo=param[3].argument[0];
127     std::string chemin=param[4].argument[0];
128     #ifdef BREP_STEP
129     if (typegeo=="STEP")
130     {
131     fichstep.change_nom((char *)chemin.c_str());
132     int code=fichstep.lire();
133     if (code==0) return 0;
134     mggeo=new MG_GEOMETRIE("STEP",id,fichstep.get_nom(),unite);
135     ajouter_mg_geometrie(mggeo);
136     }
137     #endif
138     #ifdef BREP_SAT
139     if (typegeo=="ACIS")
140     {
141     fichsat.change_nom((char *)chemin.c_str());
142     int code=fichsat.lire();
143     if (code==0) return 0;
144     mggeo=new MG_GEOMETRIE("ACIS",id,fichsat.get_nom(),unite);
145     ajouter_mg_geometrie(mggeo);
146     }
147     #endif
148     #ifdef BREP_SLD
149     if (typegeo=="SLD")
150     {
151     fonction->Connection();
152     fonction->OuvrirFichier((char *)chemin.c_str() );
153     mggeo=new MG_GEOMETRIE("SLD",id,chemin.c_str(),unite);
154     ajouter_mg_geometrie(mggeo);
155     ouvertsld=1;
156     }
157     #endif
158     std::string nommat="";
159     if (param[5].argument[0]!="")
160     nommat=param[5].argument[0];
161     mggeo->change_gest_materiau((char*)nommat.c_str());
162     }
163     if (entite=="VOLUME")
164     {
165     parse.decode(data.c_str(),"@,@,@,@,(&)",param+2);
166     MG_VOLUME* mgvol=new MG_VOLUME(param[2].argument[0],id);
167     mggeo->ajouter_mg_volume(mgvol);
168     int nummat=atoi((char*)param[4].argument[0].c_str());
169     mgvol->change_num_materiau(nummat);
170     int nb=atoi(param[5].argument[0].c_str());
171     if (nb!=0)
172     {
173     for (int i=0;i<nb;i++)
174     {
175     parse.decode(param[6].argument[i].c_str(),"(@,@)",param+7);
176     char nom[3];
177     double val;
178     strcpy(nom,param[7].argument[0].c_str());
179     val=atof(param[8].argument[0].c_str());
180     mgvol->ajouter_ccf(nom,val);
181     }
182     }
183     }
184     if (entite=="COQUE")
185     {
186     parse.decode(data.c_str(),"@,@,@,@,(&)",param+2);
187     MG_COQUE* mgcoq=new MG_COQUE(param[2].argument[0],id);
188     mggeo->ajouter_mg_coque(mgcoq);
189     int nummat=atoi((char*)param[4].argument[0].c_str());
190     mgcoq->change_num_materiau(nummat);
191     int nb=atoi(param[5].argument[0].c_str());
192     if (nb!=0)
193     {
194     for (int i=0;i<nb;i++)
195     {
196     parse.decode(param[6].argument[i].c_str(),"(@,@)",param+7);
197     char nom[3];
198     double val;
199     strcpy(nom,param[7].argument[0].c_str());
200     val=atof(param[8].argument[0].c_str());
201     mgcoq->ajouter_ccf(nom,val);
202     }
203     }
204     }
205     if (entite=="POUTRE")
206     {
207     parse.decode(data.c_str(),"@,@,@,@,(&)",param+2);
208     MG_POUTRE* mgpoutre=new MG_POUTRE(param[2].argument[0],id);
209     mggeo->ajouter_mg_poutre(mgpoutre);
210     int nummat=atoi((char*)param[4].argument[0].c_str());
211     mgpoutre->change_num_materiau(nummat);
212     int nb=atoi(param[5].argument[0].c_str());
213     if (nb!=0)
214     {
215     for (int i=0;i<nb;i++)
216     {
217     parse.decode(param[6].argument[i].c_str(),"(@,@)",param+7);
218     char nom[3];
219     double val;
220     strcpy(nom,param[7].argument[0].c_str());
221     val=atof(param[8].argument[0].c_str());
222     mgpoutre->ajouter_ccf(nom,val);
223     }
224     }
225     }
226     if (entite=="COQUILLE")
227     {
228     parse.decode(data.c_str(),"@,@",param+2);
229     long ident=cid(param[2].argument[0]);
230     MG_VOLUME* mgvol=mggeo->get_mg_volumeid(ident);
231     MG_COQUE* mgcoq=mggeo->get_mg_coqueid(ident);
232     if (mgvol!=NULL)
233     {
234     MG_COQUILLE* mgcoq=new MG_COQUILLE(id,mgvol);
235     mggeo->ajouter_mg_coquille(mgcoq,mgvol);
236     }
237     if (mgcoq!=NULL)
238     {
239     MG_COQUILLE* mgcoquille=new MG_COQUILLE(id,mgcoq);
240     mggeo->ajouter_mg_coquille(mgcoquille,mgcoq);
241     }
242    
243     }
244     #ifdef BREP_STEP
245     if (entite=="SURFACE_STEP")
246     {
247     parse.decode(data.c_str(),"@",param+2);
248     long idstepsuf=atol(param[2].argument[0].c_str());
249     ST_SURFACE *stsurf=fichstep.lst_surface.getid(idstepsuf);
250     STEP_SURFACE* stepsurf=new STEP_SURFACE(id,stsurf);
251     mggeo->ajouter_mg_surface(stepsurf);
252     }
253     if (entite=="COURBE_STEP")
254     {
255     parse.decode(data.c_str(),"@",param+2);
256     long idstepcur=atol(param[2].argument[0].c_str());
257     ST_COURBE *stcur=fichstep.lst_courbe.getid(idstepcur);
258     STEP_COURBE* stepcur=new STEP_COURBE(id,stcur);
259     mggeo->ajouter_mg_courbe(stepcur);
260     }
261    
262     if (entite=="POINT_STEP")
263     {
264     parse.decode(data.c_str(),"@",param+2);
265     long idsteppt=atol(param[2].argument[0].c_str());
266     ST_POINT *stpt=fichstep.lst_point.getid(idsteppt);
267     STEP_POINT* steppt=new STEP_POINT(id,stpt);
268     mggeo->ajouter_mg_point(steppt);
269     }
270    
271     #endif
272     #ifdef BREP_SAT
273     if (entite=="SURFACE_SAT")
274     {
275     parse.decode(data.c_str(),"@",param+2);
276     long idsatsuf=atol(param[2].argument[0].c_str());
277     SAT_SURFACE *satsurf=fichsat.lst_surface.getid(idsatsuf);
278     ACIS_SURFACE* acissurf=new ACIS_SURFACE(id,satsurf);
279     mggeo->ajouter_mg_surface(acissurf);
280     }
281     if (entite=="COURBE_SAT")
282     {
283     parse.decode(data.c_str(),"@",param+2);
284     long idsatcur=atol(param[2].argument[0].c_str());
285     SAT_COURBE *satcur=fichsat.lst_courbe.getid(idsatcur);
286     ACIS_COURBE* aciscur=new ACIS_COURBE(id,satcur);
287     mggeo->ajouter_mg_courbe(aciscur);
288     }
289    
290     if (entite=="POINT_SAT")
291     {
292     parse.decode(data.c_str(),"@",param+2);
293     long idsatpt=atol(param[2].argument[0].c_str());
294     SAT_POINT *satpt=fichsat.lst_point.getid(idsatpt);
295     ACIS_POINT* acispt=new ACIS_POINT(id,satpt);
296     mggeo->ajouter_mg_point(acispt);
297     }
298    
299     #endif
300     #ifdef BREP_SLD
301     if (entite=="SURFACE_SLD")
302     {
303     parse.decode(data.c_str(),"@",param+2);
304     CComPtr<IFace2> swface;
305     char* idsld=(char*)param[2].argument[0].c_str();
306     SLD_SURFACE* sldsurf=new SLD_SURFACE(id,idsld,*fonction);
307     mggeo->ajouter_mg_surface(sldsurf);
308     }
309     if (entite=="COURBE_SLD")
310     {
311     parse.decode(data.c_str(),"@",param+2);
312     CComPtr<IEdge> swedge;
313     char* idsld=(char*)param[2].argument[0].c_str();
314     SLD_COURBE* sldcrb=new SLD_COURBE(id,idsld,*fonction);
315     mggeo->ajouter_mg_courbe(sldcrb);
316     }
317    
318     if (entite=="POINT_SLD")
319     {
320     parse.decode(data.c_str(),"@",param+2);
321     CComPtr<IVertex> swvertex;
322     char* idsld=(char*)param[2].argument[0].c_str();
323     SLD_POINT* sldpoint=new SLD_POINT(id,idsld,*fonction);
324     mggeo->ajouter_mg_point(sldpoint);
325     }
326    
327     #endif
328    
329     if (entite=="CAD4FE_POLYCURVE")
330     {
331     CAD4FE::PolyCurve * polycurve = NULL;
332     parse.decode(data.c_str(),"@,(&)",param+2);
333     int nb = atoi(param[2].argument[0].c_str());
334    
335     if (nb == 0)
336     {
337     printf("PolyCurve %d is formed with reference vertex : ", id);
338     parse.decode(param[3].argument[0].c_str(),"@",param+4);
339     int idRefVertex;
340     idRefVertex=cid(param[4].argument[0].c_str());
341     printf("%d ;\n ", idRefVertex);
342     MG_SOMMET * refVertex = mggeo->get_mg_sommetid(idRefVertex);
343     polycurve = new CAD4FE::PolyCurve(refVertex);
344     }
345     else
346     {
347     printf("PolyCurve %d is formed with reference edges : ", id);
348     polycurve = new CAD4FE::PolyCurve;
349     for (int i=0;i<nb;i++)
350     {
351     parse.decode(param[3].argument[i].c_str(),"@",param+4);
352     int idRefEdge;
353     idRefEdge=cid(param[4].argument[0].c_str());
354     printf("%d ; ", idRefEdge);
355     MG_ARETE * refEdge = mggeo->get_mg_areteid(idRefEdge);
356     CAD4FE::PolyCurve tmpPC(refEdge);
357     polycurve->Merge(tmpPC);
358     }
359     printf("\n");
360     }
361    
362     polycurve->change_id(id);
363     mggeo->ajouter_mg_courbe(polycurve);
364     }
365    
366    
367     if (entite=="CAD4FE_POLYSURFACE")
368     {
369     CAD4FE::PolySurface * polysurface = new CAD4FE::PolySurface;
370     polysurface->change_id(id);
371     mggeo->ajouter_mg_surface(polysurface);
372    
373     parse.decode(data.c_str(),"@,(&)",param+2);
374    
375     int nb = atoi(param[2].argument[0].c_str());
376     printf("PolySurface %d is formed with reference faces : ", id);
377     for (int i=0;i<nb;i++)
378     {
379     parse.decode(param[3].argument[i].c_str(),"@",param+4);
380     int idRefFace;
381     idRefFace=cid(param[4].argument[0].c_str());
382     printf("%d ; ", idRefFace);
383    
384     MG_FACE * refFace = mggeo->get_mg_faceid(idRefFace);
385     CAD4FE::PolySurface tmpSF(refFace);
386     polysurface->Merge(tmpSF);
387     }
388    
389     printf("\n");
390     }
391     if (entite=="CAD4FE_MCEDGE")
392     {
393     parse.decode(data.c_str(),"@,@,@,@,@,@,(&)",param+2);
394    
395     std::string idOriginal = param[2].argument[0];
396     long idPolyCurve=cid(param[3].argument[0]);
397     CAD4FE::PolyCurve * polycurve = (CAD4FE::PolyCurve *) mggeo->get_mg_courbeid(idPolyCurve);
398    
399     // sense is not used because a MCEdge always has
400     // a sense = 1 !
401     // (because polycurve domain is equal to mcEdge domain)
402     CAD4FE::MCEdge * mcEdge = new CAD4FE::MCEdge(idOriginal, polycurve);
403     mcEdge->change_id(id);
404     mggeo->ajouter_mg_arete(mcEdge);
405    
406     int nb=atoi(param[7].argument[0].c_str());
407     if (nb!=0)
408     {
409     for (int i=0;i<nb;i++)
410     {
411     parse.decode(param[8].argument[i].c_str(),"(@,@)",param+9);
412     char nom[3];
413     double val;
414     strcpy(nom,param[9].argument[0].c_str());
415     val=atof(param[10].argument[0].c_str());
416     mcEdge->ajouter_ccf(nom,val);
417     }
418     }
419     }
420     if (entite=="CAD4FE_MCFACE")
421     {
422 foucault 64 parse.decode(data.c_str(),"@,@,@,@,@,(&)",param+2);
423 foucault 27
424     std::string idOriginal = param[2].argument[0];
425     long idPolySurface=cid(param[3].argument[0]);
426     CAD4FE::PolySurface * polysurface = (CAD4FE::PolySurface *) mggeo->get_mg_surfaceid(idPolySurface);
427    
428     CAD4FE::MCFace * mcFace = new CAD4FE::MCFace(idOriginal, polysurface);
429     mcFace->change_id(id);
430     mggeo->ajouter_mg_face(mcFace);
431    
432     int nb=atoi(param[6].argument[0].c_str());
433     if (nb!=0)
434     {
435     for (int i=0;i<nb;i++)
436     {
437     parse.decode(param[7].argument[i].c_str(),"(@,@)",param+8);
438     char nom[3];
439     double val;
440     strcpy(nom,param[8].argument[0].c_str());
441     val=atof(param[9].argument[0].c_str());
442     mcFace->ajouter_ccf(nom,val);
443     }
444     }
445     }
446     if (entite=="CAD4FE_MCVERTEX")
447     {
448     parse.decode(data.c_str(),"@,@,@,(&),@,(&)",param+2);
449     std::string idOriginal = param[2].argument[0];
450     long idsom=cid(param[3].argument[0]);
451     MG_SOMMET * mgsom = mggeo->get_mg_sommetid(idsom);
452     CAD4FE::MCVertex * mcVertex = new CAD4FE::MCVertex(mgsom);
453     mcVertex->change_id(id);
454     mggeo->ajouter_mg_sommet(mcVertex);
455     int nb_ref_vertex=atoi(param[4].argument[0].c_str());
456     if (nb_ref_vertex!=0)
457     {
458     for (int i=0;i<nb_ref_vertex;i++)
459     {
460     unsigned long idRefVertex=cid(param[5].argument[i]);
461     mcVertex->GetMergedRefVertices()[idRefVertex] = NULL;
462     mapMergedRefVertices.insert(std::make_pair(mcVertex,idRefVertex));
463     }
464     }
465     int nb_ccf=atoi(param[4+2].argument[0].c_str());
466     if (nb_ccf!=0)
467     {
468     for (int i=0;i<nb_ccf;i++)
469     {
470     parse.decode(param[5+2].argument[i].c_str(),"(@,@)",param+6+2);
471     char nom_ccf[3];
472     double val_ccf;
473     strcpy(nom_ccf,param[6+2].argument[0].c_str());
474     val_ccf=atof(param[7+2].argument[0].c_str());
475     mgsom->ajouter_ccf(nom_ccf,val_ccf);
476     }
477     }
478     }
479    
480     if (entite=="FACE")
481     {
482     parse.decode(data.c_str(),"@,@,(@),@,@,(&)",param+2);
483     long idsurf=cid(param[3].argument[0]);
484     int sens=atoi(param[5].argument[0].c_str());
485     MG_SURFACE* mgsurf=mggeo->get_mg_surfaceid(idsurf);
486     MG_FACE* mgface=new MG_FACE(param[2].argument[0],id,mgsurf,sens);
487     mggeo->ajouter_mg_face(mgface);
488     int nb=atoi(param[6].argument[0].c_str());
489     if (nb!=0)
490     {
491     for (int i=0;i<nb;i++)
492     {
493     parse.decode(param[7].argument[i].c_str(),"(@,@)",param+8);
494     char nom[3];
495     double val;
496     strcpy(nom,param[8].argument[0].c_str());
497     val=atof(param[9].argument[0].c_str());
498     mgface->ajouter_ccf(nom,val);
499     }
500     }
501     }
502     if (entite=="COFACE")
503     {
504     parse.decode(data.c_str(),"@,@,@",param+2);
505     long idface=cid(param[2].argument[0]);
506     long idcoq=cid(param[3].argument[0]);
507     int sens=atoi(param[4].argument[0].c_str());
508     MG_FACE* mgface=mggeo->get_mg_faceid(idface);
509     MG_COQUILLE* mgcoq=mggeo->get_mg_coquilleid(idcoq);
510     MG_COFACE* mgcoface=mggeo->ajouter_mg_coface(id,mgface,mgcoq,sens);
511     mgcoq->ajouter_mg_coface(mgcoface);
512     }
513     if (entite=="BOUCLE")
514     {
515     parse.decode(data.c_str(),"@,(@)",param+2);
516     long ident=cid(param[2].argument[0]);
517     MG_FACE* mgface=mggeo->get_mg_faceid(ident);
518     MG_POUTRE* mgpoutre=mggeo->get_mg_poutreid(ident);
519     if (mgface!=NULL)
520     {
521     MG_BOUCLE* mgbou=new MG_BOUCLE(id,mgface);
522     mggeo->ajouter_mg_boucle(mgbou,mgface);
523     }
524     if (mgpoutre!=NULL)
525     {
526     MG_BOUCLE* mgbou=new MG_BOUCLE(id,mgpoutre);
527     mggeo->ajouter_mg_boucle(mgbou,mgpoutre);
528     }
529     }
530     if (entite=="POINT")
531     {
532     parse.decode(data.c_str(),"@,@,@",param+2);
533     double xyz[3];
534     xyz[0]=atof(param[2].argument[0].c_str());
535     xyz[1]=atof(param[3].argument[0].c_str());
536     xyz[2]=atof(param[4].argument[0].c_str());
537     LC_POINT* point=new LC_POINT(id,xyz);
538     mggeo->ajouter_mg_point(point);
539     }
540     if (entite=="SOMMET")
541     {
542     parse.decode(data.c_str(),"@,@,@,(&)",param+2);
543     long idpoint=cid(param[3].argument[0]);
544     MG_POINT* mgpt=mggeo->get_mg_pointid(idpoint);
545     MG_SOMMET* mgsom=new MG_SOMMET(param[2].argument[0],id,mgpt);
546     mggeo->ajouter_mg_sommet(mgsom);
547     int nb=atoi(param[4].argument[0].c_str());
548     if (nb!=0)
549     {
550     for (int i=0;i<nb;i++)
551     {
552     parse.decode(param[5].argument[i].c_str(),"(@,@)",param+6);
553     char nom[3];
554     double val;
555     strcpy(nom,param[6].argument[0].c_str());
556     val=atof(param[7].argument[0].c_str());
557     mgsom->ajouter_ccf(nom,val);
558     }
559     }
560     }
561     if (entite=="ARETE")
562     {
563     parse.decode(data.c_str(),"@,@,@,@,@,@,(&)",param+2);
564     long idcur=cid(param[3].argument[0]);
565     int sens=atoi(param[6].argument[0].c_str());
566     MG_COURBE* mgcur=mggeo->get_mg_courbeid(idcur);
567     MG_ARETE* mgarete=new MG_ARETE(param[2].argument[0],id,mgcur,sens);
568     mggeo->ajouter_mg_arete(mgarete);
569     int nb=atoi(param[7].argument[0].c_str());
570     if (nb!=0)
571     {
572     for (int i=0;i<nb;i++)
573     {
574     parse.decode(param[8].argument[i].c_str(),"(@,@)",param+9);
575     char nom[3];
576     double val;
577     strcpy(nom,param[9].argument[0].c_str());
578     val=atof(param[10].argument[0].c_str());
579     mgarete->ajouter_ccf(nom,val);
580     }
581     }
582     }
583     if (entite=="COSOMMET")
584     {
585     parse.decode(data.c_str(),"@,@,@",param+2);
586     long idsom=cid(param[2].argument[0]);
587     long idarete=cid(param[3].argument[0]);
588     int num=atoi(param[4].argument[0].c_str());
589     MG_SOMMET* mgsom=mggeo->get_mg_sommetid(idsom);
590     MG_ARETE* mgarete=mggeo->get_mg_areteid(idarete);
591     MG_COSOMMET* mgcosom=mggeo->ajouter_mg_cosommet(id,mgarete,mgsom);
592     if (num==1) mgarete->changer_cosommet1(mgcosom);
593     if (num==2) mgarete->changer_cosommet2(mgcosom);
594     }
595     if (entite=="COARETE")
596     {
597     parse.decode(data.c_str(),"@,@,@",param+2);
598     long idarete=cid(param[2].argument[0]);
599     long idboucle=cid(param[3].argument[0]);
600     int sens=atoi(param[4].argument[0].c_str());
601     MG_ARETE* mgarete=mggeo->get_mg_areteid(idarete);
602     MG_BOUCLE* mgboucle=mggeo->get_mg_boucleid(idboucle);
603     MG_COARETE* mgcoarete=mggeo->ajouter_mg_coarete(id,mgarete,mgboucle,sens);
604     mgboucle->ajouter_mg_coarete(mgcoarete);
605     }
606     if (entite=="VISU_COURBE")
607     {
608     parse.decode(data.c_str(),"@,@,@,@,@,@",param+2);
609     double xyz1[3];
610     double xyz2[3];
611     xyz1[0]=atof(param[2].argument[0].c_str());
612     xyz1[1]=atof(param[3].argument[0].c_str());
613     xyz1[2]=atof(param[4].argument[0].c_str());
614     xyz2[0]=atof(param[5].argument[0].c_str());
615     xyz2[1]=atof(param[6].argument[0].c_str());
616     xyz2[2]=atof(param[7].argument[0].c_str());
617     MG_VISU_COURBE* mgcrb=new MG_VISU_COURBE(id,xyz1,xyz2);
618     mggeo->ajouter_mg_visu_courbe(mgcrb);
619     }
620     if (entite=="MAILLAGE")
621     {
622     parse.decode(data.c_str(),"@",param+2);
623     long idgeo=cid(param[2].argument[0]);
624     MG_GEOMETRIE* mggeo=get_mg_geometrieid(idgeo);
625     mgmai=new MG_MAILLAGE(id,mggeo);
626     ajouter_mg_maillage(mgmai);
627     }
628     if (entite=="FEM_MAILLAGE")
629     {
630     parse.decode(data.c_str(),"@,@,@",param+2);
631     int degre=atoi(param[2].argument[0].c_str());
632     long idmai=cid(param[3].argument[0]);
633     long idgeo=cid(param[4].argument[0]);
634     MG_GEOMETRIE* mggeo=get_mg_geometrieid(idgeo);
635     MG_MAILLAGE* mgmai=get_mg_maillageid(idmai);
636     femmai=new FEM_MAILLAGE(id,mggeo,mgmai,degre);
637     ajouter_fem_maillage(femmai);
638     }
639     if (entite=="NOEUD")
640     {
641 francois 35 parse.decode(data.c_str(),"@,@,@,@,@",param+2);
642 foucault 27 long idtopo=cid(param[2].argument[0]);
643     double x=atof(param[3].argument[0].c_str());
644     double y=atof(param[4].argument[0].c_str());
645     double z=atof(param[5].argument[0].c_str());
646 francois 35 int ori=atoi(param[6].argument[0].c_str());
647 foucault 27 MG_ELEMENT_TOPOLOGIQUE* topo;
648     if (idtopo>-1)
649     {
650     topo=mggeo->get_mg_sommetid(idtopo);
651     if (topo==NULL) topo=mggeo->get_mg_areteid(idtopo);
652     if (topo==NULL) topo=mggeo->get_mg_faceid(idtopo);
653     if (topo==NULL) topo=mggeo->get_mg_volumeid(idtopo);
654     }
655     else topo=NULL;
656 francois 35 MG_NOEUD* noeud=new MG_NOEUD(id,topo,x,y,z,ori);
657 foucault 27 mgmai->ajouter_mg_noeud(noeud);
658     }
659     if (entite=="FEM_NOEUD")
660     {
661     parse.decode(data.c_str(),"@,@,@,@,@,@,@",param+2);
662     long idtopo=cid(param[2].argument[0]);
663     long idmai=cid(param[3].argument[0]);
664     double x=atof(param[4].argument[0].c_str());
665     double y=atof(param[5].argument[0].c_str());
666     double z=atof(param[6].argument[0].c_str());
667     int num=atoi(param[7].argument[0].c_str());
668     int numopt=atoi(param[8].argument[0].c_str());
669     MG_ELEMENT_MAILLAGE* elmai;
670     if (idmai>-1)
671     {
672     elmai=mgmai->get_mg_noeudid(idmai);
673     if (elmai==NULL) elmai=mgmai->get_mg_segmentid(idmai);
674     if (elmai==NULL) elmai=mgmai->get_mg_triangleid(idmai);
675     if (elmai==NULL) elmai=mgmai->get_mg_tetraid(idmai);
676     }
677     else elmai=NULL;
678     FEM_NOEUD* noeud;
679     if (elmai!=NULL) noeud=new FEM_NOEUD(id,elmai,x,y,z);
680     else
681     {
682     MG_ELEMENT_TOPOLOGIQUE* topo;
683     if (idtopo>-1)
684     {
685     topo=mggeo->get_mg_sommetid(idtopo);
686     if (topo==NULL) topo=mggeo->get_mg_areteid(idtopo);
687     if (topo==NULL) topo=mggeo->get_mg_faceid(idtopo);
688     if (topo==NULL) topo=mggeo->get_mg_volumeid(idtopo);
689     }
690     else topo=NULL;
691     noeud=new FEM_NOEUD(id,topo,x,y,z);
692     }
693     noeud->change_numero(num);
694     noeud->change_numero_opt(numopt);
695     femmai->ajouter_fem_noeud(noeud);
696     }
697     if (entite=="SEGMENT")
698     {
699 francois 35 parse.decode(data.c_str(),"@,@,@,@",param+2);
700 foucault 27 long idtopo=cid(param[2].argument[0]);
701     long idn1=cid(param[3].argument[0]);
702     long idn2=cid(param[4].argument[0]);
703 francois 35 int ori=atoi(param[5].argument[0].c_str());
704 foucault 27 MG_NOEUD* noeud1=mgmai->get_mg_noeudid(idn1);
705     MG_NOEUD* noeud2=mgmai->get_mg_noeudid(idn2);
706     MG_ELEMENT_TOPOLOGIQUE* topo;
707     if (idtopo>-1)
708     {
709     topo=mggeo->get_mg_areteid(idtopo);
710     if (topo==NULL) topo=mggeo->get_mg_faceid(idtopo);
711     if (topo==NULL) topo=mggeo->get_mg_volumeid(idtopo);
712     }
713     else topo=NULL;
714 francois 35 MG_SEGMENT* seg=new MG_SEGMENT(id,topo,noeud1,noeud2,ori);
715 foucault 27 mgmai->ajouter_mg_segment(seg);
716     }
717     if (entite=="FEM_SEGMENT2")
718     {
719     parse.decode(data.c_str(),"@,@,@,@",param+2);
720     long idmai=cid(param[3].argument[0]);
721     long idn1=cid(param[4].argument[0]);
722     long idn2=cid(param[5].argument[0]);
723     FEM_NOEUD* tab[2];
724     tab[0]=femmai->get_fem_noeudid(idn1);
725     tab[1]=femmai->get_fem_noeudid(idn2);
726     MG_ELEMENT_MAILLAGE* elmai;
727     if (idmai>-1)
728     elmai=mgmai->get_mg_segmentid(idmai);
729     else elmai=NULL;
730     FEM_SEGMENT2* seg=new FEM_SEGMENT2(id,elmai,tab);
731     femmai->ajouter_fem_segment(seg);
732     }
733     if (entite=="FEM_SEGMENT3")
734     {
735     parse.decode(data.c_str(),"@,@,@,@,@",param+2);
736     long idmai=cid(param[3].argument[0]);
737     long idn1=cid(param[4].argument[0]);
738     long idn2=cid(param[5].argument[0]);
739     long idn3=cid(param[6].argument[0]);
740     FEM_NOEUD* tab[3];
741     tab[0]=femmai->get_fem_noeudid(idn1);
742     tab[1]=femmai->get_fem_noeudid(idn2);
743     tab[2]=femmai->get_fem_noeudid(idn3);
744     MG_ELEMENT_MAILLAGE* elmai;
745     if (idmai>-1)
746     elmai=mgmai->get_mg_segmentid(idmai);
747     else elmai=NULL;
748     FEM_SEGMENT3* seg=new FEM_SEGMENT3(id,elmai,tab);
749     femmai->ajouter_fem_segment(seg);
750     }
751     if (entite=="TRIANGLE")
752     {
753 francois 35 parse.decode(data.c_str(),"@,@,@,@,@",param+2);
754 foucault 27 long idtopo=cid(param[2].argument[0]);
755     long idn1=cid(param[3].argument[0]);
756     long idn2=cid(param[4].argument[0]);
757     long idn3=cid(param[5].argument[0]);
758 francois 35 int ori=atoi(param[6].argument[0].c_str());
759 foucault 27 MG_NOEUD* noeud1=mgmai->get_mg_noeudid(idn1);
760     MG_NOEUD* noeud2=mgmai->get_mg_noeudid(idn2);
761     MG_NOEUD* noeud3=mgmai->get_mg_noeudid(idn3);
762     MG_ELEMENT_TOPOLOGIQUE* topo;
763     if (idtopo>-1)
764     {
765     topo=mggeo->get_mg_faceid(idtopo);
766     if (topo==NULL) topo=mggeo->get_mg_volumeid(idtopo);
767     }
768     else topo=NULL;
769 francois 35 mgmai->ajouter_mg_triangle(topo,noeud1,noeud2,noeud3,ori,id);
770 foucault 27 }
771     if (entite=="FEM_TRIANGLE3")
772     {
773     parse.decode(data.c_str(),"@,@,@,@,@",param+2);
774     long idmai=cid(param[3].argument[0]);
775     long idn1=cid(param[4].argument[0]);
776     long idn2=cid(param[5].argument[0]);
777     long idn3=cid(param[6].argument[0]);
778     FEM_NOEUD* tab[3];
779     tab[0]=femmai->get_fem_noeudid(idn1);
780     tab[1]=femmai->get_fem_noeudid(idn2);
781     tab[2]=femmai->get_fem_noeudid(idn3);
782     MG_ELEMENT_MAILLAGE* elmai;
783     if (idmai>-1)
784     elmai=mgmai->get_mg_triangleid(idmai);
785     else elmai=NULL;
786     FEM_TRIANGLE3* tri=new FEM_TRIANGLE3(id,elmai,tab);
787     femmai->ajouter_fem_triangle(tri);
788     }
789     if (entite=="FEM_TRIANGLE6")
790     {
791     parse.decode(data.c_str(),"@,@,@,@,@,@,@,@",param+2);
792     long idmai=cid(param[3].argument[0]);
793     long idn1=cid(param[4].argument[0]);
794     long idn2=cid(param[5].argument[0]);
795     long idn3=cid(param[6].argument[0]);
796     long idn4=cid(param[7].argument[0]);
797     long idn5=cid(param[8].argument[0]);
798     long idn6=cid(param[9].argument[0]);
799     FEM_NOEUD* tab[6];
800     tab[0]=femmai->get_fem_noeudid(idn1);
801     tab[1]=femmai->get_fem_noeudid(idn2);
802     tab[2]=femmai->get_fem_noeudid(idn3);
803     tab[3]=femmai->get_fem_noeudid(idn4);
804     tab[4]=femmai->get_fem_noeudid(idn5);
805     tab[5]=femmai->get_fem_noeudid(idn6);
806     MG_ELEMENT_MAILLAGE* elmai;
807     if (idmai>-1)
808     elmai=mgmai->get_mg_triangleid(idmai);
809     else elmai=NULL;
810     FEM_TRIANGLE6* tri=new FEM_TRIANGLE6(id,elmai,tab);
811     femmai->ajouter_fem_triangle(tri);
812     }
813     if (entite=="TETRAEDRE")
814     {
815 francois 35 parse.decode(data.c_str(),"@,@,@,@,@,@",param+2);
816 foucault 27 long idtopo=cid(param[2].argument[0]);
817     long idn1=cid(param[3].argument[0]);
818     long idn2=cid(param[4].argument[0]);
819     long idn3=cid(param[5].argument[0]);
820     long idn4=cid(param[6].argument[0]);
821 francois 35 int ori=atoi(param[7].argument[0].c_str());
822 foucault 27 MG_NOEUD* noeud1=mgmai->get_mg_noeudid(idn1);
823     MG_NOEUD* noeud2=mgmai->get_mg_noeudid(idn2);
824     MG_NOEUD* noeud3=mgmai->get_mg_noeudid(idn3);
825     MG_NOEUD* noeud4=mgmai->get_mg_noeudid(idn4);
826     MG_ELEMENT_TOPOLOGIQUE* topo;
827     if (idtopo>-1) topo=mggeo->get_mg_volumeid(idtopo);
828     else topo=NULL;
829 francois 35 if (noeud1&&noeud2&&noeud3&&noeud4) mgmai->ajouter_mg_tetra(topo,noeud1,noeud2,noeud3,noeud4,ori,id);
830 foucault 27 }
831     if (entite=="FEM_TETRA4")
832     {
833     parse.decode(data.c_str(),"@,@,@,@,@,@",param+2);
834     long idmai=cid(param[3].argument[0]);
835     long idn1=cid(param[4].argument[0]);
836     long idn2=cid(param[5].argument[0]);
837     long idn3=cid(param[6].argument[0]);
838     long idn4=cid(param[7].argument[0]);
839     FEM_NOEUD* tab[4];
840     tab[0]=femmai->get_fem_noeudid(idn1);
841     tab[1]=femmai->get_fem_noeudid(idn2);
842     tab[2]=femmai->get_fem_noeudid(idn3);
843     tab[3]=femmai->get_fem_noeudid(idn4);
844     MG_ELEMENT_MAILLAGE* elmai;
845     if (idmai>-1)
846     elmai=mgmai->get_mg_tetraid(idmai);
847     else elmai=NULL;
848     FEM_TETRA4* tet=new FEM_TETRA4(id,elmai,tab);
849     femmai->ajouter_fem_tetra(tet);
850     }
851     if (entite=="FEM_TETRA10")
852     {
853     parse.decode(data.c_str(),"@,@,@,@,@,@,@,@,@,@,@,@",param+2);
854     long idmai=cid(param[3].argument[0]);
855     long idn1=cid(param[4].argument[0]);
856     long idn2=cid(param[5].argument[0]);
857     long idn3=cid(param[6].argument[0]);
858     long idn4=cid(param[7].argument[0]);
859     long idn5=cid(param[8].argument[0]);
860     long idn6=cid(param[9].argument[0]);
861     long idn7=cid(param[10].argument[0]);
862     long idn8=cid(param[11].argument[0]);
863     long idn9=cid(param[12].argument[0]);
864     long idn10=cid(param[13].argument[0]);
865     FEM_NOEUD* tab[10];
866     tab[0]=femmai->get_fem_noeudid(idn1);
867     tab[1]=femmai->get_fem_noeudid(idn2);
868     tab[2]=femmai->get_fem_noeudid(idn3);
869     tab[3]=femmai->get_fem_noeudid(idn4);
870     tab[4]=femmai->get_fem_noeudid(idn5);
871     tab[5]=femmai->get_fem_noeudid(idn6);
872     tab[6]=femmai->get_fem_noeudid(idn7);
873     tab[7]=femmai->get_fem_noeudid(idn8);
874     tab[8]=femmai->get_fem_noeudid(idn9);
875     tab[9]=femmai->get_fem_noeudid(idn10);
876     MG_ELEMENT_MAILLAGE* elmai;
877     if (idmai>-1)
878     elmai=mgmai->get_mg_tetraid(idmai);
879     else elmai=NULL;
880     FEM_TETRA10* tet=new FEM_TETRA10(id,elmai,tab);
881     femmai->ajouter_fem_tetra(tet);
882     }
883     if (entite=="SOLUTION")
884     {
885     parse.decode(data.c_str(),"@,@,@,@,(&)",param+2);
886     std::string nomsol=param[2].argument[0];
887     long idmai=cid(param[3].argument[0]);
888     int nb=atoi(param[4].argument[0].c_str());
889     std::string chemin=param[5].argument[0];
890     MG_MAILLAGE* mai=get_mg_maillageid(idmai);
891     MG_SOLUTION* sol=new MG_SOLUTION(id,mai,nb,(char*)chemin.c_str(),SOL_EXISTANTE,nomsol);
892     ajouter_mg_solution(sol);
893     for (int i=0;i<nb;i++)
894     sol->change_legende(i,param[6].argument[i]);
895     }
896     if (entite=="FEM_SOLUTION")
897     {
898     parse.decode(data.c_str(),"@,@,@,@,(&)",param+2);
899     std::string nomsol=param[2].argument[0];
900     long idmai=cid(param[3].argument[0]);
901     int nb=atoi(param[4].argument[0].c_str());
902     std::string chemin=param[5].argument[0];
903     FEM_MAILLAGE* mai=get_fem_maillageid(idmai);
904     FEM_SOLUTION* sol=new FEM_SOLUTION(id,mai,nb,(char*)chemin.c_str(),SOL_EXISTANTE,nomsol);
905     ajouter_fem_solution(sol);
906     for (int i=0;i<nb;i++)
907     sol->change_legende(i,param[6].argument[i]);
908     }
909     if (entite=="CAD4FE_MCSEGMENT")
910     {
911     parse.decode(data.c_str(),"@,@,@",param+2);
912     long idtopo=cid(param[2].argument[0]);
913     long idn1=cid(param[3].argument[0]);
914     long idn2=cid(param[4].argument[0]);
915     CAD4FE::MCNode* noeud1=(CAD4FE::MCNode*)mgmai->get_mg_noeudid(idn1);
916     CAD4FE::MCNode* noeud2=(CAD4FE::MCNode*)mgmai->get_mg_noeudid(idn2);
917     MG_ELEMENT_TOPOLOGIQUE* topo;
918     if (idtopo>-1)
919     {
920     topo=mggeo->get_mg_areteid(idtopo);
921     if (topo==NULL) topo=mggeo->get_mg_faceid(idtopo);
922     if (topo==NULL) topo=mggeo->get_mg_volumeid(idtopo);
923     }
924     else topo=NULL;
925     CAD4FE::MCSegment * seg = new CAD4FE::MCSegment(id,topo,noeud1,noeud2);
926     mgmai->ajouter_mg_segment(seg);
927     }
928     if (entite=="CAD4FE_MCNODE")
929     {
930     parse.decode(data.c_str(),"@,@,@,@,@",param+2);
931     long idRefTopo=cid(param[2].argument[0]);
932     long idMCTopo=cid(param[3].argument[0]);
933     double x=atof(param[4].argument[0].c_str());
934     double y=atof(param[5].argument[0].c_str());
935     double z=atof(param[6].argument[0].c_str());
936     MG_ELEMENT_TOPOLOGIQUE* refTopo=NULL;
937     if (refTopo==NULL) refTopo=mggeo->get_mg_sommetid(idRefTopo);
938     if (refTopo==NULL) refTopo=mggeo->get_mg_areteid(idRefTopo);
939     if (refTopo==NULL) refTopo=mggeo->get_mg_faceid(idRefTopo);
940     if (refTopo==NULL) refTopo=mggeo->get_mg_volumeid(idRefTopo);
941     MG_ELEMENT_TOPOLOGIQUE* mcTopo=NULL;
942     if (mcTopo==NULL) mcTopo=mggeo->get_mg_sommetid(idMCTopo);
943     if (mcTopo==NULL) mcTopo=mggeo->get_mg_areteid(idMCTopo);
944     if (mcTopo==NULL) mcTopo=mggeo->get_mg_faceid(idMCTopo);
945     if (mcTopo==NULL) mcTopo=mggeo->get_mg_volumeid(idMCTopo);
946    
947     if (mcTopo->get_dimension()==0)
948     {
949     if (updatedMergedRefVertices == false)
950     {
951     for (std::multimap<CAD4FE::MCVertex * , unsigned long>::iterator itMergedRefVertices = mapMergedRefVertices.begin();
952     itMergedRefVertices != mapMergedRefVertices.end();
953     itMergedRefVertices++)
954     {
955     CAD4FE::MCVertex * v = itMergedRefVertices->first;
956     MG_SOMMET * refV = NULL;
957     unsigned long id = itMergedRefVertices->second;
958     refV = (MG_SOMMET *) mggeo->get_mg_sommetid(id);
959     v->MergeRefVertex(refV);
960     }
961    
962     updatedMergedRefVertices = true;
963     }
964     }
965    
966     CAD4FE::MCNode* noeud=new CAD4FE::MCNode(id,mcTopo,refTopo,x,y,z);
967     mgmai->ajouter_mg_noeud(noeud);
968     }
969     if (entite=="CAD4FE_MCTRIANGLE")
970     {
971     parse.decode(data.c_str(),"@,@,@,@",param+2);
972     long idtopo=cid(param[2].argument[0]);
973     long idn1=cid(param[3].argument[0]);
974     long idn2=cid(param[4].argument[0]);
975     long idn3=cid(param[5].argument[0]);
976     CAD4FE::MCNode* noeud1=(CAD4FE::MCNode*)mgmai->get_mg_noeudid(idn1);
977     CAD4FE::MCNode* noeud2=(CAD4FE::MCNode*)mgmai->get_mg_noeudid(idn2);
978     CAD4FE::MCNode* noeud3=(CAD4FE::MCNode*)mgmai->get_mg_noeudid(idn3);
979     CAD4FE::MCSegment* mgsegment[3];
980     CAD4FE::MCNode *mgnoeud[3]={noeud1,noeud2,noeud3};
981     // la topo. d'un MCTriangle est obligatoirement une MCFace
982     CAD4FE::MCFace* mcFace=(CAD4FE::MCFace*)mggeo->get_mg_faceid(idtopo);
983     for (int i=0;i<3;i++)
984     {
985     mgsegment[i]=(CAD4FE::MCSegment*)mgmai->get_mg_segment(mgnoeud[i]->get_id(),mgnoeud[(i+1)%3]->get_id());
986     if (mgsegment[i]==NULL)
987     {
988     mgsegment[i]=new CAD4FE::MCSegment(mcFace,mgnoeud[i],mgnoeud[(i+1)%3]);
989     mgmai->ajouter_mg_segment(mgsegment[i]);
990     }
991     }
992     CAD4FE::M3D_MCTriangle *triangle = new CAD4FE::M3D_MCTriangle(id,mcFace,noeud1,noeud2,noeud3,mgsegment[0],mgsegment[1],mgsegment[2]);
993     mgmai->ajouter_mg_triangle(triangle);
994     }
995     }
996     }
997     while (param[0].argument[0]!="FIN");
998    
999     if (updatedMergedRefVertices == false)
1000     {
1001     for (std::multimap<CAD4FE::MCVertex * , unsigned long>::iterator itMergedRefVertices = mapMergedRefVertices.begin();
1002     itMergedRefVertices != mapMergedRefVertices.end();
1003     itMergedRefVertices++)
1004     {
1005     CAD4FE::MCVertex * v = itMergedRefVertices->first;
1006     MG_SOMMET * refV = NULL;
1007     unsigned long id = itMergedRefVertices->second;
1008     refV = (MG_SOMMET *) mggeo->get_mg_sommetid(id);
1009     v->MergeRefVertex(refV);
1010     }
1011    
1012     updatedMergedRefVertices = true;
1013     }
1014    
1015    
1016     fclose(in);
1017     #ifdef BREP_SLD
1018     fonction->Fermer();
1019     #endif
1020     return 1;
1021     }
1022    
1023    
1024    
1025