[LON-CAPA-cvs] cvs: loncom /xml lonplot.pm

foxr foxr at source.lon-capa.org
Mon Jul 16 06:09:36 EDT 2012


foxr		Mon Jul 16 10:09:36 2012 EDT

  Modified files:              
    /loncom/xml	lonplot.pm 
  Log:
  Bug 4308 - Provide control over arrows in vector plots.
  See http://bugs.loncapa.org/show_bug.cgi?id=4308 for details on what is now
  available.
  
  
  
Index: loncom/xml/lonplot.pm
diff -u loncom/xml/lonplot.pm:1.159 loncom/xml/lonplot.pm:1.160
--- loncom/xml/lonplot.pm:1.159	Mon Jul  9 11:11:47 2012
+++ loncom/xml/lonplot.pm	Mon Jul 16 10:09:36 2012
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.159 2012/07/09 11:11:47 foxr Exp $
+# $Id: lonplot.pm,v 1.160 2012/07/16 10:09:36 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -139,6 +139,10 @@
 my $linestyle_test = sub {exists($linestyles{$_[0]})};
 my $words_test     = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^([\w~!\@\#\$\%^&\*\(\)-=_\+\[\]\{\}:\;\'<>,\.\/\?\\]+ ?)+$/};
 
+my $arrowhead_test = sub{$_[0]=~/^(nohead|head|heads| )+$/};
+my $arrowstyle_test= sub{$_[0]=~/^(filled|empty|nofilled)+$/};
+my $degree_test  = sub{&$pos_real_test($_[0]) && ($_[0] <= 360.0)};
+
 ###################################################################
 ##                                                               ##
 ##                      Attribute metadata                       ##
@@ -533,7 +537,10 @@
      	},
      );
 
-my @curve_edit_order = ('color','name','linestyle','linewidth','linetype','pointtype','pointsize','limit');
+my @curve_edit_order = ('color','name','linestyle','linewidth','linetype',
+			'pointtype','pointsize','limit', 'arrowhead', 'arrowstyle', 
+			'arrowlength', 'arrowangle', 'arrowbackangle'
+    );
 
 my %curve_defaults = 
     (
@@ -594,6 +601,43 @@
          edit_type   => 'choice',
          choices     => ['above', 'below', 'closed','x1','x2','y1','y2']
          },
+     arrowhead => {
+         default     => 'head',
+	 test        => $arrowhead_test,
+	 description => 'Vector arrow head type',
+	 edit_type   => 'choice',
+	 choices     => ['nohead', 'head', 'heads']
+     },
+     arrowstyle => {
+	 default     => 'filled',
+	 test        => $arrowstyle_test,
+	 description => 'Vector arrow head style',
+	 edit_type   => 'choice',
+	 choices     => ['filled', 'empty', 'nofilled']
+     },
+     arrowlength => {
+	 default     => 0.02,
+	 test        => $pos_real_test,
+	 description => "Length of vector arrow (only applies to vector plots)",
+	 edit_type   => 'entry',
+	 size        => '5'
+     },
+     arrowangle  => {
+	default      => 10.0,
+	test         => $degree_test,
+	description  => 'Angle of arrow branches to arrow body (only applies to vector plots)',
+	edit_type    => 'entry',
+	size         => '5'
+     },
+
+     arrowbackangle => {
+	 default    => 90.0,
+	 test       => $degree_test,
+	 descripton => 'Angle of arrow back lines to branches.',
+	 edit_type  => 'entry',
+	 size       => '5'
+     }
+
      );
 
 ###################################################################
@@ -1850,6 +1894,11 @@
     my $linestyle_index = 50;
     my $line_width   = '';
 
+    # If arrows are needed there will be an arrow style for each as well:
+    #
+
+    my $arrow_style_index = 50;
+
     my $plot_command;
     my $plot_type;
 
@@ -1892,6 +1941,26 @@
 	my $pointtype = '';
 	my $pointsize = '';
 
+	# Figure out the linestyle:
+
+	my $lt = $curve->{'linetype'} ne '' ? $curve->{'linetype'} 
+	                : 'solid';	# Line type defaults to solid.
+	# The mapping of lt -> the actual gnuplot line type depends on the target:
+
+	if ($target eq 'tex') {
+	    $lt = $ps_linetypes{$lt};
+	} else {
+	    $lt = $linetypes{$lt}
+	}
+
+	my $color = $curve->{'color'};
+	$color =~ s/^x/#/;	        # Convert xhex color -> #hex color.   
+
+	my $style_command = "set style line $linestyle_index $pointtype $pointsize linetype $lt linewidth $line_width lc rgb '$color'\n";
+	$gnuplot_input .= $style_command;
+
+
+
 	if (($curve->{'linestyle'} eq 'points')      ||
 	    ($curve->{'linestyle'} eq 'linespoints') ||
 	    ($curve->{'linestyle'} eq 'errorbars')   ||
@@ -1903,34 +1972,39 @@
 	    $pointsize =' pointsize '.$curve->{'pointsize'};
 	} elsif ($curve->{'linestyle'} eq 'filledcurves') { 
 	    $plot_command.= ' '.$curve->{'limit'};
-	} 
+	} elsif ($curve->{'linestyle'} eq 'vector') {
 
+	    # Create the arrow head style add it to 
+	    # $gnuplot_input..and ensure it gets
+	    # Selected in the plot command.
 
-	# Figure out the linestyle:
+	    $gnuplot_input .= "set style arrow $arrow_style_index ";
+	    $gnuplot_input .= ' ' . $curve->{'arrowhead'};
+	    $gnuplot_input .= ' size ' . $curve->{'arrowlength'};
+	    $gnuplot_input .= ','.$curve->{'arrowangle'};
+	    $gnuplot_input .= ',' . $curve->{'arrowbackangle'}; 
+	    $gnuplot_input .=  ' ' . $curve->{'arrowstyle'} . " ls $linestyle_index\n";
 
-	my $lt = $curve->{'linetype'} ne '' ? $curve->{'linetype'} 
-	                : 'solid';	# Line type defaults to solid.
-	# The mapping of lt -> the actual gnuplot line type depends on the target:
 
-	if ($target eq 'tex') {
-	    $lt = $ps_linetypes{$lt};
-	} else {
-	    $lt = $linetypes{$lt}
+	    $plot_command  .= "  arrowstyle $arrow_style_index ";
+	    $arrow_style_index++;
 	}
 
-	my $color = $curve->{'color'};
-	$color =~ s/^x/#/;	        # Convert xhex color -> #hex color.   
 
-	my $style_command = "set style line $linestyle_index $pointtype $pointsize linetype $lt linewidth $line_width lc rgb '$color'\n";
-	$gnuplot_input .= $style_command;
 
-	$plot_command.= " ls $linestyle_index";
+
+	# The condition below is because gnuplot lumps the linestyle in with the 
+	# arrowstyle _sigh_.
+
+	if ($curve->{'linestyle'} ne 'vector') {
+	    $plot_command.= " ls $linestyle_index";
+	}
+
 	$gnuplot_input .= 'plot ' . $plot_type . ' ' . $plot_command . "\n";
 	$linestyle_index++;	# Each curve get a unique linestyle.
     }
     # Write the output to a file.
     open (my $fh,">$tmpdir$filename.data");
-    # binmode($fh, ":utf8");
     print $fh $gnuplot_input;
     close($fh);
     # That's all folks.




More information about the LON-CAPA-cvs mailing list