[changeset] - bug and fix for surfnorm()

John W. Eaton jwe at bevo.che.wisc.edu
Mon Oct 20 09:46:34 CDT 2008


On 19-Oct-2008, Ben Abbott wrote:

| 
| On Oct 18, 2008, at 6:19 PM, Ben Abbott wrote:
| 
| > I noticed that the lines below produced multiple surfaces
| >
| > 	surfnorm (peaks (10))
| > 	surf (peaks)
| >
| > The problem was with the "hold on" that was needed to add the normal- 
| > vectors to the surface ... and no "hold off" followed.
| >
| > The attached changeset fixes that.
| >
| > Ben
| >
| > <changeset-surfnorm.patch>
| 
| Dan,
| 
| I've merged your changeset with mine.
| 
| There are three differences between yours and mine. First you did a  
| nicer job of using the handle properties. Second, your placement  
| before the surf() command is more proper (imo). Third, I tried to  
| preserve the hold state for "oldh" as well. The one instance I can  
| imagine where that matters is when h==oldh and an error is encountered  
| during the "unwind_protect".
| 
| I've also added an extra demo which would illustrate that the hold  
| state was left on.
| 
| I've attached the changeset credited to you.

I made the following change:

  # HG changeset patch
  # User John W. Eaton <jwe at octave.org>
  # Date 1224513720 14400
  # Node ID 1e1e88bcc733f7069f8fbd88556a0a476e26ca5b
  # Parent  5cfeb7bc497a663a3321b15c0055e16f95dc5606
  surfnorm.m: save and restore hold state

  diff --git a/scripts/ChangeLog b/scripts/ChangeLog
  --- a/scripts/ChangeLog
  +++ b/scripts/ChangeLog
  @@ -1,3 +1,9 @@
  +2008-10-20  John W. Eaton  <jwe at octave.org>
  +
  +       * plot/surfnorm.m: Save and restore hold state.
  +       From Daniel J. Sebald <daniel.sebald at ieee.org> and
  +       Ben Abbott <bpabbott at mac.com>.
  +
   2008-10-20  Ben Abbott  <bpabbott at mac.com>

	  * plot/__stem__.m: Respect new ordering of children when setting
  diff --git a/scripts/plot/surfnorm.m b/scripts/plot/surfnorm.m
  --- a/scripts/plot/surfnorm.m
  +++ b/scripts/plot/surfnorm.m
  @@ -114,11 +114,16 @@
	 axes (h);
	 newplot ();
	 surf (x, y, z, varargin{ioff:end});
  -      hold on;
  -      plot3 ([x(:)'; x(:).' + nx(:).' ; NaN(size(x(:).'))](:),
  -            [y(:)'; y(:).' + ny(:).' ; NaN(size(y(:).'))](:),
  -            [z(:)'; z(:).' + nz(:).' ; NaN(size(z(:).'))](:), 
  -            varargin{ioff:end});
  +      old_hold_state = get (h, "nextplot");
  +      unwind_protect
  +       set (h, "nextplot", "add");
  +       plot3 ([x(:)'; x(:).' + nx(:).' ; NaN(size(x(:).'))](:),
  +              [y(:)'; y(:).' + ny(:).' ; NaN(size(y(:).'))](:),
  +              [z(:)'; z(:).' + nz(:).' ; NaN(size(z(:).'))](:), 
  +              varargin{ioff:end});
  +      unwind_protect_cleanup
  +       set (h, "nextplot", old_hold_state);
  +      end_unwind_protect
       unwind_protect_cleanup
	 axes (oldh);
       end_unwind_protect

I don't see the point of saving and restoring the hold state of OLDH
since we aren't changing the hold state on those axes.

Also, note the use of unwind_protect here.  Without that, it would be
possible for an intterupt to happen during the plot3 call that would
leave the hold state for H set to "add".

jwe


More information about the Bug-octave mailing list