Algorithmique Numérique Distribuée Public GIT Repository
1 #!/usr/bin/perl -w
2 use strict;
3 #use Data::Dumper;
4 use XFig;
6 my(\$grid_Y_size)=225; # xfig
7 my(\$grid_X_size)=550; # xfig
10     my(%Cat);
11     my(\$filename)=@_;
12     my(\$line);
14     open INPUT, \$filename;
16     while (defined(\$line=<INPUT>)) {
17         chomp \$line;
18         if(\$line =~ /^7\s/) {
19             my(\$event,\$date,\$id,\$type,\$father,@name) = split(/\s+/,\$line);
21             \$Cat{\$id}{name}="@name ";
22             \$Cat{\$id}{name}=~s/\"//g;
23             \$Cat{\$id}{father}=\$father;
24             \$Cat{\$id}{type}=\$type;
25             \$Cat{\$id}{date}=\$date;
26         }
27     }
28     close INPUT;
29     return \%Cat;
30 }
34     my(\$filename,\$Cat)=@_;
35     my(\$line);
37     open INPUT, \$filename;
39     while (defined(\$line=<INPUT>)) {
40         chomp \$line;
41         if(\$line =~ /^11\s/) {
42             my(\$event,\$date,\$type,\$id,\$state) = split(/\s+/,\$line);
43             push @{\$\$Cat{\$id}{state}}, [\$date,\$state];
44         }
45         if(\$line =~ /^12\s/) {
46             my(\$event,\$date,\$type,\$id) = split(/\s+/,\$line);
47             push @{\$\$Cat{\$id}{state}}, [\$date];
48         }
49     }
50     close INPUT;
51 }
54     my(\$filename)=@_;
55     my(\$line);
58     open INPUT, \$filename;
60     while (defined(\$line=<INPUT>)) {
61         chomp \$line;
62         if(\$line =~ /^16\s/) {
63             my(\$event,\$date,\$type,\$father,\$channel,\$src,\$key) = split(/\t+/,\$line);
66         }
67         if(\$line =~ /^17\s/) {
68             my(\$event,\$date,\$type,\$father,\$channel,\$dst,\$key) = split(/\t+/,\$line);
71         }
72     }
73     close INPUT;
75 }
78 sub build_cat_tree {
79     my(\$root,\$Cat)=@_;
80     my(@childs)=();
81     my(\$cat);
83     foreach \$cat (keys %\$Cat) {
84         if(\$\$Cat{\$cat}{father} eq \$root) {
85             push @childs, build_cat_tree(\$cat,\$Cat);
86         }
87 #       print "\$\$Cat{\$cat}{name}\t\t \$Cat{\$cat}{father}\n";
88     }
90     return [\$root,@childs];
91 }
93 sub build_cat_list {
94     my(\$tree,\$cat_list)=@_;
95     my(\$root) = shift @\$tree;
96     my(\$u);
98     push @\$cat_list,\$root;
100     foreach \$u (@\$tree) {
101         build_cat_list(\$u,\$cat_list);
102     }
103     unshift @\$tree, \$root;
104 }
107 sub set_cat_position {
108     my(\$Cat,\$cat_list)=@_;
109     my(\$i)=0;
110     my(\$cat);
111     foreach \$cat (@\$cat_list) {
112         if(defined(\$\$Cat{\$cat}{state})) {
113             \$\$Cat{\$cat}{Y_min} = \$i;
114             \$\$Cat{\$cat}{Y_max} = \$i+1;
115             \$i++;
116         }
117     }
118 }
120 sub create_fig {
121     my(\$filename)=shift;
122     my(\$fig)=new XFig;
123     \$fig->{object} = 'compound'; # Compound
124     \$fig->{elements} = [];
125     \$fig->{version} = 3.2;
126     \$fig->{orientation}   = 'Landscape';
127     \$fig->{justification} = 'Center';
128     \$fig->{units}         = 'Metric';
129     \$fig->{papersize}     = 'A4';
130     \$fig->{magnification} = '100.00';
131     \$fig->{multiplepage}  = 'Single';
132     \$fig->{transparent}   = '-2';
133     \$fig->{resolution}    = '1200';
134     \$fig->{coordsystem}   = '2';
135     \$fig->{filename}   = \$filename;
136     return \$fig;
137 }
139 sub draw_cat {
142     foreach \$cat (keys %\$Cat) {
143         next unless (defined(\$\$Cat{\$cat}{Y_min}) &&
144                      defined(\$\$Cat{\$cat}{Y_max}));
145         my(\$text) = new XFig ('text');
146         \$text->{'text'} = "\$\$Cat{\$\$Cat{\$cat}{father}}{name}"."\$\$Cat{\$cat}{name}";
147         \$text->{'y'} = (\$\$Cat{\$cat}{Y_min}+\$\$Cat{\$cat}{Y_max})/2*\$grid_Y_size+68;
149     }
150     foreach \$cat (keys %\$Cat) {
151         next unless (defined(\$\$Cat{\$cat}{Y_min}) &&
152                      defined(\$\$Cat{\$cat}{Y_max}));
153         my(@states)=();
154         my(\$e);
155         foreach \$e (@{\$\$Cat{\$cat}{state}}) {
156             my(\$new_date,\$state) = (\$\$e[0],\$\$e[1]);
157             if(defined(\$state)) {
158                 push @states, \$e;
159             } else {
160                 my(\$old_event) = pop @states;
161                 my(\$old_date) = \$\$old_event[0];
162                 \$state = \$\$old_event[1];
164                 my(\$line) = new XFig ('polyline');
166                 \$line->{'depth'} = 50;  # line
167                 \$line->{'subtype'} = 1;  # line
168                 \$line->{'points'} = [ [\$old_date*\$grid_X_size, \$\$Cat{\$cat}{Y_min}*\$grid_Y_size],
169                                       [\$new_date*\$grid_X_size, \$\$Cat{\$cat}{Y_min}*\$grid_Y_size],
170                                       [\$new_date*\$grid_X_size, \$\$Cat{\$cat}{Y_max}*\$grid_Y_size],
171                                       [\$old_date*\$grid_X_size, \$\$Cat{\$cat}{Y_max}*\$grid_Y_size] ];
172                 \$line->{'areafill'} = 20;
173                 if(\$state eq "S") {
174                     \$line->{'fillcolor'} = 1;
175                 } elsif (\$state eq "E") {
176                     \$line->{'fillcolor'} = 2;
177                 } elsif (\$state eq "B") {
178                     \$line->{'fillcolor'} = 3;
179                 } elsif (\$state eq "C") {
180                     \$line->{'fillcolor'} = 4;
181                 }
183             }
184         }
185     }
188         my(\$line) = new XFig ('polyline');
193         \$line->{'subtype'} = 1;  # line
195         print STDERR "\$src -> \$dst\n";
197         print STDERR "\$\$Cat{\$src}{name} -> \$\$Cat{\$dst}{name}\n";
198         \$line->{'points'} = [ [\$src_date*\$grid_X_size,
199                                (\$\$Cat{\$src}{Y_min}+\$\$Cat{\$src}{Y_max})/2*\$grid_Y_size],
200                               [\$dst_date*\$grid_X_size,
201                                (\$\$Cat{\$dst}{Y_min}+\$\$Cat{\$dst}{Y_max})/2*\$grid_Y_size] ];
202         \$line->{'forwardarrow'} = ['1', '1', '1.00', '60.00', '120.00'];
204     }
205 }
207 sub main {
209     my(\$cat_tree)=build_cat_tree("0",\$Cat);
212 #    print Dumper(\$cat_tree);
213 #    print Dumper(\$Cat);
214     my(\$cat_list)=[];
215     build_cat_list(\$cat_tree,\$cat_list);
216     shift @\$cat_list;
217     shift @\$cat_list;
218     print "@\$cat_list \n";
220     set_cat_position(\$Cat,\$cat_list);
222     my(\$fig)=create_fig("toto.fig");