--- loncom/xml/lonplot.pm 2002/01/23 11:10:14 1.44 +++ loncom/xml/lonplot.pm 2002/02/05 15:05:44 1.47 @@ -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.47 2002/02/05 15:05:44 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,7 +40,7 @@ use Apache::lonxml; use Apache::edit; BEGIN { - &Apache::lonxml::register('Apache::lonplot',('plot')); + &Apache::lonxml::register('Apache::lonplot',('gnuplot')); } ## @@ -113,9 +113,9 @@ my $words_test = sub {$_[0]=~s/\s+/ ## Attribute metadata ## ## ## ################################################################### -my @plot_edit_order = +my @gnuplot_edit_order = qw/bgcolor fgcolor height width font transparent grid border align/; -my %plot_defaults = +my %gnuplot_defaults = ( height => { default => 200, @@ -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,31 +337,33 @@ 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 { +sub start_gnuplot { %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]); + my $inside = &Apache::lonxml::get_all_text("/gnuplot",$$parser[-1]); $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); &Apache::lonxml::newparser($parser,\$inside); - &get_attributes(\%plot,\%plot_defaults,$parstack,$safeeval, + &get_attributes(\%plot,\%gnuplot_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token,'Plot'); - $result .= &edit_attributes($target,$token,\%plot_defaults, - \@plot_edit_order); + $result .= &Apache::edit::tag_start($target,$token,'GnuPlot'); + $result .= &edit_attributes($target,$token,\%gnuplot_defaults, + \@gnuplot_edit_order); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args - ($token,$parstack,$safeeval,keys(%plot_defaults)); + ($token,$parstack,$safeeval,keys(%gnuplot_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } @@ -330,9 +371,8 @@ sub start_plot { return $result; } -sub end_plot { +sub end_gnuplot { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; - pop @Apache::lonxml::namespace; &Apache::lonxml::deregister('Apache::lonplot', ('title','xlabel','ylabel','key','axis','label','curve')); @@ -352,7 +392,7 @@ sub end_plot { width = "$plot{'width'}" height = "$plot{'height'}" align = "$plot{'align'}" - alt = "/cgi-bin/plot.gif?$filename" /> + alt = "image should be /cgi-bin/plot.gif?$filename" /> ENDIMAGE } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); @@ -360,6 +400,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 +866,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"; @@ -839,7 +961,7 @@ sub write_gnuplot_file { sub check_inputs { ## Note: no inputs, no outputs - this acts only on global variables. ## Make sure we have all the input we need: - if (! %plot) { &set_defaults(\%plot,\%plot_defaults); } + if (! %plot) { &set_defaults(\%plot,\%gnuplot_defaults); } if (! %key ) {} # No key for this plot, thats okay # if (! %axis) { &set_defaults(\%axis,\%axis_defaults); } if (! defined($title )) {} # No title for this plot, thats okay @@ -879,7 +1001,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); } @@ -895,16 +1017,15 @@ sub edit_attributes { ## ## ################################################################### -#------------------------------------------------ insert_xxxxxxx -sub insert_plot { +sub insert_gnuplot { my $result = ''; # plot attributes $result .= "{'default'}\"\n"; + foreach my $attr (keys(%gnuplot_defaults)) { + $result .= " $attr=\"$gnuplot_defaults{$attr}->{'default'}\"\n"; } $result .= ">\n"; - # Add the components + # Add the components (most are commented out for simplicity) # $result .= &insert_key(); # $result .= &insert_axis(); # $result .= &insert_title(); @@ -916,9 +1037,35 @@ sub insert_plot { return $result; } +sub insert_tics { + my $result; + $result .= &insert_xtics() . &insert_ytics; + return $result; +} + +sub insert_xtics { + my $result; + $result .= "\n {'default'}\" "; + } + $result .= "/>\n"; + return $result; +} + +sub insert_ytics { + my $result; + $result .= "\n {'default'}\" "; + } + $result .= "/>\n"; + return $result; +} + sub insert_key { my $result; - $result .= " {'default'}\"\n"; } @@ -928,7 +1075,7 @@ sub insert_key { sub insert_axis{ my $result; - $result .= ' {'default'}\"\n"; } @@ -936,13 +1083,13 @@ sub insert_axis{ return $result; } -sub insert_title { return " \n"; } -sub insert_xlabel { return " \n"; } -sub insert_ylabel { return " \n"; } +sub insert_title { return "\n \n"; } +sub insert_xlabel { return "\n \n"; } +sub insert_ylabel { return "\n \n"; } sub insert_label { my $result; - $result .= '