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, 10 months ago) by francois
File size: 14121 byte(s)
Log Message:
Amelioration publi comparaison

File Contents

# Content
1 //------------------------------------------------------------
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 occimport.importer(gesta,geo1,1.,2);
420 occimport.importer(gestb,geo2,1.,2);
421 #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)