--- loncom/xml/lonplot.pm 2012/07/17 10:49:53 1.162 +++ loncom/xml/lonplot.pm 2012/07/24 10:50:54 1.163 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.162 2012/07/17 10:49:53 foxr Exp $ +# $Id: lonplot.pm,v 1.163 2012/07/24 10:50:54 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -537,6 +537,7 @@ my %axis_defaults = }, ); + my @curve_edit_order = ('color','name','linestyle','linewidth','linetype', 'pointtype','pointsize','limit', 'arrowhead', 'arrowstyle', 'arrowlength', 'arrowangle', 'arrowbackangle' @@ -649,6 +650,8 @@ my %curve_defaults = undef %Apache::lonplot::plot; my (%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics); +my $current_tics; # Reference to the current tick hash + sub start_gnuplot { undef(%Apache::lonplot::plot); undef(%key); undef(%axis); undef($title); undef($xlabel); undef($ylabel); @@ -748,6 +751,8 @@ sub start_xtics { if ($target eq 'web' || $target eq 'tex') { &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval, $tagstack->[-1]); + $current_tics = \%xtics; + &Apache::lonxml::register('Apache::lonplot', 'tic'); } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'xtics'); $result .= &edit_attributes($target,$token,\%tic_defaults, @@ -766,6 +771,7 @@ sub end_xtics { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; if ($target eq 'web' || $target eq 'tex') { + &Apache::lonxml::deregister('Apache::lonplot', 'tic'); } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -779,6 +785,8 @@ sub start_ytics { if ($target eq 'web' || $target eq 'tex') { &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval, $tagstack->[-1]); + $current_tics = \%ytics; + &Apache::lonxml::register('Apache::lonplot', 'tic'); } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'ytics'); $result .= &edit_attributes($target,$token,\%tic_defaults, @@ -797,12 +805,55 @@ sub end_ytics { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; if ($target eq 'web' || $target eq 'tex') { + &Apache::lonxml::deregister('Apache::lonplot', 'tic'); } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } return $result; } + +##---------------------------------------------------------------- +# +# Tic handling: +# The 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 my %font_properties = ( @@ -1457,6 +1508,8 @@ sub start_function { $style); $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]); $function=~s/\^/\*\*/gs; + $function=~ s/^\s+//; # Trim leading + $function=~ s/\s+$//; # And trailing whitespace. $curves[-1]->{'function'} = $function; } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function'); @@ -1652,30 +1705,44 @@ sub generate_tics { if (defined %$spec) { + + # Major tics: - If there are 'ticspecs' these override any other + # specifications: - # Major tics: - + + $result .= "set $type $spec->{'location'} "; $result .= ($spec->{'mirror'} eq 'on') ? 'mirror ' : 'nomirror '; - $result .= "$spec->{'start'}, "; - $result .= "$spec->{'increment'}, "; - $result .= "$spec->{'end'} "; + 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; } @@ -2014,7 +2081,7 @@ sub write_gnuplot_file { $linestyle_index++; # Each curve get a unique linestyle. } # Write the output to a file. - &Apache::lonnet::logthis($gnuplot_input); + # &Apache::lonnet::logthis($gnuplot_input); # uncomment to log the gnuplot input. open (my $fh, "> $tmpdir$filename.data"); binmode($fh, ':utf8'); print $fh $gnuplot_input;