--- loncom/xml/lonplot.pm 2003/06/10 18:46:02 1.85 +++ loncom/xml/lonplot.pm 2003/10/24 17:35:32 1.92 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.85 2003/06/10 18:46:02 matthew Exp $ +# $Id: lonplot.pm,v 1.92 2003/10/24 17:35:32 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,6 +34,8 @@ package Apache::lonplot; use strict; +use warnings FATAL=>'all'; +no warnings 'uninitialized'; use Apache::File; use Apache::response; use Apache::lonxml; @@ -113,7 +115,7 @@ my $words_test = sub {$_[0]=~s/\s+/ ################################################################### my @gnuplot_edit_order = qw/alttag bgcolor fgcolor height width font transparent grid samples - border align texwidth/; + border align texwidth texfont plottype/; my $gnuplot_help_text = <<"ENDPLOTHELP";

@@ -230,6 +232,20 @@ my %gnuplot_defaults = edit_type => 'entry', size => '5' }, + texfont => { + default => '22', + test => $int_test, + description => 'Font size to use in TeX output (pts):', + edit_type => 'choice', + choices => [qw/10 12 14 16 18 20 22 24 26 28 30 32 34 36/], + }, + plottype => { + default => 'Cartesian', + test => sub {$_[0]=~/^(Polar|Cartesian)$/}, + description => 'Plot type:', + edit_type => 'choice', + choices => ['Polar','Cartesian'] + }, ); my %key_defaults = @@ -282,43 +298,51 @@ my %label_defaults = } ); -my @tic_edit_order = ('location','mirror','start','increment','end'); +my @tic_edit_order = ('location','mirror','start','increment','end', + 'minorfreq'); my %tic_defaults = ( location => { default => 'border', test => sub {$_[0]=~/^(border|axis)$/}, - description => 'Location of tick marks', + description => 'Location of major tic marks', edit_type => 'choice', choices => ['border','axis'] }, mirror => { default => 'on', test => $onoff_test, - description => 'mirror ticks on opposite axis?', + description => 'mirror tics on opposite axis?', edit_type => 'onoff' }, start => { default => '-10.0', test => $real_test, - description => 'Start ticks at', + description => 'Start major tics at', edit_type => 'entry', size => '10' }, increment => { default => '1.0', test => $real_test, - description => 'Place a tick every', + description => 'Place a major tic every', edit_type => 'entry', size => '10' }, end => { default => ' 10.0', test => $real_test, - description => 'Stop ticks at ', + description => 'Stop major tics at ', edit_type => 'entry', size => '10' }, + minorfreq => { + default => '0', + test => $int_test, + description => 'Number of minor tics between major tic marks', + edit_type => 'entry', + size => '10' + }, ); my @axis_edit_order = ('color','xmin','xmax','ymin','ymax'); @@ -449,10 +473,10 @@ my %curve_defaults = my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics); sub start_gnuplot { - %plot = (); %key = (); %axis = (); - $title = undef; $xlabel = undef; $ylabel = undef; - $#labels = -1; $#curves = -1; - %xtics = (); %ytics = (); + undef(%plot); undef(%key); undef(%axis); + undef($title); undef($xlabel); undef($ylabel); + undef(@labels); undef(@curves); + undef(%xtics); undef(%ytics); # my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; @@ -513,8 +537,8 @@ sub end_gnuplot { alt = "$plot{'alttag'}" /> ENDIMAGE } elsif ($target eq 'tex') { - &Apache::lonnet::ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps"); - + #might be inside the safe space, register the URL for later + &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}'; } } elsif ($target eq 'edit') { @@ -970,8 +994,13 @@ sub set_defaults { sub get_attributes{ my ($values,$defaults,$parstack,$safeeval,$tag) = @_; foreach my $attr (keys(%{$defaults})) { - $values->{$attr} = - &Apache::lonxml::get_param($attr,$parstack,$safeeval); + if ($attr eq 'texwidth' || $attr eq 'texfont') { + $values->{$attr} = + &Apache::lonxml::get_param($attr,$parstack,$safeeval,undef,1); + } else { + $values->{$attr} = + &Apache::lonxml::get_param($attr,$parstack,$safeeval); + } if ($values->{$attr} eq '' | !defined($values->{$attr})) { $values->{$attr} = $defaults->{$attr}->{'default'}; next; @@ -992,6 +1021,7 @@ sub write_gnuplot_file { my ($tmpdir,$filename,$target)= @_; my $gnuplot_input = ''; my $curve; + my $pt = $plot{'texfont'}; # Collect all the colors my @Colors; push @Colors, $plot{'bgcolor'}; @@ -1012,10 +1042,16 @@ sub write_gnuplot_file { # set output $gnuplot_input .= "set output\n"; } elsif ($target eq 'tex') { - $gnuplot_input .= "set term postscript eps monochrome solid\n"; + $gnuplot_input .= "set term postscript eps monochrome solid \"Helvetica\" $pt \n"; $gnuplot_input .= "set output \"/home/httpd/perl/tmp/". &Apache::lonnet::unescape($filename).".eps\"\n"; } + # cartesian or polar? + if (lc($plot{'plottype'}) eq 'polar') { + $gnuplot_input .= 'set polar'.$/; + } else { + # Assume Cartesian + } # grid $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on'); # border @@ -1026,9 +1062,15 @@ sub write_gnuplot_file { $gnuplot_input .= "set samples $plot{'samples'}\n"; # title, xlabel, ylabel # titles - $gnuplot_input .= "set title \"$title\"\n" if (defined($title)) ; - $gnuplot_input .= "set xlabel \"$xlabel\"\n" if (defined($xlabel)); - $gnuplot_input .= "set ylabel \"$ylabel\"\n" if (defined($ylabel)); + if ($target eq 'tex') { + $gnuplot_input .= "set title \"$title\" font \"Helvetica,".$pt."pt\"\n" if (defined($title)) ; + $gnuplot_input .= "set xlabel \"$xlabel\" font \"Helvetica,".$pt."pt\" \n" if (defined($xlabel)); + $gnuplot_input .= "set ylabel \"$ylabel\" font \"Helvetica,".$pt."pt\"\n" if (defined($ylabel)); + } else { + $gnuplot_input .= "set title \"$title\" \n" if (defined($title)) ; + $gnuplot_input .= "set xlabel \"$xlabel\" \n" if (defined($xlabel)); + $gnuplot_input .= "set ylabel \"$ylabel\" \n" if (defined($ylabel)); + } # tics if (%xtics) { $gnuplot_input .= "set xtics $xtics{'location'} "; @@ -1036,6 +1078,9 @@ sub write_gnuplot_file { $gnuplot_input .= "$xtics{'start'}, "; $gnuplot_input .= "$xtics{'increment'}, "; $gnuplot_input .= "$xtics{'end'}\n"; + if ($xtics{'minorfreq'} != 0) { + $gnuplot_input .= "set mxtics ".$xtics{'minorfreq'}."\n"; + } } if (%ytics) { $gnuplot_input .= "set ytics $ytics{'location'} "; @@ -1043,6 +1088,9 @@ sub write_gnuplot_file { $gnuplot_input .= "$ytics{'start'}, "; $gnuplot_input .= "$ytics{'increment'}, "; $gnuplot_input .= "$ytics{'end'}\n"; + if ($ytics{'minorfreq'} != 0) { + $gnuplot_input .= "set mytics ".$ytics{'minorfreq'}."\n"; + } } # axis if (%axis) { @@ -1063,7 +1111,7 @@ sub write_gnuplot_file { my $label; foreach $label (@labels) { $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '. - $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'}.$/ ; + $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'}.' font "Helvetica,'.$pt.'pt"'.$/ ; } if ($target eq 'tex') { $gnuplot_input .="set size 1,".$plot{'height'}/$plot{'width'}*1.38;