[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