ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/compare/src/visufile.cpp
Revision: 364
Committed: Thu Oct 18 22:26:57 2012 UTC (12 years, 6 months ago) by francois
File size: 14121 byte(s)
Log Message:
Amelioration publi comparaison

File Contents

# User Rev Content
1 francois 363 //------------------------------------------------------------
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     // main.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H25
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23     #include "gestionversion.h"
24     #ifdef WINDOWS_VERSION
25     #include "fenetre.h"
26     #endif
27    
28     #pragma hdrstop
29     #include <iostream>
30     #include "mg_file.h"
31     #include <string.h>
32     #include <map>
33     //---------------------------------------------------------------------------
34    
35     void affiche(char* message)
36     {
37     #ifdef WINDOWS_VERSION
38     Form1->Memo1->Lines->Add(message);
39     #else
40     std::cout << message << std::endl;
41     #endif
42     }
43     #ifdef _COMPARESTEP_
44     #include "occ_import.h"
45     #endif
46     struct color
47     {
48     color(unsigned char r=255,unsigned char g=255,unsigned char b=255,unsigned char a=255) : R(r),G(g),B(b),A(a) {}
49     unsigned char R;
50     unsigned char G;
51     unsigned char B;
52     unsigned char A; //Alpha
53     };
54    
55     struct groupe_couleur
56     {
57     int num;
58     std::map<unsigned long,unsigned long> A;
59     std::map<unsigned long,unsigned long> B;
60     bool est_dans_A(unsigned long val)
61     {
62     std::map<unsigned long,unsigned long>::iterator it=A.find(val);
63     if (it!=A.end()) return true;
64     return false;
65     };
66     bool est_dans_B(unsigned long val)
67     {
68     std::map<unsigned long,unsigned long>::iterator it=B.find(val);
69     if (it!=B.end()) return true;
70     return false;
71     };
72     };
73    
74    
75    
76     struct data_fichier
77     {
78     std::string nomA;
79     std::string nomB;
80     std::map<int,groupe_couleur> list_face_similaire;
81     std::map<int,groupe_couleur> list_face_identique;
82     std::map<int,groupe_couleur> list_face_localise;
83     std::map<int,groupe_couleur> list_arete_localise;
84     std::map<int,groupe_couleur> list_sommet_localise;
85     std::map<int,groupe_couleur> list_face_modifie;
86     std::map<int,groupe_couleur> list_arete_modifie;
87     };
88    
89    
90     void ini_couleur(std::vector<color> &tabcoul,int dim)
91     {
92     int ecart=255/(dim+1);
93     std::map<int,int> list;
94     for (int i=0;i<dim*dim*dim;i++)
95     {
96     int r=rand()%dim+1;
97     int g=rand()%dim+1;
98     int b=rand()%dim+1;
99     int c=r*ecart+255*g*ecart+255*255*b*ecart;
100     std::pair<int,int> tmp(c,c);
101     std::pair<std::map<int,int>::iterator,bool> ret=list.insert(tmp);
102     if (ret.second==false) i--;
103     else
104     {
105     color cc(r*ecart,g*ecart,b*ecart);
106     tabcoul.push_back(cc);
107     }
108     }
109     }
110    
111    
112    
113     void ajouter_liste_couleur(std::map<int,groupe_couleur> &list,unsigned long valA,unsigned long valB)
114     {
115     static int num_couleur=0;
116     std::map<int,groupe_couleur>::iterator it;
117     for (it=list.begin();it!=list.end();it++)
118     {
119     bool res=it->second.est_dans_A(valA);
120     if (res==true)
121     {
122     it->second.A.insert(std::pair<unsigned long,unsigned long>(valA,valA));
123     it->second.B.insert(std::pair<unsigned long,unsigned long>(valB,valB));
124     return;
125     }
126    
127     res=it->second.est_dans_B(valB);
128     if (res==true)
129     {
130     it->second.A.insert(std::pair<unsigned long,unsigned long>(valA,valA));
131     it->second.B.insert(std::pair<unsigned long,unsigned long>(valB,valB));
132     return;
133     }
134    
135     }
136     groupe_couleur gc;
137     std::pair<std::map<int,groupe_couleur>::iterator,bool> ret=list.insert(std::pair<int,groupe_couleur>(num_couleur,gc));
138     ret.first->second.num=num_couleur;
139     ret.first->second.A.insert(std::pair<unsigned long,unsigned long>(valA,valA));
140     ret.first->second.B.insert(std::pair<unsigned long,unsigned long>(valB,valB));
141     num_couleur++;
142     }
143    
144    
145     void lire_fichier(char *nom,data_fichier &data)
146     {
147     FILE* in=fopen(nom,"rt");
148    
149     while (!feof(in))
150     {
151     char mess[255],mess2[255];
152     fgets(mess,255,in);
153     if (strlen(mess)>1)
154     if (mess[0]=='/')
155     if (mess[1]=='/') continue;
156     if (strcmp(mess,"Model A:\n")==0)
157     {
158     fgets(mess,255,in);
159     sscanf(mess,"%s",mess2);
160     data.nomA=mess2;
161     }
162     else if (strcmp(mess,"Model B:\n")==0)
163     {
164     fgets(mess,255,in);
165     sscanf(mess,"%s",mess2);
166     data.nomB=mess2;
167     }
168     else
169     {
170     char mot1[255],mot2[255],mot3[255];
171     int nb;
172     int n=sscanf(mess,"%d %s %s %s",&nb,mot1,mot2,mot3);
173     std::map<int,groupe_couleur> *list=NULL;
174     if (n>2)
175     {
176     if (strcmp(mot1,"Similar")==0)
177     if (strcmp(mot2,"faces")==0)
178     list= &(data.list_face_similaire);
179     if (strcmp(mot1,"Identical")==0)
180     if (strcmp(mot2,"faces")==0)
181     list= &(data.list_face_identique);
182     if (strcmp(mot1,"Localized")==0)
183     if (strcmp(mot2,"identical")==0)
184     if (strcmp(mot3,"faces")==0)
185     list=&(data.list_face_localise);
186     if (strcmp(mot1,"Localized")==0)
187     if (strcmp(mot2,"identical")==0)
188     if (strcmp(mot3,"edges")==0)
189     list=&(data.list_arete_localise);
190     if (strcmp(mot1,"Localized")==0)
191     if (strcmp(mot2,"identical")==0)
192     if (strcmp(mot3,"vertices")==0)
193     list=&(data.list_sommet_localise);
194     if (strcmp(mot1,"Localized")==0)
195     if (strcmp(mot2,"modified")==0)
196     if (strcmp(mot3,"faces")==0)
197     list=&(data.list_face_modifie);
198     if (strcmp(mot1,"Localized")==0)
199     if (strcmp(mot2,"modified")==0)
200     if (strcmp(mot3,"edges")==0)
201     list=&(data.list_arete_modifie);
202     if (list!=NULL)
203     for (int i=0;i<nb;i++)
204     {
205     fgets(mess,255,in);
206     unsigned long valA,valB;
207     sscanf(mess,"%lu %lu%",&valA,&valB);
208     ajouter_liste_couleur(*list,valA,valB);
209     }
210     }
211     }
212    
213    
214    
215     }
216    
217    
218    
219     fclose(in);
220     }
221    
222    
223     void affiche_structure(char* nom,char c,MG_GEOMETRIE* geo,MG_MAILLAGE* mai,bool A,std::vector<color> &tabcoul, std::map<int,groupe_couleur> &list_face, std::map<int,groupe_couleur> &list_arete, std::map<int,groupe_couleur> &list_sommet)
224     {
225     char nomtmp[500];
226     strcpy(nomtmp,nom);
227     int i=0;
228     while (nomtmp[i]!=0)
229     {
230     if (nomtmp[i]=='.') {nomtmp[i]=0;break;}
231     i++;
232     }
233     char nomfichier[500];
234     if (A==true) sprintf(nomfichier,"%s_%c_A.vtk",nomtmp,c);
235     else sprintf(nomfichier,"%s_%c_B.vtk",nomtmp,c);
236     std::map<unsigned long,int> correspondance;
237     std::map<int,groupe_couleur>::iterator it;
238     for (it=list_face.begin();it!=list_face.end();it++)
239     {
240     groupe_couleur gc=it->second;
241     int numcolor=gc.num;
242     std::map<unsigned long,unsigned long>::iterator it2;
243     std::map<unsigned long,unsigned long> *tmp;
244     if (A==true) tmp=&(gc.A);
245     else tmp=&(gc.B);
246     for (it2=tmp->begin();it2!=tmp->end();it2++)
247     {
248     unsigned long idface=it2->second;
249     correspondance.insert(std::pair<unsigned long,int>(idface,numcolor) );
250     }
251     }
252     for (it=list_arete.begin();it!=list_arete.end();it++)
253     {
254     groupe_couleur gc=it->second;
255     int numcolor=gc.num;
256     std::map<unsigned long,unsigned long>::iterator it2;
257     std::map<unsigned long,unsigned long> *tmp;
258     if (A==true) tmp=&(gc.A);
259     else tmp=&(gc.B);
260     for (it2=tmp->begin();it2!=tmp->end();it2++)
261     {
262     unsigned long idarete=it2->second;
263     correspondance.insert(std::pair<unsigned long,int>(idarete,numcolor) );
264     }
265     }
266     for (it=list_sommet.begin();it!=list_sommet.end();it++)
267     {
268     groupe_couleur gc=it->second;
269     int numcolor=gc.num;
270     std::map<unsigned long,unsigned long>::iterator it2;
271     std::map<unsigned long,unsigned long> *tmp;
272     if (A==true) tmp=&(gc.A);
273     else tmp=&(gc.B);
274     for (it2=tmp->begin();it2!=tmp->end();it2++)
275     {
276     unsigned long idsommet=it2->second;
277     correspondance.insert(std::pair<unsigned long,int>(idsommet,numcolor) );
278     }
279     }
280     FILE* out=fopen(nomfichier,"wt");
281     fprintf(out,"# vtk DataFile Version 2.0\n");
282     fprintf(out,"vtk output\n");
283     fprintf(out,"ASCII\n");
284     fprintf(out,"DATASET POLYDATA\n");
285     int nbnoeud=mai->get_nb_mg_noeud();
286     TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg;
287     LISTE_MG_SEGMENT::iterator itseg;
288     for (MG_SEGMENT* seg=mai->get_premier_segment(itseg);seg!=NULL;seg=mai->get_suivant_segment(itseg))
289     if (seg->get_lien_topologie()->get_dimension()==1) lstseg.ajouter(seg);
290     fprintf(out,"POINTS %d double\n",nbnoeud);
291     LISTE_MG_NOEUD::iterator itn;
292     i=0;
293     for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
294     {
295     fprintf(out,"%lf %lf %lf\n",no->get_x(),no->get_y(),no->get_z());
296     no->change_nouveau_numero(i);
297     i++;
298     }
299     fprintf(out,"VERTICES %d %d\n",geo->get_nb_mg_sommet(),2*geo->get_nb_mg_sommet());
300     LISTE_MG_SOMMET::iterator its;
301     for (MG_SOMMET* som=geo->get_premier_sommet(its);som!=NULL;som=geo->get_suivant_sommet(its))
302     {
303     MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(0);
304     fprintf(out,"1 %d\n",no->get_nouveau_numero());
305     }
306     fprintf(out,"LINES %d %d\n",lstseg.get_nb(),lstseg.get_nb()*3);
307     for (int j=0;j<lstseg.get_nb();j++)
308     fprintf(out,"2 %d %d\n",lstseg.get(j)->get_noeud1()->get_nouveau_numero(),lstseg.get(j)->get_noeud2()->get_nouveau_numero());
309    
310     fprintf(out,"POLYGONS %d %d\n",mai->get_nb_mg_triangle(),4*mai->get_nb_mg_triangle());
311     LISTE_MG_TRIANGLE::iterator itt;
312     for (MG_TRIANGLE* tri=mai->get_premier_triangle(itt);tri!=NULL;tri=mai->get_suivant_triangle(itt))
313     fprintf(out,"3 %d %d %d\n",tri->get_noeud1()->get_nouveau_numero(),tri->get_noeud2()->get_nouveau_numero(),tri->get_noeud3()->get_nouveau_numero());
314     fprintf(out,"CELL_DATA %d\n",geo->get_nb_mg_sommet()+lstseg.get_nb()+mai->get_nb_mg_triangle());
315     fprintf(out,"COLOR_SCALARS color 4\n");
316     for (MG_SOMMET* som=geo->get_premier_sommet(its);som!=NULL;som=geo->get_suivant_sommet(its))
317     {
318     double r=0.;
319     double g=0.;
320     double b=0.;
321     if (c!='L') {r=1.;g=1.;b=1.;}
322     unsigned long id=som->get_id();
323     std::map<unsigned long,int>::iterator it=correspondance.find(id);
324     if (it!=correspondance.end())
325     {
326     int num=it->second;
327     r=tabcoul[num].R*1./255.;
328     g=tabcoul[num].G*1./255.;
329     b=tabcoul[num].B*1./255.;
330     }
331     fprintf(out,"%lf %lf %lf 1.\n",r,g,b);
332     }
333     for (int j=0;j<lstseg.get_nb();j++)
334     {
335     double r=0.;
336     double g=0.;
337     double b=0.;
338     if (c!='L') {r=1.;g=1.;b=1.;}
339     unsigned long id=lstseg.get(j)->get_lien_topologie()->get_id();
340     std::map<unsigned long,int>::iterator it=correspondance.find(id);
341     if (it!=correspondance.end())
342     {
343     int num=it->second;
344     r=tabcoul[num].R*1./255.;
345     g=tabcoul[num].G*1./255.;
346     b=tabcoul[num].B*1./255.;
347     }
348     fprintf(out,"%lf %lf %lf 1.\n",r,g,b);
349     }
350     for (MG_TRIANGLE* tri=mai->get_premier_triangle(itt);tri!=NULL;tri=mai->get_suivant_triangle(itt))
351     {
352     double r=0.;
353     double g=0.;
354     double b=0.;
355     //if (c!='L') {r=1.;g=1.;b=1.;}
356     unsigned long id=tri->get_lien_topologie()->get_id();
357     std::map<unsigned long,int>::iterator it=correspondance.find(id);
358     if (it!=correspondance.end())
359     {
360     int num=it->second;
361     r=tabcoul[num].R*1./255.;
362     g=tabcoul[num].G*1./255.;
363     b=tabcoul[num].B*1./255.;
364     }
365     fprintf(out,"%lf %lf %lf 1.\n",r,g,b);
366     }
367     fclose(out);
368    
369    
370    
371    
372    
373     };
374    
375    
376    
377    
378    
379    
380    
381     #ifdef WINDOWS_VERSION
382     int amain(int argc,char **argv)
383     #else
384     int main(int argc,char **argv)
385     #endif
386     {
387    
388     printf("******************************\n");
389     printf("* VTK Comparison *\n");
390     printf("* visualization export *\n");
391     printf("* by *\n");
392     printf("* Jean-Christophe Cuillière *\n");
393     printf("* and *\n");
394     printf("* Vincent Francois *\n");
395     printf("* ERICCA-UQTR *\n");
396     printf("******************************\n\n\n");
397    
398     if (argc!=2)
399     {
400     printf("Visufile syntax error - Bad number arguments\n\n");
401     return 0;
402    
403     }
404    
405    
406     std::map<int,groupe_couleur> list_vide;
407     std::vector<color> tabcoul;
408     ini_couleur(tabcoul,10);
409     bool A=true;
410     bool B=false;
411     data_fichier df;
412     lire_fichier(argv[1],df);
413     #ifdef _COMPARESTEP_
414     MG_GESTIONNAIRE gesta;
415     MG_GESTIONNAIRE gestb;
416     OCC_IMPORT occimport;
417     MG_GEOMETRIE* geo1=occimport.importer(gesta,(char*)df.nomA.c_str(),FICHIERSTEP,1.,1e-6);
418     MG_GEOMETRIE* geo2=occimport.importer(gestb,(char*)df.nomB.c_str(),FICHIERSTEP,1.,1e-6);
419 francois 364 occimport.importer(gesta,geo1,1.,2);
420     occimport.importer(gestb,geo2,1.,2);
421 francois 363 #else
422     MG_FILE gesta((char*)df.nomA.c_str());
423     MG_FILE gestb((char*)df.nomB.c_str());
424     #endif
425     printf(" Similar faces : %d\n",df.list_face_similaire.size());
426     printf(" Identical faces : %d\n",df.list_face_identique.size());
427     printf(" Localized faces : %d\n",df.list_face_localise.size());
428     printf(" Localized edges : %d\n",df.list_arete_localise.size());
429     printf(" Localized vertices : %d\n",df.list_sommet_localise.size());
430     printf(" Modified faces : %d \n",df.list_face_modifie.size());
431     printf(" Modified edges : %d\n",df.list_arete_modifie.size());
432    
433    
434     MG_GEOMETRIE* geoa=gesta.get_mg_geometrie(0);
435     MG_GEOMETRIE* geob=gestb.get_mg_geometrie(0);
436     MG_MAILLAGE* maia=gesta.get_mg_maillage(0);
437     MG_MAILLAGE* maib=gestb.get_mg_maillage(0);
438     affiche_structure(argv[1],'M',geoa,maia,A,tabcoul,df.list_face_modifie,df.list_arete_modifie,list_vide);
439     affiche_structure(argv[1],'I',geoa,maia,A,tabcoul,df.list_face_identique,list_vide,list_vide);
440     affiche_structure(argv[1],'S',geoa,maia,A,tabcoul,df.list_face_similaire,list_vide,list_vide);
441     affiche_structure(argv[1],'L',geoa,maia,A,tabcoul,df.list_face_localise,df.list_arete_localise,df.list_sommet_localise);
442     affiche_structure(argv[1],'M',geob,maib,B,tabcoul,df.list_face_modifie,df.list_arete_modifie,list_vide);
443     affiche_structure(argv[1],'I',geob,maib,B,tabcoul,df.list_face_identique,list_vide,list_vide);
444     affiche_structure(argv[1],'S',geob,maib,B,tabcoul,df.list_face_similaire,list_vide,list_vide);
445     affiche_structure(argv[1],'L',geob,maib,B,tabcoul,df.list_face_localise,df.list_arete_localise,df.list_sommet_localise);
446     return 0;
447     }
448    
449    
450    
451     #pragma package(smart_init)