| FigAnim documentation | Contained in the FigAnim distribution. |
Compound - A XFig file animator class - Compound object
Compound object - object code in FIG format: 6. Here are all the attributes of this class:
upperleft_corner_x, upperleft_corner_y, lowerright_corner_x, lowerright_corner_y, arcs, compounds, ellipses, polylines, splines, texts, center_x, center_y
Fig units
Fig units
Fig units
Fig units
arrays containing every object's name classified by type
calculated center (Fig units)
| FigAnim documentation | Contained in the FigAnim distribution. |
package Compound;
use strict; use warnings; # useful classes use FigAnim::Utils; # constructor sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; $self->{name} = shift; # object's name in comment #$self->{object_code} = 6; $self->{upperleft_corner_x} = shift; $self->{upperleft_corner_y} = shift; $self->{lowerright_corner_x} = shift; $self->{lowerright_corner_y} = shift; # reference to the FigFile $self->{fig_file} = shift; # arrays containing every object's name classified by type $self->{arcs} = []; $self->{compounds} = []; $self->{ellipses} = []; $self->{polylines} = []; $self->{splines} = []; $self->{texts} = []; # calculated center $self->{center_x} = undef; $self->{center_y} = undef; bless ($self, $class); return $self; } # methods sub clone { my $self = shift; my $obj = new Compound; $obj->{$_} = $self->{$_} foreach (keys %{$self}); return $obj; } sub output { my $self = shift; my $fh = shift; foreach (split(/\n/, $self->{name})) { printf $fh "# $_\n"; } printf $fh "6 %d %d %d %d\n", @$self{'upperleft_corner_x','upperleft_corner_y','lowerright_corner_x', 'lowerright_corner_y'}; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->output($fh); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->output($fh); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->output($fh); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->output($fh); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->output($fh); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->output($fh); } print $fh "-6\n"; } sub calculateCenter { my $self = shift; $self->{center_x} = sprintf("%.0f",($self->{upperleft_corner_x} + $self->{lowerright_corner_x}) / 2); $self->{center_y} = sprintf("%.0f",($self->{upperleft_corner_y} + $self->{lowerright_corner_y}) / 2); } # objects selectors sub selectByType { my $self = shift; my $res = new Compound("",0,0,0,0,$self->{fig_file}); foreach (@_) { push @{$res->{$_}}, @{$self->{$_}}; } foreach (@{$self->{compounds}}) { my $aux = $self->{fig_file}->{objects}->{$_}->selectByType(@_); foreach (@_) { push @{$res->{$_}}, @{$aux->{$_}}; } } return $res; } sub selectByPenColor { my $self = shift; my $res = new Compound("",0,0,0,0,$self->{fig_file}); foreach (@_) { my $color = $FigAnim::Utils::colors_codes{$_}; if (defined $color) { foreach (@{$self->{arcs}}) { if ($self->{fig_file}->{objects}->{$_}->{pen_color} == $color){ push @{$res->{arcs}}, $_; } } foreach (@{$self->{ellipses}}) { if ($self->{fig_file}->{objects}->{$_}->{pen_color} == $color){ push @{$res->{ellipses}}, $_; } } foreach (@{$self->{polylines}}) { if ($self->{fig_file}->{objects}->{$_}->{pen_color} == $color){ push @{$res->{polylines}}, $_; } } foreach (@{$self->{splines}}) { if ($self->{fig_file}->{objects}->{$_}->{pen_color} == $color){ push @{$res->{splines}}, $_; } } foreach (@{$self->{texts}}) { if ($self->{fig_file}->{objects}->{$_}->{pen_color} == $color){ push @{$res->{texts}}, $_; } } } } foreach (@{$self->{compounds}}) { my $aux = $self->{fig_file}->{objects}->{$_}->selectByPenColor(@_); push @{$res->{arcs}}, @{$aux->{arcs}}; push @{$res->{ellipses}}, @{$aux->{ellipses}}; push @{$res->{polylines}}, @{$aux->{polylines}}; push @{$res->{splines}}, @{$aux->{splines}}; push @{$res->{texts}}, @{$aux->{texts}}; } return $res; } sub selectByFillColor { my $self = shift; my $res = new Compound("",0,0,0,0,$self->{fig_file}); foreach (@_) { my $color = $FigAnim::Utils::colors_codes{$_}; if (defined $color) { foreach (@{$self->{arcs}}) { if ($self->{fig_file}->{objects}->{$_}->{fill_color}==$color) { push @{$res->{arcs}}, $_; } } foreach (@{$self->{ellipses}}) { if ($self->{fig_file}->{objects}->{$_}->{fill_color}==$color) { push @{$res->{ellipses}}, $_; } } foreach (@{$self->{polylines}}) { if ($self->{fig_file}->{objects}->{$_}->{fill_color}==$color) { push @{$res->{polylines}}, $_; } } foreach (@{$self->{splines}}) { if ($self->{fig_file}->{objects}->{$_}->{fill_color}==$color) { push @{$res->{splines}}, $_; } } } } foreach (@{$self->{compounds}}) { my $aux = $self->{fig_file}->{objects}->{$_}->selectByFillColor(@_); push @{$res->{arcs}}, @{$aux->{arcs}}; push @{$res->{ellipses}}, @{$aux->{ellipses}}; push @{$res->{polylines}}, @{$aux->{polylines}}; push @{$res->{splines}}, @{$aux->{splines}}; } return $res; } sub selectByAttributeValue { my $self = shift; my $res = new Compound("",0,0,0,0,$self); my @params = @_; while (@params) { my $attribute = shift @params; my $value = shift @params; foreach (@{$self->{arcs}}) { if ((defined $self->{fig_file}->{objects}->{$_}->{$attribute}) && ($self->{fig_file}->{objects}->{$_}->{$attribute} eq $value)) { push @{$res->{arcs}}, $_; } } foreach (@{$self->{compounds}}) { if ((defined $self->{fig_file}->{objects}->{$_}->{$attribute}) && ($self->{fig_file}->{objects}->{$_}->{$attribute} eq $value)) { push @{$res->{compounds}}, $_; } } foreach (@{$self->{ellipses}}) { if ((defined $self->{fig_file}->{objects}->{$_}->{$attribute}) && ($self->{fig_file}->{objects}->{$_}->{$attribute} eq $value)) { push @{$res->{ellipses}}, $_; } } foreach (@{$self->{polylines}}) { if ((defined $self->{fig_file}->{objects}->{$_}->{$attribute}) && ($self->{fig_file}->{objects}->{$_}->{$attribute} eq $value)) { push @{$res->{polylines}}, $_; } } foreach (@{$self->{splines}}) { if ((defined $self->{fig_file}->{objects}->{$_}->{$attribute}) && ($self->{fig_file}->{objects}->{$_}->{$attribute} eq $value)) { push @{$res->{splines}}, $_; } } foreach (@{$self->{texts}}) { if ((defined $self->{fig_file}->{objects}->{$_}->{$attribute}) && ($self->{fig_file}->{objects}->{$_}->{$attribute} eq $value)) { push @{$res->{texts}}, $_; } } } foreach (@{$self->{compounds}}) { my $aux=$self->{fig_file}->{objects}->{$_}->selectByAttributeValue(@_); push @{$res->{arcs}}, @{$aux->{arcs}}; push @{$res->{compounds}}, @{$aux->{compounds}}; push @{$res->{ellipses}}, @{$aux->{ellipses}}; push @{$res->{polylines}}, @{$aux->{polylines}}; push @{$res->{splines}}, @{$aux->{splines}}; push @{$res->{texts}}, @{$aux->{texts}}; } return $res; } # animation methods sub setAttributeValue { my $self = shift; my $time = shift; my $attribute = shift; my $value = shift; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->setAttributeValue($time,$attribute, $value); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->setAttributeValue($time,$attribute, $value); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->setAttributeValue($time,$attribute, $value); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->setAttributeValue($time,$attribute, $value); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->setAttributeValue($time,$attribute, $value); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->setAttributeValue($time,$attribute, $value); } } sub setPenColor { my $self = shift; my $time = shift; my $color = $FigAnim::Utils::colors_codes{shift}; if (defined $color) { $self->setAttributeValue($time,'pen_color',$color); } } sub setFillColor { my $self = shift; my $time = shift; my $color = $FigAnim::Utils::colors_codes{shift}; if (defined $color) { $self->setAttributeValue($time,'fill_color',$color); } } sub hide { my $self = shift; my $time = shift; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->hide($time); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->hide($time); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->hide($time); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->hide($time); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->hide($time); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->hide($time); } } sub show { my $self = shift; my $time = shift; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->show($time); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->show($time); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->show($time); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->show($time); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->show($time); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->show($time); } } sub changeThickness { my $self = shift; my $beginning = shift; my $duration = shift; my $thickness = shift; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->changeThickness($beginning, $duration, $thickness); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->changeThickness($beginning, $duration, $thickness); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->changeThickness($beginning, $duration, $thickness); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->changeThickness($beginning, $duration, $thickness); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->changeThickness($beginning, $duration, $thickness); } } sub changeFillIntensity { my $self = shift; my $beginning = shift; my $duration = shift; my $intensity = shift; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->changeFillIntensity($beginning, $duration, $intensity); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->changeFillIntensity($beginning, $duration, $intensity); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->changeFillIntensity($beginning, $duration, $intensity); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->changeFillIntensity($beginning, $duration, $intensity); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->changeFillIntensity($beginning, $duration, $intensity); } } sub translate { my $self = shift; my $beginning = shift; my $duration = shift; my $x = shift; my $y = shift; my $unit = shift; $unit = '' if (!(defined $unit)); my @anim = (16, $self->{name}, $beginning, $duration, $x, $y, $unit); push @{$self->{fig_file}->{animations}}, \@anim; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->translate($beginning, $duration, $x, $y, $unit); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->translate($beginning, $duration, $x, $y, $unit); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->translate($beginning, $duration, $x, $y, $unit); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->translate($beginning, $duration, $x, $y, $unit); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->translate($beginning, $duration, $x, $y, $unit); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->translate($beginning, $duration, $x, $y, $unit); } } sub rotate { my $self = shift; my $beginning = shift; my $duration = shift; my $angle = shift; my $c_x = shift; my $c_y = shift; if (!((defined $c_x) && (defined $c_y))) { $c_x = $self->{center_x}; $c_y = $self->{center_y}; } my $unit = shift; $unit = '' if (!(defined $unit)); my @anim = (26, $self->{name},$beginning,$duration,$angle,$c_x,$c_y,$unit); push @{$self->{fig_file}->{animations}}, \@anim; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->rotate($beginning,$duration,$angle, $c_x,$c_y,$unit); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->rotate($beginning,$duration,$angle, $c_x,$c_y,$unit); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->rotate($beginning,$duration,$angle, $c_x,$c_y,$unit); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->rotate($beginning,$duration,$angle, $c_x,$c_y,$unit); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->rotate($beginning,$duration,$angle, $c_x,$c_y,$unit); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->rotate($beginning,$duration,$angle, $c_x,$c_y,$unit); } } sub scale { my $self = shift; my $beginning = shift; my $duration = shift; my $scale = shift; my $c_x = shift; my $c_y = shift; if (!((defined $c_x) && (defined $c_y))) { $c_x = $self->{center_x}; $c_y = $self->{center_y}; } my @anim = (36, $self->{name},$beginning,$duration,$scale,$c_x,$c_y); push @{$self->{fig_file}->{animations}}, \@anim; foreach (@{$self->{arcs}}) { $self->{fig_file}->{objects}->{$_}->scale($beginning,$duration,$scale, $c_x,$c_y); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->scale($beginning,$duration,$scale, $c_x,$c_y); } foreach (@{$self->{ellipses}}) { $self->{fig_file}->{objects}->{$_}->scale($beginning,$duration,$scale, $c_x,$c_y); } foreach (@{$self->{polylines}}) { $self->{fig_file}->{objects}->{$_}->scale($beginning,$duration,$scale, $c_x,$c_y); } foreach (@{$self->{splines}}) { $self->{fig_file}->{objects}->{$_}->scale($beginning,$duration,$scale, $c_x,$c_y); } foreach (@{$self->{texts}}) { $self->{fig_file}->{objects}->{$_}->scale($beginning,$duration,$scale, $c_x,$c_y); } } # outputs a SVG element sub outputSVG { my $self = shift; my $fh = shift; my ($colors) = @_; foreach (split(/\n/, $self->{name})) { print $fh "<!-- $_ -->\n"; } print $fh "<g>\n"; my @objects = @{$self->{arcs}}; push @objects, @{$self->{ellipses}}; push @objects, @{$self->{polylines}}; push @objects, @{$self->{splines}}; push @objects, @{$self->{texts}}; # sorts objects by depth @objects = sort { if ($self->{fig_file}->{objects}->{$a}->{depth} < $self->{fig_file}->{objects}->{$b}->{depth}) { return 1; } elsif ($self->{fig_file}->{objects}->{$a}->{depth} == $self->{fig_file}->{objects}->{$b}->{depth}) { return 0; } else { return -1; } } @objects; foreach (@objects) { $self->{fig_file}->{objects}->{$_}->outputSVG($fh, $colors); } foreach (@{$self->{compounds}}) { $self->{fig_file}->{objects}->{$_}->outputSVG($fh, $colors); } print $fh "</g>\n\n"; } 1;