changeset 5361:0ac38aea9f76

[project @ 2005-05-23 19:08:36 by jwe]
author jwe
date Mon, 23 May 2005 19:08:36 +0000
parents 33adb987c033
children ef053d682e42
files scripts/plot/print.m
diffstat 1 files changed, 371 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/plot/print.m	Mon May 23 19:08:36 2005 +0000
@@ -0,0 +1,371 @@
+## Copyright (C) 2001 Laurent Mazet
+##
+## This program is free software; it is distributed in the hope that it
+## will be useful, but WITHOUT ANY WARRANTY; without even the implied
+## warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+## the GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this file; see the file COPYING.  If not, write to the
+## Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+##
+## Copyright (C) 1999 Daniel Heiserer
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} print (@var{filename}, @var{options})
+##
+## Print a graph, or save it to a file
+##
+## @var{filename} defines the file name of the output file. If no
+## filename is specified, output is sent to the printer.
+##
+## @var{options}:
+## @table @code
+## @item -P@var{printer}
+##   Set the @var{printer} name to which the graph is sent if no
+##   @var{filename} is specified.
+## @item -color
+## @itemx -mono
+##   Monochrome or colour lines.
+## @item -solid
+## @itemx -dashed
+##   Solid or dashed lines.
+## @item -portrait
+## @itemx -landscape
+##   Plot orientation, as returned by "orient".
+## @item -d@var{device}
+##   Output device, where @var{device} is one of:
+##   @table @code
+##   @item ps
+##   @itemx ps2
+##   @itemx psc
+##   @itemx psc2
+##     Postscript (level 1 and 2, mono and color)
+##   @item eps
+##   @itemx eps2
+##   @itemx epsc
+##   @itemx epsc2
+##     Encapsulated postscript (level 1 and 2, mono and color)
+##   @item ill
+##   @itemx aifm
+##     Adobe Illustrator
+##   @item cdr
+##   @itemx corel
+##     CorelDraw
+##   @item hpgl
+##     HP plotter language
+##   @item fig
+##     XFig
+##   @item dxf
+##     AutoCAD
+##   @item mf
+##     Metafont
+##   @item png
+##     Portable network graphics
+##   @item pbm
+##     PBMplus
+##   @end table
+##
+##   Other devices are supported by "convert" from ImageMagick.  Type
+##   system("convert") to see what formats are available.
+##
+##   If the device is omitted, it is inferred from the file extension,
+##   or if there is no filename it is sent to the printer as postscript.
+##
+## @item -F@var{fontname}
+## @itemx -F@var{fontname}:@var{size}
+## @itemx -F:@var{size}
+##   @var{fontname} set the postscript font (for use with postscript,
+##   aifm, corel and fig). By default, 'Helvetica' is set for PS/Aifm,
+##   and 'SwitzerlandLight' for Corel. It can also be 'Times-Roman'.
+##   @var{size} is given in points. @var{fontname} is ignored for the
+##   fig device.
+## @end table
+##
+## The filename and options can be given in any order.
+##
+## If you are using Octave 2.1.x or above, command("print") will change 
+## print from a function to a command, so instead of typing
+##    print("-FTimes-Roman:14", "-dashed", "-depsc", "out.ps")
+## you can type
+##    print -FTimes-Roman:14 -dashed -depsc out.ps
+##
+## See also: orient, command
+## @end deftypefn
+
+## Author: Daniel Heiserer <Daniel.heiserer@physik.tu-muenchen.de>
+## 2001-03-23  Laurent Mazet <mazet@crm.mot.com>
+##     * simplified interface: guess the device from the extension
+##     * font support
+## 2001-03-25  Paul Kienzle <pkienzle@kienzle.powernet.co.uk>
+##     * add unwind_protect
+##     * use tmpnam to generate temporary name
+##     * move "set term" before "set output" as required by gnuplot
+##     * more options, and flexible options
+## 2001-03-29  Laurent Mazet <mazet@crm.mot.com>
+##     * add solid and dashed options
+##     * change PBMplus device
+##     * add Corel device
+##     * take care of the default terminal settings to restore them.
+##     * add color, mono, dashed and solid support for printing and convert.
+##     * add orientation for printing.
+##     * create a .ps for printing (avoid some filtering problems).
+##     * default printing is mono, default convert is color.
+##     * add font size support.
+## 2001-03-30  Laurent Mazet <mazet@crm.mot.com>
+##     * correct correl into corel
+##     * delete a irrelevant test
+##     * check for convert before choosing the ouput device
+## 2001-03-31  Paul Kienzle <pkienzle@kienzle.powernet.co.uk>
+##     * use -Ffontname:size instead of -F"fontname size"
+##     * add font size support to fig option
+##     * update documentation
+## 2003-10-01  Laurent Mazet <mazet@crm.mot.com>
+##     * clean documentation
+
+function print(varargin)
+
+  ## take care of the settings we had before
+  origterm = gget("terminal");
+  origout = gget("output");
+  ## End of line trmination for __gnuplot_raw__ command strings.
+  endl = ";\n";
+  _automatic_replot = automatic_replot;
+
+  ## take care of the default terminal settings to restore them.
+  terminal_default = "";
+  
+  orientation = orient;
+  use_color = 0; # 0=default, -1=mono, +1=color
+  force_solid = 0; # 0=default, -1=dashed, +1=solid
+  fontsize = font = name = devopt = printer = "";
+  
+  va_arg_cnt = 1;
+
+  for i=1:nargin
+    arg = nth (varargin, va_arg_cnt++);
+    if isstr(arg)
+      if strcmp(arg, "-color")
+	use_color = 1;
+      elseif strcmp(arg, "-mono")
+	use_color = -1;
+      elseif strcmp(arg, "-solid")
+        force_solid = 1;
+      elseif strcmp(arg, "-dashed")
+        force_solid = -1;
+      elseif strcmp(arg, "-portrait")
+	orientation = "portrait";
+      elseif strcmp(arg, "-landscape")
+	orientation = "landscape";
+      elseif length(arg) > 2 && arg(1:2) == "-d"
+	devopt = arg(3:length(arg));
+      elseif length(arg) > 2 && arg(1:2) == "-P"
+	printer = arg;
+      elseif length(arg) > 2 && arg(1:2) == "-F"
+	idx = rindex(arg, ":");
+	if (idx)
+	  font = arg(3:idx-1);
+	  fontsize = arg(idx+1:length(arg));
+	else
+	  font = arg(3:length(arg));
+	endif
+      elseif length(arg) >= 1 && arg(1) == "-"
+	error([ "print: unknown option ", arg ]);
+      elseif length(arg) > 0
+	name = arg;
+      endif
+    else
+      error("print: expects string options");
+    endif
+  endfor
+
+  doprint = isempty(name);
+  if doprint
+    if isempty(devopt)
+      printname = [ tmpnam, ".ps" ]; 
+    else
+      printname = [ tmpnam, ".", devopt ];
+    endif
+    name = printname;
+  endif
+
+  if isempty(devopt)
+    dot = rindex(name, ".");
+    if (dot == 0) 
+      error ("print: no format specified");
+    else
+      dev = tolower(name(dot+1:length(name)));
+    endif
+  else
+    dev = devopt;
+  endif
+
+  if strcmp(dev, "ill")
+    dev = "aifm";
+  elseif strcmp(dev, "cdr")
+    dev = "corel";
+  endif
+
+  ## check if we have to use convert
+  dev_list = [" aifm corel fig png pbm dxf mf hpgl", ...
+	      " ps ps2 psc psc2 eps eps2 epsc epsc2 " ];
+  convertname = "";
+  if isempty(findstr(dev_list , [ " ", dev, " " ]))
+    if !isempty(devopt)
+      convertname = [ devopt ":" name ];
+    else
+      convertname = name;
+    endif
+    dev = "epsc";
+    name = [ tmpnam, ".eps" ];
+  endif
+  
+  unwind_protect
+    automatic_replot = 0;
+
+    if strcmp(dev, "ps") || strcmp(dev, "ps2") ...
+	  || strcmp(dev, "psc")  || strcmp(dev, "psc2") ...
+	  || strcmp(dev, "epsc") || strcmp(dev, "epsc2") ... 
+	  || strcmp(dev, "eps")  || strcmp(dev, "eps2")
+      ## Various postscript options
+      ## FIXME: Do we need this? DAS
+      ##__gnuplot_set__ term postscript
+      terminal_default = gget ("terminal");
+      
+      if dev(1) == "e"
+	options = "eps ";
+      else
+	options = [ orientation, " " ];
+      endif
+      options = [ options, "enhanced " ];
+      
+      if any( dev == "c" ) || use_color > 0
+        if force_solid < 0
+	  options = [ options, "color dashed " ];
+	else
+          options = [ options, "color solid " ];
+        endif
+      else
+        if force_solid > 0
+	  options = [ options, "mono solid " ];
+	else
+	  options = [ options, "mono dashed " ];
+        endif
+      endif
+
+      if !isempty(font)
+	options = [ options, "\"", font, "\" " ];
+      endif
+      if !isempty(fontsize)
+	options = [ options, " ", fontsize ];
+      endif
+
+      __gnuplot_raw__ (["set term postscript ", options, endl]);
+
+
+    elseif strcmp(dev, "aifm") || strcmp(dev, "corel")
+      ## Adobe Illustrator, CorelDraw
+      ## FIXME: Do we need it? DAS
+      ## eval(sprintf ("__gnuplot_set__ term %s", dev));
+      terminal_default = gget ("terminal");
+      if (use_color >= 0)
+	options = " color";
+      else
+	options = " mono";
+      endif
+      if !isempty(font)
+	options = [ options, " \"" , font, "\"" ];
+      endif
+      if !isempty(fontsize)
+	options = [ options, " ", fontsize ];
+      endif
+
+      __gnuplot_raw__ (["set term ", dev, " ", options, endl]);
+
+    elseif strcmp(dev, "fig")
+      ## XFig
+      ## FIXME: Do we need it? DAS
+      ## __gnuplot_set__ term fig
+      terminal_default = gget ("terminal");
+      options = orientation;
+      if (use_color >= 0)
+	options = " color";
+      else
+	options = " mono";
+      endif
+      if !isempty(fontsize)
+	options = [ options, " fontsize ", fontsize ];
+      endif
+      __gnuplot_raw__ (["set term fig ", options, endl]);
+
+    elseif strcmp(dev, "png") || strcmp(dev, "pbm")
+      ## Portable network graphics, PBMplus
+      ## FIXME: Do we need it? DAS
+      ## eval(sprintf ("__gnuplot_set__ term %s", dev));
+      terminal_default = gget ("terminal");
+
+      ## FIXME
+      ## New PNG interface takes color as "xRRGGBB" where x is the literal character
+      ## 'x' and 'RRGGBB' are the red, green and blue components in hex.
+      ## For now we just ignore it and use default. 
+      ## The png terminal now is so rich with options, that one perhaps
+      ## has to write a separate printpng.m function.
+      ## DAS
+
+      ##
+      ## if (use_color >= 0)
+      ##	eval (sprintf ("__gnuplot_set__ term %s color medium", dev));
+      ##else
+      ##eval (sprintf ("__gnuplot_set__ term %s mono medium", dev));
+      ##endif
+      
+      __gnuplot_raw__ ("set term png large;\n")
+ 
+    elseif strcmp(dev,"dxf") || strcmp(dev,"mf") || strcmp(dev, "hpgl")
+      ## AutoCad DXF, METAFONT, HPGL
+      __gnuplot_raw__ (["set terminal ", dev, endl]);
+            
+    endif;
+    
+    ## Gnuplot expects " around output file name
+
+    __gnuplot_raw__ (["set output \"", name, "\"", endl]);
+    __gnuplot_replot__
+    
+  unwind_protect_cleanup
+
+    ## Restore init state
+    if ! isempty (terminal_default)
+      __gnuplot_raw__ (["set terminal ", terminal_default, endl]);
+    endif
+    __gnuplot_raw__ (["set terminal ", origterm, endl]);
+    if isempty (origout)
+      __gnuplot_raw__ ("set output;\n")
+    else
+    ## Gnuplot expects " around output file name
+
+      __gnuplot_raw__ (["set output \"", origout, "\"", endl]);
+    end
+    __gnuplot_replot__
+    
+    automatic_replot = _automatic_replot ;
+
+  end_unwind_protect
+
+  if !isempty(convertname)
+    command = [ "convert '", name, "' '", convertname, "'" ];
+    [output, errcode] = system (command);
+    unlink (name);
+    if (errcode)
+      error ("print: could not convert");
+    endif
+  endif
+  ## FIXME: This looks like a dirty, Unix-specific hack
+  ## DAS
+  if doprint
+    system(sprintf ("lpr %s '%s'", printer, printname));
+    unlink(printname);
+  endif
+  
+endfunction