--- loncom/xml/lonplot.pm 2005/05/31 22:15:32 1.108 +++ loncom/xml/lonplot.pm 2005/07/05 15:05:13 1.111 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.108 2005/05/31 22:15:32 foxr Exp $ +# $Id: lonplot.pm,v 1.111 2005/07/05 15:05:13 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,11 +39,7 @@ use Apache::lonnet; use vars qw/$weboutputformat $versionstring/; -# -# This variable allows a callback to be registered -# if a gnuplot tag block is performed. -# -my $notify_callback; + BEGIN { &Apache::lonxml::register('Apache::lonplot',('gnuplot')); @@ -54,31 +50,9 @@ BEGIN { if ($versionstring =~ /^gnuplot 4/) { $weboutputformat = 'png'; } - $notify_callback = undef; } -# register_callback(\&callback) -# Arranges for callback to be invoked on the -# tag. -# -sub register_callback { - $notify_callback = shift; -} -# clear_callback(); -# Undefs the callback. -# -sub clear_callback { - $notify_callback = undef; -} -# invoke_callback() -# Invokes the callback if defined -# -sub invoke_callback { - if (defined $notify_callback) { - &$notify_callback(); - } -} ## ## Description of data structures: @@ -128,6 +102,7 @@ my %linestyles = yerrorbars => [3,4], xyerrorbars => [4,6], boxes => 3, + filledcurves => 2, vector => 4 ); @@ -151,7 +126,8 @@ my $words_test = sub {$_[0]=~s/\s+/ my @gnuplot_edit_order = qw/alttag bgcolor fgcolor height width font transparent grid samples border align texwidth texfont plotcolor plottype lmargin rmargin tmargin - bmargin major_ticscale minor_ticscale/; + bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle + pattern solid/; my $margin_choices = ['default',0..20]; @@ -204,6 +180,19 @@ my %gnuplot_defaults = description => 'Display grid', edit_type => 'onoff' }, + gridlayer => { + default => 'off', + test => $onoff_test, + description => 'Display grid front layer over filled boxes or filled curves', + edit_type => 'onoff' + }, + box_border => { + default => 'noborder', + test => sub {$_[0]=~/^(noborder|border)$/}, + description => 'Draw border for boxes', + edit_type => 'choice', + choices => ['border','noborder'] + }, border => { default => 'on', test => $onoff_test, @@ -217,7 +206,7 @@ my %gnuplot_defaults = edit_type => 'choice', choices => ['small','medium','large'] }, - samples => { + samples => { default => '100', test => $int_test, description => 'Number of samples for non-data plots', @@ -238,55 +227,83 @@ my %gnuplot_defaults = edit_type => 'entry', size => '5' }, - texfont => { + texfont => { default => '22', test => $int_test, description => 'Font size to use in TeX output (pts):', edit_type => 'choice', choices => [qw/8 10 12 14 16 18 20 22 24 26 28 30 32 34 36/], }, - plotcolor => { + plotcolor => { default => 'monochrome', test => sub {$_[0]=~/^(monochrome|color|colour)$/}, description => 'Color setting for printing:', edit_type => 'choice', choices => [qw/monochrome color colour/], }, - plottype => { + pattern => { + default => '', + test => $int_test, + description => 'pattern value for boxes:', + edit_type => 'choice', + choices => [0,1,2,3,4,5,6] + }, + solid => { + default => 0, + test => $real_test, + description => 'The density of fill style for boxes', + edit_type => 'entry', + size => '5' + }, + fillstyle => { + default => 'empty', + test => sub {$_[0]=~/^(empty|solid|pattern)$/}, + description => 'Filled style for boxes:', + edit_type => 'choice', + choices => ['empty','solid','pattern'] + }, + plottype => { default => 'Cartesian', test => sub {$_[0]=~/^(Polar|Cartesian)$/}, description => 'Plot type:', edit_type => 'choice', choices => ['Cartesian','Polar'] }, - lmargin => { + lmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Left margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, - rmargin => { + rmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Right margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, - tmargin => { + tmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Top margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, - bmargin => { + bmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Bottom margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, + boxwidth => { + default => '', + test => $real_test, + description => 'width of boxes default auto', + edit_type => 'entry', + size => '5' + }, major_ticscale => { default => '1', test => $real_test, @@ -440,7 +457,7 @@ my %axis_defaults = } ); -my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize'); +my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize','limit'); my %curve_defaults = ( @@ -486,7 +503,14 @@ my %curve_defaults = description => 'point type (may not apply to all line styles)', edit_type => 'choice', choices => [0,1,2,3,4,5,6] - } + }, + limit => { + default => 'closed', + test => sub {$_[0]=~/^(closed|x1|x2|y1|y2)$/}, + description => 'point to fill -- for filledcurves', + edit_type => 'choice', + choices => ['closed','x1','x2','y1','y2'] + }, ); ################################################################### @@ -565,12 +589,13 @@ ENDIMAGE &Apache::lonxml::debug(" gnuplot ht = $Apache::lonplot::plot{'height'}"); #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='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}'; + $result = "%DYNAMICIMAGE:$Apache::lonplot::plot{'width'}:$Apache::lonplot::plot{'height'}:$Apache::lonplot::plot{'texwidth'}\n"; + $result .= '\graphicspath{{/home/httpd/perl/tmp/}}'."\n"; + $result .= '\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}'; } } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } - &invoke_callback(); return $result; } @@ -1090,6 +1115,14 @@ sub write_gnuplot_file { } else { # Assume Cartesian } + # solid or pattern for boxes? + if (lc($Apache::lonplot::plot{'fillstyle'}) eq 'solid') { + $gnuplot_input .= 'set style fill solid '. + $Apache::lonplot::plot{'solid'}.$Apache::lonplot::plot{'box_border'}.$/; + } elsif (lc($Apache::lonplot::plot{'fillstyle'}) eq 'pattern') { + $gnuplot_input .= 'set style fill pattern '.$Apache::lonplot::plot{'pattern'}.$Apache::lonplot::plot{'box_border'}.$/; + } elsif (lc($Apache::lonplot::plot{'fillstyle'}) eq 'empty') { + } # margin if (lc($Apache::lonplot::plot{'lmargin'}) ne 'default') { $gnuplot_input .= 'set lmargin '.$Apache::lonplot::plot{'lmargin'}.$/; @@ -1106,6 +1139,14 @@ sub write_gnuplot_file { # tic scales $gnuplot_input .= 'set ticscale '. $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/; + #boxwidth + if (lc($Apache::lonplot::plot{'boxwidth'}) ne '') { + $gnuplot_input .= 'set boxwidth '.$Apache::lonplot::plot{'boxwidth'}.$/; + } + # gridlayer + $gnuplot_input .= 'set grid noxtics noytics front '.$/ + if ($Apache::lonplot::plot{'gridlayer'} eq 'on'); + # grid $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); # border @@ -1194,6 +1235,8 @@ sub write_gnuplot_file { ($curve->{'linestyle'} eq 'xyerrorbars')) { $gnuplot_input.=' pointtype '.$curve->{'pointtype'}; $gnuplot_input.=' pointsize '.$curve->{'pointsize'}; + } elsif ($curve->{'linestyle'} eq 'filledcurves') { + $gnuplot_input.= ' '.$curve->{'limit'}; } } elsif (exists($curve->{'data'})) { # Store data values in $datatext @@ -1227,6 +1270,8 @@ sub write_gnuplot_file { ($curve->{'linestyle'} eq 'xyerrorbars')) { $gnuplot_input.=' pointtype '.$curve->{'pointtype'}; $gnuplot_input.=' pointsize '.$curve->{'pointsize'}; + } elsif ($curve->{'linestyle'} eq 'filledcurves') { + $gnuplot_input.= ' '.$curve->{'limit'}; } } }