--- loncom/xml/lonplot.pm 2012/12/05 19:30:28 1.170 +++ loncom/xml/lonplot.pm 2020/01/30 15:59:15 1.183 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.170 2012/12/05 19:30:28 raeburn Exp $ +# $Id: lonplot.pm,v 1.183 2020/01/30 15:59:15 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use Apache::lonnet; use LONCAPA; -use vars qw/$weboutputformat $version/; +use vars qw/$weboutputformat $version $colorprefix/; @@ -56,7 +56,10 @@ BEGIN { if ($version >= 4) { $weboutputformat = 'png'; } - + $colorprefix = 'x'; + if ($version > 4.6) { + $colorprefix = '#'; + } } @@ -78,7 +81,7 @@ BEGIN { ## align ## ## @labels: $labels[$i] = \%label -## %label: text, xpos, ypos, justify +## %label: text, xpos, ypos, justify, rotate, zlayer ## ## @curves: $curves[$i] = \%curve ## %curve: name, linestyle, ( function | data ) @@ -105,7 +108,7 @@ my %linetypes = # For png use these li ); my %ps_linetypes = # For ps the line types are different! ( - solid => 0, + solid => 1, dashed => 7 ); @@ -186,17 +189,17 @@ my %gnuplot_defaults = size => '10' }, bgcolor => { - default => 'xffffff', - test => $color_test, - description => 'Background color of image (xffffff)', + default => $colorprefix.'ffffff', + test => $color_test, + description => 'Background color of image ('.$colorprefix.'ffffff)', edit_type => 'entry', size => '10', class => 'colorchooser' }, fgcolor => { - default => 'x000000', + default => $colorprefix.'000000', test => $color_test, - description => 'Foreground color of image (x000000)', + description => 'Foreground color of image ('.$colorprefix.'000000)', edit_type => 'entry', size => '10', class => 'colorchooser' @@ -258,7 +261,7 @@ my %gnuplot_defaults = test => sub {$_[0]=~/^(left|right|middle|center)$/}, description => 'Alignment for image in HTML', edit_type => 'choice', - choices => ['left','right','middle'] + choices => ['left','right','middle','center'] }, texwidth => { default => '93', @@ -367,6 +370,7 @@ my %gnuplot_defaults = }, ); + my %key_defaults = ( title => { @@ -421,7 +425,14 @@ my %label_defaults = description => 'Rotation of label (degrees)', edit_type => 'entry', size => '10', - } + }, + zlayer => { + default => '', + test => sub {$_[0]=~/^(front|back)$/}, + description => 'Z position of label', + edit_type => 'choice', + choices => ['front','back'], + }, ); my @tic_edit_order = ('location','mirror','start','increment','end', @@ -481,9 +492,9 @@ my @axis_edit_order = ('color','xmin','x my %axis_defaults = ( color => { - default => 'x000000', + default => $colorprefix.'000000', test => $color_test, - description => 'Color of grid lines (x000000)', + description => 'Color of grid lines ('.$colorprefix.'000000)', edit_type => 'entry', size => '10', class => 'colorchooser' @@ -518,14 +529,14 @@ my %axis_defaults = }, xformat => { default => 'on', - test => sub {$_[0]=~/^(on|off|\d+(f|F|e|E))$/}, + test => sub {$_[0]=~/^(on|off|\d+(f|F|e|E|P(|\s*[Pp][Ii])))$/}, description => 'X-axis number formatting', edit_type => 'choice', choices => ['on', 'off', '2e', '2f'], }, yformat => { default => 'on', - test => sub {$_[0]=~/^(on|off|\d+(f|F|e|E))$/}, + test => sub {$_[0]=~/^(on|off|\d+(f|F|e|E|P(|\s*[Pp][Ii])))$/}, description => 'Y-axis number formatting', edit_type => 'choice', choices => ['on', 'off', '2e', '2f'], @@ -557,9 +568,9 @@ my @curve_edit_order = ('color','name',' my %curve_defaults = ( color => { - default => 'x000000', + default => $colorprefix.'000000', test => $color_test, - description => 'Color of curve (x000000)', + description => 'Color of curve ('.$colorprefix.'000000)', edit_type => 'entry', size => '10', class => 'colorchooser' @@ -690,13 +701,13 @@ sub start_gnuplot { if ($constructtag) { # - # The color chooser does not prepent x to the color values + # Color chooser does not prepend x (or #) to the color values # Do that here: # foreach my $attribute ('bgcolor', 'fgcolor') { my $value = $token->[2]{$attribute}; - if (defined $value && !($value =~ /^x/)) { - $token->[2]{$attribute} = 'x' . $value; + if (defined $value && ($value !~ /^\Q$colorprefix\E/)) { + $token->[2]{$attribute} = $colorprefix . $value; } } $result = &Apache::edit::rebuild_tag($token); @@ -732,13 +743,19 @@ sub end_gnuplot { $filename = &escape($filename); ## return image tag for the plot if ($target eq 'web') { - $result .= <<"ENDIMAGE"; -$Apache::lonplot::plot{'alttag'} -ENDIMAGE + my $srcatt = "src=\"/cgi-bin/plot.$weboutputformat?file=$filename.data\""; + my $widthatt = "width=\"$Apache::lonplot::plot{'width'}\""; + my $heightatt = "height=\"$Apache::lonplot::plot{'height'}\""; + my $alignatt = "align=\"$Apache::lonplot::plot{'align'}\""; + my $altatt = "alt=\"$Apache::lonplot::plot{'alttag'}\""; + if ($Apache::lonplot::plot{'align'} eq 'center') { + $result .= '
'. + "". + "
\n"; + + } else { + $result .= ""; + } } elsif ($target eq 'tex') { &Apache::lonxml::debug(" gnuplot wid = $Apache::lonplot::plot{'width'}"); &Apache::lonxml::debug(" gnuplot ht = $Apache::lonplot::plot{'height'}"); @@ -746,7 +763,13 @@ ENDIMAGE &Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps"); $result = "%DYNAMICIMAGE:$Apache::lonplot::plot{'width'}:$Apache::lonplot::plot{'height'}:$Apache::lonplot::plot{'texwidth'}\n"; $result .= '\graphicspath{{'.$tmpdir.'}}'."\n"; + if ($Apache::lonplot::plot{'align'} eq 'center') { + $result .= '\begin{center}'; + } $result .= '\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&unescape($filename).'.eps}'; + if ($Apache::lonplot::plot{'align'} eq 'center') { + $result .= '\end{center}'; + } } } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); @@ -1478,11 +1501,12 @@ sub start_curve { ($token,$parstack,$safeeval,keys(%curve_defaults)); if ($constructtag) { # - # Fix up the color attribute as jcolor does not prepend an x + # Fix up the color attribute as jcolor does not prepend an x + # (or #) # my $value = $token->[2]{'color'}; - if (defined $value && !($value =~ /^x/)) { - $token->[2]{'color'} = 'x' . $value; + if (defined $value && ($value !~ /^\Q$colorprefix\E/)) { + $token->[2]{'color'} = $colorprefix . $value; } $result = &Apache::edit::rebuild_tag($token); } @@ -1636,11 +1660,11 @@ sub start_axis { if ($constructtag) { # # Fix up the color attribute since jchooser does not - # prepend an x to the color: + # prepend an x (or #) to the color: # my $value = $token->[2]{'color'}; - if (defined $value && !($value =~ /^x/)) { - $token->[2]{'color'} = 'x' . $value; + if (defined $value && ($value !~ /^\Q$colorprefix\E/)) { + $token->[2]{'color'} = $colorprefix . $value; } $result = &Apache::edit::rebuild_tag($token); @@ -1714,7 +1738,7 @@ sub generate_tics { my $result = ''; - if (defined %$spec) { + if ((ref($spec) eq 'HASH') && (keys(%{$spec}) > 0)) { @@ -1752,7 +1776,7 @@ sub generate_tics { if ($spec->{'minorfreq'} != 0) { $result .= "set m$type $spec->{'minorfreq'}\n"; } - } else { + } elsif ($target eq 'tex' ) { $result .= "set $type font " . '"Helvetica,22"' ."\n"; } @@ -1803,7 +1827,13 @@ sub write_gnuplot_file { '/'.$font_properties->{'file'}.'.ttf" '; $gnuplot_input .= $fontsize; $gnuplot_input .= ' size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' '; - $gnuplot_input .= "@Colors\n"; + if ($version > 4.6) { + if ($Apache::lonplot::plot{'bgcolor'}) { + $gnuplot_input .= "background '$Apache::lonplot::plot{'bgcolor'}'\n"; + } + } else { + $gnuplot_input .= "@Colors\n"; + } # set output $gnuplot_input .= "set output\n"; } elsif ($target eq 'tex') { @@ -1879,11 +1909,25 @@ sub write_gnuplot_file { if ($Apache::lonplot::plot{'gridlayer'} eq 'on'); # grid - $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); + if (($version > 4.6) && ($Apache::lonplot::plot{'fgcolor'} ne '')) { + $gnuplot_input .= 'set grid linecolor "'.$Apache::lonplot::plot{'fgcolor'}.'"'.$/ + if ($Apache::lonplot::plot{'grid'} eq 'on'); + } else { + $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); + } # border - $gnuplot_input .= ($Apache::lonplot::plot{'border'} eq 'on'? - 'set border'.$/ : - 'set noborder'.$/ ); + if ($Apache::lonplot::plot{'border'} eq 'on') { + if (($version > 4.6) && (($axis{'color'} ne '') || ($Apache::lonplot::plot{'fgcolor'} ne ''))) { + $gnuplot_input .= 'set border linecolor "'. + (($axis{'color'} ne '')?$axis{'color'}: + $Apache::lonplot::plot{'fgcolor'}). + '" '.$/; + } else { + $gnuplot_input .= 'set border '.$/; + } + } else { + $gnuplot_input .= 'set noborder '.$/; + } # sampling rate for non-data curves $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n"; # title, xlabel, ylabel @@ -1912,6 +1956,14 @@ sub write_gnuplot_file { if ($axis{'xformat'} eq 'off') { $gnuplot_input .= "\"\"\n"; } else { + if ($axis{'xformat'} =~ /^(\d+P\s*)[Pp][Ii]/) { + my $xprefix = $1; + if (($target eq 'web') || ($target eq 'tex')) { + $axis{'xformat'} = $xprefix.$lookup{'(pi|#960)'}{$target}; + } else { + $axis{'xformat'} = $xprefix; + } + } $gnuplot_input .= "\"\%.".$axis{'xformat'}."\"\n"; } } @@ -1920,6 +1972,14 @@ sub write_gnuplot_file { if ($axis{'yformat'} eq 'off') { $gnuplot_input .= "\"\"\n"; } else { + if ($axis{'yformat'} =~ /^(\d+P\s*)[Pp][Ii]/) { + my $yprefix = $1; + if (($target eq 'web') || ($target eq 'tex')) { + $axis{'yformat'} = $yprefix.$lookup{'(pi|#960)'}{$target}; + } else { + $axis{'yformat'} = $yprefix; + } + } $gnuplot_input .= "\"\%.".$axis{'yformat'}."\"\n"; } } @@ -1967,7 +2027,10 @@ sub write_gnuplot_file { $gnuplot_input .= ' '.$label->{'justify'}; if ($target eq 'tex') { - $gnuplot_input .=' font "'.$font_properties->{'printname'}.','.$fontsize.'pt"' ; + $gnuplot_input .=' font "'.$font_properties->{'printname'}.','.$fontsize.'pt"'; + } + if (($label->{'zlayer'} eq 'front') || ($label->{'zlayer'} eq 'back')) { + $gnuplot_input .= ' '.$label->{'zlayer'}; } $gnuplot_input .= $/; } @@ -1984,7 +2047,7 @@ sub write_gnuplot_file { # my $linestyle_index = 50; my $line_width = ''; - my $plots; + my $plots = ''; # If arrows are needed there will be an arrow style for each as well: # @@ -1993,8 +2056,11 @@ sub write_gnuplot_file { for (my $i = 0;$i<=$#curves;$i++) { $curve = $curves[$i]; - my $plot_command; - my $plot_type = ', ' if ($i > 0); + my $plot_command = ''; + my $plot_type = ''; + if ($i > 0) { + $plot_type = ', '; + } if ($target eq 'tex') { $curve->{'linewidth'} *= 2; }