mirror of
https://github.com/dkogan/feedgnuplot.git
synced 2025-05-05 22:11:12 +08:00
Added a new .gp terminal to create self-plotting gnuplot scripts
This commit is contained in:
parent
350b2db022
commit
016c7ebfa9
149
bin/feedgnuplot
149
bin/feedgnuplot
@ -617,14 +617,95 @@ sub getNextLine
|
||||
sub mainThread
|
||||
{
|
||||
local *PIPE;
|
||||
|
||||
my $outputfile;
|
||||
my $outputfileType;
|
||||
if( defined $options{hardcopy})
|
||||
{
|
||||
$outputfile = $options{hardcopy};
|
||||
if( $outputfile =~ /^[^|] # starts with anything other than |
|
||||
.* # stuff in the middle
|
||||
\.(eps|ps|pdf|png|svg|gp)$/ix) # ends with a known extension
|
||||
{
|
||||
$outputfileType = lc $1;
|
||||
}
|
||||
|
||||
my %terminalOpts =
|
||||
( eps => 'postscript noenhanced solid color enhanced eps',
|
||||
ps => 'postscript noenhanced solid color landscape 12',
|
||||
pdf => 'pdfcairo noenhanced solid color font ",12" size 11in,8.5in',
|
||||
png => 'png noenhanced size 1280,1024',
|
||||
svg => 'svg noenhanced',
|
||||
gp => 'gp');
|
||||
|
||||
if( !defined $options{terminal} &&
|
||||
defined $outputfileType &&
|
||||
$terminalOpts{$outputfileType} )
|
||||
{
|
||||
$options{terminal} = $terminalOpts{$outputfileType};
|
||||
}
|
||||
|
||||
die "Asked to plot to file '$outputfile', but I don't know which terminal to use, and no --terminal given"
|
||||
unless $options{terminal};
|
||||
}
|
||||
|
||||
|
||||
sub gpterminal
|
||||
{
|
||||
return defined $options{terminal} && $options{terminal} eq 'gp';
|
||||
}
|
||||
sub datadump_only
|
||||
{
|
||||
return
|
||||
exists $options{dump} ||
|
||||
gpterminal();
|
||||
}
|
||||
sub search_PATH
|
||||
{
|
||||
for my $pathdir (File::Spec->path())
|
||||
{
|
||||
my $gnuplot_execpath = File::Spec->catfile($pathdir, $_[0]);
|
||||
return $gnuplot_execpath
|
||||
if -x $gnuplot_execpath && ! -d $gnuplot_execpath;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(datadump_only())
|
||||
{
|
||||
if(gpterminal())
|
||||
{
|
||||
open PIPE, '>', $outputfile;
|
||||
|
||||
my $gnuplotpath = search_PATH('gnuplot');
|
||||
if(!defined $gnuplotpath)
|
||||
{
|
||||
print STDERR "Couldn't find the gnuplot executable path. Creating .gp file still, but omitting #!. This will NOT be self-executable";
|
||||
}
|
||||
else
|
||||
{
|
||||
chmod 0755, $outputfile;
|
||||
print PIPE "#!$gnuplotpath\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*PIPE = *STDOUT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
my $dopersist = '';
|
||||
|
||||
if ( getGnuplotVersion() >= 4.3 && # --persist not available before this
|
||||
|
||||
# --persist is needed for the "half-alive" state (see documentation for
|
||||
# --exit). This state is only used with these options:
|
||||
!$options{stream} && $options{exit})
|
||||
{
|
||||
!$options{stream} && $options{exit}) {
|
||||
$dopersist = '--persist';
|
||||
}
|
||||
|
||||
@ -639,52 +720,17 @@ sub mainThread
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if(exists $options{dump})
|
||||
{
|
||||
*PIPE = *STDOUT;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $geometry = defined $options{geometry} ?
|
||||
"-geometry $options{geometry}" : '';
|
||||
open PIPE, "|gnuplot $geometry $dopersist" or die "Can't initialize gnuplot\n";
|
||||
}
|
||||
autoflush PIPE 1;
|
||||
|
||||
my $outputfile;
|
||||
my $outputfileType;
|
||||
if( defined $options{hardcopy})
|
||||
{
|
||||
$outputfile = $options{hardcopy};
|
||||
if( $outputfile =~ /^[^|] # starts with anything other than |
|
||||
.* # stuff in the middle
|
||||
\.(eps|ps|pdf|png|svg)$/ix) # ends with a known extension
|
||||
{
|
||||
$outputfileType = lc $1;
|
||||
}
|
||||
|
||||
my %terminalOpts =
|
||||
( eps => 'postscript noenhanced solid color enhanced eps',
|
||||
ps => 'postscript noenhanced solid color landscape 12',
|
||||
pdf => 'pdfcairo noenhanced solid color font ",12" size 11in,8.5in',
|
||||
png => 'png noenhanced size 1280,1024',
|
||||
svg => 'svg noenhanced');
|
||||
|
||||
if( !defined $options{terminal} &&
|
||||
defined $outputfileType &&
|
||||
$terminalOpts{$outputfileType} )
|
||||
if(!gpterminal())
|
||||
{
|
||||
$options{terminal} = $terminalOpts{$outputfileType};
|
||||
}
|
||||
|
||||
die "Asked to plot to file '$outputfile', but I don't know which terminal to use, and no --terminal given"
|
||||
unless $options{terminal};
|
||||
}
|
||||
print PIPE "set terminal $options{terminal}\n" if $options{terminal};
|
||||
print PIPE "set output \"$outputfile\"\n" if $outputfile;
|
||||
}
|
||||
|
||||
# set up plotting style
|
||||
my $style = '';
|
||||
@ -961,7 +1007,7 @@ sub mainThread
|
||||
# finished reading in all. Plot what we have
|
||||
plotStoredData() unless $options{stream} && $options{exit};
|
||||
|
||||
if ( defined $options{hardcopy})
|
||||
if ( defined $options{hardcopy} && !gpterminal())
|
||||
{
|
||||
print PIPE "set output\n";
|
||||
|
||||
@ -990,7 +1036,12 @@ sub mainThread
|
||||
# we persist gnuplot, so we shouldn't need this sleep. However, once
|
||||
# gnuplot exits, but the persistent window sticks around, you can no
|
||||
# longer interactively zoom the plot. So we still sleep
|
||||
unless($options{dump} || $options{exit})
|
||||
if(gpterminal())
|
||||
{
|
||||
print PIPE "pause mouse close\n";
|
||||
close PIPE;
|
||||
}
|
||||
elsif(!($options{dump} || $options{exit}))
|
||||
{
|
||||
print PIPE "pause mouse close\n";
|
||||
}
|
||||
@ -1540,15 +1591,20 @@ This command causes feedgnuplot to exit.
|
||||
|
||||
The script is able to produce hardcopy output with C<--hardcopy outputfile>. The
|
||||
output type can be inferred from the filename, if B<.ps>, B<.eps>, B<.pdf>,
|
||||
B<.svg> or B<.png> is requested. If any other file type is requested,
|
||||
B<.svg>, B<.png> or B<.gp> is requested. If any other file type is requested,
|
||||
C<--terminal> I<must> be passed in to tell gnuplot how to make the plot. If
|
||||
C<--terminal> is passed in, then the C<--hardcopy> argument only provides the
|
||||
output filename.
|
||||
|
||||
The B<.gp> output is special. Instead of asking gnuplot to plot to a particular
|
||||
terminal, writing to a B<.gp> simply dumps a self-executable gnuplot script into
|
||||
the given file. This is similar to what C<--dump> does, but writes to a file,
|
||||
and makes sure that the file can be self-executing.
|
||||
|
||||
=head2 Self-plotting data files
|
||||
|
||||
This script can be used to enable self-plotting data files. There are 2 ways of
|
||||
doing this: with a shebang (#!) or with inline perl data.
|
||||
This script can be used to enable self-plotting data files. There are several
|
||||
ways of doing this: with a shebang (#!) or with inline perl data.
|
||||
|
||||
=head3 Self-plotting data with a #!
|
||||
|
||||
@ -1582,6 +1638,11 @@ characters and that the full path to feedgnuplot must be given. The 127
|
||||
character limit is a serious limitation, but this can likely be resolved with a
|
||||
kernel patch. I have only tried on Linux 2.6.
|
||||
|
||||
=head3 Self-plotting data with gnuplot
|
||||
|
||||
Running C<feedgnuplot --hardcopy plotdata.gp ....> will create a self-executable
|
||||
gnuplot script in C<plotdata.gp>
|
||||
|
||||
=head3 Self-plotting data with perl inline data
|
||||
|
||||
Perl supports storing data and code in the same file. This can also be used to
|
||||
|
Loading…
Reference in New Issue
Block a user