Diff for /loncom/xml/lonplot.pm between versions 1.160 and 1.164

version 1.160, 2012/07/16 10:09:36 version 1.164, 2012/07/24 11:02:58
Line 463  my %tic_defaults = Line 463  my %tic_defaults =
  description => 'Number of minor tics per major tic mark',   description => 'Number of minor tics per major tic mark',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },            }, 
        rotate => {
    default => 'off',
    test    => $onoff_test,
    description => 'Rotate tic label by 90 degrees if on',
    edit_type   => 'onoff'
        }
      );       );
   
 my @axis_edit_order = ('color','xmin','xmax','ymin','ymax','xformat', 'yformat', 'xzero', 'yzero');  my @axis_edit_order = ('color','xmin','xmax','ymin','ymax','xformat', 'yformat', 'xzero', 'yzero');
Line 537  my %axis_defaults = Line 543  my %axis_defaults =
       },        },
      );       );
   
   
 my @curve_edit_order = ('color','name','linestyle','linewidth','linetype',  my @curve_edit_order = ('color','name','linestyle','linewidth','linetype',
  'pointtype','pointsize','limit', 'arrowhead', 'arrowstyle',    'pointtype','pointsize','limit', 'arrowhead', 'arrowstyle', 
  'arrowlength', 'arrowangle', 'arrowbackangle'   'arrowlength', 'arrowangle', 'arrowbackangle'
Line 649  my %curve_defaults = Line 656  my %curve_defaults =
 undef %Apache::lonplot::plot;  undef %Apache::lonplot::plot;
 my (%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics);  my (%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics);
   
   my $current_tics; # Reference to the current tick hash
   
 sub start_gnuplot {  sub start_gnuplot {
     undef(%Apache::lonplot::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);
Line 748  sub start_xtics { Line 757  sub start_xtics {
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval,   &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
    $current_tics = \%xtics;
    &Apache::lonxml::register('Apache::lonplot', 'tic');
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'xtics');   $result .= &Apache::edit::tag_start($target,$token,'xtics');
  $result .= &edit_attributes($target,$token,\%tic_defaults,   $result .= &edit_attributes($target,$token,\%tic_defaults,
Line 766  sub end_xtics { Line 777  sub end_xtics {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
    &Apache::lonxml::deregister('Apache::lonplot', 'tic');
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 779  sub start_ytics { Line 791  sub start_ytics {
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval,   &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
    $current_tics = \%ytics;
    &Apache::lonxml::register('Apache::lonplot', 'tic');
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'ytics');   $result .= &Apache::edit::tag_start($target,$token,'ytics');
  $result .= &edit_attributes($target,$token,\%tic_defaults,   $result .= &edit_attributes($target,$token,\%tic_defaults,
Line 797  sub end_ytics { Line 811  sub end_ytics {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
    &Apache::lonxml::deregister('Apache::lonplot', 'tic');
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
     return $result;      return $result;
 }  }
   
   
   ##----------------------------------------------------------------
   #
   #  Tic handling:
   #   The <tic> tag allows users to specify exact Tic positions and labels
   #   for each axis.  In this version we only support level 0 tics (major tic).
   #   Each tic has associated with it a position and a label
   #   $current_tics is a reference to the current tick description hash.
   #   We add elements to an array  in that has: ticspecs whose elements
   #   are 'pos' - the tick position and 'label' - the tic label.
   #
   
   
   sub start_tic {
       my ($target, $token, $tagstack, $parstack, $parser, $safeeval, $style)  = @_;
   
       my $result = '';
       if ($target eq 'web' || $target eq 'tex') {
    my $tic_location = &Apache::lonxml::get_param('location', $parstack, $safeeval);
    my $tic_label    = &Apache::lonxml::get_all_text('/tic', $parser);
   
    # Tic location must e a real:
   
    if (!&$real_test($tic_location)) {
       &Apache::lonxml::warning("Tic location: $tic_location must be a real number");
    } else {
   
       if (!defined  $current_tics->{'ticspecs'}) {
    $current_tics->{'ticspecs'} = [];
       }
       my $ticspecs = $current_tics->{'ticspecs'};
       push (@$ticspecs, {'pos' => $tic_location, 'label' => $tic_label});
    }
       }
   
       return $result;
   }
   
   sub end_tic {
       return '';
   }
   
 ##-----------------------------------------------------------------font  ##-----------------------------------------------------------------font
 my %font_properties =  my %font_properties =
     (      (
Line 1457  sub start_function { Line 1514  sub start_function {
      $style);       $style);
  $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);   $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
         $function=~s/\^/\*\*/gs;          $function=~s/\^/\*\*/gs;
    $function=~ s/^\s+//; # Trim leading
    $function=~ s/\s+$//;   # And trailing whitespace.
  $curves[-1]->{'function'} = $function;    $curves[-1]->{'function'} = $function; 
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');   $result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
Line 1636  sub get_attributes{ Line 1695  sub get_attributes{
     }      }
     return ;      return ;
 }  }
   ##
   # Generate tic mark specifications.
   # 
   # @param type - type of tics (xtics or ytics).
   # @param spec - Reference to a hash that contains the tic specification.
   # @param target - 'tex' if hard copy target.
   #
   # @return string - the tic specification command.
   #
   sub generate_tics {
       my ($type, $spec, $target) = @_;
       my $result   = '';
   
   
       if (defined %$spec) {
   
   
   
    # Major tics: - If there are 'ticspecs' these override any other
    #               specifications:
   
   
   
    $result .= "set $type $spec->{'location'}  ";
    $result .= ($spec->{'mirror'} eq 'on') ? 'mirror ' : 'nomirror ';
    if ($spec->{'rotate'} eq 'on') {
       $result .= ' rotate ';
    }
    if (defined $spec->{'ticspecs'}) {
       $result .= '( ';
       my @ticspecs;
       my $ticinfo = $spec->{'ticspecs'};
       foreach my $tic (@$ticinfo) {
    push(@ticspecs,  '"' . $tic->{'label'} . '" ' . $tic->{'pos'} );
       }
       $result .= join(', ', (@ticspecs));
       $result .= ' )';
    } else {
       $result .= "$spec->{'start'}, ";
       $result .= "$spec->{'increment'}, ";
       $result .= "$spec->{'end'} ";
    }
    if ($target eq 'tex' ) {
       $result .= 'font "Helvetica,22"';
    }
    $result .= "\n";
   
    # minor frequency:
   
    if ($spec->{'minorfreq'} != 0) {
       $result .= "set m$type $spec->{'minorfreq'}\n";
    }
       } else {
    $result .= "set $type font " . '"Helvetica,22"' ."\n";
       }
       
       
       return $result;
   }
   
 ##------------------------------------------------------- write_gnuplot_file  ##------------------------------------------------------- write_gnuplot_file
 sub write_gnuplot_file {  sub write_gnuplot_file {
Line 1778  sub write_gnuplot_file { Line 1896  sub write_gnuplot_file {
         $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y \n" if (defined($ylabel));          $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y \n" if (defined($ylabel));
     }      }
     # tics      # tics
     if (%xtics) {          $gnuplot_input .= &generate_tics('xtics', \%xtics, $target);
  $gnuplot_input .= "set xtics $xtics{'location'} ";  
  $gnuplot_input .= ( $xtics{'mirror'} eq 'on'?"mirror ":"nomirror ");      $gnuplot_input .= &generate_tics('ytics', \%ytics, $target);
  $gnuplot_input .= "$xtics{'start'}, ";  
  $gnuplot_input .= "$xtics{'increment'}, ";  
  $gnuplot_input .= "$xtics{'end'} ";  
  if ($target eq 'tex') {  
     $gnuplot_input .= 'font "Helvetica,22"';     # Needed in iso 8859-1 enc.  
  }  
  $gnuplot_input .= "\n";  
         if ($xtics{'minorfreq'} != 0) {  
             $gnuplot_input .= "set mxtics ".$xtics{'minorfreq'}."\n";  
         }   
     } else {  
  if ($target eq 'tex') {  
     $gnuplot_input .= 'set xtics font "Helvetica,22"'."\n"; # needed in iso 8859-1 enc  
  }  
     }  
     if (%ytics) {      
  $gnuplot_input .= "set ytics $ytics{'location'} ";  
  $gnuplot_input .= ( $ytics{'mirror'} eq 'on'?"mirror ":"nomirror ");  
  $gnuplot_input .= "$ytics{'start'}, ";  
  $gnuplot_input .= "$ytics{'increment'}, ";  
         $gnuplot_input .= "$ytics{'end'} ";  
         if ($target eq 'tex') {  
             $gnuplot_input .= 'font "Helvetica,22"'; # Needed in iso-8859-1 encoding.  
         }  
         $gnuplot_input .= "\n";  
         if ($ytics{'minorfreq'} != 0) {  
             $gnuplot_input .= "set mytics ".$ytics{'minorfreq'}."\n";  
         }   
     } else {  
  if ($target eq 'tex') {  
     $gnuplot_input .= 'set ytics font "Helvetica,22"'."\n"; # Needed for iso 8859-1 enc.  
  }  
     }  
     # axis      # axis
     if (%axis) {      if (%axis) {
         if ($axis{'xformat'} ne 'on') {          if ($axis{'xformat'} ne 'on') {
Line 2004  sub write_gnuplot_file { Line 2090  sub write_gnuplot_file {
  $linestyle_index++; # Each curve get a unique linestyle.   $linestyle_index++; # Each curve get a unique linestyle.
     }      }
     # Write the output to a file.      # Write the output to a file.
     open (my $fh,">$tmpdir$filename.data");  
       &Apache::lonnet::logthis($gnuplot_input); # uncomment to log the gnuplot input.
       open (my $fh, "> $tmpdir$filename.data");
       binmode($fh, ':utf8');
     print $fh $gnuplot_input;      print $fh $gnuplot_input;
     close($fh);      close($fh);
     # That's all folks.      # That's all folks.

Removed from v.1.160  
changed lines
  Added in v.1.164


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