diff main/plot/print.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 7489ae70c347
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/plot/print.m	Wed Oct 10 19:54:49 2001 +0000
@@ -0,0 +1,321 @@
+## Copyright (C) 1999 Daniel Heiserer, 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.
+
+## usage: print (filename, options)
+##
+## Print a graph, or save it to a file
+##
+## filename: 
+##   File to receive output.  If no filename is specified, output is
+##   sent to the printer.
+##
+## options:
+##   -Pprinter
+##      Printer to which the graph is sent if no filename is specified.
+##
+##   -color | -mono
+##      Monochrome or colour lines.
+##
+##   -solid | -dashed
+##      Solid or dashed lines.
+##
+##   -portrait | -landscape
+##      Plot orientation, as returned by "orient".
+##
+##   -dDEVICE
+##      Output device, where DEVICE is one of:
+##
+##        ps,ps2,psc,psc2      
+##             Postscript (level 1 and 2, mono and color)
+##        eps,eps2,epsc,epsc2  
+##             Encapsulated postscript (level 1 and 2, mono and color)
+##        ill,aifm 
+##             Adobe Illustrator
+##        cdr,corel
+##             CorelDraw
+##        hpgl HP plotter language
+##        fig  XFig
+##        dxf  AutoCAD
+##        mf   Metafont
+##        png  Portable network graphics
+##        pbm  PBMplus
+##
+##      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.
+##
+##   -Ffontname, -Ffontname:size, -F:size
+##      Postscript font (for use with postscript, aifm, corel and fig)
+##      "Helvetica" by default for PS/Aifm, "SwitzerlandLight" for Corel
+##      Can also be "Times-Roman".  The font size is given in points.
+##      The fontname is ignored for the fig device.
+##
+## 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
+
+## 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
+
+function print(...)
+
+  ## take care of the settings we had before
+  origterm = gget("terminal");
+  origout = gget("output");
+  _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_start();
+  for i=1:nargin
+    arg = va_arg();
+    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
+      gset 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
+
+      eval (sprintf ("gset term postscript %s;", options));
+
+
+    elseif strcmp(dev, "aifm") || strcmp(dev, "corel")
+      ## Adobe Illustrator, CorelDraw
+      eval(sprintf ("gset 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
+
+      eval (sprintf ("gset term %s %s;", dev, options));
+
+    elseif strcmp(dev, "fig")
+      ## XFig
+      gset 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
+      eval (sprintf ("gset term fig %s;", option));
+
+    elseif strcmp(dev, "png") || strcmp(dev, "pbm")
+      ## Portable network graphics, PBMplus
+      eval(sprintf ("gset term %s;", dev));
+      terminal_default = gget ("terminal");
+      if (use_color >= 0)
+      	eval (sprintf ("gset term %s color medium;", dev));
+      else
+	eval (sprintf ("gset term %s mono medium;", dev));
+      endif
+
+    elseif strcmp(dev,"dxf") || strcmp(dev,"mf") || strcmp(dev, "hpgl")
+      ## AutoCad DXF, METAFONT, HPGL
+      eval (sprintf ("gset terminal %s;", dev));
+            
+    endif;
+    
+    eval (sprintf ("gset output \"%s\";", name));
+    replot;
+    
+  unwind_protect_cleanup
+
+    ## Restore init state
+    if isempty (origout)
+      gset output;
+    else
+      eval (sprintf ("gset output %s;", origout));
+    end
+    if ! isempty (terminal_default)
+      eval (sprintf ("gset terminal %s;", terminal_default));
+    endif
+    eval (sprintf ("gset terminal %s;", origterm));
+    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
+  if doprint
+    system(sprintf ("lpr %s %s", printer, printname));
+    unlink(printname);
+  endif
+  
+endfunction