Bug #14581 fixed : http://bugzilla.scilab.org/14581 06/18506/5
Samuel GOUGEON [Sun, 21 Aug 2016 23:05:31 +0000 (01:05 +0200)]
 * replot() upgraded:
    - a bound set to %inf gets the position of the most marginal object
    - replot() syntax added (as replot([%inf %inf %inf %inf]) )
    - option "tigh_limits" added
    - Any handle having Axes as direct children -- as uicontrol-frame --
      is now supported
 * zoom_auto() is replaced with replot() and is removed
 * replot unit test added
 * Bug #14581 fixed : http://bugzilla.scilab.org/14581
   "Reframe to contents" feature fixed.

Change-Id: I65142a8ce25bc5a4d59e3728f314b091400356ec

12 files changed:
scilab/CHANGES.md
scilab/modules/graphics/help/en_US/axes_operations/replot.xml
scilab/modules/graphics/help/en_US/axes_operations/zoom_auto.xml [deleted file]
scilab/modules/graphics/help/fr_FR/axes_operations/replot.xml
scilab/modules/graphics/help/ja_JP/axes_operations/replot.xml
scilab/modules/graphics/help/pt_BR/axes_operations/replot.xml
scilab/modules/graphics/locales/graphics.pot
scilab/modules/graphics/macros/replot.sci
scilab/modules/graphics/macros/zoom_auto.sci [deleted file]
scilab/modules/graphics/tests/unit_tests/replot.tst [new file with mode: 0644]
scilab/modules/gui/etc/graphics_menubar.xml
scilab/modules/gui/etc/graphics_toolbar.xml

index 02fa478..3dc8445 100644 (file)
@@ -109,6 +109,11 @@ Feature changes and additions
 * name2rgb can now handle a single string and a matrix of strings.
 * `isoview`, `isoview on`, `isoview off`, `isoview(idGraphics, "on"|"off")` are now supported
 * `twinkle` and `twinkle(n)` are now supported: by default, the current element `gce` blinks.
+* `replot` is upgraded:
+  - a bound set to %inf now gets the position of the most marginal object
+  - replot() can now be used to reframe considered axes to all their contents
+  - option "tigh_limits" added
+  - Any handle having some Axes as direct children -- as uicontrol-frame -- is now supported
 * `householder` can now return the reflection matrix, and has a demo.
 * `ndgrid` can now works with any types of homogeneous data
 * `bench_run` can now return its results and/or record them in a file
@@ -305,7 +310,7 @@ Bug Fixes
   - typeof names longer than 8-char were not documented.
 * [Bug #8210](http://bugzilla.scilab.org/show_bug.cgi?id=8210) fixed   - UMFPACK demos were not well packaged and not numerous enough.
 * [Bug #8310](http://bugzilla.scilab.org/show_bug.cgi?id=8310)         - Non-convex plane or unplane polygons could be wrongly triangulated and badly rendered with extra facets.
-* [Bug #8990](http://bugzilla.scilab.org/show_bug.cgi?id=8990) fixed   - `.zoom_auto` feature was missing on the `plot` toolbar.
+* [Bug #8990](http://bugzilla.scilab.org/show_bug.cgi?id=8990) fixed   - `Reframe to contents` feature was missing on the graphics toolbar and `Tools` menu.
 * [Bug #9456](http://bugzilla.scilab.org/show_bug.cgi?id=9456) fixed   - `bench_run` did not work on a path or in a toolbox
 * [Bug #9560](http://bugzilla.scilab.org/show_bug.cgi?id=9560) fixed   - `1./M` was parsed as `1. / M` instead of `1 ./ M`
 * [Bug #9621](http://bugzilla.scilab.org/show_bug.cgi?id=9621) fixed   - A `tlist` with undefined fields can now be saved.
index a8cc211..b4b1bde 100644 (file)
@@ -2,7 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) ENPC - Jean-Philippe Chancelier
- * Copyright (C) 2013 - Samuel GOUGEON
+ * Copyright (C) 2013, 2016 - Samuel GOUGEON
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
     <refsynopsisdiv>
         <title>Syntax</title>
         <synopsis>
+          replot()
           replot(area)
-          replot(area, axesHandles)
+          replot(idAxes)
+          replot(area, idAxes)
+          replot(.., tight_limits)
       </synopsis>
     </refsynopsisdiv>
     <refsection role="parameters">
             <varlistentry>
                 <term>area</term>
                 <listitem>
-                    <para>row vector [xmin ymin xmax ymax] or [xmin ymin zmin xmax ymax zmax]: new bounds of the area to be replotted.
+                    <para>row vector [xmin ymin xmax ymax] or
+                        [xmin ymin zmin xmax ymax zmax]: new bounds of the area
+                        to be replotted.
                         <note>
-                            Use <literal>%nan</literal> to keep a bound as is.
+                            <itemizedlist>
+                                <listitem>
+                                    <literal>%nan</literal> can be used to keep a bound as is.
+                                </listitem>
+                                <listitem>
+                                    <literal>%inf</literal> can be used to set
+                                    a bound to the position of the most marginal
+                                    graphical component existing in the axes,
+                                    for the considered direction.
+                                </listitem>
+                            </itemizedlist>
                         </note>
+                        The default area is [%inf %inf %inf %inf]
+                        for a 2D axes, or [%inf %inf %inf %inf %inf %inf] for a
+                        3D one.
+                    </para>
+                    <para>If N axes are identified in <literal>idAxes</literal>,
+                        <literal>area</literal> may be a matrix with N rows and
+                        4 or 6 columns. The row #i is then related to the axes #i
+                         of <literal>idAxes</literal>.
+                        If <literal>area</literal> is only a vector of 4 or 6
+                        bounds, these ones are used for all axes to be reframed.
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>axeHandle</term>
+                <term>idAxes</term>
                 <listitem>
-                    <para>Vector of graphics handles of type Axes: Axes to crop. By default, the current Axes of the current figure is considered.
+                    <para>Vector of graphic handles, expected to be of Axes type
+                          or to have direct children of type Axes, such as Figures
+                          or some frame uicontrols.
+                          <literal>idAxes</literal> specifies direct or children
+                          Axes to crop. If no axes is found, nothing is done.
+                    </para>
+                    <para>By default, the current Axes is considered.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>tight_limits</term>
+                <listitem>
+                    <para>
+                    Single word <literal>"tight"</literal> or <literal>"on"</literal> or
+                    <literal>"off"</literal>, or vector of 2 (in 2D)
+                    or 3 (in 3D) words <literal>"tight"</literal> or <literal>"on"</literal> or
+                    <literal>"off"</literal>. If a single word is provided,
+                    it is used for every axis. This option forces the
+                    <literal>.tight_limits</literal> attribute of considered
+                    axes to the specified <literal>"on"</literal> or
+                    <literal>"off"</literal> values. By default,
+                    current limits modes are unchanged.
                     </para>
                 </listitem>
             </varlistentry>
     <refsection role="description">
         <title>Description</title>
         <para>
-            <literal>replot</literal> is used to redraw the content of the current graphics axes with new boundaries defined by
-            <literal>area = [xmin,ymin, xmax,ymax]</literal> or <literal>area = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>.
+            <literal>replot</literal> is used to reframe the (set of) axes specified
+            with <literal>idAxes</literal> -- or by default the current axes --
+            with new boundaries defined by
+            <literal>area = [xmin,ymin, xmax,ymax]</literal> or
+            <literal>area = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>.
         </para>
-        <para>This transformation can be applied to specific
-            axes given by Axes graphics handles via the <varname>axesHandles</varname> argument. If <varname>axesHandles</varname> is
-            not specified, the new boundaries are applied to the current axes of the
-            current figure. The transformation changes the <literal>data_bounds</literal>
-            value of those axes.
+        <para>
+            It changes the <literal>data_bounds</literal> attribute of processed axes.
+        </para>
+        <para>
+            When a specified bound is infinite (%inf and -%inf are equivalent),
+            <literal>replot</literal> looks for the most marginal graphical object
+            and sets the actual related bound to its position, taking also
+            objects sizes into account. This ensures not clipping any object
+            that would be beyond the targeted side of the axes.
+        </para>
+        <para>When the <literal>tight_limits</literal> option is provided,
+            its value is assigned to the <literal>.tight_limits</literal>
+            attribute of each considered axes, in an axis-wise way.
         </para>
-        <note>
-            The axes property <literal>tight_limits</literal>
-            must be set to "on" to strictly select specified bounds (see
-            <link linkend="axes_properties">axes_properties</link>)
-        </note>
     </refsection>
     <refsection role="examples">
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-      x=[0:0.1:2*%pi]';
+      x = [0:0.1:2*%pi]';
       plot2d(x,sin(x))
       replot([-1,-1,10,2])
       ]]></programlisting>
         <programlisting role="example"><![CDATA[
       xdel(winsid());
       plot() // plot demo
-      f=gcf();
+      f = gcf();
       replot([-1,-1,10,2],f.children(1)) // specify axes handle's value
       replot([-3,-2,8,4],f.children(2))
       ]]></programlisting>
@@ -99,9 +151,12 @@ x = linspace(0,360,200).';
 clf
 plot2d(x,[sind(x) tand(x)])
 ax = gca();
-ax.data_bounds                         // initial bounds
-replot([%nan,-10,%nan,10])     // only Ymin and Ymax are changed
-ax.data_bounds                         // updated bounds
+ax.data_bounds              // initial bounds
+replot([%nan,-10,%nan,10])  // only Ymin and Ymax are changed
+ax.data_bounds              // updated bounds
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // Resizing Z bounds as well as X and Y ones in 3D view:
 clf
 x = linspace(-4,4,100);
@@ -116,6 +171,9 @@ ax.data_bounds
 sleep(3000)
 replot([-5 0 -0.4 0 5 0.5])
 ax.data_bounds
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // Resizing several chosen axes together:
 clf
 x = linspace(-%pi,%pi,400);
@@ -163,6 +221,27 @@ replot([-1 %nan 1.5 %nan], [ax1 ax2])
                     </itemizedlist>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                        <listitem>
+                            Handles of frame uicontrols having Axes children are
+                            now accepted.
+                        </listitem>
+                        <listitem>
+                            %inf can now be used to set a bound to the position
+                            of most marginal contents.
+                        </listitem>
+                        <listitem>
+                            replot() as replot([%inf %inf %inf %inf]) is added.
+                        </listitem>
+                        <listitem>
+                            Option tight_limits added.
+                        </listitem>
+                    </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
diff --git a/scilab/modules/graphics/help/en_US/axes_operations/zoom_auto.xml b/scilab/modules/graphics/help/en_US/axes_operations/zoom_auto.xml
deleted file mode 100644 (file)
index 9ce346f..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- *
- * This help file was generated from zoom_auto.sci using help_from_sci().
- *
- -->
-
-<refentry version="5.0-subset Scilab" xml:id="zoom_auto" xml:lang="en"
-          xmlns="http://docbook.org/ns/docbook"
-          xmlns:xlink="http://www.w3.org/1999/xlink"
-          xmlns:svg="http://www.w3.org/2000/svg"
-          xmlns:ns3="http://www.w3.org/1999/xhtml"
-          xmlns:mml="http://www.w3.org/1998/Math/MathML"
-          xmlns:scilab="http://www.scilab.org"
-          xmlns:db="http://docbook.org/ns/docbook">
-    
-    <refnamediv>
-        <refname>zoom_auto</refname>
-        <refpurpose>Zoom automatically to the visible values of all axes of the figure</refpurpose>
-    </refnamediv>
-    
-    
-    <refsynopsisdiv>
-        <title>Syntax</title>
-        <synopsis>
-            zoom_auto()
-            zoom_auto(h)
-            
-        </synopsis>
-    </refsynopsisdiv>
-    
-    <refsection>
-        <title>Parameters</title>
-        <variablelist>
-            <varlistentry>
-                <term>h:</term>
-                <listitem>
-                    <para> A Figure or Axes handle to zoom automatically</para>
-                </listitem>
-            </varlistentry>
-        </variablelist>
-    </refsection>
-    
-    <refsection>
-        <title>Description</title>
-        <para>
-            This function update the zoom_box of all axes of the figure when there is
-            some zoom applied to it or update the data bounds otherwise. After the call
-            the user will be able to view all visible data even if mis-configured
-            something.
-        </para>
-        <para>
-        </para>
-    </refsection>
-    
-    <refsection>
-        <title>Examples</title>
-        <programlisting role="example"><![CDATA[
-plot3d();
-a=gca();
-// hide some data to the user
-a.data_bounds = [-1 -1 -0.5 ; 1 1 0.5]
-sleep(1000)
-// let the user view the whole dataset
-zoom_auto()
-
-   ]]></programlisting>
-    </refsection>
-    
-    <refsection>
-        <title>See also</title>
-        <simplelist type="inline">
-            <member>
-                <link linkend="zoom_rect">zoom_rect</link>
-            </member>
-            <member>
-                <link linkend="unzoom">unzoom</link>
-            </member>
-            <member>
-                <link linkend="axes_properties">axes_properties</link>
-            </member>
-        </simplelist>
-    </refsection>
-    
-    <refsection>
-        <title>History</title>
-        <revhistory>
-            <revision>
-                <revnumber>5.5.3</revnumber>
-                <revremark>
-                    Function <function>zoom_auto</function> introduced.
-                </revremark>
-            </revision>
-        </revhistory>
-    </refsection>
-</refentry>
index 8589c2b..9523270 100644 (file)
@@ -2,8 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) ENPC - Jean-Philippe Chancelier
- * Copyright (C) 2012 - Scilab Enterprises
- * Copyright (C) 2013 - Samuel GOUGEON
+ * Copyright (C) 2013, 2016 - Samuel GOUGEON
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
     <refsynopsisdiv>
         <title>Syntaxe</title>
         <synopsis>
+          replot()
           replot(area)
-          replot(area, axesHandles)
+          replot(idAxes)
+          replot(area, idAxes)
+          replot(.., tight_limits)
       </synopsis>
     </refsynopsisdiv>
     <refsection role="parameters">
             <varlistentry>
                 <term>area</term>
                 <listitem>
-                    <para>vecteur [xmin ymin xmax ymax] ou [xmin ymin zmin xmax ymax zmax]: nouvelles bornes de la zone à réafficher.
-                        Utiliser <literal>%nan</literal> pour conserver une borne telle quelle.
+                    <para>vecteur [xmin ymin xmax ymax] ou [xmin ymin zmin xmax ymax zmax]:
+                      nouvelles bornes de la zone à réafficher.
+                      <note>
+                            <itemizedlist>
+                                <listitem>
+                                    La valeur <literal>%nan</literal> peut être
+                                    utilisée pour conserver une borne telle quelle.
+                                </listitem>
+                                <listitem>
+                                    La valeur <literal>%inf</literal> peut être
+                                    utilisée pour établir une borne à la position
+                                    de l'objet graphique le plus marginal présent
+                                    dans le repère, dans la direction considérée.
+                                </listitem>
+                            </itemizedlist>
+                        </note>
+                    </para>
+                    <para>
+                        La zone <literal>area</literal> par défaut
+                        est [%inf %inf %inf %inf] pour un repère 2D,
+                        ou [%inf %inf %inf %inf %inf %inf] en 3D.
+                    </para>
+                    <para>Si N repères graphiques sont identifiés dans
+                        <literal>idAxes</literal>, <literal>area</literal>
+                        peut être une matrice de N lignes et 4 ou 6 colonnes.
+                        Chaque ligne correspond alors à un repère graphique
+                        respectif de <literal>idAxes</literal>.
+                        Si <literal>area</literal> est seulement un vecteur de
+                        4 ou 6 bornes, celles-ci sont utilisées pour tous les
+                        repères à recadrer.
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>axesHandles</term>
+                <term>idAxes</term>
                 <listitem>
-                    <para>Vecteur d'identifiants graphiques de type Axes: repères graphiques à retailler. Par défaut, le repère graphique actif de la fenêtre graphique active est considéré.
+                    <para>Vecteur d'identifiants graphiques soit de type Axes,
+                        soit ayant des descendants directs de type Axes, tels
+                        que les Figures ou certains composants uicontrol de style
+                        <literal>frame</literal>.
+                        <literal>idAxes</literal> spécifie les repères graphiques
+                        à recadrer, directement ou via leur parents directs.
+                        Si aucun repère n'est identifié, l'instruction
+                        <literal>replot</literal> est simplement ignorée.
+                    </para>
+                    <para>
+                        Par défaut, le repère graphique actif est considéré.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>tight_limits</term>
+                <listitem>
+                    <para>
+                    Mot simple <literal>"tight"</literal> ou <literal>"on"</literal> ou
+                    <literal>"off"</literal>, ou vecteur de 2 (en 2D)
+                    ou 3 (en 3D) mots <literal>"tight"</literal>, <literal>"on"</literal> ou
+                    <literal>"off"</literal>. Si un seul mot est fourni, il
+                    est utilisé pour les 2 ou 3 axes de chaque repère.
+                    </para>
+                    <para>
+                    Cette option force la valeur de l'attribut
+                    <literal>.tight_limits</literal> des repères
+                    aux valeurs <literal>"on"</literal> ou
+                    <literal>"off"</literal> données.
+                    </para>
+                    <para>
+                        Par défaut, les attributs tight_limits en cours sont inchangés.
                     </para>
                 </listitem>
             </varlistentry>
     <refsection role="description">
         <title>Description</title>
         <para>
-            <literal>replot</literal> est utilisée pour recadrer les repères graphiques spécifiés par <literal>axesHandles</literal>
-            (ou par défaut le repère graphique actif de la fenêtre graphique active) en changeant leurs bornes communes spécifiées sous la forme
-            <literal>rect = [xmin,ymin, xmax,ymax]</literal> ou <literal>rect = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>.
+            <literal>replot</literal> recadre les repères graphiques spécifiés
+            par <literal>idAxes</literal> (ou par défaut le repère graphique actif)
+            en changeant leurs bornes spécifiées sous la forme
+            <literal>area = [xmin, ymin, xmax, ymax]</literal> ou
+            <literal>area = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>.
+        </para>
+        <para>
+            <varname>replot</varname> modifie l'attribut
+            <literal>data_bounds</literal> des repères.
         </para>
         <para>
-            <varname>replot</varname> modifie les valeurs <literal>data_bounds</literal> des repères.
-            <note>
-                La propriété <literal>tight_limits</literal> des repères doit
-                être mise à  <literal>"on"</literal> pour sélectionner strictement ces bornes
-                (voir <link linkend="axes_properties">axes_properties</link>).
-            </note>
+            Lorsque la valeur spécifiée pour une borne est infinie (%inf et -%inf
+            sont équivalentes),
+            <literal>replot</literal> recherche dans le repère l'objet graphique
+            le plus marginal du coté de la borne considérée, et assigne la
+            position de l'objet comme borne effective. Les dimensions des objets
+            sont prises en compte, de sorte à assurer qu'aucun objet ne soit
+            partiellement ou totalement caché hors du repère dans la direction
+            choisie.
+        </para>
+        <para>Lorsque l'option <literal>tight_limits</literal> est fournie,
+            sa valeur est affectée à l'attribut <literal>.tight_limits</literal>
+            de chaque repère graphique considéré, axe par axe.
         </para>
     </refsection>
     <refsection role="examples">
@@ -98,9 +171,12 @@ x = linspace(0,360,200).';
 clf
 plot2d(x,[sind(x) tand(x)])
 ax = gca();
-ax.data_bounds                         // bornes initiales
-replot([%nan,-10,%nan,10])     // Seules Ymin and Ymax sont modifiées
-ax.data_bounds                         // nouvelles bornes
+ax.data_bounds              // bornes initiales
+replot([%nan,-10,%nan,10])  // Seules Ymin and Ymax sont modifiées
+ax.data_bounds              // nouvelles bornes
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // En 3D, les bornes en Z peuvent également être modifiées :
 clf
 x = linspace(-4,4,100);
@@ -115,6 +191,9 @@ ax.data_bounds
 sleep(3000)
 replot([-5 0 -0.4 0 5 0.5])
 ax.data_bounds
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // Plusieurs repères graphiques peuvent être simultanément recadrés :
 clf
 x = linspace(-%pi,%pi,400);
@@ -156,16 +235,42 @@ replot([-1 %nan 1.5 %nan], [ax1 ax2])
                             <para>Extension en 3D</para>
                         </listitem>
                         <listitem>
-                            <para>Plusieurs repères graphiques peuvent être désormais redimensionnés simultanément</para>
+                            <para>Plusieurs repères graphiques peuvent être désormais
+                                 redimensionnés simultanément
+                            </para>
                         </listitem>
                         <listitem>
                             <para>
-                                <literal>%nan</literal> peut être utilisé pour spécifier une borne inchangée.
+                                <literal>%nan</literal> peut être utilisé pour
+                                spécifier une borne inchangée.
                             </para>
                         </listitem>
                     </itemizedlist>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                        <listitem>
+                            Les identifiants de composants uicontrol de style frame
+                            ayant des children de type Axes à traiter sont
+                            désormais acceptés.
+                        </listitem>
+                        <listitem>
+                            %inf peut être utilisée pour fixer une borne à la
+                            position du contenu le plus marginal.
+                        </listitem>
+                        <listitem>
+                            Ajout de la syntaxe replot() abrégeant
+                            replot([%inf %inf %inf %inf]).
+                        </listitem>
+                        <listitem>
+                            Option tight_limits ajoutée.
+                        </listitem>
+                    </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index a57593c..a8dd01f 100644 (file)
@@ -2,7 +2,7 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) ENPC - Jean-Philippe Chancelier
- * Copyright (C) 2013 - 2016 - Samuel GOUGEON
+ * Copyright (C) 2013, 2016 - Samuel GOUGEON
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
  * along with this program.
  *
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"  xml:lang="ja" xml:id="replot">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+    xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+    xml:lang="ja" xml:id="replot">
     <refnamediv>
         <refname>replot</refname>
         <refpurpose>
     <refsynopsisdiv>
         <title>呼び出し手順</title>
         <synopsis>
+            replot()
             replot(area)
-            replot(area, axesHandles)
+            replot(idAxes)
+            replot(area, idAxes)
+            replot(.., tight_limits)
         </synopsis>
     </refsynopsisdiv>
     <refsection role="parameters">
                         行ベクトル [xmin ymin xmax ymax] または
                         [xmin ymin zmin xmax ymax zmax]: 再プロットされる領域の新しい範囲.
                         <note>
-                            範囲を変えない場合は <literal>%nan</literal> を使用してください.
+                            <itemizedlist>
+                                <listitem>
+                                    範囲を変えない場合は <literal>%nan</literal> を使用してください.
+                                </listitem>
+                                <listitem>
+                                    <literal>%inf</literal> can be used to set
+                                    a bound to the position of the most marginal
+                                    graphical component existing in the axes,
+                                    for the considered direction.
+                                </listitem>
+                            </itemizedlist>
                         </note>
+                        The default area is [%inf %inf %inf %inf]
+                        for a 2D axes, or [%inf %inf %inf %inf %inf %inf] for a
+                        3D one.
+                    </para>
+                    <para>If N axes are identified in <literal>idAxes</literal>,
+                        <literal>area</literal> may be a matrix with N rows and
+                        4 or 6 columns. The row #i is then related to the axes #i
+                         of <literal>idAxes</literal>.
+                        If <literal>area</literal> is only a vector of 4 or 6
+                        bounds, these ones are used for all axes to be reframed.
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>axesHandles</term>
+                <term>idAxes</term>
                 <listitem>
+                    <para>Vector of graphic handles, expected to be of Axes type
+                          or to have direct children of type Axes, such as Figures
+                          and possibly frame uicontrols.
+                          <literal>idAxes</literal> specifies direct or children
+                          Axes to crop. If no axes is found, nothing is done.
+                    </para>
+                    <para>By default, the current Axes is considered.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>tight_limits</term>
+                <listitem>
+                    <para>
+                      Single word <literal>"tight"</literal> or <literal>"on"</literal> or
+                      <literal>"off"</literal>, or vector of 2 (in 2D)
+                      or 3 (in 3D) words <literal>"tight"</literal> or <literal>"on"</literal> or
+                      <literal>"off"</literal>. If a single word is provided,
+                      it is used for every axis. This option forces the
+                      <literal>.tight_limits</literal> attribute of considered
+                      axes to the specified <literal>"on"</literal> or
+                      <literal>"off"</literal> values. By default,
+                      current limits modes are unchanged.
+                    </para>
                     <para>
-                        Axes型のグラフィックハンドルのベクトル:
-                        選択する軸. デフォルトで, カレントの図のカレントの軸が指定されます.
+                        By default, current limits modes are unchanged.
                     </para>
                 </listitem>
             </varlistentry>
     <refsection role="description">
         <title>説明</title>
         <para>
-            <literal>replot</literal> はカレントのグラフィックウインドウの内容を
-            <literal>area = [xmin,ymin, xmax,ymax]</literal>または
-            <literal>area = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>で定義した新しい境界内に
-            再描画する際に使用されます.
+            <literal>replot</literal> is used to reframe the (set of) axes specified
+            with <literal>idAxes</literal> -- or by default the current axes --
+            with new boundaries defined by
+            <literal>area = [xmin,ymin, xmax,ymax]</literal> or
+            <literal>area = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>.
+        </para>
+        <para>
+            It changes the <literal>data_bounds</literal> attribute of processed axes.
         </para>
         <para>
-            この変換は<varname>axesHandles</varname>引数でAxesグラフィックハンドルにより
-            指定された特定の軸に適用できます.
-            <varname>axesHandles</varname>が指令されない場合,
-            新しい境界はカレントの図のカレントの軸に適用されます.
-            変換はこれらの軸の<literal>data_bounds</literal>の値を変更します.
+            When a specified bound is infinite (%inf and -%inf are equivalent),
+            <literal>replot</literal> looks for the most marginal graphical object
+            and sets the actual related bound to its position, taking also
+            objects sizes into account. This ensures not clipping any object
+            that would be beyond the targeted side of the axes.
+        </para>
+        <para>When the <literal>tight_limits</literal> option is provided,
+            its value is assigned to the <literal>.tight_limits</literal>
+            attribute of each considered axes, in an axis-wise way.
         </para>
-        <note>
-            これらの範囲を厳密に選択するために
-            axesのプロパティ<literal>tight_limits</literal>を"on" に設定する必要があります
-            (<link linkend="axes_properties">axes_properties</link>を参照ください).
-        </note>
     </refsection>
     <refsection role="examples">
         <title>例</title>
@@ -112,7 +163,9 @@ ax = gca();
 ax.data_bounds              // 初期限界
 replot([%nan,-10,%nan,10])  // YminとYmaxのだけ変更され
 ax.data_bounds              // 新しい制限
-
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // 3D端末Zも変更できます。
 clf
 x = linspace(-4,4,100);
@@ -127,7 +180,9 @@ ax.data_bounds
 sleep(3000)
 replot([-5 0 -0.4 0 5 0.5])
 ax.data_bounds
-
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // いくつかのグラフィカルなマーカーを同時にトリミングすることができます。
 clf
 x = linspace(-%pi,%pi,400);
@@ -175,6 +230,27 @@ replot([-1 %nan 1.5 %nan], [ax1 ax2])
                     </itemizedlist>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                        <listitem>
+                            Handles of frame uicontrols having Axes children are
+                            now accepted.
+                        </listitem>
+                        <listitem>
+                            %inf can now be used to set a bound to the position
+                            of most marginal contents.
+                        </listitem>
+                        <listitem>
+                            replot() as replot([%inf %inf %inf %inf]) is added.
+                        </listitem>
+                        <listitem>
+                            Option tight_limits added.
+                        </listitem>
+                    </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
\ No newline at end of file
index 880952c..9979df2 100644 (file)
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) ENPC - Jean-Philippe Chancelier
- * Copyright (C) 2013 - Samuel GOUGEON
+ * Copyright (C) 2013, 2016 - Samuel GOUGEON
  *
- * Copyright (C) 2012 - 2016 - Scilab Enterprises
- *
- * 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.
- * This file was originally licensed under the terms of the CeCILL v2.1,
- * and continues to be available under such terms.
- * For more information, see the COPYING file which you should have received
- * along with this program.
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns4="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="replot" xml:lang="pt">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns4="http://www.w3.org/1999/xhtml"
+    xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+    xmlns:scilab="http://www.scilab.org" xml:id="replot" xml:lang="pt">
     <refnamediv>
         <refname>replot</refname>
         <refpurpose>reformula a área de exibição de um ou mais gráficos
     <refsynopsisdiv>
         <title>Seqüência de Chamamento</title>
         <synopsis>
-          replot(area)
-          replot(area, axesHandles)
-      </synopsis>
+            replot()
+            replot(area)
+            replot(idAxes)
+            replot(area, idAxes)
+            replot(.., tight_limits)
+        </synopsis>
     </refsynopsisdiv>
-    <refsection role="parameters">
+    <refsection>
         <title>Parâmetros</title>
         <variablelist>
             <varlistentry>
                 <term>area</term>
                 <listitem>
-                    <para>vetor linha de tamanho 4.</para>
+                    <para>row vector [xmin ymin xmax ymax] or
+                        [xmin ymin zmin xmax ymax zmax]: new bounds of the area
+                        to be replotted.
+                        <note>
+                            <itemizedlist>
+                                <listitem>
+                                    <literal>%nan</literal> can be used to keep a bound as is.
+                                </listitem>
+                                <listitem>
+                                    <literal>%inf</literal> can be used to set
+                                    a bound to the position of the most marginal
+                                    graphical component existing in the axes,
+                                    for the considered direction.
+                                </listitem>
+                            </itemizedlist>
+                        </note>
+                        The default area is [%inf %inf %inf %inf]
+                        for a 2D axes, or [%inf %inf %inf %inf %inf %inf] for a
+                        3D one.
+                    </para>
+                    <para>If N axes are identified in <literal>idAxes</literal>,
+                        <literal>area</literal> may be a matrix with N rows and
+                        4 or 6 columns. The row #i is then related to the axes #i
+                         of <literal>idAxes</literal>.
+                        If <literal>area</literal> is only a vector of 4 or 6
+                        bounds, these ones are used for all axes to be reframed.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>idAxes</term>
+                <listitem>
+                    <para>Vector of graphic handles, expected to be of Axes type
+                          or to have direct children of type Axes, such as Figures
+                          or some frame uicontrols.
+                          <literal>idAxes</literal> specifies direct or children
+                          Axes to crop. If no axes is found, nothing is done.
+                    </para>
+                    <para>By default, the current Axes is considered.</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>axesHandles</term>
+                <term>tight_limits</term>
                 <listitem>
-                    <para>argumento opcional. Manipulador(es) do tipo Axes para
-                        selecionar uma ou várias entidades Axes válidas. Disponível apenas
-                        no novo modo de gráficos.
+                    <para>
+                    Single word <literal>"tight"</literal> or <literal>"on"</literal> or
+                    <literal>"off"</literal>, or vector of 2 (in 2D)
+                    or 3 (in 3D) words <literal>"tight"</literal> or <literal>"on"</literal> or
+                    <literal>"off"</literal>. If a single word is provided,
+                    it is used for every axis. This option forces the
+                    <literal>.tight_limits</literal> attribute of considered
+                    axes to the specified <literal>"on"</literal> or
+                    <literal>"off"</literal> values. By default,
+                    current limits modes are unchanged.
                     </para>
                 </listitem>
             </varlistentry>
         </variablelist>
     </refsection>
-    <refsection role="description">
+    <refsection>
         <title>Descrição</title>
         <para>
-            <literal>replot</literal> é utilizado para redesenhar o conteúdo da
-            janela de gráficos atual com novas fronteiras definidas por
-            <literal>area = [xmin,ymin,xmax,ymax]</literal> ou <literal> rect = [xmin, ymin, zmin, xmax, ymax, zmax] </literal>.
+            <literal>replot</literal> is used to reframe the (set of) axes specified
+            with <literal>idAxes</literal> -- or by default the current axes --
+            with new boundaries defined by
+            <literal>area = [xmin,ymin, xmax,ymax]</literal> or
+            <literal>area = [xmin,ymin,zmin, xmax,ymax,zmax]</literal>.
+        </para>
+        <para>
+            It changes the <literal>data_bounds</literal> attribute of processed axes.
         </para>
-        <para>Sob o novo modo de gráficos, esta transformação pode ser aplicada a
-            eixos específicos fornecidos por manipuladores gráficos Axes via o
-            argumento <varname>axesHandles</varname>. Se <varname>axesHandles</varname>
-            não for especificado, as novas fronteiras são
-            aplicadas aos eixos correntes da figura corrente. A transformação muda os
-            valores de <literal>data_bounds</literal> para estes eixos.
-            <note>
-                A propriedade de eixos <literal>tight_limits</literal> também deve ser
-                ajustada para "on" para selecionar estritamente estas fronteiras (ver
-                <link linkend="axes_properties">axes_properties</link>).
-            </note>
+        <para>
+            When a specified bound is infinite (%inf and -%inf are equivalent),
+            <literal>replot</literal> looks for the most marginal graphical object
+            and sets the actual related bound to its position, taking also
+            objects sizes into account. This ensures not clipping any object
+            that would be beyond the targeted side of the axes.
+        </para>
+        <para>When the <literal>tight_limits</literal> option is provided,
+            its value is assigned to the <literal>.tight_limits</literal>
+            attribute of each considered axes, in an axis-wise way.
         </para>
     </refsection>
-    <refsection role="examples">
+    <refsection>
         <title>Exemplos</title>
         <programlisting role="example"><![CDATA[
 // primeiro exemplo
@@ -102,9 +154,12 @@ x = linspace(0,360,200).';
 clf
 plot2d(x,[sind(x) tand(x)])
 ax = gca();
-ax.data_bounds                         // Fronteiras iniciais
-replot([%nan,-10,%nan,10])     // Ymin e Ymax só são modificados
-ax.data_bounds                         // novas fronteiras
+ax.data_bounds              // Fronteiras iniciais
+replot([%nan,-10,%nan,10])  // Ymin e Ymax só são modificados
+ax.data_bounds              // novas fronteiras
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // 3D Fronteiras Z também pode ser modificadas :
 clf
 x = linspace(-4,4,100);
@@ -119,6 +174,9 @@ ax.data_bounds
 sleep(3000)
 replot([-5 0 -0.4 0 5 0.5])
 ax.data_bounds
+     ]]></programlisting>
+        <para></para>
+        <programlisting role="example"><![CDATA[
 // Diversos gráficos podem ser cortadas simultaneamente :
 clf
 x = linspace(-%pi,%pi,400);
@@ -149,8 +207,8 @@ replot([-1 %nan 1.5 %nan], [ax1 ax2])
             </member>
         </simplelist>
     </refsection>
-    <refsection role="history">
-        <title>histórico</title>
+    <refsection>
+        <title>Histórico</title>
         <revhistory>
             <revision>
                 <revnumber>5.5.0</revnumber>
@@ -170,6 +228,27 @@ replot([-1 %nan 1.5 %nan], [ax1 ax2])
                     </itemizedlist>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                        <listitem>
+                            Handles of frame uicontrols having Axes children are
+                            now accepted.
+                        </listitem>
+                        <listitem>
+                            %inf can now be used to set a bound to the position
+                            of most marginal contents.
+                        </listitem>
+                        <listitem>
+                            replot() as replot([%inf %inf %inf %inf]) is added.
+                        </listitem>
+                        <listitem>
+                            Option tight_limits added.
+                        </listitem>
+                    </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index f9e5551..d7d91aa 100644 (file)
@@ -3047,7 +3047,6 @@ msgstr ""
 # File: modules/graphics/macros/fac3d.sci, line: 44
 # File: modules/graphics/macros/fac3d1.sci, line: 46
 # File: modules/graphics/macros/getcolor.sci, line: 41
-# File: modules/graphics/macros/zoom_auto.sci, line: 36
 #, c-format
 msgid "%s: Wrong number of input arguments: %d to %d expected.\n"
 msgstr ""
@@ -4378,15 +4377,3 @@ msgstr ""
 #, c-format
 msgid "%s: Wrong value given for %s."
 msgstr ""
-
-#
-# File: modules/graphics/macros/zoom_auto.sci, line: 43
-#, c-format
-msgid "%s: Wrong type for argument %d: a handle expected.\n"
-msgstr ""
-
-#
-# File: modules/graphics/macros/zoom_auto.sci, line: 46
-#, c-format
-msgid "%s: Wrong size for input argument #%d: a handle expected.\n"
-msgstr ""
index ca84282..da12f26 100644 (file)
@@ -1,7 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
-// Copyright (C) 2013 - Samuel GOUGEON : extend to 3D + set of handles + skip with %nan
-
+// Copyright (C) 2013, 2016 - Samuel GOUGEON
+// Copyright (C) 2016 - Clément DAVID - Scilab Enterprises
+//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function replot(rect,handl)
+function replot(varargin)
+    // replot(rect, handl, tight_limits)
     // replots the graphic axes using rect as x and y (and z) bounds
-    //
+    // rect = [xmin ymin xmax ymax] or [xmin ymin zmin xmax ymax zmax]
+    // Added in Scilab 5.5 (2013):
+    //  - idAxes|idFig option
+    //  - %nan usage
+    //  - extension to 3D
+    // Added in Scilab 6.0 (2016):
+    //  - Any handle (expected to have Axes children) such as Figures and
+    //    frame uicontrols can now be specified.
+    //  - buildEnclosingBounds() and management of %inf values
+    //  - replot()
+    //  - tight_limits option
 
     [lhs,rhs] = argn(0);
+    fname = "replot"
 
-    if rhs < 1 then
-        msg = _("%s: Wrong number of input argument(s): %d or %d expected.\n")
-        error(msprintf(msg, "replot", 1, 2));
+    // CHECKING ARGUMENTS
+    // ==================
+    // Number of argins
+    if rhs > 3 then
+        msg = _("%s: Wrong number of input arguments: %d to %d expected.\n")
+        error(msprintf(msg, fname, 0, 3))
+    end
+    // Types and order
+    //   If several argins with a same allowed type are provided,
+    //   only the last one is considered
+    for i = 1:size(varargin)
+        a = varargin(i)
+        if type(a)==0   // allows ,, syntaxes
+            continue
+        end
+        msg = _("%s: Argument #%d is badly placed. Please check available syntaxes.\n")
+        if a==[]
+            continue
+        elseif or(type(a)==[1 5 8])
+            if isdef("handl", "l") || isdef("tight","l")
+                error(msprintf(msg, fname, i))
+            end
+            rect = full(double(a))
+            irect = i   // for possible forthcoming error message
+        elseif type(a)==9
+            if isdef("tight","l") // handles must be _before_ tight_limits
+                error(msprintf(msg, fname, i))
+            end
+            handl = a
+            ihandl = i
+        elseif type(a)==10
+            tight = a
+            itight = i
+        else
+            msg = _("%s: Argument #%d: Wrong type. Please check available syntaxes.\n")
+            error(msprintf(msg, fname, i))
+        end
     end
 
-    if rhs == 1
-        a = gca();
+    // Checking existence, formats and values. Assigning default values
+    // Handles
+    // -------
+    if ~isdef("handl", "l")
+        handl = gca()
     else
-        if (type(handl) == 9)
-            if and(handl.type == "Axes")
-                a = handl;
+        Handl = []
+        // We get Axes from handl() or from their direct children
+        //  (if some are Figure, frame uicontrol, ..)
+        for i = 1:length(handl)
+            h = handl(i)
+            if h.type=="Axes"
+                Handl = [Handl ; h]
             else
-                msg = _("%s: Input argument #%d must be a handle on an axis.\n")
-                error(msprintf(msg, "replot", 2));
+                tmp = h.children
+                Handl = [Handl ; tmp(tmp.type=="Axes")]
             end
-        else
-            msg = _("%s: Wrong type for input argument #%d: Graphic handle expected.\n")
-            error(msprintf(msg, "replot", 2));
+        end
+        handl = Handl
+        if Handl==[]
+            return
         end
     end
-    if length(rect)==4 then
-        rect = [rect(1) rect(2) ; rect(3) rect(4)]
-    elseif length(rect)==6
-        rect = [rect(1) rect(2) rect(3); rect(4) rect(5) rect(6)]
+
+    // rect
+    // ----
+    if ~isdef("rect","l") then
+        rect = %inf * ones(size(handl,1),6)
+    end
+    if or(length(rect)==[4 6]) then
+        rect = rect(:)'     // Forces format in single row
+    end
+    // rect must have as many rows as targeted axes.
+    // Otherwise, we trim it or replicate the only row or add %inf rows
+    nr = size(rect,1)
+    na = length(handl)  // number of axes
+    if nr ~= na then
+        if nr>na
+            rect = rect(1:na,:)
+        elseif nr==1    // the same rect is used for all Axes
+            rect = ones(na,1)*rect(:)'
+        else            // %inf are used for missing rows
+            rect = [rect ; %inf*ones(na-nr, size(rect,2))]
+        end
+    end
+    // rect must have provided 4 (2D) or 6 (3D) columns
+    nc = size(rect,2)
+    if ~or(nc==[4 6])
+        msg = _("%s: Argument #%d: Matrix with 4 or 6 columns expected.\n")
+        error(msprintf(msg, fname, irect))
+    end
+    // To get a standard 6 columns shape, we add zmin=%inf and zmax=%inf columns
+    if nc==4
+        rect = [rect(:,[1 2]) %inf*ones(na,1) rect(:,[3 4]) %inf*ones(na,1)]
+    end
+
+    // tight
+    // -----
+    if ~isdef("tight", "l") then
+        tight = []
+    else
+        if size(tight,"*")>3
+            tight = tight(1:3)  // We simply ignore extra values
+        end
+        tight = convstr(tight)  // => case-insensitive "on" "off" values
+        if ~and(tight=="tight" | tight=="on" | tight=="off")
+            msg = _("%s: Argument #%d: ""tight"" or ""on"" or ""off"" values expected.\n")
+            error(msprintf(msg, fname, itight))
+        elseif or(tight=="tight")
+            tight(tight=="tight") = "on"
+        end
+        if size(tight,"*")==1   // If it is scalar => we replicate it 3 times
+            tight = emptystr(1,3) + tight
+        end
     end
-    k = ~isnan(rect)
 
-    for i = 1:length(a)
-        if length(rect)==4 then
-            a(i).data_bounds(k) = rect(k)
-        elseif length(rect)==6 & a(i).view=="3d"
-            a(i).data_bounds(k) = rect(k)
+    // PROCESSING
+    // ==========
+    // Loop over axes
+    // --------------
+    for i = 1:na
+        bounds = matrix(rect(i,:)',-1,2)'
+        // [ xmin  ymin  zmin
+        //   xmax  ymax  zmax ]
+        if handl(i).view=="2d"
+            bounds(:,3) = []
+        end
+        k = ~isnan(bounds)  // Nan bounds are ignored
+        // processing %inf values = set to data limits
+        getTrueBounds = bounds==%inf
+        if or(getTrueBounds)
+            dataBounds = buildEnclosingBounds(handl(i))
+            bounds(getTrueBounds) = dataBounds(getTrueBounds)
+            handl(i).zoom_box = []
         end
+        handl(i).data_bounds(k) = bounds(k)
+        if tight~=[]
+            handl(i).tight_limits = tight
+        end
+    end
+endfunction
+
+// ==========================================================================
+
+function bounds = buildEnclosingBounds(e,bounds)
+    // internal private function: utility for replot()
+    select e.type
+        case "Axes"
+            nc = length(e.children)
+            if nc==0 then
+                bounds = e.data_bounds
+                return
+            end
+            // We scan all components belonging to the axes
+            bounds = [%inf  %inf  %inf ; -%inf  -%inf  -%inf]
+            for i = 1:nc
+                c = e.children(i)
+                bounds = buildEnclosingBounds(c, bounds)
+            end
+            if and(bounds([5 6])==[%inf ; -%inf]) then
+                bounds(:,3) = []
+            end
+        case "Compound"
+            for i = 1:length(e.children)
+                c = e.children(i)
+                bounds = buildEnclosingBounds(c, bounds)
+            end
+        // ---------------------------------------------------------
+        case "Polyline"
+            data = e.data
+            bounds(1,1) = min([data(:,1) ; bounds(1,1)])
+            bounds(2,1) = max([data(:,1) ; bounds(2,1)])
+            bounds(1,2) = min([data(:,2) ; bounds(1,2)])
+            bounds(2,2) = max([data(:,2) ; bounds(2,2)])
+            if (size(data,"c") > 2) then
+                bounds(1,3) = min([data(:,3) ; bounds(1,3)])
+                bounds(2,3) = max([data(:,3) ; bounds(2,3)])
+            end
+        // ---------------------------------------------------------
+        case "Arc"
+            data = e.data
+            bounds(1,1) = min([data(1) ; bounds(1,1)]);
+            bounds(2,1) = max([data(1)+data(3) ; bounds(2,1)]);
+            bounds(1,2) = min([data(2)-data(4) ; bounds(1,2)]);
+            bounds(2,2) = max([data(2) ; bounds(2,2)]);
+        // ---------------------------------------------------------
+        case "Rectangle"
+            data = e.data
+            bounds(1,1) = min([data(1) ; bounds(1,1)]);
+            bounds(2,1) = max([data(1)+data(3) ; bounds(2,1)]);
+            bounds(1,2) = min([data(2)-data(4) ; bounds(1,2)]);
+            bounds(2,2) = max([data(2) ; bounds(2,2)]);
+        // ---------------------------------------------------------
+        case "Segs"
+            data = e.data
+            bounds(1,1) = min([data(:,1) ; bounds(1,1)]);
+            bounds(2,1) = max([data(:,1) ; bounds(2,1)]);
+            bounds(1,2) = min([data(:,2) ; bounds(1,2)]);
+            bounds(2,2) = max([data(:,2) ; bounds(2,2)]);
+            if (size(data,"c") > 2) then
+                bounds(1,3) = min([data(:,3) ; bounds(1,3)]);
+                bounds(2,3) = max([data(:,3) ; bounds(2,3)]);
+            end
+        // ---------------------------------------------------------
+        case "Champ"
+            data = e.data
+            bounds(1,1) = min([data.x ; bounds(1,1)]);
+            bounds(2,1) = max([data.x ; bounds(2,1)]);
+            bounds(1,2) = min([data.y ; bounds(1,2)]);
+            bounds(2,2) = max([data.y ; bounds(2,2)]);
+        // ---------------------------------------------------------
+        case "Surface"
+            bounds = buildEnclosingBoundsOfSurface(e, bounds)
+        case "Fac3d"
+            bounds = buildEnclosingBoundsOfSurface(e, bounds)
+        case "Plot3d"
+            bounds = buildEnclosingBoundsOfSurface(e, bounds)
+        case "Grayplot"
+            bounds = buildEnclosingBoundsOfSurface(e, bounds)
+        // ---------------------------------------------------------
+        case "Fec"
+            data = e.data
+            // TODO: Fec zoom behavior is not clear to me, should be reviewed carefully
+            bounds(1,1) = min([data(:,2) ; bounds(1,1)]);
+            bounds(2,1) = max([data(:,2) ; bounds(2,1)]);
+            bounds(1,2) = min([data(:,1) ; bounds(1,2)]);
+            bounds(2,2) = max([data(:,1) ; bounds(2,2)]);
+        // ---------------------------------------------------------
+        case "Matplot"
+            data = e.rect
+            bounds(1,1) = min([data(1) ; bounds(1,1)]);
+            bounds(2,1) = max([data(3) ; bounds(2,1)]);
+            bounds(1,2) = min([data(2) ; bounds(1,2)]);
+            bounds(2,2) = max([data(4) ; bounds(2,2)]);
+
+        // ---------------------------------------------------------
+        case "Text"
+            data = e.data
+            bounds(1,1) = min([data(1) ; bounds(1,1)]);
+            bounds(1,2) = min([data(2) ; bounds(1,2)]);
+            if (size(data,"c") > 2) then
+                bounds(1,3) = min([data(3) ; bounds(1,3)]);
+            end
+        // ---------------------------------------------------------
+        case "Legend"
+            // Nothing to do: a legend is located in window relative coordinates,
+            //                not in data coordinates
+        // ---------------------------------------------------------
+        case "Axis"
+            bounds(1,1) = min([e.xtics_coord , bounds(1,1)]);
+            bounds(2,1) = max([e.xtics_coord , bounds(2,1)]);
+            bounds(1,2) = min([e.ytics_coord , bounds(1,2)]);
+            bounds(2,2) = max([e.ytics_coord , bounds(2,2)]);
+        // ---------------------------------------------------------
+        case "Light"
+            // nothing to do: a light source is never visible by itself
+        // ---------------------------------------------------------
+    else
+        msg = _("%s: Handle of unsupported type ''%s'' as Argument #%d\n")
+        error(msprintf(msg, "buildEnclosingBounds", e.type, 1))
     end
 endfunction
+
+// ===========================================================================
+
+function [bounds] = buildEnclosingBoundsOfSurface(e, bounds)
+    data = e.data
+    bounds(1,1) = min([min(data.x) ; bounds(1,1)]);
+    bounds(2,1) = max([max(data.x) ; bounds(2,1)]);
+    bounds(1,2) = min([min(data.y) ; bounds(1,2)]);
+    bounds(2,2) = max([max(data.y) ; bounds(2,2)]);
+    bounds(1,3) = min([min(data.z) ; bounds(1,3)]);
+    bounds(2,3) = max([max(data.z) ; bounds(2,3)]);
+endfunction
diff --git a/scilab/modules/graphics/macros/zoom_auto.sci b/scilab/modules/graphics/macros/zoom_auto.sci
deleted file mode 100644 (file)
index a7050c0..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-function zoom_auto(h)
-    // Zoom automatically to the visible values of all axes of the figure
-    //
-    // Syntax
-    //   zoom_auto()
-    //   zoom_auto(h)
-    //
-    // Parameters
-    // h: A Figure or Axes handle to zoom automatically
-    //
-    // Description
-    // This function update the zoom_box of all axes of the figure when there is
-    // some zoom applied to it or update the data bounds otherwise. After the call
-    // the user will be able to view all visible data even if mis-configured
-    // something.
-    //
-    // Examples
-    // plot3d();
-    // a=gca();
-    // // hide some data to the user
-    // a.data_bounds = [-1 -1 -0.5 ; 1 1 0.5]
-    // sleep(1000)
-    // // let the user view the whole dataset
-    // zoom_auto()
-    //
-    // See also
-    //  zoom_rect
-    //  unzoom
-    //  axes_properties
-    //
-    // Authors
-    //  Clement DAVID - Scilab Enterprises
-
-    rhs=argn(2);
-    if rhs>1 then
-        error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"), "zoom_auto", 0, 1));
-    end
-
-    if (rhs == 0) then
-        h=gcf();
-    end
-    if typeof(h)<>"handle" then
-        error(sprintf(gettext("%s: Wrong type for argument %d: a handle expected.\n"), "zoom_auto", 1));
-    end
-    if size(h, "*")<>1 then
-        error(sprintf(gettext("%s: Wrong size for input argument #%d: a handle expected.\n"), "zoom_auto" , 1));
-    end
-
-    visit(h, [0 0 0 ; 0 0 0])
-endfunction
-
-function [bounds]=visit(e, bounds)
-    if isempty(e) then
-        pause,
-    end
-    execstr("bounds=visit"+e.Type+"(e, bounds);");
-endfunction
-
-function [bounds]=visitFigure(e, bounds)
-    for i=1:length(e.children)
-        a=e.children(i);
-        bounds = visit(a, bounds);
-
-        if (a.zoom_state == "off") then
-            a.data_bounds=bounds;
-        else
-            // the weird definition of zoom_box enforce us to perfom a projection
-            M=[1 0 0 0 0 0 ;..
-            0 0 1 0 0 0 ;..
-            0 1 0 0 0 0 ;..
-            0 0 0 1 0 0 ;..
-            0 0 0 0 1 0 ;..
-            0 0 0 0 0 1 ];
-            a.zoom_box= M * bounds(:);
-        end
-    end
-endfunction
-
-function [bounds]=visitAxes(e, bounds)
-    children = e.children;
-    for i=1:length(children)
-        bounds = visit(children(i), bounds);
-    end
-endfunction
-
-function [bounds]=visitCompound(e, bounds)
-    children = e.children;
-    for i=1:length(children)
-        bounds = visit(children(i), bounds);
-    end
-endfunction
-
-function [bounds]=visitAxis(e, bounds)
-    bounds(1,1)=min([a1.xtics_coord , bounds(1,1)]);
-    bounds(2,1)=max([a1.xtics_coord , bounds(2,1)]);
-    bounds(1,2)=min([a1.ytics_coord , bounds(1,2)]);
-    bounds(2,2)=max([a1.ytics_coord , bounds(2,2)]);
-endfunction
-
-function [bounds]=visitPolyline(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([data(:,1) ; bounds(1,1)]);
-    bounds(2,1)=max([data(:,1) ; bounds(2,1)]);
-    bounds(1,2)=min([data(:,2) ; bounds(1,2)]);
-    bounds(2,2)=max([data(:,2) ; bounds(2,2)]);
-    if (size(data,"c") > 2) then
-        bounds(1,3)=min([data(:,3) ; bounds(1,3)]);
-        bounds(2,3)=max([data(:,3) ; bounds(2,3)]);
-    end
-endfunction
-
-function [bounds]=visitArc(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([data(1) ; bounds(1,1)]);
-    bounds(2,1)=max([data(1)+data(3) ; bounds(2,1)]);
-    bounds(1,2)=min([data(2)-data(4) ; bounds(1,2)]);
-    bounds(2,2)=max([data(2) ; bounds(2,2)]);
-endfunction
-
-function [bounds]=visitRectangle(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([data(1) ; bounds(1,1)]);
-    bounds(2,1)=max([data(1)+data(3) ; bounds(2,1)]);
-    bounds(1,2)=min([data(2)-data(4) ; bounds(1,2)]);
-    bounds(2,2)=max([data(2) ; bounds(2,2)]);
-endfunction
-
-function [bounds]=visitSurface(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([min(data.x) ; bounds(1,1)]);
-    bounds(2,1)=max([max(data.x) ; bounds(2,1)]);
-    bounds(1,2)=min([min(data.y) ; bounds(1,2)]);
-    bounds(2,2)=max([max(data.y) ; bounds(2,2)]);
-    bounds(1,3)=min([min(data.z) ; bounds(1,3)]);
-    bounds(2,3)=max([max(data.z) ; bounds(2,3)]);
-endfunction
-
-function [bounds]=visitFac3d(e, bounds)
-    [bounds]=visitSurface(e, bounds)
-endfunction
-
-function [bounds]=visitPlot3d(e, bounds)
-    [bounds]=visitSurface(e, bounds)
-endfunction
-
-function [bounds]=visitFec(e, bounds)
-    data = e.data;
-
-    // TODO: Fec zoom behavior is not clear to me, should be reviewed carefully
-    bounds(1,1)=min([data(:,2) ; bounds(1,1)]);
-    bounds(2,1)=max([data(:,2) ; bounds(2,1)]);
-    bounds(1,2)=min([data(:,1) ; bounds(1,2)]);
-    bounds(2,2)=max([data(:,1) ; bounds(2,2)]);
-endfunction
-
-function [bounds]=visitGrayplot(e, bounds)
-    [bounds]=visitSurface(e, bounds)
-endfunction
-
-function [bounds]=visitMatplot(e, bounds)
-    data = e.rect;
-
-    bounds(1,1)=min([data(1) ; bounds(1,1)]);
-    bounds(2,1)=max([data(3) ; bounds(2,1)]);
-    bounds(1,2)=min([data(2) ; bounds(1,2)]);
-    bounds(2,2)=max([data(4) ; bounds(2,2)]);
-endfunction
-
-function [bounds]=visitSegs(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([data(:,1) ; bounds(1,1)]);
-    bounds(2,1)=max([data(:,1) ; bounds(2,1)]);
-    bounds(1,2)=min([data(:,2) ; bounds(1,2)]);
-    bounds(2,2)=max([data(:,2) ; bounds(2,2)]);
-    if (size(data,"c") > 2) then
-        bounds(1,3)=min([data(:,3) ; bounds(1,3)]);
-        bounds(2,3)=max([data(:,3) ; bounds(2,3)]);
-    end
-endfunction
-
-function [bounds]=visitChamp(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([data.x ; bounds(1,1)]);
-    bounds(2,1)=max([data.x ; bounds(2,1)]);
-    bounds(1,2)=min([data.y ; bounds(1,2)]);
-    bounds(2,2)=max([data.y ; bounds(2,2)]);
-endfunction
-
-function [bounds]=visitText(e, bounds)
-    data = e.data;
-
-    bounds(1,1)=min([data(1) ; bounds(1,1)]);
-    bounds(1,2)=min([data(2) ; bounds(1,2)]);
-    if (size(data,"c") > 2) then
-        bounds(1,3)=min([data(3) ; bounds(1,3)]);
-    end
-endfunction
-
-function [bounds]=visitLegend(e, bounds)
-    // TODO: implement something ; it might not be possible at all
-endfunction
-
-function [bounds]=visitLight(e, bounds)
-    // nothing to do, a light is always visible
-endfunction
diff --git a/scilab/modules/graphics/tests/unit_tests/replot.tst b/scilab/modules/graphics/tests/unit_tests/replot.tst
new file mode 100644 (file)
index 0000000..589aa19
--- /dev/null
@@ -0,0 +1,62 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
+
+// Unit test for replot()
+
+former_driver = driver("null");
+xinit(TMPDIR+"/unittest.gif");
+x = linspace(0,20,200);
+plot2d(x,sin(x))
+
+// Testing wrong syntaxes
+// ----------------------
+// Wrong argins order:
+assert_checktrue(execstr("replot(gca(), [1 2 3 4])", "errcatch")~=0);
+assert_checktrue(execstr("replot(""tight"", [1 2 3 4])", "errcatch")~=0);
+assert_checktrue(execstr("replot(""tight"", gca())", "errcatch")~=0);
+assert_checktrue(execstr("replot([1 2 3 4], ""on"", gca())", "errcatch")~=0);
+assert_checktrue(execstr("replot(gca(), ""on"", [1 2 3 4])", "errcatch")~=0);
+
+// Wrong argins values:
+assert_checktrue(execstr("replot([1 2 3])", "errcatch")~=0);
+assert_checktrue(execstr("replot(""about"")", "errcatch")~=0);
+
+// Some valid syntaxes
+// -------------------
+assert_checktrue(execstr("replot()", "errcatch")==0);
+assert_checktrue(execstr("replot(gca())", "errcatch")==0);
+assert_checktrue(execstr("replot(gcf())", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2])", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2], gca())", "errcatch")==0);
+assert_checktrue(execstr("replot(""on"")", "errcatch")==0);
+assert_checktrue(execstr("replot(gca(), ""on"")", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2], ""on"")", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2], ""tight"")", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2], ""off"")", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2], [""tight"" ""off""])", "errcatch")==0);
+assert_checktrue(execstr("replot([-1 -1 2 2], gca(), ""on"")", "errcatch")==0);
+
+// Testing set bounds
+// ------------------
+replot([2 0 14 0.7]);
+assert_checkequal(gca().data_bounds, [2 0 ; 14 0.7]);
+replot();
+assert_checkalmostequal(gca().data_bounds, [0 -1 ; 20 1], 1e-3);
+clf
+plot2d(x,sin(x))
+replot([%nan 0 14 0.7]);
+assert_checkalmostequal(gca().data_bounds, [0 0 ; 14 0.7], 1e-3);
+replot([3 -1 %inf 0.5]);
+assert_checkalmostequal(gca().data_bounds, [3 -1 ; 20 0.5], 1e-3);
+
+// ============================================================================
+xend();
+driver(former_driver);
+
index 0190250..abf04b3 100644 (file)
@@ -58,7 +58,7 @@
                 type="0"/>
         </submenu>
     </menu>
-    
+
     <menu label="&amp;Tools">
         <submenu label="Show/Hide &amp;Toolbar">
             <callback
         <submenu label="&amp;Original View" icon="zoom-original">
             <callback instruction='unzoom(get_figure_handle([SCILAB_FIGURE_ID]))' type="0"/>
         </submenu>
-        <submenu label="Fit zoom to data" icon="zoom-fit-drawing">
-            <callback instruction='zoom_auto(get_figure_handle([SCILAB_FIGURE_ID]))' type="0"/>
+        <submenu label="Reframe to contents" icon="zoom-fit-drawing">
+            <callback instruction='replot(get_figure_handle([SCILAB_FIGURE_ID]))' type="0"/>
         </submenu>
         <separator/>
         <submenu label="2D/3D &amp;Rotation" icon="transform-rotate">
             <callback instruction="set(get_figure_handle([SCILAB_FIGURE_ID]), 'info_message', 'Right click and drag to rotate.')" type="-2"/>
         </submenu>
     </menu>
-    
+
     <menu label="&amp;Edit">
         <submenu label="&amp;Select as current figure">
             <callback instruction='scf([SCILAB_FIGURE_ID]);' type="0"/>
         <submenu label="Stop datatip manager">
             <callback instruction='org.scilab.modules.gui.datatip.DatatipManager.stop([SCILAB_FIGURE_ID])' type="3"/>
         </submenu>
-        
+
         <submenu label="Start curve data modification" icon="data_modify">
             <callback instruction='org.scilab.modules.gui.editor.EditorManager.start([SCILAB_FIGURE_ID])' type="3"/>
         </submenu>
         <submenu label="Stop curve data modification">
             <callback instruction='org.scilab.modules.gui.editor.EditorManager.stop([SCILAB_FIGURE_ID])' type="3"/>
         </submenu>
-        
+
         <!--
         <submenu label="Plot Browser">
             <callback instruction="plotbrowser([SCILAB_FIGURE_ID])" type="-2"/>
index 73dced5..d929376 100644 (file)
@@ -15,8 +15,8 @@
         <callback instruction="unzoom(get_figure_handle([SCILAB_FIGURE_ID]))" type="-2"/>
     </button>
     <!-- Fit to the data -->
-    <button icon="zoom-fit-drawing" tooltiptext="Fit zoom to data">
-        <callback instruction="zoom_auto(get_figure_handle([SCILAB_FIGURE_ID]))" type="-2"/>
+    <button icon="zoom-fit-drawing" tooltiptext="Reframe to contents">
+        <callback instruction="replot(get_figure_handle([SCILAB_FIGURE_ID]))" type="-2"/>
     </button>
     <separator/>
     <!-- Datatips -->