[changeset] - improve clf() compatibility
David Bateman
David.Bateman at motorola.com
Wed Oct 22 09:53:38 CDT 2008
John W. Eaton wrote:
> I still see some strange behavior.
>
>
> * Try
>
> demo plotyy
> demo quiver3
>
> Both of these demos seem to work OK if run separately in fresh Octave
> sessions, but plotyy seems to be leaving some state that causes
> quiver3 to fail with
>
> octave:2> demo quiver3
> quiver3 example 1:
> [x,y]=meshgrid (-1:0.1:1);
> z=sin(2*pi*sqrt(x.^2+y.^2));
> theta=2*pi*sqrt(x.^2+y.^2)+pi/2;
> quiver3(x,y,z,sin(theta),cos(theta),ones(size(z)));
> hold on;
> mesh(x,y,z);
> hold off;
>
> quiver3 example 1: failed
> get: invalid handle (= -1.22961)Press <enter> to continue:
> quiver3 example 2:
> [x, y, z] = peaks (25);
> surf (x, y, z);
> hold on;
> [u, v, w] = surfnorm (x, y, z / 10);
> h = quiver3 (x, y, z, u, v, w);
> set (h, "maxheadsize", 0.33);
>
> quiver3 example 2: failed
> get: invalid handle (= -1.22961)error: get: invalid handle (= -14.6238)
> error: called from:
> error: /home/jwe/src/octave/scripts/plot/__go_draw_axes__.m at line 60, column 9
> error: /home/jwe/src/octave/scripts/plot/__go_draw_figure__.m at line 58, column 8
> error: /home/jwe/src/octave/scripts/plot/gnuplot_drawnow.m at line 66, column 5
>
>
Ok, this one is subtle.. The problem is that the callback function that
is associated with the plotyy axes is not removed by the newplot call in
quiver3 -> __quiver__ -> plot3. Therefore, as one of the axes of the
plotyy object remains and the other is destroyed, the update_position
callback in plotyy.m tries to update a non existent axis with the change
of view.
There are two solutions to this
1) The simple and wrong solution is to just test if the axis to update
in the plotyy callback still exists before trying to update it. A patch
as simple as
diff --git a/scripts/plot/plotyy.m b/scripts/plot/plotyy.m
--- a/scripts/plot/plotyy.m
+++ b/scripts/plot/plotyy.m
@@ -203,7 +203,7 @@
persistent recursion = false;
## Don't allow recursion
- if (! recursion)
+ if (! recursion && ishandle (ax2) && strcmp (get (ax2, "type"), "axes"))
unwind_protect
recursion = true;
position = get (h, "position");
will do that and will prevent the error. However, the callback is
continually called while the axis exists..
2) The correct solution is to have a means of removing callback
functions in the deletefcn of plotyy. So we need a dellistener function
that corresponds to the existing addlistener function.. I'm working on a
patch along these lines.
D.
--
David Bateman David.Bateman at motorola.com
Motorola Labs - Paris +33 1 69 35 48 04 (Ph)
Parc Les Algorithmes, Commune de St Aubin +33 6 72 01 06 33 (Mob)
91193 Gif-Sur-Yvette FRANCE +33 1 69 35 77 01 (Fax)
The information contained in this communication has been classified as:
[x] General Business Information
[ ] Motorola Internal Use Only
[ ] Motorola Confidential Proprietary
More information about the Octave-maintainers
mailing list