+sub draw_cat {
+ my($fig,$Cat,$Link)=@_;
+ my($cat,$e,$link);
+ foreach $cat (keys %$Cat) {
+ next unless (defined($$Cat{$cat}{Y_min}) &&
+ defined($$Cat{$cat}{Y_max}));
+ my($text) = new XFig ('text');
+ $text->{'text'} = $$Cat{$cat}{name};
+ $text->{'y'} = ($$Cat{$cat}{Y_min}+$$Cat{$cat}{Y_max})/2*$grid_Y_size+68;
+ $fig->add ($text);
+ }
+ foreach $cat (keys %$Cat) {
+ next unless (defined($$Cat{$cat}{Y_min}) &&
+ defined($$Cat{$cat}{Y_max}));
+ my(@states)=();
+ my($e);
+ foreach $e (@{$$Cat{$cat}{state}}) {
+ my($new_date,$state) = ($$e[0],$$e[1]);
+ if(defined($state)) {
+ push @states, $e;
+ } else {
+ my($old_event) = pop @states;
+ my($old_date) = $$old_event[0];
+ $state = $$old_event[1];
+
+ my($line) = new XFig ('polyline');
+
+ $line->{'subtype'} = 1; # line
+ $line->{'points'} = [ [$old_date*$grid_X_size, $$Cat{$cat}{Y_min}*$grid_Y_size],
+ [$new_date*$grid_X_size, $$Cat{$cat}{Y_min}*$grid_Y_size],
+ [$new_date*$grid_X_size, $$Cat{$cat}{Y_max}*$grid_Y_size],
+ [$old_date*$grid_X_size, $$Cat{$cat}{Y_max}*$grid_Y_size] ];
+ $line->{'areafill'} = 20;
+ if($state eq "S") {
+ $line->{'fillcolor'} = 1;
+ } elsif ($state eq "E") {
+ $line->{'fillcolor'} = 2;
+ } elsif ($state eq "B") {
+ $line->{'fillcolor'} = 3;
+ } elsif ($state eq "C") {
+ $line->{'fillcolor'} = 4;
+ }
+ $fig->add ($line);
+ }
+ }
+ }
+
+ foreach $link (keys %$Link) {
+ my($line) = new XFig ('polyline');
+ my($src_date)=$$Link{$link}{src_date};
+ my($src)=$$Link{$link}{src};
+ my($dst_date)=$$Link{$link}{dst_date};
+ my($dst)=$$Link{$link}{dst};
+ $line->{'subtype'} = 1; # line
+
+ $line->{'points'} = [ [$src_date*$grid_X_size,
+ ($$Cat{$src}{Y_min}+$$Cat{$src}{Y_max})/2*$grid_Y_size],
+ [$dst_date*$grid_X_size,
+ ($$Cat{$dst}{Y_min}+$$Cat{$dst}{Y_max})/2*$grid_Y_size] ];
+ $line->{'forwardarrow'} = ['1', '1', '1.00', '60.00', '120.00'];
+ $fig->add ($line);
+ }
+}
+