Mercurial > hg > octave-nkf
diff scripts/plot/util/zoom.m @ 19281:8a6f87637c16
hg new function, zoom
* zoom.m: New function.
* plot/util/module.mk: Add it to the list.
* pan.m, rotate3d.m: Update @seealso lists.
* plot.txi: Document it.
* NEWS: Mention it.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 13 Sep 2014 16:45:31 -0400 |
parents | |
children | 0f9c5a15c8fa |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/plot/util/zoom.m @@ -0,0 +1,122 @@ +## Copyright (C) 2014 John W. Eaton +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave 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 Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Command} {} zoom (@var{factor}) +## @deftypefnx {Command} {} zoom out +## @deftypefnx {Command} {} zoom reset +## Zoom the current axes object. +## +## Given a numeric argument greater than zero, zoom by the given factor. +## If the zoom factor is greater than one, zoom in on the plot. If the +## factor is less than one, zoom out. +## +## Given the option @qcode{"out"}, zoom to the initial zoom setting. +## +## Given the option @qcode{"reset"}, set the initial zoom setting to the +## current axes limits. +## +## @seealso{pan, rotate3d} +## @end deftypefn + +## Eventually we need to also support these features: +## @deftypefn {Command} {} zoom +## @deftypefnx {Command} {} zoom on +## @deftypefnx {Command} {} zoom off +## @deftypefnx {Command} {} zoom xon +## @deftypefnx {Command} {} zoom yon +## @deftypefnx {Command} {} zoom (@var{hfig}, @var{option}) +## @deftypefnx {Command} {zoom_object_handle =} zoom (@var{hfig}) + +function zoom (varargin) + + hfig = NaN; + + nargs = nargin; + + if (nargs > 2) + print_usage (); + endif + + if (nargin == 1 && isfigure (varargin{1})) + error ("zoom_object_handle = zoom (hfig): not implemented"); + endif + + if (nargs == 2) + hfig = varargin{1}; + if (isfigure (hfig)) + varargin(1) = []; + nargs--; + else + error ("zoom: expecting figure handle as first argument"); + endif + endif + + if (isnan (hfig)) + hfig = gcf (); + endif + + if (nargs == 0) + error ("zoom: toggling zoom mode is not implemented"); + elseif (nargs == 1) + arg = varargin{1}; + if (isnumeric (arg)) + factor = arg; + if (factor < 0) + error ("zoom: factor must be greater than 1"); + elseif (factor == 1) + return; + endif + cax = get (hfig, "currentaxes"); + if (! isempty (cax)) + limits = axis (); + initial_zoom = getappdata (cax, "initial_zoom"); + if (isempty (initial_zoom)) + setappdata (cax, "__initial_zoom__", limits); + endif + axis (cax, limits / factor); + endif + elseif (ischar (arg)) + switch (arg) + case {"on", "off", "xon", "yon"} + error ("zoom %s: not implemented", arg); + + case "out" + cax = get (hfig, "currentaxes"); + if (! isempty (cax)) + initial_zoom = getappdata (cax, "__initial_zoom__"); + if (! isempty (initial_zoom)) + axis (cax, initial_zoom); + endif + endif + + case "reset" + cax = get (hfig, "currentaxes"); + if (! isempty (cax)) + setappdata (cax, "__initial_zoom__", axis ()); + endif + + otherwise + error ("zoom: unrecognized option '%s'", arg); + endswitch + else + error ("zoom: wrong type argument '%s'", class (arg)); + endif + endif + +endfunction