Mercurial > hg > octave-terminal
changeset 7379:a78c7bccda91
[project @ 2008-01-15 18:42:29 by jwe]
author | jwe |
---|---|
date | Tue, 15 Jan 2008 18:42:30 +0000 |
parents | 3771971e8891 |
children | 2ba95a933d3e |
files | scripts/ChangeLog scripts/linear-algebra/__norm__.m scripts/plot/__go_draw_axes__.m scripts/plot/__go_draw_figure__.m scripts/plot/drawnow.m src/ChangeLog src/genprops.awk src/graphics.cc src/graphics.h.in |
diffstat | 9 files changed, 204 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,14 @@ +2008-01-15 Michael Goffioul <michael.goffioul@gmail.com> + + * plot/drawnow.m, plot/__go_draw_figure__.m, plot/__go_draw_axes__.m: + Call __get__ instead of get. + +2008-01-15 Ben Abbott <bpabbott@mac.com> + + * linear-algebra/__norm__.m: Avoid divide by zero error for + Frobenius norm if matrix is all zeros. Use transpose instead of + hermitian operator. + 2008-01-14 Bill Denney <bill@denney.ws> * plot/axis.m: Correctly handle "tight" and "image" options.
--- a/scripts/linear-algebra/__norm__.m +++ b/scripts/linear-algebra/__norm__.m @@ -44,7 +44,11 @@ if (ischar (p)) if (strcmp (p, "fro")) inf_norm = norm (x, "inf"); - retval = inf_norm .* sqrt (sum (abs (x ./ inf_norm) .^ 2)); + if (inf_norm) + retval = inf_norm .* sqrt (sum (abs (x ./ inf_norm) .^ 2)); + else + retval = inf_norm; + endif elseif (strcmp (p, "inf")) retval = max (abs (x)); else @@ -56,7 +60,7 @@ elseif (p == -Inf) retval = min (abs (x)); elseif (p == 1) - retval = sum (abs (x)); + retval = sum (abs (x)); elseif (p == 2) if (iscomplex (x)) x = abs (x); @@ -70,9 +74,13 @@ if (ischar (p)) if (strcmp (p, "fro")) inf_norm = norm (x, "inf"); - retval = inf_norm .* sqrt (sum (sum (abs (x ./ inf_norm) .^ 2))); + if (inf_norm) + retval = inf_norm .* sqrt (sum (sum (abs (x ./ inf_norm) .^ 2))); + else + retval = inf_norm; + endif elseif (strcmp (p, "inf")) - retval = max (sum (abs (x'))); + retval = max (sum (abs (x.'))); else error ("norm: unrecognized vector norm"); endif @@ -83,11 +91,33 @@ s = svd (x); retval = s (1); elseif (p == Inf) - retval = max (sum (abs (x'))); + retval = max (sum (abs (x.'))); else - error ("norm: unrecognized matrix norm"); + error ("norm: unrecognized matrix norm"); endif endif endif endfunction + +%!test +%! x = __norm__ (zeros (5), "fro"); +%! assert (x, 0); +%! x = __norm__ (ones (5), "fro"); +%! assert (x, 5); +%! x = __norm__ (zeros (5,1), "fro"); +%! assert (x, 0); +%! x = __norm__ (2*ones (5,3), "fro"); +%! assert (x, sqrt (60)); + +%!test +%! x = __norm__ (zeros (5), "inf"); +%! assert (x, 0); +%! x = __norm__ (ones (5), "inf"); +%! assert (x, 5); +%! x = __norm__ (2*ones (5,1), "inf"); +%! assert (x, 0); +%! x = __norm__ (2*ones (5,3), "inf"); +%! assert (x, 6); + +
--- a/scripts/plot/__go_draw_axes__.m +++ b/scripts/plot/__go_draw_axes__.m @@ -24,7 +24,7 @@ if (nargin == 4) - axis_obj = get (h); + axis_obj = __get__ (h); parent_figure_obj = get (axis_obj.parent);
--- a/scripts/plot/__go_draw_figure__.m +++ b/scripts/plot/__go_draw_figure__.m @@ -33,7 +33,7 @@ if (nkids > 0) axes_count = 0; for i = 1:nkids - obj = get (kids(i)); + obj = __get__ (kids(i)); switch (obj.type) case "axes" axes_count++;
--- a/scripts/plot/drawnow.m +++ b/scripts/plot/drawnow.m @@ -49,7 +49,7 @@ endif h = get (0, "currentfigure"); if (h) - f = get (h); + f = __get__ (h); plot_stream = []; fid = []; unwind_protect @@ -74,7 +74,7 @@ elseif (nargin == 0) for h = __go_figure_handles__ () if (! (isnan (h) || h == 0)) - f = get (h); + f = __get__ (h); if (f.__modified__) plot_stream = f.__plot_stream__; figure_is_visible = strcmp (f.visible, "on");
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,27 @@ +2008-01-15 Michael Goffioul <michael.goffioul@gmail.com> + + * genprops.awk: Handle 'h' modifier for hidden properties. + Replace "get(void)" method with "get(bool all = false)" to allow + access to hidden properties. + + * graphics.h.in (base_properties::get, base_graphics_object::get, + graphics_object::get, root_figure::get, figure::get, axes::get, + line::get, text::get, patch::get, surface::get, image::get): + New arg, ALL, to access hidden properties. + (gh_manager::do_get_object): Do not look for invalid handles. + (figure::properties::__plot_stream__, + figure::properties::__enhanced__, axes::properties::__colorbar__): + Make properties hidden. + (axes::properties, line::properties, text::properties, + patch::properties, surface::properties): Remove obsolete 'a' + property modifier. + * graphics.cc (base_properties::get): New arg ALL, to access + hidden properties. + (base_properties::mark_modified): Call mark_modified only on valid + parent object. + (__get__): New internal function returning all properties, + including the hidden ones. + 2008-01-15 John W. Eaton <jwe@octave.org> * graphics.cc (properties::set_currentfigure,
--- a/src/genprops.awk +++ b/src/genprops.awk @@ -51,7 +51,7 @@ ## } ## ## If present, the QUALIFIERS string may include any of the characters -## g, G, m, s, S, o, O, which have the following meanings: +## g, G, m, s, S, o, O, h, which have the following meanings: ## ## g: There is a custom inline definition for the get function, ## so we don't emit one. @@ -106,6 +106,8 @@ ## ## to the type-specific set function. ## +## h: Make the property hidden +## ## The 'o' and 'O' qualifiers are only useful when the the property type ## is something other than octave_value. @@ -204,7 +206,7 @@ printf (" properties (const graphics_handle& mh, const graphics_handle& p);\n\n"); printf (" ~properties (void) { }\n\n"); printf (" void set (const caseless_str& name, const octave_value& val);\n\n"); - printf (" octave_value get (void) const;\n\n"); + printf (" octave_value get (bool all = false) const;\n\n"); printf (" octave_value get (const caseless_str& name) const;\n\n"); printf (" std::string graphics_object_name (void) const { return go_name; }\n\n"); printf (" static property_list::pval_map_type factory_defaults (void);\n\n"); @@ -322,12 +324,16 @@ printf ("\n") >> filename; } - printf ("{\n init ();\n") >> filename; + printf ("{\n") >> filename; -## for (i = 1; i <= idx; i++) -## printf (" insert_static_property (\"%s\", %s);\n", name[i], name[i]) >> filename; + for (i = 1; i <= idx; i++) + { +## printf (" insert_static_property (\"%s\", %s);\n", name[i], name[i]) >> filename; + if (hidden[i]) + printf (" %s.set_hidden (true);\n", name[i]) >> filename; + } - printf ("}\n\n") >> filename; + printf (" init ();\n}\n\n") >> filename; ## set method @@ -344,13 +350,17 @@ ## get "all" method - printf ("octave_value\n%s::properties::get (void) const\n{\n", class_name) >> filename; - printf (" Octave_map m = base_properties::get ().map_value ();\n\n") >> filename; + printf ("octave_value\n%s::properties::get (bool all) const\n{\n", class_name) >> filename; + printf (" Octave_map m = base_properties::get (all).map_value ();\n\n") >> filename; for (i = 1; i <= idx; i++) { - printf (" m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i], - (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; + if (hidden[i]) + printf (" if (all)\n m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i], + (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; + else + printf (" m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i], + (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; } printf ("\n return m;\n}\n\n") >> filename; @@ -449,6 +459,7 @@ limits[idx] = 0; mode[idx] = 0; + hidden[idx] = 0; emit_get[idx] = "definition"; emit_set[idx] = "definition"; default[idx] = ""; @@ -488,6 +499,10 @@ ## but we still emit the declaration. if (index (quals, "S")) emit_set[idx] = "declaration"; + + ## The property is hidden + if (index (quals, "h")) + hidden[idx] = 1; ## ## emmit an asignment set function ## if (index (quals, "a"))
--- a/src/graphics.cc +++ b/src/graphics.cc @@ -954,17 +954,19 @@ } octave_value -base_properties::get (void) const +base_properties::get (bool all) const { Octave_map m; for (std::map<caseless_str, property>::const_iterator it = all_props.begin (); it != all_props.end (); ++it) - m.assign (it->second.get_name (), it->second.get ()); + if (all || ! it->second.is_hidden ()) + m.assign (it->second.get_name (), it->second.get ()); m.assign ("tag", get_tag ()); m.assign ("type", get_type ()); - m.assign ("__modified__", is_modified ()); + if (all) + m.assign ("__modified__", is_modified ()); m.assign ("parent", get_parent ().as_octave_value ()); m.assign ("children", children); m.assign ("busyaction", get_busyaction ()); @@ -1107,7 +1109,8 @@ { __modified__ = "on"; graphics_object parent_obj = gh_manager::get_object (get_parent ()); - parent_obj.mark_modified (); + if (parent_obj) + parent_obj.mark_modified (); } void @@ -1970,6 +1973,61 @@ return retval; } +DEFUN (__get__, args, , + "-*- texinfo -*-\n\ +@deftypefn {Built-in Function} {} __get__ (@var{h})\n\ +Return all properties from the graphics handle @var{h}.\n\ +If @var{h} is a vector, return a cell array including the property\n\ +values or lists respectively.\n\ +@end deftypefn") +{ + octave_value retval; + octave_value_list vlist; + + int nargin = args.length (); + + if (nargin == 1) + { + ColumnVector hcv (args(0).vector_value ()); + + if (! error_state) + { + octave_idx_type len = hcv.length (); + + vlist.resize (len); + + for (octave_idx_type n = 0; n < len; n++) + { + graphics_object obj = gh_manager::get_object (hcv(n)); + + if (obj) + vlist(n) = obj.get (true); + else + { + error ("get: invalid handle (= %g)", hcv(n)); + break; + } + } + } + else + error ("get: expecting graphics handle as first argument"); + } + else + print_usage (); + + if (! error_state) + { + octave_idx_type len = vlist.length (); + + if (len > 1) + retval = Cell (vlist); + else if (len == 1) + retval = vlist(0); + } + + return retval; +} + static octave_value make_graphics_object (const std::string& go_name, const octave_value_list& args)
--- a/src/graphics.h.in +++ b/src/graphics.h.in @@ -1005,7 +1005,7 @@ virtual octave_value get (const caseless_str&) const; - virtual octave_value get (void) const; + virtual octave_value get (bool all = false) const; property get_property (const caseless_str&) const; @@ -1314,7 +1314,7 @@ error ("base_graphics_object::set_defaults: invalid graphics object"); } - virtual octave_value get (void) const + virtual octave_value get (bool all = false) const { error ("base_graphics_object::get: invalid graphics object"); return octave_value (); @@ -1453,7 +1453,7 @@ void set_defaults (const std::string& mode) { rep->set_defaults (mode); } - octave_value get (void) const { return rep->get (); } + octave_value get (bool all = false) const { return rep->get (all); } octave_value get (const caseless_str& name) const { @@ -1619,9 +1619,9 @@ xproperties.set (name, value); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -1710,8 +1710,8 @@ // properties declarations. BEGIN_PROPERTIES(figure) - any_property __plot_stream__ , Matrix () - bool_property __enhanced__ , "on" + any_property __plot_stream__ h , Matrix () + bool_property __enhanced__ h , "on" radio_property nextplot , "add|replace_children|{replace}" callback_property closerequestfcn , "closereq" handle_property currentaxes S , graphics_handle () @@ -1777,9 +1777,9 @@ xproperties.set (name, value); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -1848,7 +1848,7 @@ array_property colororder , default_colororder () array_property dataaspectratio m , Matrix (1, 3, 1.0) radio_property dataaspectratiomode , "{auto}|manual" - radio_property layer a , "{bottom}|top" + radio_property layer , "{bottom}|top" array_property xlim m , default_lim () array_property ylim m , default_lim () array_property zlim m , default_lim () @@ -1878,7 +1878,7 @@ radio_property xticklabelmode , "{auto}|manual" radio_property yticklabelmode , "{auto}|manual" radio_property zticklabelmode , "{auto}|manual" - color_property color a , color_property (color_values (1, 1, 1), radio_values ("none")) + color_property color , color_property (color_values (1, 1, 1), radio_values ("none")) color_property xcolor , color_values (0, 0, 0) color_property ycolor , color_values (0, 0, 0) color_property zcolor , color_values (0, 0, 0) @@ -1893,8 +1893,8 @@ array_property view , Matrix () radio_property nextplot , "add|replace_children|{replace}" array_property outerposition , Matrix () - radio_property activepositionproperty a , "{outerposition}|position" - radio_property __colorbar__ a , "{none}|north|south|east|west|northoutside|southoutside|eastoutside|westoutside" + radio_property activepositionproperty , "{outerposition}|position" + radio_property __colorbar__ h , "{none}|north|south|east|west|northoutside|southoutside|eastoutside|westoutside" END_PROPERTIES protected: @@ -1970,9 +1970,9 @@ xproperties.set_defaults (*this, mode); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -2047,7 +2047,7 @@ color_property markerfacecolor , "auto|{none}" double_property markersize , 6 string_property keylabel , "" - radio_property interpreter a , "{tex}|none|latex" + radio_property interpreter , "{tex}|none|latex" string_property displayname , "" radio_property erase_mode , "{normal}|none|xor|background" END_PROPERTIES @@ -2086,9 +2086,9 @@ xproperties.set (name, val); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -2133,9 +2133,9 @@ color_property color , color_values (0, 0, 0) string_property fontname , "Helvetica" double_property fontsize , 10 - radio_property fontangle a , "{normal}|italic|oblique" - radio_property fontweight a , "light|{normal}|demi|bold" - radio_property interpreter a , "{tex}|none|latex" + radio_property fontangle , "{normal}|italic|oblique" + radio_property fontweight , "light|{normal}|demi|bold" + radio_property interpreter , "{tex}|none|latex" color_property backgroundcolor , "{none}" string_property displayname , "" color_property edgecolor , "{none}" @@ -2188,9 +2188,9 @@ xproperties.set (name, val); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -2271,9 +2271,9 @@ xproperties.set (name, val); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -2314,26 +2314,26 @@ data_property ydata l , Matrix () data_property zdata l , Matrix () data_property cdata l , Matrix () - radio_property cdatamapping a , "{scaled}|direct" + radio_property cdatamapping , "{scaled}|direct" array_property faces , Matrix () data_property facevertexalphadata , Matrix () data_property facevertexcdata , Matrix () array_property vertices , Matrix () array_property vertexnormals , Matrix () - radio_property normalmode a , "{auto}|manual" - color_property facecolor a , "{flat}|none|interp" + radio_property normalmode , "{auto}|manual" + color_property facecolor , "{flat}|none|interp" double_property facealpha , 1.0 - radio_property facelighting a , "{flat}|none|gouraud|phong" - color_property edgecolor a , color_property (color_values (0, 0, 0), radio_values ("flat|none|interp")) + radio_property facelighting , "{flat}|none|gouraud|phong" + color_property edgecolor , color_property (color_values (0, 0, 0), radio_values ("flat|none|interp")) double_property edgealpha , 1.0 - radio_property edgelighting a , "{none}|flat|gouraud|phong" - radio_property backfacelighting a , "{reverselit}|unlit|lit" + radio_property edgelighting , "{none}|flat|gouraud|phong" + radio_property backfacelighting , "{reverselit}|unlit|lit" double_property ambientstrength , 0.3 double_property diffusestrength , 0.6 double_property specularstrength , 0.6 double_property specularexponent , 10.0 double_property specularcolorreflectance , 1.0 - radio_property erasemode a , "{normal}|background|xor|none" + radio_property erasemode , "{normal}|background|xor|none" radio_property linestyle , "{-}|--|:|-.|none" double_property linewidth , 0.5 radio_property marker , "{none}|s|o|x|+|.|*|<|>|v|^|d|p|h" @@ -2341,7 +2341,7 @@ color_property markerfacecolor , "auto|{none}" double_property markersize , 6 string_property keylabel , "" - radio_property interpreter a , "{tex}|none|latex" + radio_property interpreter , "{tex}|none|latex" END_PROPERTIES protected: @@ -2385,9 +2385,9 @@ xproperties.set (name, val); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -2428,9 +2428,9 @@ data_property ydata l , Matrix () data_property zdata l , Matrix () data_property cdata l , Matrix () - color_property facecolor a , "{flat}|none|interp" + color_property facecolor , "{flat}|none|interp" double_property facealpha , 1.0 - color_property edgecolor a , color_property (color_values (0, 0, 0), radio_values ("flat|none|interp")) + color_property edgecolor , color_property (color_values (0, 0, 0), radio_values ("flat|none|interp")) radio_property linestyle , "{-}|--|:|-.|none" double_property linewidth , 0.5 radio_property marker , "{none}|s|o|x|+|.|*|<|>|v|^|d|p|h" @@ -2438,7 +2438,7 @@ color_property markerfacecolor , "auto|{none}" double_property markersize , 6 string_property keylabel , "" - radio_property interpreter a , "{tex}|none|latex" + radio_property interpreter , "{tex}|none|latex" END_PROPERTIES protected: @@ -2480,9 +2480,9 @@ xproperties.set (name, val); } - octave_value get (void) const + octave_value get (bool all = false) const { - return xproperties.get (); + return xproperties.get (all); } octave_value get (const caseless_str& name) const @@ -2639,7 +2639,7 @@ graphics_object do_get_object (const graphics_handle& h) { - iterator p = handle_map.find (h); + iterator p = (h.ok () ? handle_map.find (h) : handle_map.end ()); return (p != handle_map.end ()) ? p->second : graphics_object (); }