--- loncom/xml/lonplot.pm 2002/01/23 11:10:14 1.44 +++ loncom/xml/lonplot.pm 2002/01/28 14:12:34 1.45 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.44 2002/01/23 11:10:14 matthew Exp $ +# $Id: lonplot.pm,v 1.45 2002/01/28 14:12:34 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -149,19 +149,19 @@ my %plot_defaults = default => 'off', test => $onoff_test, description => 'Transparent image', - edit_type => 'on_off' + edit_type => 'onoff' }, grid => { default => 'off', test => $onoff_test, description => 'Display grid', - edit_type => 'on_off' + edit_type => 'onoff' }, border => { default => 'on', test => $onoff_test, description => 'Draw border around plot', - edit_type => 'on_off' + edit_type => 'onoff' }, font => { default => 'medium', @@ -192,7 +192,7 @@ my %key_defaults = default => 'off', test => $onoff_test, description => 'Draw a box around the key?', - edit_type => 'on_off' + edit_type => 'onoff' }, pos => { default => 'top right', @@ -229,6 +229,45 @@ my %label_defaults = } ); +my @tic_edit_order = ('location','mirror','start','increment','end'); +my %tic_defaults = + ( + location => { + default => 'border', + test => sub {$_[0]=~/^(border|axis)$/}, + description => 'Location of tick marks', + edit_type => 'choice', + choices => ['border','axis'] + }, + mirror => { + default => 'on', + test => $onoff_test, + description => 'mirror ticks on opposite axis?', + edit_type => 'onoff' + }, + start => { + default => '-10.0', + test => $real_test, + description => 'Start ticks at', + edit_type => 'entry', + size => '10' + }, + increment => { + default => '1.0', + test => $real_test, + description => 'Place a tick every', + edit_type => 'entry', + size => '10' + }, + end => { + default => ' 10.0', + test => $real_test, + description => 'Stop ticks at ', + edit_type => 'entry', + size => '10' + }, + ); + my %axis_defaults = ( color => { @@ -298,17 +337,19 @@ my %curve_defaults = ## parsing and edit rendering ## ## ## ################################################################### -my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves); +my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves,%xtics,%ytics); sub start_plot { %plot = (); %key = (); %axis = (); $title = undef; $xlabel = undef; $ylabel = undef; $#labels = -1; $#curves = -1; + %xtics = (); %ytics = (); # my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; &Apache::lonxml::register('Apache::lonplot', - ('title','xlabel','ylabel','key','axis','label','curve')); + ('title','xlabel','ylabel','key','axis','label','curve', + 'xtics','ytics')); push (@Apache::lonxml::namespace,'lonplot'); if ($target eq 'web') { my $inside = &Apache::lonxml::get_all_text("/plot",$$parser[-1]); @@ -360,6 +401,70 @@ ENDIMAGE return $result; } + +##--------------------------------------------------------------- xtics +sub start_xtics { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + if ($target eq 'web') { + &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval, + $tagstack->[-1]); + } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token,'xtics'); + $result .= &edit_attributes($target,$token,\%tic_defaults, + \@tic_edit_order); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args + ($token,$parstack,$safeeval,keys(%tic_defaults)); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } + } + return $result; +} + +sub end_xtics { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result = ''; + if ($target eq 'web') { + } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); + } + return $result; +} + +##--------------------------------------------------------------- ytics +sub start_ytics { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + if ($target eq 'web') { + &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval, + $tagstack->[-1]); + } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token,'ytics'); + $result .= &edit_attributes($target,$token,\%tic_defaults, + \@tic_edit_order); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args + ($token,$parstack,$safeeval,keys(%tic_defaults)); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } + } + return $result; +} + +sub end_ytics { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result = ''; + if ($target eq 'web') { + } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); + } + return $result; +} + + ##----------------------------------------------------------------- key sub start_key { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -762,16 +867,34 @@ sub write_gnuplot_file { $gnuplot_input .= $plot{'font'} . ' '; $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' '; $gnuplot_input .= "@Colors\n"; + # set output + $gnuplot_input .= "set output\n"; # grid $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on'); # border $gnuplot_input .= ($plot{'border'} eq 'on'? 'set border'.$/ : 'set noborder'.$/ ); # title, xlabel, ylabel - $gnuplot_input .= "set output\n"; + # 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)); + # tics + if (%xtics) { + $gnuplot_input .= "set xtics $xtics{'location'} "; + $gnuplot_input .= ( $xtics{'mirror'} eq 'on' ? "mirror" : "nomirror "); + $gnuplot_input .= "$xtics{'start'}, "; + $gnuplot_input .= "$xtics{'increment'}, "; + $gnuplot_input .= "$xtics{'end'}\n"; + } + 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'}\n"; + } + # axis if (%axis) { $gnuplot_input .= "set xrange \[$axis{'xmin'}:$axis{'xmax'}\]\n"; $gnuplot_input .= "set yrange \[$axis{'ymin'}:$axis{'ymax'}\]\n"; @@ -879,7 +1002,7 @@ sub edit_attributes { } elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') { $result .= &Apache::edit::select_arg ($description,$attr,$defaults->{$attr}->{'choices'},$token); - } elsif ($defaults->{$attr}->{'edit_type'} eq 'on_off') { + } elsif ($defaults->{$attr}->{'edit_type'} eq 'onoff') { $result .= &Apache::edit::select_arg ($description,$attr,['on','off'],$token); } @@ -916,6 +1039,26 @@ sub insert_plot { return $result; } +sub insert_xtics { + my $result; + $result .= " {'default'}\"\n"; + } + $result .= " />\n"; + return $result; +} + +sub insert_ytics { + my $result; + $result .= " {'default'}\"\n"; + } + $result .= " />\n"; + return $result; +} + sub insert_key { my $result; $result .= "