Mercurial > octave
changeset 22354:0b2edd6408be
Set "edgecolor" instead of "facecolor" for mesh plots (bug #48392).
* shading.m: Set "edgecolor" instead of "facecolor" for mesh plots.
Add tests and more demos.
author | Markus Muetzel <markus.muetzel@gmx.de> |
---|---|
date | Mon, 18 Jul 2016 22:24:48 +0200 |
parents | 788f554ac87d |
children | 886530282db9 |
files | scripts/plot/appearance/shading.m |
diffstat | 1 files changed, 115 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/plot/appearance/shading.m Thu Aug 18 23:59:00 2016 +0200 +++ b/scripts/plot/appearance/shading.m Mon Jul 18 22:24:48 2016 +0200 @@ -28,16 +28,16 @@ ## Single colored patches with invisible edges. ## ## @item @qcode{"faceted"} -## Single colored patches with visible edges. +## Single colored patches with black edges. ## ## @item @qcode{"interp"} -## Color between patch vertices are interpolated and the patch edges are +## Colors between patch vertices are interpolated and the patch edges are ## invisible. ## @end table ## ## If the first argument @var{hax} is an axes handle, then plot into this axis, ## rather than the current axes returned by @code{gca}. -## @seealso{fill, mesh, patch, pcolor, surf, surface, hidden} +## @seealso{fill, mesh, patch, pcolor, surf, surface, hidden, lighting} ## @end deftypefn ## Author: Kai Habel <kai.habel@gmx.de> @@ -51,6 +51,11 @@ endif mode = varargin{1}; + if (! ischar (mode)) + error ("shading: MODE must be a valid string"); + elseif (! any (strcmpi (mode, {"flat", "interp", "faceted"}))) + error ('shading: Invalid MODE "%s"', mode); + endif if (isempty (hax)) hax = gca (); @@ -81,19 +86,35 @@ ##hs = findobj (hax, "type", "surface"); ##hlist = [hp(:); hs(:)]; - switch (lower (mode)) - case "flat" - set (hlist, "facecolor", "flat"); - set (hlist, "edgecolor", "none"); - case "interp" - set (hlist, "facecolor", "interp"); - set (hlist, "edgecolor", "none"); - case "faceted" - set (hlist, "facecolor", "flat"); - set (hlist, "edgecolor", [0 0 0]); - otherwise - error ('shading: Invalid MODE "%s"', mode); - endswitch + if (isempty (hlist)) + return; + endif + + ## Change "EdgeColor" for meshes instead of "FaceColor" + fc = get (hlist, "facecolor"); + is_mesh = strcmp (fc, "none"); + if (! iscell (fc)) + fc = {fc}; + endif + bg = get (hax, "color"); + if (strcmp (bg, "none")) + if (isprop (get (hax, "parent"), "color")) + bg = get (get (hax, "parent"), "color"); + endif + if (isempty (bg) || strcmp (bg, "none")) + bg = [1 1 1]; + endif + endif + is_mesh |= cellfun (@(x) isequal (x, bg), fc); + + ec = "none"; + if (strcmpi (mode, "faceted")) + ec = [0 0 0]; + mode = "flat"; + endif + + set (hlist(! is_mesh), "facecolor", mode, "edgecolor", ec); + set (hlist(is_mesh), "edgecolor", mode); endfunction @@ -113,7 +134,7 @@ %! h = findobj (gca (), "type", "surface"); %! facecolor = get (h, "facecolor"); %! edgecolor = get (h, "edgecolor"); -%! set (h, "edgecolor", facecolor, "facecolor", edgecolor) +%! set (h, "edgecolor", facecolor, "facecolor", edgecolor); %! title ({'shading ''faceted''', 'with "edgecolor" and "facecolor" reversed'}); %!demo @@ -131,7 +152,7 @@ %! h = findobj (gca (), "type", "surface"); %! facecolor = get (h, "facecolor"); %! edgecolor = get (h, "edgecolor"); -%! set (h, "edgecolor", facecolor, "facecolor", edgecolor) +%! set (h, "edgecolor", facecolor, "facecolor", edgecolor); %! title ({'shading ''flat''', 'with "edgecolor" and "facecolor" reversed'}); %!demo @@ -149,17 +170,17 @@ %! h = findobj (gca (), "type", "surface"); %! facecolor = get (h, "facecolor"); %! edgecolor = get (h, "edgecolor"); -%! set (h, "edgecolor", facecolor, "facecolor", edgecolor) +%! set (h, "edgecolor", facecolor, "facecolor", edgecolor); %! title ({'shading ''interp''', 'with "edgecolor" and "facecolor" reversed'}); %!demo -%! clf -%! colormap ("default") -%! peaks () -%! shading interp +%! clf; +%! colormap ("default"); +%! peaks (); +%! shading interp; %! h = findobj (gca (), "type", "surface"); -%! set (h, "edgecolor", "k") -%! title ({'shading ''interp''', 'with "edgecolor" set to black'}) +%! set (h, "edgecolor", "k"); +%! title ({'shading ''interp''', 'with "edgecolor" set to black'}); %!demo %! clf; @@ -176,7 +197,7 @@ %! h = findobj (gca (), "type", "surface"); %! facecolor = get (h, "facecolor"); %! edgecolor = get (h, "edgecolor"); -%! set (h, "edgecolor", facecolor, "facecolor", edgecolor) +%! set (h, "edgecolor", facecolor, "facecolor", edgecolor); %! title ({'shading ''faceted''', 'with "edgecolor" and "facecolor" reversed'}); %!demo @@ -194,7 +215,7 @@ %! h = findobj (gca (), "type", "surface"); %! facecolor = get (h, "facecolor"); %! edgecolor = get (h, "edgecolor"); -%! set (h, "edgecolor", facecolor, "facecolor", edgecolor) +%! set (h, "edgecolor", facecolor, "facecolor", edgecolor); %! title ({'shading ''flat''', 'with "edgecolor" and "facecolor" reversed'}); %!demo @@ -212,6 +233,72 @@ %! h = findobj (gca (), "type", "surface"); %! facecolor = get (h, "facecolor"); %! edgecolor = get (h, "edgecolor"); -%! set (h, "edgecolor", facecolor, "facecolor", edgecolor) +%! set (h, "edgecolor", facecolor, "facecolor", edgecolor); %! title ({'shading ''interp''', 'with "edgecolor" and "facecolor" reversed'}); +%!demo +%! clf; +%! colormap ('default'); +%! mesh (sombrero ()); +%! shading interp; +%! title ('mesh with shading ''interp'''); + +%!demo +%! clf; +%! colormap ('default'); +%! mesh (sombrero ()); +%! shading flat; +%! title ('mesh with shading ''flat'''); + +%!test +%! hf = figure ("Visible", "off"); +%! unwind_protect +%! ha = axes; +%! hm = mesh (sombrero ()); +%! hp = patch; +%! hs = surface; +%! shading interp; +%! assert (get (hp, "facecolor"), "interp"); +%! assert (get (hs, "facecolor"), "interp"); +%! assert (get (hp, "edgecolor"), "none"); +%! assert (get (hs, "edgecolor"), "none"); +%! assert (get (hm, "edgecolor"), "interp"); +%! shading faceted; +%! assert (get (hp, "facecolor"), "flat"); +%! assert (get (hs, "facecolor"), "flat"); +%! assert (get (hp, "edgecolor"), [0 0 0]); +%! assert (get (hs, "edgecolor"), [0 0 0]); +%! assert (get (hm, "edgecolor"), "flat"); +%! shading (ha, "interp"); +%! assert (get (hp, "facecolor"), "interp"); +%! assert (get (hs, "facecolor"), "interp"); +%! assert (get (hp, "edgecolor"), "none"); +%! assert (get (hs, "edgecolor"), "none"); +%! assert (get (hm, "edgecolor"), "interp"); +%! set (hp, "edgecolor", "k"); +%! set (hs, "edgecolor", "k"); +%! shading flat; +%! assert (get (hp, "facecolor"), "flat"); +%! assert (get (hs, "facecolor"), "flat"); +%! assert (get (hp, "edgecolor"), "none"); +%! assert (get (hs, "edgecolor"), "none"); +%! assert (get (hm, "edgecolor"), "flat"); +%! unwind_protect_cleanup +%! close (hf); +%! end_unwind_protect + +## Test on axes which has no patch or mesh objects +%!test +%! hf = figure ("visible", "off"); +%! unwind_protect +%! shading flat +%! unwind_protect_cleanup +%! close (hf); +%! end_unwind_protect + +%!error shading () +%!error shading (1, 2, "flat") +%!error <MODE must be a valid string> shading (-1) +%!error <MODE must be a valid string> shading ({}) +%!error <Invalid MODE "foo"> shading foo +