* Bugs 10553 16232 fixed: colorbar(): gce(), $ in colminmax 95/21195/4
Samuel GOUGEON [Sun, 29 Dec 2019 23:22:55 +0000 (00:22 +0100)]
  http://bugzilla.scilab.org/10553
  http://bugzilla.scilab.org/16232

  Page updated/fixed/improved: http://bugzilla.scilab.org/attachment.cgi?id=5040

Change-Id: I1d0f9401d280c4472ec8f126d6f6a8b8f07b6efe

scilab/CHANGES.md
scilab/modules/graphics/help/en_US/color_management/colorbar.xml
scilab/modules/graphics/macros/colorbar.sci
scilab/modules/graphics/tests/unit_tests/colorbar.tst
scilab/modules/helptools/etc/images_md5.txt
scilab/modules/helptools/images/_LaTeX_histc.xml_1.png
scilab/modules/helptools/images/colorbar_1.png
scilab/modules/helptools/images/colorbar_5.png
scilab/modules/helptools/images/nicholschart_2.png

index d1ecdad..4236d47 100644 (file)
@@ -209,6 +209,7 @@ Bug Fixes
 * [#9673](http://bugzilla.scilab.org/show_bug.cgi?id=9673): Priority of colon `:` operator was too low
 * [#10078](http://bugzilla.scilab.org/show_bug.cgi?id=10078): `isinf()` was not reliable for polynomials.
 * [#10353](http://bugzilla.scilab.org/show_bug.cgi?id=10353): Documentation: The referential for the uicontrol.position property was not provided. Moreover, gca().axes_bounds refered to fig.figure_size instead of fig.axes_size.
+* [#10553](http://bugzilla.scilab.org/show_bug.cgi?id=10553): After calling `colorbar()`, retrieving the handle of the new color bar was not trivial.
 * [#10723](http://bugzilla.scilab.org/show_bug.cgi?id=10723): `subplot`'s action was unclearly described in its help page. Page improved.
 * [#11852](http://bugzilla.scilab.org/show_bug.cgi?id=11852): File browser didn't update after file creation or remove.
 * [#11363](http://bugzilla.scilab.org/show_bug.cgi?id=11363): show_window() did not raise the current graphics window.
@@ -321,6 +322,7 @@ Bug Fixes
 * [#16215](http://bugzilla.scilab.org/show_bug.cgi?id=16215): `mfile2sci` badly converted the colon `:` into `mtlb(:)`
 * [#16227](http://bugzilla.scilab.org/show_bug.cgi?id=16227): `WSCI` was not defined as environment variable and could not be used as `%WSCI%` in commands sent with `host()` or `unix_*()`.
 * [#16230](http://bugzilla.scilab.org/show_bug.cgi?id=16230): `MSWin>scilab --help` missed displaying some options like `-args..`, `-noatomsautoload`, etc.
+* [#16232](http://bugzilla.scilab.org/show_bug.cgi?id=16232): `colorbar()` did not support `$` in `colminmax`, standing for the number of colors in the current color map.
 * [#16234](http://bugzilla.scilab.org/show_bug.cgi?id=16234): Airy functions were not available.
 * [#16242](http://bugzilla.scilab.org/show_bug.cgi?id=16242): `loadmatfile()` could not read Octave native text data files.
 * [#16245](http://bugzilla.scilab.org/show_bug.cgi?id=16245): `gsort` could not sort booleans.
index faecbee..fb0ceb7 100644 (file)
                 <term>colminmax</term>
                 <listitem>
                     <para>
-                        <literal>colminmax</literal> aims to provide the range of colors
-                        that will be spanned on the colorbar, and that will correspond
-                        to the data bounds provided through <literal>umin</literal> and
-                        <literal>umax</literal>.
+                        implicit or explicit vector <literal>[colmin, colmax]</literal> specifying
+                        the range of colors that span on the colorbar, corresponding to the
+                        <literal>[umin, umax]</literal> chosen data bounds.
                     </para>
                     <para>
-                        It is an implicit or explicit vector
-                        <literal>[colmin, colmax]</literal>
-                        being indices of bounding colors. The color of index
-                        <literal>colmin</literal> in the current colormap will
-                        represent the <literal>umin</literal> data value. Similarly,
-                        the color of index <literal>colmax</literal> will represent
-                        <literal>umax</literal>, with
+                        <literal>colmin</literal> and <literal>colmax</literal> are indices
+                        of colors in the current colormap, with
                         <literal>1 ≤ colmin &lt; colmax ≤ Nc</literal>.
                     </para>
                     <para>Default setting: <literal>[1,Nc]</literal></para>
                     <para>
-                        Fractional bounds may also be specified, as well as using the special
-                        value <literal>colminmax=-1</literal>. Please see the description
-                        section for more details.
+                        The dollar $ symbol can be used, standing for Nc.
+                        For example, <literal>colminmax=[1 $/2]</literal> will use the first half
+                        of the colormap, and <literal>colminmax=[$/2+1, $]</literal> will use the
+                        second half.
+                    </para>
+                    <para>
+                        Fractional bounds <literal>[fmin, fmax]</literal> may also be specified,
+                        as well as using the special value <literal>colminmax=-1</literal>.
+                        Please see the description section for more details.
                     </para>
                 </listitem>
             </varlistentry>
             .image_type=="index" is specifically processed.
         </para>
         <note>
-            Just after calling <literal>colorbar(…)</literal>,
-            <literal>colbar = gcf().children(1)</literal> as well as
-            <literal>gce().parent</literal> return the graphical handle of the color bar.
+            Just after calling <literal>colorbar(…)</literal>, <literal>gce()</literal> returns
+            the graphical handle of the color bar.
         </note>
         <para>
             The possible syntaxes are the following:
         </para>
         <para><emphasis role="bold">colorbar(,, [colmin colmax])</emphasis></para>
         <para>
-            with integers such that <literal>1 ≤ colmin &lt; colmax ≤ Nc</literal>.
+            with integers such that <literal>1 ≤ colmin &lt; colmax ≤ Nc</literal> or using
+            <literal>$</literal> standing for <literal>Nc</literal>.
             Conversely to the previous one, this syntax sets
             <literal>umin</literal> and <literal>umax</literal>
-            such that "[umin,umax]/[minU,maxU]" maps "[colmin,colmax]/[1,Nc]"
-            ratio.
+            such that "[umin,umax]/[minU,maxU]" maps "[colmin,colmax]/[1,Nc]".
         </para>
         <para><emphasis role="bold">colorbar(,, [fmin fmax])</emphasis></para>
         <para>
-            The previous syntax <literal>colorbar(,,[colmin colmax])</literal> needs to know the
-            colormap range to specify <literal>colmin</literal>
-            and <literal>colmax</literal> conveniently. This is not very
-            handy when we just want to target a fractional part of the colormap
-            whatever is its actual length. <literal>fmin</literal> and
-            <literal>fmax</literal> with <literal>0 ≤ fmin &lt; fmax ≤ 1</literal>
-            allow such a more robust specification.
-        </para>
-        <para>
-            This syntax sets
-            <itemizedlist>
-                <listitem>
-                    <literal>umin</literal> and <literal>umax</literal> such that the relative
-                    range "[umin umax]/[min(U) max(U]" maps "[fmin, fmax]".
-                </listitem>
-                <listitem>
-                    <literal>[colmin colmax]</literal> such that the relative range
-                    "[colmin,colmax]/[1,Nc]" maps <literal>[fmin,fmax]</literal>.
-                </listitem>
-            </itemizedlist>
+            with <literal>0 ≤ fmin &lt; fmax ≤ 1</literal>, uses actual colors bounds
+            <literal>1+[fmin fmax]*(Nc-1)</literal>, and uses proportional
+            <literal>umin</literal> and <literal>umax</literal> accordingly,
+            such that the relative range "[umin umax]/[min(U) max(U]" maps "[fmin, fmax]".
         </para>
         <para><emphasis role="bold">colorbar(-%inf, %inf, ..)</emphasis></para>
         <para>
         <title>Examples</title>
         <refsect3>
             <title>Example #1</title>
-            without underlaying U data :
-            Direct umin and umax specifications. General colorbar() behavior.
+            <para>
+                Without underlaying U data :
+                Direct umin and umax specifications.
+            </para>
         <programlisting role="example"><![CDATA[
 clf reset                           // clears and resets the figure
 gcf().color_map = jetcolormap(100); // sets its color map
-subplot(1,2,2), plotframe([0 0 1 1])// fake axes on the right
+
+// Axes on the left
+// ----------------
 subplot(1,2,1)                      // Now the default current axes
 ax0 = gca();                        //  is on the half left
 ax0.axes_bounds(3)  //  Here is its initial width
@@ -233,15 +220,12 @@ gca() == ax0
 // colorbar on its right side.
 gca().axes_bounds
 
-// gce() returns the handle of the colored area, and
-// gce().parent is the handle to the axes defining the color bar
-colbar1 = gce().parent;
+// gce() returns the handle of the color bar, to postprocess and customize it.
+colbar1 = gce();
 colbar1.type
-colbar1 == gcf().children(1)  // Another way to retrieve the handle
-// This handle allows to postprocess and customize the colorbar.
 ylabel(colbar1, "Temperature [°C]") // Let's add a label
 title("°C")                         // or as title
-colbar1.title.font_size = 3;   // .. with a bigger font
+colbar1.title.font_size = 3;        // .. with a bigger font
 // Beware: xlabel(), ylabel() title() moves the focus to the bar.
 sca(ax0); // Reset the focus to ax0 before going on
 
@@ -250,28 +234,42 @@ plotframe([0 0 1 1])
 
 // Then add some other color bars, still for the current axes
 colorbar(-2, 5, [1 70])
-// Set the labelsin magenta
-gcf().children(1).font_color = color("red");
+// Set the labels in red
+gce().font_color = color("red");
 
 // The current axes is shrunk. The bar's width is decreased accordingly.
 
-// A last one: top half of the colormap, with another data scale:
-colorbar(0, 1.5, [0.5 1])  // colminmax = [fmin fmax]
-// Let decrease its font size:
-colbar3 = gcf().children(1);
+// axes on the right
+// -----------------
+subplot(1,2,2), plotframe([0 0 1 1])
+ax1 = gca();
+// top half of the colormap, with another data scale:
+colorbar(0, 1.5, [$/2+1 $])
+
+// Color bar post-processing
+colbar3 = gce();
+//      decrease its font size:
 set(colbar3, "fractional_font","on","font_size", 0.5);
-// And vertically extend the bar, to match ax0's height
-colbar3.axes_bounds([2 4]) = ax0.axes_bounds([2 4]);
-colbar3.margins([3 4]) = ax0.margins([3 4]);
+//      vertically extend the bar, to match the axes height:
+colbar3.axes_bounds([2 4]) = ax1.axes_bounds([2 4]);
+colbar3.margins([3 4]) = ax1.margins([3 4]);
+//      reverse its graduations top-down:
+colbar3.axes_reverse(2) = "on";
+//      put its graduations on the left side:
+colbar3.y_location = "left";
 
 // Color bars are automatically redrawn and regraduated
 // when resizing the figure. Try it!
      ]]></programlisting>
+        <para>
+            ➞ Customized color bar style:
+        </para>
         <scilab:image>
             clf reset                           // clears and resets the figure
             gcf().color_map = jetcolormap(100); // sets its color map
-            gcf().figure_size = [730 420];
-            subplot(1,2,2), plotframe([0 0 1 1])// fake axes on the right
+
+            // Axes on the left
+            // ----------------
             subplot(1,2,1)                      // Now the default current axes
             ax0 = gca();                        //  is on the half left
             ax0.axes_bounds(3)  //  Here is its initial width
@@ -287,15 +285,12 @@ colbar3.margins([3 4]) = ax0.margins([3 4]);
             // colorbar on its right side.
             gca().axes_bounds
 
-            // gce() returns the handle of the colored area, and
-            // gce().parent is the handle to the axes defining the color bar
-            colbar1 = gce().parent;
+            // gce() returns the handle of the color bar, to postprocess and customize it.
+            colbar1 = gce();
             colbar1.type
-            colbar1 == gcf().children(1)  // Another way to retrieve the handle
-            // This handle allows to postprocess and customize the colorbar.
             ylabel(colbar1, "Temperature [°C]") // Let's add a label
             title("°C")                         // or as title
-            colbar1.title.font_size = 3;   // .. with a bigger font
+            colbar1.title.font_size = 3;        // .. with a bigger font
             // Beware: xlabel(), ylabel() title() moves the focus to the bar.
             sca(ax0); // Reset the focus to ax0 before going on
 
@@ -304,22 +299,34 @@ colbar3.margins([3 4]) = ax0.margins([3 4]);
 
             // Then add some other color bars, still for the current axes
             colorbar(-2, 5, [1 70])
-            // Set the labelsin magenta
-            gcf().children(1).font_color = color("red");
+            // Set the labels in red
+            gce().font_color = color("red");
 
             // The current axes is shrunk. The bar's width is decreased accordingly.
 
-            // A last one: top half of the colormap, with another data scale:
-            colorbar(0, 1.5, [0.5 1])  // colminmax = [fmin fmax]
-            // Let decrease its font size:
-            colbar3 = gcf().children(1);
+            // axes on the right
+            // -----------------
+            subplot(1,2,2), plotframe([0 0 1 1])
+            ax1 = gca();
+            // top half of the colormap, with another data scale:
+            colorbar(0, 1.5, [$/2+1 $])
+
+            // Color bar post-processing
+            colbar3 = gce();
+            //      decrease its font size:
             set(colbar3, "fractional_font","on","font_size", 0.5);
-            // And vertically extend the bar, to match ax0's height
-            colbar3.axes_bounds([2 4]) = ax0.axes_bounds([2 4]);
-            colbar3.margins([3 4]) = ax0.margins([3 4]);
+            //      vertically extend the bar, to match the axes height:
+            colbar3.axes_bounds([2 4]) = ax1.axes_bounds([2 4]);
+            colbar3.margins([3 4]) = ax1.margins([3 4]);
+            //      reverse its graduations top-down:
+            colbar3.axes_reverse(2) = "on";
+            //      put its graduations on the left side:
+            colbar3.y_location = "left";
 
             // Color bars are automatically redrawn and regraduated
             // when resizing the figure. Try it!
+
+            gcf().axes_size = [770 440];
         </scilab:image>
         <screen><![CDATA[
 --> ax0.axes_bounds(3)  //  Here is its initial width
@@ -339,8 +346,8 @@ colbar3.margins([3 4]) = ax0.margins([3 4]);
    0.   0.   0.425   1.
 
 --> ...
---> // gce().parent is the handle to the axes defining the color bar
---> colbar1 = gce().parent;
+--> // gce() returns the handle of the color bar
+--> colbar1 = gce();
 --> colbar1.type
  ans  =
  Axes
@@ -526,10 +533,10 @@ subplot(2,2,3)
 plotSphere();
 colorbar(,,[60 120]);  // graduations on [0, 0.3]
 
-// 3.3) Selection of a colormap relative part. umin & umax set accordingly
+// 3.3) Selection of the first half of the colormap. umin & umax set accordingly
 subplot(2,2,4)
 plotSphere();
-colorbar(,,[0 0.5]);  // graduations on [-0.3, 0]
+colorbar(,,[1 $/2]);  // graduations on [-0.3, 0]
             ]]></programlisting>
             <scilab:image><![CDATA[
 function [zz, zz1] = plotSphere()
@@ -567,10 +574,10 @@ subplot(2,2,3)
 plotSphere();
 colorbar(,,[50 100]);  // graduations on [0, 0.3]
 
-// 3.3) Selection of a colormap relative part. umin & umax set accordingly
+// 3.3) Selection of the first half of the colormap. umin & umax set accordingly
 subplot(2,2,4)
 plotSphere();
-colorbar(,,[0 0.5]);  // graduations on [-0.3, 0]
+colorbar(,,[1 $/2]);  // graduations on [-0.3, 0]
             ]]></scilab:image>
             </para>
         </refsect3>
@@ -682,6 +689,19 @@ exec("SCI/modules/graphics/demos/colormap/colormaps.dem.sce",-1)
                     </itemizedlist>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                        <listitem>
+                            $ can be used in colminmax.
+                        </listitem>
+                        <listitem>
+                            After calling colorbar(), gce() provides the color bar's handle.
+                        </listitem>
+                    </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 1ea4b2d..e022acb 100644 (file)
@@ -2,7 +2,7 @@
 // Copyright (C) Bruno Pincon
 // Copyright (C) Serge Steer (adaptation to new graphic system)
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
-// Copyright (C) 2017 - 2018 - Samuel GOUGEON
+// Copyright (C) 2017 - 2019 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -17,33 +17,25 @@ function colorbar(umin, umax, colminmax, fmt)
     //     Draw a colorbar for a plot3d, fec, Sgrayplot, etc...
     //
     //  PARAMETERS
-    //     umin : min value of the plot
-    //     umax : max value of the plot
-    //     colminmax : (optional) a vector with 2 integer components
-    //                 the first is the color number (of the current
-    //                 colormap) associated with umin
-    //                 the second the max color number ....
-    //                 default : [1 nb_colors] where nb_colors is
-    //                 the number of colors of the current colormap.
+    //     umin : data value corresponding to the colorbar lower bound
+    //     umax : data value corresponding to the colorbar upper bound
+    //     colminmax : a [cmin cmax] vector providing the colors corresponding
+    //                 to the [umin, umax] data bounds.
+    //                 Is a vector of 2 colors indices, where $ stands for the
+    //                 total number of colors in the current colormap.
+    //                 Examples: [1 $]   // the whole colormap
+    //                           [$/2 $] // The second half of the colormap
     //                 May be useful to deal with a part of the colormap
     //                 (for instance using fec or plot3d)
     //     fmt : optional, a C format to display colorbar graduations
     //
-    //  CAUTION
-    //     this function may be used BEFORE a plot3d, fec, Sgrayplot, ...
-    //     It is important because this function set and change the
-    //     frame for the plot. This way the colorbar is not part of
-    //     the "associated" plot and so is not modified by a zoom or
-    //     a rotation of the plot.
-    //
-    //  EXAMPLES
-    //     see the help page
-    //
     //  HISTORY
     // 2017 : http://bugzilla.scilab.org/14711 : in uicontrol frame
     // 2018 : http://bugzilla.scilab.org/15638 : unequal color spans
     //        http://bugzilla.scilab.org/15805 : poor ticking
     //        http://bugzilla.scilab.org/15806 : syntaxes with default umin, umax..
+    // 2019 : http://bugzilla.scilab.org/16232 : Support of $ in colminmax added
+    //        http://bugzilla.scilab.org/10553 : gce() is now the colorbar handle
 
     // Check number of input argument
     [lhs, rhs] = argn();
@@ -82,9 +74,14 @@ function colorbar(umin, umax, colminmax, fmt)
     // PARSING INPUT ARGUMENTS
     // =======================
     // colminmax
+    if isdef("colminmax","l") & type(colminmax)==2
+        colminmax = horner(colminmax, nColorsCM)
+        colminmax(colminmax < 1) = 1
+        colminmax(colminmax > nColorsCM) = nColorsCM
+    end
     if isdef("colminmax","l") & type(colminmax)~=0 & colminmax~=[] & colminmax(1)~=-1
         msg = _("%s: Argument #%d: Decimal number(s) expected.\n")
-        if type(colminmax)~=1 | ~isreal(colminmax)
+        if and(type(colminmax)~=[1 2])| ~isreal(colminmax)
             error(msprintf(msg, "colorbar", 3))
         end
         if length(colminmax)~=2
@@ -317,4 +314,7 @@ function colorbar(umin, umax, colminmax, fmt)
 
     // Restoring input drawing mode
     f.immediate_drawing = idMem;
+
+    // setting gce()
+    set("current_entity", a_cb)
 endfunction
index 67e0998..dd4f9cf 100644 (file)
@@ -1,6 +1,6 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2018 - Samuel GOUGEON
+// Copyright (C) 2018 - 2019 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
@@ -144,7 +144,7 @@ colorbar(,,[64 128]);  // graduations on [0 , 0.3]
 
 // 3.3) umin & umax set according to partial colormap as fraction / whole u-range
 z = plotSphere();
-colorbar(,,[2.97 5]/6);   // ticks on [9, 0.2]
+colorbar(,,[2.97 5]/6);   // ticks on [0, 0.2]
                           // colors in [orange, yellow] must match figure #10 ones
 
 // 3.4) after graypolarplot()
@@ -191,3 +191,12 @@ colorbar(,,[100 200]);  // graduations from 0 to 1
 // 4.5) Same as above, with colors given as fractions inside the whole colormap
 plotSample();
 colorbar(,,[0.6 0.8]);  // values from 0.2 to 0.6
+
+// 4.6) Same as 4.4), with colors given with $
+plotSample();
+colorbar(,,[$/2 $]);  // values from 0 to 1
+
+
+// CHECKING gce()
+// ==============
+twinkle(gce())  // The colorbar of the last test must twinkle
index 1a6f36a..5969e72 100644 (file)
@@ -583,11 +583,11 @@ champ_properties_1.png=6409c708318038fda6b54aacc96937eb
 cheb1mag_1.png=3b26f5856ff8a2bcfbcf78e2d77cb5c1
 cheb2mag_1.png=d53206e41bccd28401ab6309ce2f941a
 color_1.png=8c94d2cd086d9ccb4ebc994bfd2dcf32
-colorbar_1.png=100726906558aea270a2831bd4d50b40
+colorbar_1.png=05786beb48816004257a076162de853d
 colorbar_2.png=08676eb69790372ff48052d9bfccb8c3
 colorbar_3.png=292d69dafbd3a147b474899d3e1305ac
 colorbar_4.png=72e7fa8b4c2ef7786caa3c7cf1ab3e27
-colorbar_5.png=b2d0497ab4a2918d8153fd6b30da9ac0
+colorbar_5.png=7baeab5e23d320fffa7928ca78ff54ea
 colorbar_6.png=f45bccb9441fd558c25f8ff3e2a84d3b
 colordef_1.png=b862d25fe3199de144cb45c810a43085
 colordef_2.png=8dffacb993e0972367eaabb29383154f
index 24d35b4..fabd3db 100644 (file)
Binary files a/scilab/modules/helptools/images/_LaTeX_histc.xml_1.png and b/scilab/modules/helptools/images/_LaTeX_histc.xml_1.png differ
index 84ea245..1adef40 100644 (file)
Binary files a/scilab/modules/helptools/images/colorbar_1.png and b/scilab/modules/helptools/images/colorbar_1.png differ
index 5b6ab51..72261ac 100644 (file)
Binary files a/scilab/modules/helptools/images/colorbar_5.png and b/scilab/modules/helptools/images/colorbar_5.png differ
index 2cbd640..8efa764 100644 (file)
Binary files a/scilab/modules/helptools/images/nicholschart_2.png and b/scilab/modules/helptools/images/nicholschart_2.png differ