# Copyright (c) 1997-2006 # Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany) # http://www.math.tu-berlin.de/polymake, mailto:polymake@math.tu-berlin.de # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any # later version: http://www.gnu.org/licenses/gpl.txt. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. #----------------------------------------------------------------------------- # $Project: polymake $$Id: JavaView.pm 7476 2006-11-28 17:16:30Z gawrilow $ use strict; require 'JavaView.def'; package JavaView::File; use Struct ( [ new => '$;$' ], [ '$workfile' => '#1' ], [ '$title' => '#2' ], '@geometries', [ '$unnamed' => '0' ], ); sub append { my $self = shift; push @{$self->geometries}, @_; foreach (@_) { if (length($_->{name})) { if (!length($self->title)) { $self->title=$_->{name}; } } else { $_->{name}="unnamed__" . ++$self->unnamed; } } } sub header { my ($self) = @_; my $who=$ENV{USER}; my $when=localtime(); my $title=$self->title; if (!length($title)) { $title="unnamed"; } return <<"."; 1.0 $title . } sub trailer { return <<"."; . } sub toString { my $self=shift; $self->header . join("", map { $_->toString } @{$self->geometries}) . $self->trailer; } sub print_it { my ($self) = @_; open my $file, ">".$self->workfile or die ref($self), "::print_it: could not write file ", $self->workfile, ": $!\n"; print $file $self->toString; close $file; } ############################################################################################## # # Basis class for all graphical objects handled by javaview # package JavaView::geometry; sub new { my $class = shift; my $self = { @_ }; bless $self, $class; $self->initialize; return $self; } sub initialize { my $self=shift; if (! exists $self->{name}) { $self->{name}="geometry"; } if (! exists $self->{points}) { croak( ref($self), "::initialize: parameter 'points' missing" ); } if (! exists $self->{pointSet_dim}) { croak( ref($self), "::initialize: parameter 'pointSet_dim' missing" ); } $self->{pointSet_point_flag} ||= "show"; if (! exists $self->{points_thickness}) { $self->{points_thickness}=$JavaView::default::points_thickness; } $self->{pointSet_thicknesses_flag} ||= exists $self->{points_thicknesses_list} ? "show" : "hide"; $self->{pointSet_color_flag} = exists $self->{points_colors_list} ? "show" : "hide"; } sub header { my ($self)=@_; my $attr=" name=\"$self->{name}\""; if (defined $self->{visibleFlag}) { $attr .= " visible=\"$self->{visibleFlag}\""; } return <<"."; . } sub trailer { return <<"."; . } sub color_list { my ($self, $name)=@_; my $text=""; if (exists $self->{$name}) { $text .= <<"."; . foreach (@{$self->{$name}}) { my @color = /\d+/g; $text .= <<"."; @color . } $text .= <<"."; . } return $text; } sub thickness_list { my ($self, $name)=@_; my $text=""; if (exists $self->{$name}) { $text .= <<"."; . foreach (@{$self->{$name}}) { /[.\d]+/; $text .= <<"."; $& . } $text .= <<"."; . } return $text; } sub pointSet { my ($self) = @_; my $text=""; $text .= <<"."; . my $k=0; my $labels=$self->{points_labels_list}; foreach (@{$self->{points}}) { my $point=$_; chomp $point; my $attr=""; if (defined($labels)) { $attr=' name="' . $labels->($k) . '"'; } $text .= " $point

\n"; ++$k; } if (exists $self->{points_thickness}) { $text .= <<"."; $self->{points_thickness} . } if (exists $self->{points_color}) { $text .= <<"."; $self->{points_color} . } my $show_labels= defined($labels) ? "show" : "hide"; $text .= <<"." . $self->color_list('points_colors_list') . $self->thickness_list('points_thicknesses_list') . <<"..";
.
.. } sub toString { my $self=shift; return $self->header . $self->pointSet . $self->trailer; } ############################################################################################## # # Solid 2-d or 3-d body # package JavaView::solid; @ISA=qw( JavaView::geometry ); sub initialize { my $self=shift; $self->SUPER::initialize; if (! exists $self->{faces}) { croak( ref($self), "::initialize: parameter 'faces; missing\n" ); } $self->{faceSet_face_flag} ||= "show"; $self->{faceSet_backface_flag} ||= "hide"; # our objects are convex by default $self->{faceSet_edge_flag} ||= "show"; $self->{faceSet_color_flag} = exists $self->{faces_colors_list} ? "show" : "hide"; if (! exists $self->{faces_color}) { $self->{faces_color}=$JavaView::default::faces_color; } if (defined $self->{material_flag}) { $self->{faceSet_backface_flag} = $self->{material_flag}; $self->{material_diffuseColor} ||= $JavaView::default::diffuseColor; $self->{material_emissiveColor} ||= $JavaView::default::emissiveColor; $self->{material_shininess} ||= $JavaView::default::shininess; $self->{material_specularColor} ||= $JavaView::default::specularColor; $self->{material_transparency} ||= $JavaView::default::transparency; } else { $self->{material_flag} = "hide"; } } sub faceSet { my ($self) = @_; my $text=""; $text .= <<"."; . foreach (@{$self->{faces}}) { s/^\s*\{?\s*(.*)\s*\}?\s*$/$1/; $text .= <<"."; $_ . } $text .= <<"."; $self->{faces_color} . if (exists $self->{neighbours}) { $text .= <<"."; . foreach (@{$self->{neighbours}}) { my ($first, $rest)=/(\d+)\s+(.*)/; # javaview expects the neighbors in a rather weird order $text .= <<"."; $rest $first . } $text .= <<"."; . } my $edges=""; if (exists $self->{edges_color}) { $edges .= <<"."; $self->{edges_color} . } if (exists $self->{edges_thickness}) { $edges .= <<"."; $self->{edges_thickness} . } if ($edges) { $text .= <<"." . $edges . <<".."; . .. } $text .= $self->color_list('faces_colors_list') . <<'.'; . } sub material { my ($self) = @_; my $text = ""; return $text if($self->{material_flag} eq "hide"); $text .= <<"."; $self->{material_ambientIntensity} $self->{material_diffuseColor} $self->{material_emissiveColor} $self->{material_Shininess} $self->{material_specularColor} $self->{material_transparency} . } sub toString { my ($self) = @_; return $self->header . $self->pointSet . $self->faceSet . $self->material . $self->trailer; } ############################################################################################## # # Wire model (e.g. a graph) # package JavaView::wire; @ISA=qw( JavaView::geometry ); sub initialize { my $self=shift; $self->SUPER::initialize; if (! exists $self->{lines}) { croak( ref($self), "::initialize: parameter 'lines' missing" ); } $self->{lineSet_line_flag} ||= "show"; $self->{lineSet_arrow_flag} ||= "hide"; if (! exists $self->{lines_thickness}) { $self->{lines_thickness}=$JavaView::default::lines_thickness; } $self->{lineSet_thicknesses_flag} ||= exists $self->{lines_thicknesses_list} ? "show" : "hide"; if (! exists $self->{lines_color}) { $self->{lines_color}=$JavaView::default::lines_color; } $self->{lineSet_color_flag} = exists $self->{lines_colors_list} ? "show" : "hide"; } sub lineSet { my ($self)=@_; my $text=""; $text .= <<"."; . foreach (@{$self->{lines}}) { $text .= <<"."; $_ . } $text .= <<"." . $self->color_list('lines_colors_list') . $self->thickness_list('lines_thicknesses_list') . <<'..'; $self->{lines_thickness} $self->{lines_color} . .. } sub toString { my ($self)=@_; return $self->header . $self->pointSet . $self->lineSet . $self->trailer; } 1 # Local Variables: # c-basic-offset:3 # End: