--- loncom/xml/lonplot.pm	2002/10/15 18:42:41	1.79
+++ loncom/xml/lonplot.pm	2003/08/28 20:38:25	1.87
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.79 2002/10/15 18:42:41 matthew Exp $
+# $Id: lonplot.pm,v 1.87 2003/08/28 20:38:25 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -112,7 +112,8 @@ my $words_test     = sub {$_[0]=~s/\s+/
 ##                                                               ##
 ###################################################################
 my @gnuplot_edit_order = 
-    qw/alttag bgcolor fgcolor height width font transparent grid samples border align/;
+    qw/alttag bgcolor fgcolor height width font transparent grid samples 
+    border align texwidth plottype/;
 
 my $gnuplot_help_text = <<"ENDPLOTHELP";
 <p>
@@ -221,7 +222,21 @@ my %gnuplot_defaults =
 	 description => 'alignment for image in html',
 	 edit_type   => 'choice',
 	 choices     => ['left','right','center']
-	 } 
+	 },
+     texwidth     => {
+         default     => '93',
+         test        => $int_test,
+         description => 'Width of plot when printed (mm)',
+         edit_type   => 'entry',
+         size        => '5'
+         },
+     plottype  => {
+	 default     => 'Cartesian',
+	 test        => sub {$_[0]=~/^(Polar|Cartesian)$/},
+	 description => 'Plot type:',
+	 edit_type   => 'choice',
+         choices     => ['Polar','Cartesian']
+         },
      );
 
 my %key_defaults = 
@@ -506,7 +521,8 @@ sub end_gnuplot {
 ENDIMAGE
         } elsif ($target eq 'tex') {
 	    &Apache::lonnet::ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");
-	    $result = '\graphicspath{{/home/httpd/perl/tmp/}}\fbox{\includegraphics{'.&Apache::lonnet::unescape($filename).'.eps}}';
+
+	    $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}';
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_end($target,$token);
@@ -613,7 +629,7 @@ sub start_title {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
-	$title = &Apache::lonxml::get_all_text("/title",$$parser[-1]);
+	$title = &Apache::lonxml::get_all_text("/title",$parser);
 	$title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);
 	$title =~ s/\n/ /g;
 	if (length($title) > $max_str_len) {
@@ -621,7 +637,7 @@ sub start_title {
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_start($target,$token,'Plot Title');
-	my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]);
+	my $text=&Apache::lonxml::get_all_text("/title",$parser);
 	$result.=&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -647,7 +663,7 @@ sub start_xlabel {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
-	$xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);
+	$xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser);
 	$xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);
 	$xlabel =~ s/\n/ /g;
 	if (length($xlabel) > $max_str_len) {
@@ -655,7 +671,7 @@ sub start_xlabel {
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel');
-	my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);
+	my $text=&Apache::lonxml::get_all_text("/xlabel",$parser);
 	$result.=&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -682,7 +698,7 @@ sub start_ylabel {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
-	$ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);
+	$ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser);
 	$ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);
 	$ylabel =~ s/\n/ /g;
 	if (length($ylabel) > $max_str_len) {
@@ -690,7 +706,7 @@ sub start_ylabel {
 	}
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel');
-	my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);
+	my $text = &Apache::lonxml::get_all_text("/ylabel",$parser);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -720,7 +736,7 @@ sub start_label {
 	my %label;
 	&get_attributes(\%label,\%label_defaults,$parstack,$safeeval,
 		    $tagstack->[-1]);
-	my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]);
+	my $text = &Apache::lonxml::get_all_text("/label",$parser);
 	$text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]);
 	$text =~ s/\n/ /g;
 	$text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);
@@ -729,7 +745,7 @@ sub start_label {
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Plot Label');
 	$result .= &edit_attributes($target,$token,\%label_defaults);
-	my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]);
+	my $text = &Apache::lonxml::get_all_text("/label",$parser);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -798,15 +814,19 @@ sub start_function {
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
 	if (exists($curves[-1]->{'data'})) {
-	    &Apache::lonxml::warning('Use of <function> precludes use of <data>.  The <data> will be omitted in favor of the <function> declaration.');
+	    &Apache::lonxml::warning
+                ('Use of the <b>curve function</b> tag precludes use of '.
+                 ' the <b>curve data</b> tag.  '.
+                 'The curve data tag will be omitted in favor of the '.
+                 'curve function declaration.');
 	    delete $curves[-1]->{'data'} ;
 	}
-        my $function = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
+        my $function = &Apache::lonxml::get_all_text("/function",$parser);
 	$function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
 	$curves[-1]->{'function'} = $function; 
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
-	my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
+	my $text = &Apache::lonxml::get_all_text("/function",$parser);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -834,12 +854,14 @@ sub start_data {
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
 	if (exists($curves[-1]->{'function'})) {
-	    &Apache::lonxml::warning('Use of <data> precludes use of .'.
-	    '<function>.  The <function> will be omitted in favor of '.
-            'the <data> declaration.');
+	    &Apache::lonxml::warning
+                ('Use of the <b>curve function</b> tag precludes use of '.
+                 ' the <b>curve data</b> tag.  '.
+                 'The curve function tag will be omitted in favor of the '.
+                 'curve data declaration.');
 	    delete($curves[-1]->{'function'});
 	}
-	my $datatext = &Apache::lonxml::get_all_text("/data",$$parser[-1]);
+	my $datatext = &Apache::lonxml::get_all_text("/data",$parser);
 	$datatext=&Apache::run::evaluate($datatext,$safeeval,$$parstack[-1]);
 	# Deal with cases where we're given an array...
 	if ($datatext =~ /^\@/) {
@@ -860,14 +882,14 @@ sub start_data {
 	    # Check that it's non-empty
 	    if (! defined($data[$i])) {
 		&Apache::lonxml::warning(
-		    'undefined <data> value.  Replacing with '.
+		    'undefined curve data value.  Replacing with '.
 		    ' pi/e = 1.15572734979092');
 		$data[$i] = 1.15572734979092;
 	    }
 	    # Check that it's a number
 	    if (! &$real_test($data[$i]) & ! &$int_test($data[$i])) {
 		&Apache::lonxml::warning(
-		    'Bad <data> value of '.$data[$i].'  Replacing with '.
+		    'Bad curve data value of '.$data[$i].'  Replacing with '.
 		    ' pi/e = 1.15572734979092');
 		$data[$i] = 1.15572734979092;
 	    }
@@ -882,7 +904,7 @@ sub start_data {
 	push  @{$curves[-1]->{'data'}},\@data;
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data');
-	my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]);
+	my $text = &Apache::lonxml::get_all_text("/data",$parser);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -955,8 +977,13 @@ sub set_defaults {
 sub get_attributes{
     my ($values,$defaults,$parstack,$safeeval,$tag) = @_;
     foreach my $attr (keys(%{$defaults})) {
-	$values->{$attr} = 
-	    &Apache::lonxml::get_param($attr,$parstack,$safeeval);
+	if ($attr eq 'texwidth') {
+	    $values->{$attr} = 
+		&Apache::lonxml::get_param($attr,$parstack,$safeeval,undef,1);
+	} else {
+	    $values->{$attr} = 
+		&Apache::lonxml::get_param($attr,$parstack,$safeeval);
+	}
 	if ($values->{$attr} eq '' | !defined($values->{$attr})) {
 	    $values->{$attr} = $defaults->{$attr}->{'default'};
 	    next;
@@ -1001,6 +1028,12 @@ sub write_gnuplot_file {
 	$gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
 	    &Apache::lonnet::unescape($filename).".eps\"\n";
     }
+    # cartesian or polar?
+    if (lc($plot{'plottype'}) eq 'polar') {
+        $gnuplot_input .= 'set polar'.$/;
+    } else {
+        # Assume Cartesian
+    }
     # grid
     $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on');
     # border
@@ -1135,7 +1168,7 @@ sub check_inputs {
     my $curve;
     foreach $curve (@curves) {
 	if (!defined($curve->{'function'})&&!defined($curve->{'data'})){
-	    &Apache::lonxml::warning("One of the curves specified did not contain any <data> or <function> declarations\n");
+	    &Apache::lonxml::warning("One of the curves specified did not contain any curve data or curve function declarations\n");
 	    return '';
 	}
     }