Diff for /loncom/xml/lonplot.pm between versions 1.100 and 1.107

version 1.100, 2004/08/17 17:37:56 version 1.107, 2005/05/16 21:58:41
Line 35  use Apache::File; Line 35  use Apache::File;
 use Apache::response;  use Apache::response;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::edit;  use Apache::edit;
   use Apache::lonnet;
   
 use vars qw/$weboutputformat $versionstring/;  use vars qw/$weboutputformat $versionstring/;
   
Line 119  my $words_test     = sub {$_[0]=~s/\s+/ Line 120  my $words_test     = sub {$_[0]=~s/\s+/
 ###################################################################  ###################################################################
 my @gnuplot_edit_order =   my @gnuplot_edit_order = 
     qw/alttag bgcolor fgcolor height width font transparent grid samples       qw/alttag bgcolor fgcolor height width font transparent grid samples 
     border align texwidth texfont plottype/;      border align texwidth texfont plotcolor plottype lmargin rmargin tmargin
       bmargin major_ticscale minor_ticscale/;
   
   my $margin_choices = ['default',0..20];
   
 my %gnuplot_defaults =   my %gnuplot_defaults = 
     (      (
Line 211  my %gnuplot_defaults = Line 215  my %gnuplot_defaults =
          edit_type   => 'choice',           edit_type   => 'choice',
          choices     => [qw/8 10 12 14 16 18 20 22 24 26 28 30 32 34 36/],           choices     => [qw/8 10 12 14 16 18 20 22 24 26 28 30 32 34 36/],
          },           },
        plotcolor   => {
            default     => 'monochrome',
            test        => sub {$_[0]=~/^(monochrome|color|colour)$/},
            description => 'Color setting for printing:',
            edit_type   => 'choice',
            choices     => [qw/monochrome color colour/],
            },
      plottype  => {       plottype  => {
  default     => 'Cartesian',   default     => 'Cartesian',
  test        => sub {$_[0]=~/^(Polar|Cartesian)$/},   test        => sub {$_[0]=~/^(Polar|Cartesian)$/},
Line 218  my %gnuplot_defaults = Line 229  my %gnuplot_defaults =
  edit_type   => 'choice',   edit_type   => 'choice',
          choices     => ['Cartesian','Polar']           choices     => ['Cartesian','Polar']
          },           },
        lmargin   => {
    default     => 'default',
    test        => sub {$_[0]=~/^(default|\d+)$/},
    description => 'Left margin width (pts):',
    edit_type   => 'choice',
            choices     => $margin_choices,
            },
        rmargin   => {
    default     => 'default',
    test        => sub {$_[0]=~/^(default|\d+)$/},
    description => 'Right margin width (pts):',
    edit_type   => 'choice',
            choices     => $margin_choices,
            },
        tmargin   => {
    default     => 'default',
    test        => sub {$_[0]=~/^(default|\d+)$/},
    description => 'Top margin width (pts):',
    edit_type   => 'choice',
            choices     => $margin_choices,
            },
        bmargin   => {
    default     => 'default',
    test        => sub {$_[0]=~/^(default|\d+)$/},
    description => 'Bottom margin width (pts):',
    edit_type   => 'choice',
            choices     => $margin_choices,
            },
        major_ticscale  => {
            default     => '1',
            test        => $real_test,
            description => 'Size of major tic marks (plot coordinates)',
            edit_type   => 'entry',
            size        => '5'
            },
        minor_ticscale  => {
            default     => '0.5',
            test        => $real_test,
            description => 'Size of minor tic mark (plot coordinates)',
            edit_type   => 'entry',
            size        => '5'
            },
      );       );
   
 my %key_defaults =   my %key_defaults = 
Line 411  my %curve_defaults = Line 464  my %curve_defaults =
 ##                    parsing and edit rendering                 ##  ##                    parsing and edit rendering                 ##
 ##                                                               ##  ##                                                               ##
 ###################################################################  ###################################################################
 my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics);  
   undef %Apache::lonplot::plot;
   my (%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics);
   
 sub start_gnuplot {  sub start_gnuplot {
     undef(%plot);   undef(%key);    undef(%axis);      undef(%Apache::lonplot::plot);   undef(%key);    undef(%axis);
     undef($title);  undef($xlabel); undef($ylabel);      undef($title);  undef($xlabel); undef($ylabel);
     undef(@labels); undef(@curves);      undef(@labels); undef(@curves);
     undef(%xtics);  undef(%ytics);      undef(%xtics);  undef(%ytics);
Line 426  sub start_gnuplot { Line 481  sub start_gnuplot {
       'xtics','ytics'));        'xtics','ytics'));
     push (@Apache::lonxml::namespace,'lonplot');      push (@Apache::lonxml::namespace,'lonplot');
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%plot,\%gnuplot_defaults,$parstack,$safeeval,   &get_attributes(\%Apache::lonplot::plot,\%gnuplot_defaults,$parstack,$safeeval,
  $tagstack->[-1]);   $tagstack->[-1]);
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'GnuPlot');   $result .= &Apache::edit::tag_start($target,$token,'GnuPlot');
Line 461  sub end_gnuplot { Line 516  sub end_gnuplot {
  ##   ##
  ## Determine filename   ## Determine filename
  my $tmpdir = '/home/httpd/perl/tmp/';   my $tmpdir = '/home/httpd/perl/tmp/';
  my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}.   my $filename = $env{'user.name'}.'_'.$env{'user.domain'}.
     '_'.time.'_'.$$.$randnumber.'_plot';      '_'.time.'_'.$$.$randnumber.'_plot';
  ## Write the plot description to the file   ## Write the plot description to the file
  &write_gnuplot_file($tmpdir,$filename,$target);   &write_gnuplot_file($tmpdir,$filename,$target);
Line 470  sub end_gnuplot { Line 525  sub end_gnuplot {
  if ($target eq 'web') {   if ($target eq 'web') {
     $result .= <<"ENDIMAGE";      $result .= <<"ENDIMAGE";
 <img src    = "/cgi-bin/plot.gif?file=$filename.data&output=$weboutputformat"   <img src    = "/cgi-bin/plot.gif?file=$filename.data&output=$weboutputformat" 
      width  = "$plot{'width'}"       width  = "$Apache::lonplot::plot{'width'}"
      height = "$plot{'height'}"       height = "$Apache::lonplot::plot{'height'}"
      align  = "$plot{'align'}"       align  = "$Apache::lonplot::plot{'align'}"
      alt    = "$plot{'alttag'}" />       alt    = "$Apache::lonplot::plot{'alttag'}" />
 ENDIMAGE  ENDIMAGE
         } elsif ($target eq 'tex') {          } elsif ($target eq 'tex') {
       &Apache::lonxml::debug(" gnuplot wid = $Apache::lonplot::plot{'width'}");
       &Apache::lonxml::debug(" gnuplot ht  = $Apache::lonplot::plot{'height'}");
     #might be inside the safe space, register the URL for later      #might be inside the safe space, register the URL for later
     &Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");      &Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");
     $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}';      $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}';
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
Line 953  sub write_gnuplot_file { Line 1010  sub write_gnuplot_file {
     my ($tmpdir,$filename,$target)= @_;      my ($tmpdir,$filename,$target)= @_;
     my $gnuplot_input = '';      my $gnuplot_input = '';
     my $curve;      my $curve;
     my $pt = $plot{'texfont'};      my $pt = $Apache::lonplot::plot{'texfont'};
     #      #
     # Check to be sure we do not have any empty curves      # Check to be sure we do not have any empty curves
     my @curvescopy;      my @curvescopy;
Line 974  sub write_gnuplot_file { Line 1031  sub write_gnuplot_file {
     @curves = @curvescopy;      @curves = @curvescopy;
     # Collect all the colors      # Collect all the colors
     my @Colors;      my @Colors;
     push @Colors, $plot{'bgcolor'};      push @Colors, $Apache::lonplot::plot{'bgcolor'};
     push @Colors, $plot{'fgcolor'};       push @Colors, $Apache::lonplot::plot{'fgcolor'}; 
     push @Colors, (defined($axis{'color'})?$axis{'color'}:$plot{'fgcolor'});      push @Colors, (defined($axis{'color'})?$axis{'color'}:$Apache::lonplot::plot{'fgcolor'});
     foreach $curve (@curves) {      foreach $curve (@curves) {
  push @Colors, ($curve->{'color'} ne '' ?    push @Colors, ($curve->{'color'} ne '' ? 
        $curve->{'color'}       :          $curve->{'color'}       : 
        $plot{'fgcolor'}        );         $Apache::lonplot::plot{'fgcolor'}        );
     }      }
     # set term      # set term
     if ($target eq 'web') {      if ($target eq 'web') {
  $gnuplot_input .= 'set term gif ';   $gnuplot_input .= 'set term '.$weboutputformat .' ';
  $gnuplot_input .= 'transparent ' if ($plot{'transparent'} eq 'on');   $gnuplot_input .= 'transparent ' if ($Apache::lonplot::plot{'transparent'} eq 'on');
  $gnuplot_input .= $plot{'font'} . ' ';   $gnuplot_input .= $Apache::lonplot::plot{'font'} . ' ';
  $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' ';   $gnuplot_input .= 'size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' ';
  $gnuplot_input .= "@Colors\n";   $gnuplot_input .= "@Colors\n";
  # set output   # set output
  $gnuplot_input .= "set output\n";   $gnuplot_input .= "set output\n";
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $gnuplot_input .= "set term postscript eps monochrome solid \"Helvetica\" $pt \n";   $gnuplot_input .= "set term postscript eps $Apache::lonplot::plot{'plotcolor'} solid \"Helvetica\" $pt \n";
  $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".   $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
     &Apache::lonnet::unescape($filename).".eps\"\n";      &Apache::lonnet::unescape($filename).".eps\"\n";
     }      }
     # cartesian or polar?      # cartesian or polar?
     if (lc($plot{'plottype'}) eq 'polar') {      if (lc($Apache::lonplot::plot{'plottype'}) eq 'polar') {
         $gnuplot_input .= 'set polar'.$/;          $gnuplot_input .= 'set polar'.$/;
     } else {      } else {
         # Assume Cartesian          # Assume Cartesian
     }      }
       # margin
       if (lc($Apache::lonplot::plot{'lmargin'}) ne 'default') {
           $gnuplot_input .= 'set lmargin '.$Apache::lonplot::plot{'lmargin'}.$/;
       }
       if (lc($Apache::lonplot::plot{'rmargin'}) ne 'default') {
           $gnuplot_input .= 'set rmargin '.$Apache::lonplot::plot{'rmargin'}.$/;
       }
       if (lc($Apache::lonplot::plot{'tmargin'}) ne 'default') {
           $gnuplot_input .= 'set tmargin '.$Apache::lonplot::plot{'tmargin'}.$/;
       }
       if (lc($Apache::lonplot::plot{'bmargin'}) ne 'default') {
           $gnuplot_input .= 'set bmargin '.$Apache::lonplot::plot{'bmargin'}.$/;
       }
       # tic scales
       $gnuplot_input .= 'set ticscale '.
           $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/;
     # grid      # grid
     $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on');      $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on');
     # border      # border
     $gnuplot_input .= ($plot{'border'} eq 'on'?      $gnuplot_input .= ($Apache::lonplot::plot{'border'} eq 'on'?
        'set border'.$/           :         'set border'.$/           :
        'set noborder'.$/         );         'set noborder'.$/         );
     # sampling rate for non-data curves      # sampling rate for non-data curves
     $gnuplot_input .= "set samples $plot{'samples'}\n";      $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n";
     # title, xlabel, ylabel      # title, xlabel, ylabel
     # titles      # titles
     if ($target eq 'tex') {      if ($target eq 'tex') {
Line 1061  sub write_gnuplot_file { Line 1134  sub write_gnuplot_file {
     my $label;      my $label;
     foreach $label (@labels) {      foreach $label (@labels) {
  $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.   $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.
     $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'}.' font "Helvetica,'.$pt.'pt"'.$/ ;      $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'};
           if ($target eq 'tex') {
               $gnuplot_input .=' font "Helvetica,'.$pt.'pt"' ;
           }
           $gnuplot_input .= $/;
     }      }
     if ($target eq 'tex') {      if ($target eq 'tex') {
         $gnuplot_input .="set size 1,".$plot{'height'}/$plot{'width'}*1.38;          $gnuplot_input .="set size 1,".$Apache::lonplot::plot{'height'}/$Apache::lonplot::plot{'width'}*1.38;
         $gnuplot_input .="\n";          $gnuplot_input .="\n";
         }          }
     # curves      # curves
Line 1134  sub write_gnuplot_file { Line 1211  sub write_gnuplot_file {
 sub check_inputs {  sub check_inputs {
     ## Note: no inputs, no outputs - this acts only on global variables.      ## Note: no inputs, no outputs - this acts only on global variables.
     ## Make sure we have all the input we need:      ## Make sure we have all the input we need:
     if (! %plot) { &set_defaults(\%plot,\%gnuplot_defaults); }      if (! %Apache::lonplot::plot) { &set_defaults(\%Apache::lonplot::plot,\%gnuplot_defaults); }
     if (! %key ) {} # No key for this plot, thats okay      if (! %key ) {} # No key for this plot, thats okay
 #    if (! %axis) { &set_defaults(\%axis,\%axis_defaults); }  #    if (! %axis) { &set_defaults(\%axis,\%axis_defaults); }
     if (! defined($title )) {} # No title for this plot, thats okay      if (! defined($title )) {} # No title for this plot, thats okay
Line 1172  sub edit_attributes { Line 1249  sub edit_attributes {
  ($description,$attr,$token,   ($description,$attr,$token,
  $defaults->{$attr}->{'size'});   $defaults->{$attr}->{'size'});
  } elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') {   } elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') {
     $result .= &Apache::edit::select_arg      $result .= &Apache::edit::select_or_text_arg
  ($description,$attr,$defaults->{$attr}->{'choices'},$token);   ($description,$attr,$defaults->{$attr}->{'choices'},$token);
  } elsif ($defaults->{$attr}->{'edit_type'} eq 'onoff') {   } elsif ($defaults->{$attr}->{'edit_type'} eq 'onoff') {
     $result .= &Apache::edit::select_arg      $result .= &Apache::edit::select_or_text_arg
  ($description,$attr,['on','off'],$token);   ($description,$attr,['on','off'],$token);
  }   }
  $result .= '<br />';   $result .= '<br />';

Removed from v.1.100  
changed lines
  Added in v.1.107


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>