ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/fichier/src/mg_file.cpp
Revision: 102
Committed: Mon May 26 11:51:43 2008 UTC (16 years, 11 months ago) by francois
Original Path: magic/lib/fichier/fichier/src/mg_file.cpp
File size: 53529 byte(s)
Log Message:
mise a jour linux des versions lib

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