octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [changeset] - improve clf() compatibility


From: John W. Eaton
Subject: Re: [changeset] - improve clf() compatibility
Date: Tue, 21 Oct 2008 14:24:36 -0400

[With the changeset this time...]

On 21-Oct-2008, David Bateman wrote:

| John W. Eaton wrote:
| > Before we apply this change, I think we need to fix the title, xlabel,
| > ylabel, and zlabel properties to be hidden children of the axes
| > object.  My best guess at how to do that is below, but it does not
| > quite work.  I don't have any more time to work on this problem, but I
| > thought I would post the diffs anyway to give anyone else who wants to
| > work on this a starting point.
| >
| > jwe
| >   
| There are also other issues related to hidden children such as the 
| "BaseLine" of stem series, etc that cause issues with the "legend" 
| function as they aren't currently invisible.. So yes, I'd also like to 
| see this issue addressed. Could you give more information about what 
| exactly doesn't work with your patch?

This version seems to work better.

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



* Try

    demo quiver3
    demo ribbon

  Both of these seem to work OK if run separately in fresh Octave
  sessions, but quiver3 seems to be leaving some state that causes
  ribbon to do the wrong thing.  Maybe this is a hold problem?  I
  haven't looked at it yet.



* The refreshdata demo does not seem to be working correctly for me.
  I'm seeing

    octave:1> demo refreshdata
    refreshdata example 1:
     x = 0:0.1:10;
     y = sin (x);
     plot (x, y, "ydatasource", "y");
     for i = 1 : 100
       pause(0.1)
       y = sin (x + 0.1 * i);
       refreshdata();
     endfor

    refreshdata example 1: failed
    `y' undefined near line 0 column 1octave:2> 

jwe


# HG changeset patch
# User John W. Eaton <address@hidden>
# Date 1224612385 14400
# Node ID 1f429086565cd3e38e0db01a3be97126cfed4c63
# Parent  08bb643966858d025204676799c2f8d7d75f1f84
[mq]: hidden-children

diff --git a/scripts/ChangeLog b/scripts/ChangeLog
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,12 @@
+2008-10-21  John W. Eaton  <address@hidden>
+
+       * plot/gnuplot_drawnow.m: Pass handle to __go_draw_figure__, not
+       struct.  Use get instead of examining struct fields directly.
+       * plot/__go_draw_figure__.m: First arg is now handle, not figure
+       object struct.  Use get instead of examining struct elements
+       directly.  Use allhild instead of looking at children field of
+       figure object struct.
+
 2008-10-20  Ben Abbott <address@hidden>
 
        * plot/orient.m: Fix syntax error.
diff --git a/scripts/plot/__go_draw_figure__.m 
b/scripts/plot/__go_draw_figure__.m
--- a/scripts/plot/__go_draw_figure__.m
+++ b/scripts/plot/__go_draw_figure__.m
@@ -20,14 +20,16 @@
 
 ## Author: jwe
 
-function __go_draw_figure__ (f, plot_stream, enhanced, mono)
+function __go_draw_figure__ (h, plot_stream, enhanced, mono)
 
   if (nargin == 4)
-    if (strcmp (f.type, "figure"))
+    htype = get (h, "type");
+    if (strcmp (htype, "figure"))
 
       ## Set figure properties here?
 
-      kids = f.children;
+      ## Get complete list of children.
+      kids = allchild (h);
       nkids = length (kids);
 
       if (nkids > 0)
@@ -64,7 +66,7 @@
       endif
     else
       error ("__go_draw_figure__: expecting figure object, found `%s'",
-            f.type);
+            htype);
     endif
   else
     print_usage ();
diff --git a/scripts/plot/gnuplot_drawnow.m b/scripts/plot/gnuplot_drawnow.m
--- a/scripts/plot/gnuplot_drawnow.m
+++ b/scripts/plot/gnuplot_drawnow.m
@@ -34,16 +34,15 @@
   endif
 
   if (nargin >= 3 && nargin <= 5)
-    f = __get__ (h);
     plot_stream = [];
     fid = [];
     unwind_protect
       [plot_stream, enhanced] = open_gnuplot_stream (1, [], term, file);
-      __go_draw_figure__ (f, plot_stream, enhanced, mono);
+      __go_draw_figure__ (h, plot_stream, enhanced, mono);
       if (nargin == 5)
         fid = fopen (debug_file, "wb");
         enhanced = init_plot_stream (fid, [], term, file);
-        __go_draw_figure__ (f, fid, enhanced, mono);
+        __go_draw_figure__ (h, fid, enhanced, mono);
       endif
     unwind_protect_cleanup
       if (! isempty (plot_stream))
@@ -54,15 +53,14 @@
       endif
     end_unwind_protect
   elseif (nargin == 1)
-    f = __get__ (h);
-    plot_stream = f.__plot_stream__;
+    plot_stream = get (h, "__plot_stream__");
     if (isempty (plot_stream))
       [plot_stream, enhanced] = open_gnuplot_stream (2, h);
       set (h, "__enhanced__", enhanced);
     else
-      enhanced = f.__enhanced__;
+      enhanced = get (h, "__enhanced__");
     endif
-    __go_draw_figure__ (f, plot_stream (1), enhanced, mono);
+    __go_draw_figure__ (h, plot_stream (1), enhanced, mono);
     fflush (plot_stream (1));
   else
     print_usage ();
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,4 +1,27 @@
-2008-10-20  John W. Eaton  <address@hidden>
+2008-10-21  John W. Eaton  <address@hidden>
+
+       * graphics.h.in (gh_manager::is_handle_visible): New function.
+       (axes::properites): Move title property after label properties.
+       (graphics_object::is_handle_visible): New function.
+       (base_properties::is_handle_visible): New function.
+       (base_properties): Mark children property with G.
+       * graphics.cc (axes::properties::set_text_child): New function.
+       (axes::properties::set_title, axes::properties::set_xlabel,
+       axes::properties::set_ylabel, axes::properties::set_zlabel): Use it.
+       (base_property::get_children): New function.  Only
+       return handles that are visible.
+       (axes::properties::delete_text_child): Set handlevisibility to
+       "off" for newly created object and add it to the list of children.
+       Call base_properties::remove_child on previous handle value.
+       (axes::properties::set_defaults): Don't explicitly delete xlabel,
+       ylabel, zlabel, and title handles.  Reinitialize them after
+       deleting children.
+       (axes::properties::remove_child): Don't explicitly delete xlabel,
+       ylabel, zlabel, and title handles.
+       (axes::properties::init): Move here from graphics.h.in.  Set
+       handlevisibility to "off" for xlabel, ylabel, zlabel, and title
+       and add them to the list of children.
+       (axes::properties::delete_children): Delete.
 
        * genprops.awk: Allow whitespace between BEGIN_PROPERTIES and
        opening paren.  Accept optional second argument for graphics
diff --git a/src/graphics.cc b/src/graphics.cc
--- a/src/graphics.cc
+++ b/src/graphics.cc
@@ -2133,6 +2133,54 @@
 
 // ---------------------------------------------------------------------
 
+void
+axes::properties::init (void)
+{
+  position.add_constraint (dim_vector (1, 4));
+  position.add_constraint (dim_vector (0, 0));
+  outerposition.add_constraint (dim_vector (1, 4));
+  colororder.add_constraint (dim_vector (-1, 3));
+  dataaspectratio.add_constraint (dim_vector (1, 3));
+  plotboxaspectratio.add_constraint (dim_vector (1, 3));
+  xlim.add_constraint (2);
+  ylim.add_constraint (2);
+  zlim.add_constraint (2);
+  clim.add_constraint (2);
+  alim.add_constraint (2);
+  xtick.add_constraint (dim_vector (1, -1));
+  ytick.add_constraint (dim_vector (1, -1));
+  ztick.add_constraint (dim_vector (1, -1));
+  Matrix vw (1, 2, 0);
+  vw(1) = 90;
+  view = vw;
+  view.add_constraint (dim_vector (1, 2));
+  cameraposition.add_constraint (dim_vector (1, 3));
+  Matrix upv (1, 3, 0.0);
+  upv(2) = 1.0;
+  cameraupvector = upv;
+  cameraupvector.add_constraint (dim_vector (1, 3));
+  currentpoint.add_constraint (dim_vector (2, 3));
+  ticklength.add_constraint (dim_vector (1, 2));
+  tightinset.add_constraint (dim_vector (1, 4));
+
+  x_zlim.resize (1, 2);
+  sx = "linear";
+  sy = "linear";
+  sz = "linear";
+
+  xset (xlabel.handle_value (), "handlevisibility", "off");
+  xset (ylabel.handle_value (), "handlevisibility", "off");
+  xset (zlabel.handle_value (), "handlevisibility", "off");
+
+  xset (title.handle_value (), "handlevisibility", "off");
+
+  adopt (xlabel.handle_value ());
+  adopt (ylabel.handle_value ());
+  adopt (zlabel.handle_value ());
+
+  adopt (title.handle_value ());
+}
+
 void 
 axes::properties::sync_positions (void)
 {
@@ -2168,59 +2216,54 @@
 }
 
 void
+axes::properties::set_text_child (handle_property& hp,
+                                 const std::string& who,
+                                 const octave_value& v)
+{
+  graphics_handle val = ::reparent (v, "set", who, __myhandle__, false);
+
+  if (! error_state)
+    {
+      xset (val, "handlevisibility", "off");
+
+      gh_manager::free (hp.handle_value ());
+
+      base_properties::remove_child (hp.handle_value ());
+
+      hp = val;
+
+      adopt (hp.handle_value ());
+    }
+}
+
+void
+axes::properties::set_xlabel (const octave_value& v)
+{
+  set_text_child (xlabel, "xlabel", v);
+}
+
+void
+axes::properties::set_ylabel (const octave_value& v)
+{
+  set_text_child (ylabel, "ylabel", v);
+}
+
+void
+axes::properties::set_zlabel (const octave_value& v)
+{
+  set_text_child (zlabel, "zlabel", v);
+}
+
+void
 axes::properties::set_title (const octave_value& v)
 {
-  graphics_handle val = ::reparent (v, "set", "title", __myhandle__, false);
-
-  if (! error_state)
-    {
-      gh_manager::free (title.handle_value ());
-      title = val;
-    }
-}
-
-void
-axes::properties::set_xlabel (const octave_value& v)
-{
-  graphics_handle val = ::reparent (v, "set", "xlabel", __myhandle__, false);
-
-  if (! error_state)
-    {
-      gh_manager::free (xlabel.handle_value ());
-      xlabel = val;
-    }
-}
-
-void
-axes::properties::set_ylabel (const octave_value& v)
-{
-  graphics_handle val = ::reparent (v, "set", "ylabel", __myhandle__, false);
-
-  if (! error_state)
-    {
-      gh_manager::free (ylabel.handle_value ());
-      ylabel = val;
-    }
-}
-
-void
-axes::properties::set_zlabel (const octave_value& v)
-{
-  graphics_handle val = ::reparent (v, "set", "zlabel", __myhandle__, false);
-
-  if (! error_state)
-    {
-      gh_manager::free (zlabel.handle_value ());
-      zlabel = val;
-    }
+  set_text_child (title, "title", v);
 }
 
 void
 axes::properties::set_defaults (base_graphics_object& obj,
                                const std::string& mode)
 {
-  delete_text_child (title);
-
   box = "on";
   key = "off";
   keybox = "off";
@@ -2244,10 +2287,6 @@
   ylimmode = "auto";
   zlimmode = "auto";
   climmode = "auto";
-
-  delete_text_child (xlabel);
-  delete_text_child (ylabel);
-  delete_text_child (zlabel);
 
   xgrid = "off";
   ygrid = "off";
@@ -2328,10 +2367,27 @@
       activepositionproperty = "outerposition";
     }
 
-
   delete_children ();
 
   children = Matrix ();
+
+  xlabel = gh_manager::make_graphics_handle ("text", __myhandle__, false);
+  ylabel = gh_manager::make_graphics_handle ("text", __myhandle__, false);
+  zlabel = gh_manager::make_graphics_handle ("text", __myhandle__, false);
+
+  title = gh_manager::make_graphics_handle ("text", __myhandle__, false);
+
+  xset (xlabel.handle_value (), "handlevisibility", "off");
+  xset (ylabel.handle_value (), "handlevisibility", "off");
+  xset (zlabel.handle_value (), "handlevisibility", "off");
+
+  xset (title.handle_value (), "handlevisibility", "off");
+
+  adopt (xlabel.handle_value ());
+  adopt (ylabel.handle_value ());
+  adopt (zlabel.handle_value ());
+
+  adopt (title.handle_value ());
 
   update_transform ();
 
@@ -2349,37 +2405,66 @@
 
       if (go.valid_object ())
        gh_manager::free (h);
-    }
+
+      base_properties::remove_child (h);
+    }
+
+  // FIXME -- is it necessary to check whether the axes object is
+  // being deleted now?  I think this function is only called when an
+  // individual child object is delete and not when the parent axes
+  // object is deleted.
 
   if (! is_beingdeleted ())
-    hp = gh_manager::make_graphics_handle ("text", __myhandle__);
+    {
+      hp = gh_manager::make_graphics_handle ("text", __myhandle__, false);
+
+      xset (hp.handle_value (), "handlevisibility", "off");
+
+      adopt (hp.handle_value ());
+    }
 }
 
 void
 axes::properties::remove_child (const graphics_handle& h)
 {
-  if (title.handle_value ().ok () && h == title.handle_value ())
-    delete_text_child (title);
-  else if (xlabel.handle_value ().ok () && h == xlabel.handle_value ())
+  if (xlabel.handle_value ().ok () && h == xlabel.handle_value ())
     delete_text_child (xlabel);
   else if (ylabel.handle_value ().ok () && h == ylabel.handle_value ())
     delete_text_child (ylabel);
   else if (zlabel.handle_value ().ok () && h == zlabel.handle_value ())
     delete_text_child (zlabel);
+  else if (title.handle_value ().ok () && h == title.handle_value ())
+    delete_text_child (title);
   else
     base_properties::remove_child (h);
 }
 
-void
-axes::properties::delete_children (void)
-{
-  base_properties::delete_children ();
-
-  delete_text_child (title);
-
-  delete_text_child (xlabel);
-  delete_text_child (ylabel);
-  delete_text_child (zlabel);
+Matrix
+base_properties::get_children (void) const
+{
+  Matrix retval = children;
+  
+  graphics_object go = gh_manager::get_object (0);
+
+  root_figure::properties& props =
+      dynamic_cast<root_figure::properties&> (go.get_properties ());
+
+  if (! props.is_showhiddenhandles ())
+    {
+      octave_idx_type k = 0;
+
+      for (octave_idx_type i = 0; i < children.numel (); i++)
+       {
+         graphics_handle kid = children (i);
+
+         if (gh_manager::is_handle_visible (kid))
+           retval(k++) = children(i);
+       }
+
+      retval.resize (k, 1);
+    }
+
+  return retval;;
 }
 
 inline Matrix
diff --git a/src/graphics.h.in b/src/graphics.h.in
--- a/src/graphics.h.in
+++ b/src/graphics.h.in
@@ -1669,6 +1669,11 @@
   virtual bool is_zliminclude (void) const { return false; }
   virtual bool is_climinclude (void) const { return false; }
   virtual bool is_aliminclude (void) const { return false; }
+
+  bool is_handle_visible (void) const
+  {
+    return ! handlevisibility.is ("off");
+  }
  
 protected:
   void set_dynamic (const caseless_str&, const octave_value&);
@@ -1685,7 +1690,7 @@
     radio_property busyaction , "{queue}|cancel"
     callback_property buttondownfcn , Matrix ()
     // FIXME: use a property class for children
-    Matrix children fs , Matrix ()
+    Matrix children Gfs , Matrix ()
     bool_property clipping , "on"
     callback_property createfcn , Matrix ()
     callback_property deletefcn , Matrix ()
@@ -2070,6 +2075,9 @@
   
   bool is_aliminclude (void) const
   { return get_properties ().is_aliminclude (); }
+
+  bool is_handle_visible (void) const
+  { return get_properties ().is_handle_visible (); }
   
   graphics_backend get_backend (void) const { return rep->get_backend (); }
 
@@ -2534,6 +2542,9 @@
     Matrix x_zlim;
     std::list<octave_value> zoom_stack;
 
+    void set_text_child (handle_property& h, const std::string& who,
+                        const octave_value& v);
+
     void delete_text_child (handle_property& h);
 
     // See the genprops.awk script for an explanation of the
@@ -2543,7 +2554,6 @@
 
     BEGIN_PROPERTIES (axes)
       array_property position u , default_axes_position ()
-      handle_property title SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__)
       bool_property box , "on"
       bool_property key , "off"
       bool_property keybox , "off"
@@ -2562,9 +2572,10 @@
       radio_property zlimmode al , "{auto}|manual"
       radio_property climmode al , "{auto}|manual"
       radio_property alimmode    , "{auto}|manual"
-      handle_property xlabel SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__)
-      handle_property ylabel SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__)
-      handle_property zlabel SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__)
+      handle_property xlabel SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__, false)
+      handle_property ylabel SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__, false)
+      handle_property zlabel SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__, false)
+      handle_property title SOf , gh_manager::make_graphics_handle ("text", 
__myhandle__, false)
       bool_property xgrid , "off"
       bool_property ygrid , "off"
       bool_property zgrid , "off"
@@ -2643,40 +2654,7 @@
    END_PROPERTIES
 
   protected:
-    void init (void)
-      {
-        position.add_constraint (dim_vector (1, 4));
-       position.add_constraint (dim_vector (0, 0));
-        outerposition.add_constraint (dim_vector (1, 4));
-        colororder.add_constraint (dim_vector (-1, 3));
-        dataaspectratio.add_constraint (dim_vector (1, 3));
-        plotboxaspectratio.add_constraint (dim_vector (1, 3));
-       xlim.add_constraint (2);
-       ylim.add_constraint (2);
-       zlim.add_constraint (2);
-       clim.add_constraint (2);
-       alim.add_constraint (2);
-        xtick.add_constraint (dim_vector (1, -1));
-        ytick.add_constraint (dim_vector (1, -1));
-        ztick.add_constraint (dim_vector (1, -1));
-        Matrix vw (1, 2, 0);
-        vw(1) = 90;
-        view = vw;
-        view.add_constraint (dim_vector (1, 2));
-       cameraposition.add_constraint (dim_vector (1, 3));
-       Matrix upv (1, 3, 0.0);
-       upv(2) = 1.0;
-       cameraupvector = upv;
-       cameraupvector.add_constraint (dim_vector (1, 3));
-       currentpoint.add_constraint (dim_vector (2, 3));
-       ticklength.add_constraint (dim_vector (1, 2));
-       tightinset.add_constraint (dim_vector (1, 4));
-
-       x_zlim.resize (1, 2);
-       sx = "linear";
-       sy = "linear";
-       sz = "linear";
-      }
+    void init (void);
 
   private:
     void update_xscale (void) { sx = get_xscale (); }
@@ -3653,6 +3631,18 @@
     return (instance_ok () ?  instance->do_process_events (true) : 0);
   }
 
+  static bool is_handle_visible (const graphics_handle& h)
+  {
+    bool retval = false;
+
+    graphics_object go = get_object (h);
+
+    if (go.valid_object ())
+      retval = go.is_handle_visible ();
+
+    return retval;
+  }
+
 public:
   class autolock
   {

reply via email to

[Prev in Thread] Current Thread [Next in Thread]