version 1.95, 2004/03/08 17:31:37
|
version 1.97, 2004/06/21 20:04:29
|
Line 25
|
Line 25
|
# |
# |
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
# 12/15/01 Matthew |
|
# 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew |
|
# 01/01/02 Matthew |
|
# 01/02 01/03 01/04 01/07 01/08 01/09 Matthew |
|
# 01/21 02/05 02/06 2/28Matthew |
|
|
|
package Apache::lonplot; |
package Apache::lonplot; |
|
|
Line 41 use Apache::response;
|
Line 36 use Apache::response;
|
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::edit; |
use Apache::edit; |
|
|
|
use vars qw/$weboutputformat $versionstring/; |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::lonplot',('gnuplot')); |
&Apache::lonxml::register('Apache::lonplot',('gnuplot')); |
|
# |
|
# Determine the version of GNUPLOT |
|
$weboutputformat = 'gif'; |
|
$versionstring = `gnuplot --version`; |
|
if ($versionstring =~ /^gnuplot 4/) { |
|
$weboutputformat = 'png'; |
|
} |
} |
} |
|
|
## |
## |
Line 117 my @gnuplot_edit_order =
|
Line 121 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 plottype/; |
border align texwidth texfont plottype/; |
|
|
my $gnuplot_help_text = <<"ENDPLOTHELP"; |
|
<p> |
|
The <b>gnuplot</b> tag allows an author to design a plot which can |
|
be created on the fly. This is intended for use in homework problems |
|
where each student needs to see a distinct plot. It can be used in |
|
conjunction with a <b>script</b> tag to generate random plots. |
|
</p><p> |
|
A <b>gnuplot</b> tag can contain the following sub-tags: |
|
</p> |
|
<dl> |
|
<dt> Plot Label |
|
<dd> Allows you to place text at a given (x,y) coordinate on the plot. |
|
<dt> Plot Title |
|
<dd> The title of the plot |
|
<dt> Plot Xlabel |
|
<dd> The label on the horizontal axis of the plot |
|
<dt> Plot Ylabel |
|
<dd> The label on the vertical axis of the plot |
|
<dt> Plot Axes |
|
<dd> allows specification of the x and y ranges displayed in the plot |
|
<dt> Plot Key |
|
<dd> Lists the functions displayed in the plot. |
|
<dt> Plot Curve |
|
<dd> Sets the data used in the plot. |
|
<dt> Plot Tics |
|
<dd> Allows specification of the x and y coordinate 'tics' on the axes. |
|
This is mostly used to adjust the grid lines when a grid is displayed. |
|
</dl> |
|
If you are having trouble with your plot, please read the help |
|
available on Plot Curve. |
|
ENDPLOTHELP |
|
|
|
my %gnuplot_defaults = |
my %gnuplot_defaults = |
( |
( |
alttag => { |
alttag => { |
Line 237 my %gnuplot_defaults =
|
Line 209 my %gnuplot_defaults =
|
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/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/], |
}, |
}, |
plottype => { |
plottype => { |
default => 'Cartesian', |
default => 'Cartesian', |
Line 385 my %axis_defaults =
|
Line 357 my %axis_defaults =
|
} |
} |
); |
); |
|
|
my $curve_help_text = <<"ENDCURVEHELP"; |
|
The <b>curve</b> tag is where you set the data to be plotted by gnuplot. |
|
There are two ways of entering the information: |
|
<dl> |
|
<dt> Curve Data |
|
<dd> Using a <b>data</b> tag you can specify the numbers used to produce |
|
the plot. |
|
<p> |
|
By default, two <b>data</b> tags will be available in a plot. The |
|
first will specify X coordinates of the data and the second will |
|
give the Y coordinates of the data. When working with a linestyle that |
|
requires more than two data sets, inserting another <b>data</b> tag is |
|
required. Unfortunately, you must make sure the <b>data</b> tags appear |
|
in the order gnuplot expects the data. |
|
</p><p> |
|
Specifying the data should usually be done with a perl variable or array, |
|
such as \@Xdata and \@Ydata. You may also specify numerical data separated |
|
by commas. Again, the order of the <b>data</b> tags is important. The |
|
first tag will be the X data and the second will be the Y data. |
|
</p> |
|
<dt> Curve Function |
|
<dd> The <b>function</b> tag allows you to specify the curve to be |
|
plotted as a formula that gnuplot can understand. <b>Be careful using this |
|
tag.</b> It is surprisingly easy to give gnuplot a function it cannot deal |
|
with properly. Be explicit: 2*sin(2*3.141592*x/4) will work but |
|
2sin(2*3.141592x/4) will not. If you do not receive any errors in the |
|
gnuplot data but still do not have an image produced, it is likely there |
|
is an error in your <b>function</b> tag. |
|
</dl> |
|
ENDCURVEHELP |
|
|
|
my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize'); |
my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize'); |
|
|
my %curve_defaults = |
my %curve_defaults = |
Line 489 sub start_gnuplot {
|
Line 430 sub start_gnuplot {
|
$tagstack->[-1]); |
$tagstack->[-1]); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result .= &Apache::edit::tag_start($target,$token,'GnuPlot'); |
$result .= &Apache::edit::tag_start($target,$token,'GnuPlot'); |
$result .= &make_javascript(); |
|
$result .= &help_win($gnuplot_help_text); |
|
$result .= &edit_attributes($target,$token,\%gnuplot_defaults, |
$result .= &edit_attributes($target,$token,\%gnuplot_defaults, |
\@gnuplot_edit_order); |
\@gnuplot_edit_order); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
Line 530 sub end_gnuplot {
|
Line 469 sub end_gnuplot {
|
## return image tag for the plot |
## return image tag for the plot |
if ($target eq 'web') { |
if ($target eq 'web') { |
$result .= <<"ENDIMAGE"; |
$result .= <<"ENDIMAGE"; |
<img src = "/cgi-bin/plot.gif?file=$filename.data&output=gif" |
<img src = "/cgi-bin/plot.gif?file=$filename.data&output=$weboutputformat" |
width = "$plot{'width'}" |
width = "$plot{'width'}" |
height = "$plot{'height'}" |
height = "$plot{'height'}" |
align = "$plot{'align'}" |
align = "$plot{'align'}" |
Line 795 sub start_curve {
|
Line 734 sub start_curve {
|
push (@curves,\%curve); |
push (@curves,\%curve); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result .= &Apache::edit::tag_start($target,$token,'Curve'); |
$result .= &Apache::edit::tag_start($target,$token,'Curve'); |
$result .= &help_win($curve_help_text); |
|
$result .= &edit_attributes($target,$token,\%curve_defaults, |
$result .= &edit_attributes($target,$token,\%curve_defaults, |
\@curve_edit_order); |
\@curve_edit_order); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
Line 1339 sub insert_data {
|
Line 1277 sub insert_data {
|
} |
} |
|
|
##---------------------------------------------------------------------- |
##---------------------------------------------------------------------- |
# Javascript functions to display help for tags |
|
|
|
sub make_javascript { |
|
my $helpwindowwidth = 400; |
|
my $helpwindowheight = 400; |
|
my $result = ''; |
|
$result.=<<"ENDFUNCTION"; |
|
<script language="JavaScript"> |
|
function openWin(text) |
|
{ |
|
newWin = open("", "new_W", "width=$helpwindowwidth,height=$helpwindowheight,resizable=1,scrollbars=1"); |
|
newWin.document.open("text/html", "replace"); |
|
newWin.document.writeln(text); |
|
newWin.document.writeln('<center><a href=\"javascript:window.close()\">close this window</a></center>'); |
|
newWin.document.close(); |
|
} |
|
</script> |
|
ENDFUNCTION |
|
return $result; |
|
} |
|
|
|
sub help_win { |
|
my ($helptext)=@_; |
|
$helptext =~ s/\n/ /g; |
|
$helptext =~ s/\'/\\\'/g; |
|
my $result = ''; |
|
$result.=<<"ENDWIN"; |
|
<table width="100%"><tr><td align="right"> |
|
<a href="javascript:openWin('$helptext')">help</a> |
|
</td></tr></table><hr /> |
|
ENDWIN |
|
return $result; |
|
} |
|
##---------------------------------------------------------------------- |
|
1; |
1; |
__END__ |
__END__ |
|
|