version 1.108, 2005/05/31 22:15:32
|
version 1.111, 2005/07/05 15:05:13
|
Line 39 use Apache::lonnet;
|
Line 39 use Apache::lonnet;
|
|
|
use vars qw/$weboutputformat $versionstring/; |
use vars qw/$weboutputformat $versionstring/; |
|
|
# |
|
# This variable allows a callback to be registered |
|
# if a gnuplot tag block is performed. |
|
# |
|
my $notify_callback; |
|
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::lonplot',('gnuplot')); |
&Apache::lonxml::register('Apache::lonplot',('gnuplot')); |
Line 54 BEGIN {
|
Line 50 BEGIN {
|
if ($versionstring =~ /^gnuplot 4/) { |
if ($versionstring =~ /^gnuplot 4/) { |
$weboutputformat = 'png'; |
$weboutputformat = 'png'; |
} |
} |
$notify_callback = undef; |
|
|
|
} |
} |
|
|
# register_callback(\&callback) |
|
# Arranges for callback to be invoked on the </gnuplot> |
|
# 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: |
## Description of data structures: |
Line 128 my %linestyles =
|
Line 102 my %linestyles =
|
yerrorbars => [3,4], |
yerrorbars => [3,4], |
xyerrorbars => [4,6], |
xyerrorbars => [4,6], |
boxes => 3, |
boxes => 3, |
|
filledcurves => 2, |
vector => 4 |
vector => 4 |
); |
); |
|
|
Line 151 my $words_test = sub {$_[0]=~s/\s+/
|
Line 126 my $words_test = sub {$_[0]=~s/\s+/
|
my @gnuplot_edit_order = |
my @gnuplot_edit_order = |
qw/alttag bgcolor fgcolor height width font transparent grid samples |
qw/alttag bgcolor fgcolor height width font transparent grid samples |
border align texwidth texfont plotcolor plottype lmargin rmargin tmargin |
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]; |
my $margin_choices = ['default',0..20]; |
|
|
Line 204 my %gnuplot_defaults =
|
Line 180 my %gnuplot_defaults =
|
description => 'Display grid', |
description => 'Display grid', |
edit_type => 'onoff' |
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 => { |
border => { |
default => 'on', |
default => 'on', |
test => $onoff_test, |
test => $onoff_test, |
Line 217 my %gnuplot_defaults =
|
Line 206 my %gnuplot_defaults =
|
edit_type => 'choice', |
edit_type => 'choice', |
choices => ['small','medium','large'] |
choices => ['small','medium','large'] |
}, |
}, |
samples => { |
samples => { |
default => '100', |
default => '100', |
test => $int_test, |
test => $int_test, |
description => 'Number of samples for non-data plots', |
description => 'Number of samples for non-data plots', |
Line 238 my %gnuplot_defaults =
|
Line 227 my %gnuplot_defaults =
|
edit_type => 'entry', |
edit_type => 'entry', |
size => '5' |
size => '5' |
}, |
}, |
texfont => { |
texfont => { |
default => '22', |
default => '22', |
test => $int_test, |
test => $int_test, |
description => 'Font size to use in TeX output (pts):', |
description => 'Font size to use in TeX output (pts):', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => [qw/8 10 12 14 16 18 20 22 24 26 28 30 32 34 36/], |
choices => [qw/8 10 12 14 16 18 20 22 24 26 28 30 32 34 36/], |
}, |
}, |
plotcolor => { |
plotcolor => { |
default => 'monochrome', |
default => 'monochrome', |
test => sub {$_[0]=~/^(monochrome|color|colour)$/}, |
test => sub {$_[0]=~/^(monochrome|color|colour)$/}, |
description => 'Color setting for printing:', |
description => 'Color setting for printing:', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => [qw/monochrome color colour/], |
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', |
default => 'Cartesian', |
test => sub {$_[0]=~/^(Polar|Cartesian)$/}, |
test => sub {$_[0]=~/^(Polar|Cartesian)$/}, |
description => 'Plot type:', |
description => 'Plot type:', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => ['Cartesian','Polar'] |
choices => ['Cartesian','Polar'] |
}, |
}, |
lmargin => { |
lmargin => { |
default => 'default', |
default => 'default', |
test => sub {$_[0]=~/^(default|\d+)$/}, |
test => sub {$_[0]=~/^(default|\d+)$/}, |
description => 'Left margin width (pts):', |
description => 'Left margin width (pts):', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => $margin_choices, |
choices => $margin_choices, |
}, |
}, |
rmargin => { |
rmargin => { |
default => 'default', |
default => 'default', |
test => sub {$_[0]=~/^(default|\d+)$/}, |
test => sub {$_[0]=~/^(default|\d+)$/}, |
description => 'Right margin width (pts):', |
description => 'Right margin width (pts):', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => $margin_choices, |
choices => $margin_choices, |
}, |
}, |
tmargin => { |
tmargin => { |
default => 'default', |
default => 'default', |
test => sub {$_[0]=~/^(default|\d+)$/}, |
test => sub {$_[0]=~/^(default|\d+)$/}, |
description => 'Top margin width (pts):', |
description => 'Top margin width (pts):', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => $margin_choices, |
choices => $margin_choices, |
}, |
}, |
bmargin => { |
bmargin => { |
default => 'default', |
default => 'default', |
test => sub {$_[0]=~/^(default|\d+)$/}, |
test => sub {$_[0]=~/^(default|\d+)$/}, |
description => 'Bottom margin width (pts):', |
description => 'Bottom margin width (pts):', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => $margin_choices, |
choices => $margin_choices, |
}, |
}, |
|
boxwidth => { |
|
default => '', |
|
test => $real_test, |
|
description => 'width of boxes default auto', |
|
edit_type => 'entry', |
|
size => '5' |
|
}, |
major_ticscale => { |
major_ticscale => { |
default => '1', |
default => '1', |
test => $real_test, |
test => $real_test, |
Line 440 my %axis_defaults =
|
Line 457 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 = |
my %curve_defaults = |
( |
( |
Line 486 my %curve_defaults =
|
Line 503 my %curve_defaults =
|
description => 'point type (may not apply to all line styles)', |
description => 'point type (may not apply to all line styles)', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => [0,1,2,3,4,5,6] |
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'] |
|
}, |
); |
); |
|
|
################################################################### |
################################################################### |
Line 565 ENDIMAGE
|
Line 589 ENDIMAGE
|
&Apache::lonxml::debug(" gnuplot ht = $Apache::lonplot::plot{'height'}"); |
&Apache::lonxml::debug(" gnuplot ht = $Apache::lonplot::plot{'height'}"); |
#might be inside the safe space, register the URL for later |
#might be inside the safe space, register the URL for later |
&Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps"); |
&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') { |
} elsif ($target eq 'edit') { |
$result.=&Apache::edit::tag_end($target,$token); |
$result.=&Apache::edit::tag_end($target,$token); |
} |
} |
&invoke_callback(); |
|
return $result; |
return $result; |
} |
} |
|
|
Line 1090 sub write_gnuplot_file {
|
Line 1115 sub write_gnuplot_file {
|
} else { |
} else { |
# Assume Cartesian |
# 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 |
# margin |
if (lc($Apache::lonplot::plot{'lmargin'}) ne 'default') { |
if (lc($Apache::lonplot::plot{'lmargin'}) ne 'default') { |
$gnuplot_input .= 'set lmargin '.$Apache::lonplot::plot{'lmargin'}.$/; |
$gnuplot_input .= 'set lmargin '.$Apache::lonplot::plot{'lmargin'}.$/; |
Line 1106 sub write_gnuplot_file {
|
Line 1139 sub write_gnuplot_file {
|
# tic scales |
# tic scales |
$gnuplot_input .= 'set ticscale '. |
$gnuplot_input .= 'set ticscale '. |
$Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_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 |
# grid |
$gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); |
$gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); |
# border |
# border |
Line 1194 sub write_gnuplot_file {
|
Line 1235 sub write_gnuplot_file {
|
($curve->{'linestyle'} eq 'xyerrorbars')) { |
($curve->{'linestyle'} eq 'xyerrorbars')) { |
$gnuplot_input.=' pointtype '.$curve->{'pointtype'}; |
$gnuplot_input.=' pointtype '.$curve->{'pointtype'}; |
$gnuplot_input.=' pointsize '.$curve->{'pointsize'}; |
$gnuplot_input.=' pointsize '.$curve->{'pointsize'}; |
|
} elsif ($curve->{'linestyle'} eq 'filledcurves') { |
|
$gnuplot_input.= ' '.$curve->{'limit'}; |
} |
} |
} elsif (exists($curve->{'data'})) { |
} elsif (exists($curve->{'data'})) { |
# Store data values in $datatext |
# Store data values in $datatext |
Line 1227 sub write_gnuplot_file {
|
Line 1270 sub write_gnuplot_file {
|
($curve->{'linestyle'} eq 'xyerrorbars')) { |
($curve->{'linestyle'} eq 'xyerrorbars')) { |
$gnuplot_input.=' pointtype '.$curve->{'pointtype'}; |
$gnuplot_input.=' pointtype '.$curve->{'pointtype'}; |
$gnuplot_input.=' pointsize '.$curve->{'pointsize'}; |
$gnuplot_input.=' pointsize '.$curve->{'pointsize'}; |
|
} elsif ($curve->{'linestyle'} eq 'filledcurves') { |
|
$gnuplot_input.= ' '.$curve->{'limit'}; |
} |
} |
} |
} |
} |
} |