view 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 source

## 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