* Bug 15393 fixed: nicholschart() fixed & improved 19/19819/16
Samuel GOUGEON [Thu, 1 Mar 2018 07:57:58 +0000 (08:57 +0100)]
  http://bugzilla.scilab.org/15393

  Updated page (PDF) http://bugzilla.scilab.org/attachment.cgi?id=5049

  * in a new figure, nothing was plotted
  * default cyan color was too flashy => gray85
  * colors could not be specified by their names or #RRGGBB or [r g b]
  * Positions of Gain labels were somehow puzzled
  * It was not easily to access to the vectors of handles for
     both subframes and for the set of labels.

  This commit complies with iscolor() extension @ https://codereview.scilab.org/21197

Change-Id: If2631b7fd2972dade04301ddbcc9e221ca34694f

16 files changed:
scilab/CHANGES.md
scilab/modules/cacsd/help/en_US/linear_analysis/freq_domain/nicholschart.xml
scilab/modules/cacsd/help/ja_JP/linear_analysis/freq_domain/nicholschart.xml
scilab/modules/cacsd/macros/nicholschart.sci
scilab/modules/helptools/etc/images_md5.txt
scilab/modules/helptools/images/nicholschart_2.png [new file with mode: 0644]
scilab/modules/helptools/images/nicholschart_en_US_1.png
scilab/modules/helptools/images/nicholschart_en_US_2.png [deleted file]
scilab/modules/helptools/images/nicholschart_fr_FR_1.png
scilab/modules/helptools/images/nicholschart_fr_FR_2.png [deleted file]
scilab/modules/helptools/images/nicholschart_ja_JP_1.png
scilab/modules/helptools/images/nicholschart_ja_JP_2.png [deleted file]
scilab/modules/helptools/images/nicholschart_pt_BR_1.png
scilab/modules/helptools/images/nicholschart_pt_BR_2.png [deleted file]
scilab/modules/helptools/images/nicholschart_ru_RU_1.png
scilab/modules/helptools/images/nicholschart_ru_RU_2.png [deleted file]

index 5c7d1df..d827672 100644 (file)
@@ -89,7 +89,7 @@ Feature changes and additions
 * Memory invalid accesses have been greatly reduced thanks to :
   - PVS-Studio inspections blog report
   - Coverity scan weekly source analysis
-* bitget() is upgraded:
+* `bitget` is upgraded:
   - It now accepts positive Signed encoded integers.
   - It now supports the new uint64 and int64 types of encoded integers.
   - For decimal numbers: bits with indices > 52 can now be retrieved (up to `log2(number_properties("huge"))` = 1024).
@@ -98,21 +98,21 @@ Feature changes and additions
 * `bitstring` function added.
 * `edit` now accepts a line number as text (like "23").
 * `profileEnable`, `profileDisable`, `profileGetInfo` could be used to instrument functions and gather execution information within Scilab.
-* `prettyprint()` is upgraded:
+* `prettyprint` is upgraded:
   - Integer and Text input are now actually supported.
   - Default input arguments can be skipped instead of still having to be provided.
   - The result string is better formatted to be easily wrappable and indentable.
 * `mesh2d` has been introduced to compute a 2d mesh from vectors (x,y) of points.
-* `loadmatfile()` is upgraded:
+* `loadmatfile` is upgraded:
   - Octave native text data files can now be read.
   - Automatic detection of the input data format implemented.
   - `-toStruct` option added, to return results in a structure instead of in the calling environment.
 * `jremove` is optional and `clear` could be used to release Java objects mapped to Scilab.
-* `blockdiag()` is introduced to improve, replace, and extend `sysdiag()` to strings.
-* `assert_checkequal()` is upgraded:
+* `blockdiag` is introduced to improve, replace, and extend `sysdiag` to strings.
+* `assert_checkequal` is upgraded:
   - support added for Nan and void in lists, Nan in sparses, implicit lists, graphic handles, macros, libraries, and built-in.
   - For arrays of matching typeof and sizes, and for lists of matching lengths, the failure message now indicates the index and values of the first mismatching elements.
-* `diophant()` is improved: Now,
+* `diophant` is improved: Now,
   - Encoded integers are accepted, in addition to decimal numbers. Only integer solutions are then searched.
   - When there is no solution, [] is returned.
   - When there is an infinite number of solutions, the err flag has a specific value.
@@ -135,7 +135,7 @@ Feature changes and additions
   - Handles of the grids and labels are returned. Post-processing them become easy.
   - Named colors accepted ; better default colors.
   - Improved placement of labels.
-
+* `nicholschart` is improved: more neutral default frame color; improved labels positionning; colors can now be specified by their predefined name or "#RRGGBB" hexa code; a structure of handles is now returned to easily postprocess both subframes and the set of labels.
 
 Help pages:
 -----------
@@ -197,7 +197,7 @@ Bug Fixes
 * [#8307](http://bugzilla.scilab.org/show_bug.cgi?id=8307): `list2vec()` and `vec2list()` were located in the [optimization] module instead of in [data_structures], and were missing in the `See also` section of `list()`.
 * [#8418](http://bugzilla.scilab.org/show_bug.cgi?id=8418): `unique()` was not able to return the number of occurences of returned dictinct entities.
 * [#8784](http://bugzilla.scilab.org/show_bug.cgi?id=8784): Automatic self-adjusting blocks `SCALE_CSCOPE` & `SCALE_CMSCOPE` in Xcos.
-* [#5512](http://bugzilla.scilab.org/show_bug.cgi?id=5512): `disp()` puzzlingly displayed arguments in reverse order.
+* [#5512](http://bugzilla.scilab.org/show_bug.cgi?id=5512): `disp` puzzlingly displayed arguments in reverse order.
 * [#9529](http://bugzilla.scilab.org/show_bug.cgi?id=9529): `assert_checkequal(list(1,,3), list(1,,3))` yielded an error.
 * [#9673](http://bugzilla.scilab.org/show_bug.cgi?id=9673): Priority of colon `:` operator was too low
 * [#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.
@@ -210,12 +210,12 @@ Bug Fixes
 * [#14501](http://bugzilla.scilab.org/show_bug.cgi?id=14501): `strsubst` crashed on consecutive occurrences.
 * [#14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557): `csim` failed when the system has no state.
 * [#14498](http://bugzilla.scilab.org/show_bug.cgi?id=14498): `size([],3)` returned 1 instead of 0.
-* [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr()` is 40x slower with 6.0.0 wrt 5.5.2
+* [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr` is 40x slower with 6.0.0 wrt 5.5.2
 * [#14605](http://bugzilla.scilab.org/show_bug.cgi?id=14605): fixed - `bench_run` was too strict about the specification of tests names.
 * [#14606](http://bugzilla.scilab.org/show_bug.cgi?id=14606): Memory used by variables returned by `[names,mem]=who()` was always zero.
 * [#14610](http://bugzilla.scilab.org/show_bug.cgi?id=14610): `x = ric_desc(H,E)` always yielded an error. [x1,x2,residual] = ric_desc(..) returned a wrong `residual` value.
 * [#14642](http://bugzilla.scilab.org/show_bug.cgi?id=14642): No more "\r" carriage return with printf.
-* [#14741](http://bugzilla.scilab.org/show_bug.cgi?id=14741): The syntax `[m,e]=log2(x)` was not documented. As public function `frexp()` was in duplicate with `[m,e]=log2(x)`.
+* [#14741](http://bugzilla.scilab.org/show_bug.cgi?id=14741): The syntax `[m,e]=log2(x)` was not documented. As public function `frexp` was in duplicate with `[m,e]=log2(x)`.
 * [#14746](http://bugzilla.scilab.org/show_bug.cgi?id=14746): Tiny numbers were sometimes displayed as 0.
 * [#14791](http://bugzilla.scilab.org/show_bug.cgi?id=14791): `sleep 1` crashed Scilab.
 * [#14812](http://bugzilla.scilab.org/show_bug.cgi?id=14812): Minor typos in messages.
@@ -223,7 +223,7 @@ Bug Fixes
 * [#14982](http://bugzilla.scilab.org/show_bug.cgi?id=14982): `msprintf` segmentation fault was caught due to wrong size
 * [#14985](http://bugzilla.scilab.org/show_bug.cgi?id=14985): scilab crashed if a .bin file was not found.
 * [#15087](http://bugzilla.scilab.org/show_bug.cgi?id=15087): Deleting rows or columns from a matrix is slow (regression)
-* [#15248](http://bugzilla.scilab.org/show_bug.cgi?id=15248): `lsq()`was leaking memory.
+* [#15248](http://bugzilla.scilab.org/show_bug.cgi?id=15248): `lsq`was leaking memory.
 * [#15269](http://bugzilla.scilab.org/show_bug.cgi?id=15269): `xgetech` was poor and stiff compared to any combination of `gca()` properties `.axes_bounds`, `.data_bounds`, `.log_flags`, and `.margins`. It is removed.
 * [#15271](http://bugzilla.scilab.org/show_bug.cgi?id=15271): `bitget` needed to be upgraded.
 * [#15309](http://bugzilla.scilab.org/show_bug.cgi?id=15309): `eval()` was a weak duplicate of `evstr()`. It should be removed.
@@ -231,6 +231,7 @@ Bug Fixes
 * [#15350](http://bugzilla.scilab.org/show_bug.cgi?id=15350): `ric_desc()` should be merged into `riccati()`.
 * [#15368](http://bugzilla.scilab.org/show_bug.cgi?id=15368): `freson()` silently returned frequencies not corresponding to a maximum, or returned [] instead of some still computable maxima frequencies.
 * [#15392](http://bugzilla.scilab.org/show_bug.cgi?id=15392): `comet` and `comet3d` did not allow specifying colors with colors names.
+* [#15393](http://bugzilla.scilab.org/show_bug.cgi?id=15393): In a new figure, `nicholschart` plotted nothing. The default frame color was a flashy cyan. The position of gain labels could be puzzling. It was not possible to specify colors by their names. Postprocessing the frames and the set of labels was not easy.
 * [#15425](http://bugzilla.scilab.org/show_bug.cgi?id=15425): The Kronecker product `a.*.b` failed when `a` or `b` or both are hypermatrices, with one or both being polynomials or rationals.
 * [#15451](http://bugzilla.scilab.org/show_bug.cgi?id=15451): The code was not adapted to use `lucene 4.10` in Debian.
 * [#15514](http://bugzilla.scilab.org/show_bug.cgi?id=15514): The `set()` documentation page needed to be overhauled.
@@ -244,7 +245,7 @@ Bug Fixes
 * [#15715](http://bugzilla.scilab.org/show_bug.cgi?id=15715): `%nan` indices crashed Scilab.
 * [#15742](http://bugzilla.scilab.org/show_bug.cgi?id=15742): The `compatibility_functions` module should be merged in the `m2sci` one.
 * [#15581](http://bugzilla.scilab.org/show_bug.cgi?id=15581): display of complex matrix was ugly.
-* [#15680](http://bugzilla.scilab.org/show_bug.cgi?id=15680): `loadmatfile()` could not return variables in a structure instead of into the calling environment.
+* [#15680](http://bugzilla.scilab.org/show_bug.cgi?id=15680): `loadmatfile` could not return variables in a structure instead of into the calling environment.
 * [#15734](http://bugzilla.scilab.org/show_bug.cgi?id=15734):  Trivial infinite loop could not be interrupted.
 * [#15744](http://bugzilla.scilab.org/show_bug.cgi?id=15744): `sylm(a,b)` yielded an error when degree(a)==0 or degree(b)==0.
 * [#15745](http://bugzilla.scilab.org/show_bug.cgi?id=15745): `diophant(0,0,m)`, `diophant([p 0],q)`, `diophant([0 p],q)` with m<>0 and p>q were wrong. There was no flag for cases with an infinite number of solutions. When there is no solution, some values were returned anyway, instead of []. In this case, the documented definition of the err value was dubious. Decimal numbers and integers were accepted, but not encoded integers. Inf and NaN input coefficients were not rejected.
@@ -254,7 +255,7 @@ Bug Fixes
 * [#15964](http://bugzilla.scilab.org/show_bug.cgi?id=15954): A complex empty sparse matrix could be obtained after insertion.
 * [#15969](http://bugzilla.scilab.org/show_bug.cgi?id=15969): Fix spelling
 * [#15974](http://bugzilla.scilab.org/show_bug.cgi?id=15974): `msprintf("%d", %nan)` did not return Nan
-* [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group()` regressed in 5.5.2 due to a too intrusive fix.
+* [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group` regressed in 5.5.2 due to a too intrusive fix.
 * [#15984](http://bugzilla.scilab.org/show_bug.cgi?id=15984): display scale was wrong with Retina dispplays on OSX..
 * [#15995](http://bugzilla.scilab.org/show_bug.cgi?id=15995): patch was missing in surface plot (regression)
 * [#16003](http://bugzilla.scilab.org/show_bug.cgi?id=16003): Zoom with mouse scroll wheel was broken on simple surfaces.
@@ -268,16 +269,16 @@ Bug Fixes
 * [#16015](http://bugzilla.scilab.org/show_bug.cgi?id=16015): `intg(a,b,f)` called f(x) with x outside [a,b].
 * [#16019](http://bugzilla.scilab.org/show_bug.cgi?id=16019): `polarplot(x,Z)` yielded an error when x is a vector and Z a matrix.
 * [#16021](http://bugzilla.scilab.org/show_bug.cgi?id=16021): `tand([-90 90])` answered [Nan Nan] instead of [-Inf, Inf]. `cotd([-90 90])` answered [Nan Nan] instead of [0 0]. `1 ./cosd([-90 90])` answered [Inf -Inf] instead of [Inf Inf].
-* [#16026](http://bugzilla.scilab.org/show_bug.cgi?id=16026): For `atanh()`, neither the documentation pages nor the `m2sci` converter were up to date.
+* [#16026](http://bugzilla.scilab.org/show_bug.cgi?id=16026): For `atanh`, neither the documentation pages nor the `m2sci` converter were up to date.
 * [#16051](http://bugzilla.scilab.org/show_bug.cgi?id=16051): undefined list elements could be of 2 distinct typeof "void" or "listundefined" according to the way they are created.
 * [#16067](http://bugzilla.scilab.org/show_bug.cgi?id=16067): The display of matrices of signed integers was misaligned (regression of 6.0.0 vs 5.5.2)
 * [#16071](http://bugzilla.scilab.org/show_bug.cgi?id=16071): `prettyprint(complex(1,%nan))` omitted the "+" in `1 + Nani`. It printed positive exponents with a useless "+". For any input nul polynomial, the string result never included the name of the variable. Default input arguments could not be skipped. ExportFormat was uselessly case-sensitive. For tex|latex: for text input, $ \ % & { } ~ and ^ special characters were not protected ; spaces were not protected, all words were concatenated ; for polynomials and rationals, the result string could be extremely long and not easily wrappable. For MathML: "<" was not protected ; <mi></mi> were missing for text input ; <mtable>, </mtable>, <mtr>, </mtr>, <mtd>, <mfenced> and </mfenced> tags were not wrapped and could not be indented. Delimiters: "" was not documented as possible value ; ")" was wrongly documented. Dynamical linear systems were not documented as possible input.
-* [#16072](http://bugzilla.scilab.org/show_bug.cgi?id=16072): `prettyprint()` did not actually support input encoded integers.
-* [#16075](http://bugzilla.scilab.org/show_bug.cgi?id=16075): `prettyprint()` was broken for cells.
+* [#16072](http://bugzilla.scilab.org/show_bug.cgi?id=16072): `prettyprint` did not actually support input encoded integers.
+* [#16075](http://bugzilla.scilab.org/show_bug.cgi?id=16075): `prettyprint` was broken for cells.
 * [#16085](http://bugzilla.scilab.org/show_bug.cgi?id=16085): insertion in an empty struct was broken.
-* [#16087](http://bugzilla.scilab.org/show_bug.cgi?id=16087): Insertion of struct() in a non-empty struct crashed Scilab.
+* [#16087](http://bugzilla.scilab.org/show_bug.cgi?id=16087): Insertion of struct in a non-empty struct crashed Scilab.
 * [#16089](http://bugzilla.scilab.org/show_bug.cgi?id=16089): x=1:1e10 freezed Scilab.
-* [#16104](http://bugzilla.scilab.org/show_bug.cgi?id=16104): `assert_checkequal()` did not support properly or at all Nan and void in lists, Nan in sparse, implicit lists, macros, libraries, built-in functions, graphical handles. For input arrays or lists of matching typeof and sizes, the failure message did not display neither the index nor the values of the first mismatching elements.
+* [#16104](http://bugzilla.scilab.org/show_bug.cgi?id=16104): `assert_checkequal` did not support properly or at all Nan and void in lists, Nan in sparse, implicit lists, macros, libraries, built-in functions, graphical handles. For input arrays or lists of matching typeof and sizes, the failure message did not display neither the index nor the values of the first mismatching elements.
 * [#16111](http://bugzilla.scilab.org/show_bug.cgi?id=16111): `isglobal` was not supporting non-scalar array of strings as input.
 * [#16118](http://bugzilla.scilab.org/show_bug.cgi?id=16118): `%s <> (1+%s)` returned %F.
 * [#16135](http://bugzilla.scilab.org/show_bug.cgi?id=16135): base2dec did not detect invalid numbers.
@@ -298,7 +299,7 @@ Bug Fixes
 * [#16199](http://bugzilla.scilab.org/show_bug.cgi?id=16199): In the documentation, `zpk2tf` and `zpk2ss` examples yielded an error.
 * [#16200](http://bugzilla.scilab.org/show_bug.cgi?id=16200): Concatenation of transposed cells crashed Scilab.
 * [#16208](http://bugzilla.scilab.org/show_bug.cgi?id=16208): Using 3D string matrix with old C-api gateways may crash Scilab.
-* [#16209](http://bugzilla.scilab.org/show_bug.cgi?id=16209): grand() causes a freeze after several consecutive calls when using default base generator.
+* [#16209](http://bugzilla.scilab.org/show_bug.cgi?id=16209): `grand` causes a freeze after several consecutive calls when using default base generator.
 * [#16210](http://bugzilla.scilab.org/show_bug.cgi?id=16210): The uicontrol.units = "normalized" property was not described.
 * [#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_*()`.
 * [#16242](http://bugzilla.scilab.org/show_bug.cgi?id=16242): `loadmatfile()` could not read Octave native text data files.
@@ -312,10 +313,10 @@ Bug Fixes
 * [#16269](http://bugzilla.scilab.org/show_bug.cgi?id=16269): Scalar structures were poorly displayed.
 * [#16271](http://bugzilla.scilab.org/show_bug.cgi?id=16271): `loadmatfile()` was never able to automatically detect the input data format.
 * [#16272](http://bugzilla.scilab.org/show_bug.cgi?id=16272): `spzeros(0,n)` and `spzeros(n,0)` were different from `sparse(0,0)`.
-* [#16273](http://bugzilla.scilab.org/show_bug.cgi?id=16273): `calendar()` had no formated display mode.
+* [#16273](http://bugzilla.scilab.org/show_bug.cgi?id=16273): `calendar` had no formated display mode.
 * [#16275](http://bugzilla.scilab.org/show_bug.cgi?id=16275): `fsolve(x0, fun, tol)` no longer took `tol` into account.
 * [#16290](http://bugzilla.scilab.org/show_bug.cgi?id=16290): The `cn`, `dn`, `ns`, `nc` and `nd` Jacobi elliptic functions were not available.
 * [#16292](http://bugzilla.scilab.org/show_bug.cgi?id=16292): `hallchart()` had bugs and a poor rendering.
 * [#16293](http://bugzilla.scilab.org/show_bug.cgi?id=16293): Some demos run in step-by-step console mode(4) did not focus user's attention to the console to proceed.
-* [#16299](http://bugzilla.scilab.org/show_bug.cgi?id=16299): After `graypolarplot()`, `colorbar()` displayed an empty ungraduated color bar.
+* [#16299](http://bugzilla.scilab.org/show_bug.cgi?id=16299): After `graypolarplot`, `colorbar` displayed an empty ungraduated color bar.
 * [#16303](http://bugzilla.scilab.org/show_bug.cgi?id=16303): log10(x) had wrong dimensions when x is an hypermatrix.
index b00362a..a1c03c3 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2018 - 2020 - 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.
  * 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="en" xml:id="nicholschart">
+<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="en" xml:id="nicholschart">
     <refnamediv>
         <refname>nicholschart</refname>
         <refpurpose>Nichols chart</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>nicholschart([modules] [,args] [,colors])</synopsis>
+        <synopsis>
+            sh = nicholschart(modules)
+            sh = nicholschart(modules, args)
+            sh = nicholschart(modules, args, colors)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
             <varlistentry>
                 <term>modules</term>
                 <listitem>
-                    <para>real vector ( modules (in dB))</para>
+                    vector of real numbers: modules (in dB). Default values:
+                    <para/>
+                    <literal>[-30:-10:Modmin -20 -15 -12 -9 -6 -3 -2 -1 -.5 -0.2 -0.1 0 0.1 0.2 0.5 1 2 3 6 12]</literal>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>args</term>
                 <listitem>
-                    <para>real vector (phases (in degree))</para>
+                    vector of real numbers: phases (in degree). Default values:
+                    <para/>
+                    <literal>-[1 2 5 10 20 30 50 70 90 120 140 160 180]°</literal>
+                    <para/>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>colors</term>
+                <listitem>
+                    vector of 1 or 2 components specifying the colors of the isogain and isophase
+                    sets of curves. If a single color is provided, it is used for both gains and
+                    phases. colors may be specified either
+                    <itemizedlist>
+                        <listitem>
+                            by indices in the color map.
+                        </listitem>
+                        <listitem>
+                            named colors among the <link linkend="color_list">predefined ones</link>.
+                        </listitem>
+                        <listitem>
+                            "#RRGGBB" hexadecimal case-insensitive strings starting with "#",
+                            like "#FA7B35".
+                        </listitem>
+                        <listitem>
+                            A 1x3 or 2x3 matrix of [r g b] intensities such that 0 &lt;= r,g,b &lt;= 1.
+                        </listitem>
+                    </itemizedlist>
+                <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>colorss</term>
+                <term>sh</term>
                 <listitem>
-                    <para>a scalar or a vector, the color indices for isogain and iso phase curves</para>
+                    Structure with 3 fields:
+                    <itemizedlist>
+                        <listitem>
+                            <literal>.phaseLines</literal>: vector of handles of isophase lines.
+                            <literal>.phaseLines(i)</literal> is the line for
+                            <literal>args(i)</literal>.
+                        </listitem>
+                        <listitem>
+                            <literal>.gainLines</literal>: vector of handles of isogain lines.
+                            <literal>.gainLines(i)</literal> is the line for
+                            <literal>modules(i)</literal>.
+                        </listitem>
+                        <listitem>
+                            <literal>.gainLabels</literal>: vector of handles of isogain labels.
+                            <literal>.gainLabels(i)</literal> is the label for
+                            <literal>modules(i)</literal>.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
         <title>Description</title>
-        <para> plot the Nichols'chart: iso-module and iso-argument  contours of
-            <literal>y/(1+y)</literal> in <literal>y</literal> phase/gain plane
+        <para>
+            plot the Nichols'chart: iso-module and iso-argument contours of
+            <literal>y/(1+y)</literal> in <literal>y</literal> phase/gain plane.
         </para>
         <para>
             <literal>nicholschart</literal> may be used in conjunction with
             <link linkend="black">black</link>.
         </para>
-        <para>
-            The default values for <literal>modules</literal> and
-            <literal>args</literal> are respectively :
-        </para>
-        <para>
-            <literal>[-12 -8 -6 -5 -4 -3 -2 -1.4 -1 -.5 0.25 0.5 0.7 1 1.4 2 2.3 3 4 5 6 8 12]</literal>
-        </para>
-        <para>
-            <literal>[-(1:10) , -(20:10:160)]</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Remark</title>
-        <para>
-            Traditionally, the syntax for <code>nicholschart</code> is: nicholschart(modules=gains, args=phases, colors=colors),
-            but the following syntax is also allowed: nicholschart(gains, phases, colors).
-        </para>
+        <note>
+          To use the default value of an input argument, just skip it, as in
+          <literal>nicholschart(modules,,colors)</literal>.
+        </note>
     </refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
     //Nichols chart
-    clf()
-    nicholschart(modules=[-6 -3 -1 1 3 6], args=[-1 -20 20 40 80 160 180]);
+    clf
+    subplot(1,2,1)
+    nicholschart();
+    subplot(1,2,2)
+    mod = [-35:5:-10 -6 -3 -1 -0.2 1 2 3 6];
+    nicholschart(mod, -[1 20 40 80 160 180],["khaki" "paleturquoise"]);
     ]]></programlisting>
         <para>
             <scilab:image localized="true">
-                nicholschart(modules=[-6 -3 -1 1 3 6], args=[-1 -20 20 40 80 160 180]);
+            clf
+            subplot(1,2,1)
+            nicholschart()
+            subplot(1,2,2)
+            mod = [-35:5:-10 -6 -3 -1 -0.2 1 2 3 6];
+            nicholschart(mod, -[1 20 40 80 160 180],["khaki" "paleturquoise"]);
+            gcf().axes_size = [700 350];
             </scilab:image>
         </para>
         <programlisting role="example"><![CDATA[
     //Black diagram with Nichols chart as a grid
-    s=poly(0,'s');
-    Plant=syslin('c',16000/((s+1)*(s+10)*(s+100)));
+    s = poly(0,'s');
+    Plant = syslin('c',16000/((s+1)*(s+10)*(s+100)));
+
     //two degree of freedom PID
-    tau=0.2;xsi=1.2;
-    PID=syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
-    clf();
+    tau = 0.2;
+    xsi = 1.2;
+    PID = syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
+    clf
     black([Plant;Plant*PID ],0.01,100,["Plant";"Plant and PID corrector"]);
+
     //move the caption in the lower right corner
-    ax=gca();Leg=ax.children(1);
-    Leg.legend_location="in_lower_right";
-    nicholschart(colors=color('light gray')*[1 1])
+    gca().children(1).legend_location="in_lower_right";
+
+    // Add the Nichols frame and tune its labels color
+    h = nicholschart(,,'wheat');
+    h.gainLabels.font_foreground = color("orange");
     ]]></programlisting>
         <para>
-            <scilab:image localized="true">
-                s=poly(0,'s');
-                Plant=syslin('c',16000/((s+1)*(s+10)*(s+100)));
-                //two degree of freedom PID
-                tau=0.2;xsi=1.2;
-                PID=syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
-                clf();
-                black([Plant;Plant*PID ],0.01,100,["Plant";"Plant and PID corrector"]);
-                //move the caption in the lower right corner
-                ax=gca();Leg=ax.children(1);
-                Leg.legend_location="in_lower_right";
-                nicholschart(colors=color('light gray')*[1 1])
+            <scilab:image>
+            //Black diagram with Nichols chart as a grid
+            s = poly(0,'s');
+            Plant = syslin('c',16000/((s+1)*(s+10)*(s+100)));
+            //two degree of freedom PID
+            tau = 0.2;
+            xsi = 1.2;
+            PID = syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
+            clf
+            black([Plant;Plant*PID ],0.01,100,["Plant";"Plant and PID corrector"]);
+            //move the caption in the lower right corner
+            gca().children(1).legend_location="in_lower_right";
+            h = nicholschart(,,'wheat');
+            h.gainLabels.font_foreground = color("orange");
             </scilab:image>
         </para>
     </refsection>
         <title>See also</title>
         <simplelist type="inline">
             <member>
+                <link linkend="hallchart">hallchart</link>
+            </member>
+            <member>
+                <link linkend="sgrid">sgrid</link>
+            </member>
+            <member>
+                <link linkend="zgrid">zgrid</link>
+            </member>
+            <member>
+                <link linkend="bode">bode</link>
+            </member>
+            <member>
                 <link linkend="black">black</link>
             </member>
             <member>
                 <link linkend="nyquist">nyquist</link>
             </member>
             <member>
-                <link linkend="hallchart">hallchart</link>
+                <link linkend="svplot">svplot</link>
+            </member>
+            <member>
+                <link linkend="color_list">color_list</link>
             </member>
         </simplelist>
     </refsection>
         <revhistory>
             <revision>
                 <revnumber>5.5.0</revnumber>
-                <revremark> Syntax allowed: nicholschart(gains, phases, colors).</revremark>
+                <revremark>Syntax allowed: nicholschart(gains, phases, colors).</revremark>
+            </revision>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revremark>
+                    <itemizedlist>
+                        <listitem>
+                            The default frames color is now grey85 instead of cyan.
+                        </listitem>
+                        <listitem>
+                            Colors may now be specified by their Scilab names or their "#RRGGBB"
+                            hexadecimal code.
+                        </listitem>
+                        <listitem>
+                            Output argument <literal>sh</literal> added.
+                        </listitem>
+                    </itemizedlist>
+                </revremark>
             </revision>
         </revhistory>
     </refsection>
index 1bc4668..803e41e 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2018 - 2020 - 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.
  * 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="nicholschart">
+<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="nicholschart">
     <refnamediv>
         <refname>nicholschart</refname>
         <refpurpose>ニコルス線図</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>呼び出し手順</title>
-        <synopsis>nicholschart([modules] [,args] [,colors])</synopsis>
+        <synopsis>
+            sh = nicholschart(modules)
+            sh = nicholschart(modules, args)
+            sh = nicholschart(modules, args, colors)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>引数</title>
             <varlistentry>
                 <term>modules</term>
                 <listitem>
-                    <para>実数ベクトル (モジュール (単位: dB))</para>
+                    実数ベクトル: モジュール (単位: dB). Default values:
+                    <para/>
+                    <literal>[-30:-10:Modmin -20 -15 -12 -9 -6 -3 -2 -1 -.5 -0.2 -0.1 0 0.1 0.2 0.5 1 2 3 6 12]</literal>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>args</term>
                 <listitem>
-                    <para>r実数ベクトル (位相 (単位: 度))</para>
+                    r実数ベクトル: 位相 (単位: 度). Default values:
+                    <para/>
+                    <literal>-[1 2 5 10 20 30 50 70 90 120 140 160 180]°</literal>
+                    <para/>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>colors</term>
+                <listitem>
+                    vector of 1 or 2 components specifying the colors of the isogain and isophase
+                    sets of curves. If a single color is provided, it is used for both gains and
+                    phases. colors may be specified either
+                    <itemizedlist>
+                        <listitem>
+                            by indices in the color map.
+                        </listitem>
+                        <listitem>
+                            named colors among the <link linkend="color_list">predefined ones</link>.
+                        </listitem>
+                        <listitem>
+                            "#RRGGBB" hexadecimal case-insensitive strings starting with "#",
+                            like "#FA7B35".
+                        </listitem>
+                        <listitem>
+                            A 1x3 or 2x3 matrix of [r g b] intensities with 0 &lt;= r,g,b &lt;= 1.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>colorss</term>
+                <term>sh</term>
                 <listitem>
-                    <para>スカラーまたはベクトル, 等ゲインまたは等位相曲線の色インデックス</para>
+                    <para>
+                        Structure with 3 fields:
+                        <itemizedlist>
+                            <listitem>
+                                <literal>.phaseLines</literal>: vector of handles of isophase lines.
+                                <literal>.phaseLines(i)</literal> is the line for
+                                <literal>args(i)</literal>.
+                            </listitem>
+                            <listitem>
+                                <literal>.gainLines</literal>: vector of handles of isogain lines.
+                                <literal>.gainLines(i)</literal> is the line for
+                                <literal>modules(i)</literal>.
+                            </listitem>
+                            <listitem>
+                                <literal>.gainLabels</literal>: vector of handles of isogain labels.
+                                <literal>.gainLabels(i)</literal> is the label for
+                                <literal>modules(i)</literal>.
+                            </listitem>
+                        </itemizedlist>
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
             <literal>nicholschart</literal> は,<link linkend="black">black</link>
             と組み合わせて使用することができます.
         </para>
-        <para>
-            <literal>modules</literal>および<literal>args</literal>の
-            デフォルト値はそれぞれ次のようになります :
-        </para>
-        <para>
-            <literal>[-12 -8 -6 -5 -4 -3 -2 -1.4 -1 -.5 0.25 0.5 0.7 1 1.4 2 2.3 3 4 5 6 8 12]</literal>
-        </para>
-        <para>
-            <literal>[-(1:10) , -(20:10:160)]</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>注意</title>
-        <para>
-            従来からの<code>nicholschart</code>のニコルス線図の呼び出し手順は以下の形式でした:
-            nicholschart(modules=gains, args=phases, colors=colors),
-            しかし,以下の呼び出し手順も利用可能です: nicholschart(gains, phases, colors).
-        </para>
+        <note>
+          To use the default value of an input argument, just skip it, as in
+          <literal>nicholschart(modules,,colors)</literal>.
+        </note>
     </refsection>
     <refsection>
         <title>例</title>
         <programlisting role="example"><![CDATA[
     //ニコルス線図
-    clf()
-    nicholschart(modules=[-6 -3 -1 1 3 6], args=[-1 -20 20 40 80 160 180]);
+    clf
+    subplot(1,2,1)
+    nicholschart();
+
+    subplot(1,2,2)
+    mod = [-35:5:-10 -6 -3 -1 -0.2 1 2 3 6];
+    nicholschart(mod, -[1 20 40 80 160 180],["khaki" "paleturquoise"]);
     ]]></programlisting>
         <para>
             <scilab:image localized="true">
-                nicholschart(modules=[-6 -3 -1 1 3 6], args=[-1 -20 20 40 80 160 180]);
+            clf
+            subplot(1,2,1)
+            nicholschart()
+            subplot(1,2,2)
+            mod = [-35:5:-10 -6 -3 -1 -0.2 1 2 3 6];
+            nicholschart(mod, -[1 20 40 80 160 180],["khaki" "paleturquoise"]);
+            gcf().axes_size = [700 350];
             </scilab:image>
         </para>
         <programlisting role="example"><![CDATA[
     //ニコルス線図のグリッドを付けたブラック図
-    s=poly(0,'s');
+    s = poly(0,'s');
     Plant=syslin('c',16000/((s+1)*(s+10)*(s+100)));
+
     // 2自由度PID
-    tau=0.2;xsi=1.2;
-    PID=syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
-    clf();
+    tau = 0.2;
+    xsi = 1.2;
+    PID = syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
+    clf
     black([Plant;Plant*PID ],0.01,100,["Plant";"Plant and PID corrector"]);
+
     // 右下隅にキャプションを移動
-    ax=gca();Leg=ax.children(1);
-    Leg.legend_location="in_lower_right";
-    nicholschart(colors=color('light gray')*[1 1])
+    gca().children(1).legend_location="in_lower_right";
+    h = nicholschart(,,'wheat');
+    h.gainLabels.font_foreground = color("orange");
     ]]></programlisting>
         <para>
-            <scilab:image localized="true">
-                s=poly(0,'s');
-                Plant=syslin('c',16000/((s+1)*(s+10)*(s+100)));
-                tau=0.2;xsi=1.2;
-                PID=syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
-                clf();
-                black([Plant;Plant*PID ],0.01,100,["Plant";"Plant and PID corrector"]);
-                ax=gca();Leg=ax.children(1);
-                Leg.legend_location="in_lower_right";
-                nicholschart(colors=color('light gray')*[1 1])
+            <scilab:image>
+            //Black diagram with Nichols chart as a grid
+            s = poly(0,'s');
+            Plant = syslin('c',16000/((s+1)*(s+10)*(s+100)));
+            //two degree of freedom PID
+            tau = 0.2;
+            xsi = 1.2;
+            PID = syslin('c',(1/(2*xsi*tau*s))*(1+2*xsi*tau*s+tau^2*s^2));
+            clf
+            black([Plant;Plant*PID ],0.01,100,["Plant"; "Plant and PID corrector"]);
+            //move the caption in the lower right corner
+            gca().children(1).legend_location="in_lower_right";
+            h = nicholschart(,,'wheat');
+            h.gainLabels.font_foreground = color("orange");
             </scilab:image>
         </para>
     </refsection>
         <title>参照</title>
         <simplelist type="inline">
             <member>
+                <link linkend="hallchart">hallchart</link>
+            </member>
+            <member>
+                <link linkend="sgrid">sgrid</link>
+            </member>
+            <member>
+                <link linkend="zgrid">zgrid</link>
+            </member>
+            <member>
+                <link linkend="bode">bode</link>
+            </member>
+            <member>
                 <link linkend="black">black</link>
             </member>
             <member>
                 <link linkend="nyquist">nyquist</link>
             </member>
             <member>
-                <link linkend="hallchart">hallchart</link>
+                <link linkend="svplot">svplot</link>
+            </member>
+            <member>
+                <link linkend="color_list">color_list</link>
             </member>
         </simplelist>
     </refsection>
                 <revnumber>5.5.0</revnumber>
                 <revremark> 使用可能な呼び出し手順: nicholschart(gains, phases, colors).</revremark>
             </revision>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revremark>
+                    <itemizedlist>
+                        <listitem>
+                            The default frames color is now grey85 instead of cyan.
+                        </listitem>
+                        <listitem>
+                            Colors may now be specified by their Scilab names or their "#RRGGBB"
+                            hexadecimal code.
+                        </listitem>
+                        <listitem>
+                            Output argument <literal>sh</literal> added.
+                        </listitem>
+                    </itemizedlist>
+                </revremark>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index ef1601b..36ab951 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2010 - INRIA - Serge STEER
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function nicholschart(modules,args,colors)
+function handles = nicholschart(modules, args, colors)
 
+    fname = "nicholschart"
     [lhs,rhs]=argn(0);
 
     l10=log(10);
-    ratio=%pi/180;
+    d2rad=%pi/180;
 
     fig=gcf();
     immediate_drawing=fig.immediate_drawing;
     fig.immediate_drawing="off";
 
     ax=gca();
+    blankAxes = length(ax.children)==0;
     old_data_bounds = ax.data_bounds;
     nc=size(ax.children,"*")
     if nc==0 then
         ax.data_bounds=[-360,-40;0,40];
         ax.axes_visible="on";
         ax.box="on";
-        ax.tight_limits="on"
-        ax.title.text=_("Amplitude and phase contours of y/(1+y)")
+        ax.tight_limits="on";
+        ax.title.text=_("Amplitude and phase contours of y/(1+y)");
         ax.x_label.text=_("phase(y) (degree)");
         ax.y_label.text=_("magnitude(y) (dB)");
     else
-        ax.data_bounds(2,2)=max( ax.data_bounds(2,2),40)
+        ax.data_bounds(2,2)=max( ax.data_bounds(2,2),40);
     end
     ax.clip_state="clipgrf"
 
@@ -42,14 +45,15 @@ function nicholschart(modules,args,colors)
     mod_max=ax.data_bounds(2,2)
 
     defaultArgs = [1 2 5 10 20 30 50 70 90 120 140 160 180];
-    defaultModules=[mod_min:20:-35 -30 -25 -20 -15 -12 -9 -6  -3 -2 -1 -0.5 -0.25 -0.1 0 0.1 0.25 0.5  1  2.3 4  6  12];
+    defaultModules=[-30:-10:mod_min -25 -20 -15 -12 -9 -6 -3 -2 -1 -0.5 -0.2 -0.1 0 0.1 0.2 0.5  1  2 3 6 12];
 
 
     if exists("modules","local") == 0 | modules == [] then
         modules=defaultModules
     else
         if type(modules)<>1|~isreal(modules) then
-            error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"nicholschart","modules");
+            msg = _("%s: Wrong type for input argument ""%s"": real floating point array expected\n")
+            error(msprintf(msg, fname, "modules"));
         end
         modules=matrix(modules,1,-1)
     end
@@ -57,23 +61,37 @@ function nicholschart(modules,args,colors)
         args=defaultArgs
     else
         if type(args)<>1|~isreal(args) then
-            error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"nicholschart","args");
+            msg = _("%s: Wrong type for input argument ""%s"": real floating point array expected\n")
+            error(msprintf(msg, fname, "args"));
         end
         args=matrix(args,1,-1)
     end
-    //
+
+    // colors
     if exists("colors","local")==0 | colors == [] then
-        colors=[4 12];
+        colors = "grey85";
+    end
+    c = iscolor(colors);
+    if or(isnan(c))
+        msg = _("%s: Argument #%d: Wrong color specification.\n")
+        error(msprintf(msg, fname, 3));
+    end
+    if size(c,1)==1 then
+        c = [c ; c];    // Same color for both subframes
     else
-        if type(colors)<>1|~isreal(colors) then
-            error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","colors");
-        end
-        if size(colors,"*")==1 then
-            colors=colors*ones(1,2)
-        end
+        c = c(1:2, :);  // selects only the 2 first inputs (no warning)
     end
+    if size(c,2)==3
+        colors = addcolor(c);
+    else
+        colors = c
+    end
+    if length(colors)<2 then
+        colors = colors * [1 1]
+    end
+
     // convert args to radian and insure negative
-    args = -abs(args) * ratio;
+    args = -abs(args) * d2rad;
 
     //initialize handles array for chart entities
     chart_handles=[]
@@ -84,9 +102,20 @@ function nicholschart(modules,args,colors)
 
     //isogain curves: y as fixed gain and varying phase
     //-------------------------------------------------
+    c = addcolor(min(1, gcf().color_map(colors(1),:)*0.8));  // labels are a bit darker
+    gainCurves = [];
+    gainLabels = [];
+    phaseCurves = [];
+
     if modules<>[] then
         w=[linspace(-%pi,-0.1,100) linspace(-0.1,0,80) ]
         nw=size(w,"*")
+
+        // Calibrating labels dimensions
+        str = msprintf("%.2gdB",0.25)
+        r = xstringl(0,0,str)
+
+        // Main loop on gains
         for i = 1:prod(size(modules)),
             att=modules(i);
             y=10^(att/20)*exp(%i*w);
@@ -96,23 +125,24 @@ function nicholschart(modules,args,colors)
             //use symetry and period to extend the curve on [k1*180 k2*180]
             p=[];m=[];
             S=[];cut=[]
-            for k=k1:k2-1
+            for k = k1:k2-1
                 if pmodulo(k,2)==0 then
-                    p=[p cut k*180-phi($:-1:1)]
-                    m=[m cut module($:-1:1)]
+                    p = [p cut k*180-phi($:-1:1)]
+                    m = [m cut module($:-1:1)]
                     if att>0 then
-                        str=msprintf("%.2gdB",att)
-                        r=xstringl(0,0,str)
-                        xstring(k*180-phi($)-r(3)/2,module($),str,0,0),
+                        str = msprintf("%.2gdB",att)
+                        xstring(k*180-phi($)-r(3)/6, module($)+r(4)/6, str, 0, 0),
                         e=gce();
-                        e.font_foreground=colors(1)
+                        e.font_foreground = c;
+                        e.text_box_mode = "centered";
                         S=[e S]
                     elseif att==0 then
-                        l=find(module>mod_max-r(4),1)
+                        l = find(module>mod_max-r(4),1)
                         if l<>[] then
-                            xstring(k*180-phi(l-1),module(l-1),"0dB",0,0),
+                            xstring(k*180-phi(l-1),module(l-1)+r(4)/5,"0dB",0,0),
                             e=gce();
-                            e.font_foreground=colors(1)
+                            e.font_foreground = c;
+                            e.text_box_mode = "centered";
                             S=[e S]
                         end
                     end
@@ -120,31 +150,33 @@ function nicholschart(modules,args,colors)
                     p=[p cut ((k+1)*180)+phi]
                     m=[m cut module]
                     if att<0 then
-                        str=msprintf("%.2gdB",att)
-                        r=xstringl(0,0,str)
-                        xstring(p($)-r(3),m($),str,0,0),
-                        e=gce();
-                        e.font_foreground=colors(1)
+                        str = msprintf("%.2gdB",att)
+                        xstring(p($)-r(3)/2,m($)+r(4)/5,str,0,0),
+                        e = gce();
+                        e.font_foreground = c;
+                        e.text_box_mode = "centered";
                         S=[e S]
                     end
                 end
                 cut=%nan
             end
+            gainLabels = [S gainLabels];
+
             xpoly(p,m)
             e=gce();
             e.foreground=colors(1),
-            e.line_style=7;
+            e.line_style = 1;
             e.display_function = "formatNicholsGainTip";
             e.display_function_data = att;
+            gainCurves = [e gainCurves];
 
             if size(S,"*")>1 then S=glue(S),end
             chart_handles=[glue([S,e]),chart_handles];
-        end;
+        end
     end
 
     //isophase curves: y as fixed phase and varying gain
     //-------------------------------------------------
-
     if args<>[] then
 
         eps=10*%eps;
@@ -156,12 +188,12 @@ function nicholschart(modules,args,colors)
                 last=teta+eps,
             end;
             //use logarithmic discretization to have more mesh points near low modules
-            w=real(logspace(log10(-last),log10(170*ratio),150))
+            w=real(logspace(log10(-last),log10(170*d2rad),150))
             w=-w($:-1:1)
 
             n=prod(size(w));
             module=real(20*log((sin(w)*cos(teta)/sin(teta)-cos(w)))/l10)
-            w=w/ratio
+            w=w/d2rad
             //use symetry and period to extend the curve on [k1*180 k2*180]
             p=[];m=[];
             for k=k1:k2-1
@@ -176,9 +208,10 @@ function nicholschart(modules,args,colors)
             xpoly(p,m)
             e=gce();
             e.foreground=colors(2);
-            e.line_style=7;
+            e.line_style = 1;
             e.display_function = "formatNicholsPhaseTip";
             e.display_function_data = teta * 180 / %pi;
+            phaseCurves = [e phaseCurves];
             chart_handles=[e chart_handles]
         end;
     end
@@ -187,13 +220,15 @@ function nicholschart(modules,args,colors)
     for k=1:nc
         swap_handles(ax.children(k),ax.children(k+1))
     end
-
     fig.immediate_drawing=immediate_drawing;
 
     // reset data_bounds
-    if rhs == 0 then
-        ax.data_bounds=[-360,-40;0,40];
+    if rhs == 0 | blankAxes then
+        ax.data_bounds = [-360,-40;0,40];
     else
         ax.data_bounds = old_data_bounds;
     end
+
+    // output
+    handles = struct("phaseFrame", phaseCurves($:-1:1), "gainFrame", gainCurves($:-1:1), "gainLabels", gainLabels($:-1:1));
 endfunction
index 0e136b9..ed7d9fb 100644 (file)
@@ -856,15 +856,16 @@ nanreglin_2.png=5a3c75b736030778ba4a1717051810cb
 ndgrid_1.png=881b8c6e4e1ccf21fce8004766f2df8d
 ndgrid_2.png=02c9c5b309ed4b25ee57c8b35e6a1fe1
 ndgrid_ru_RU_2.png=4ea2b3c6a3035633dbbdf9ffc2c7a676
-nicholschart_en_US_1.png=4123c1234e85121879226ae325b64513
+nicholschart_2.png=0f5b59c05f28aad6beae03208bc3fa07
+nicholschart_en_US_1.png=364f970d6bb93b0f839013928c7c006a
 nicholschart_en_US_2.png=0f40d41b275495a2e839ed7f26bbbf92
-nicholschart_fr_FR_1.png=4123c1234e85121879226ae325b64513
+nicholschart_fr_FR_1.png=364f970d6bb93b0f839013928c7c006a
 nicholschart_fr_FR_2.png=0f40d41b275495a2e839ed7f26bbbf92
-nicholschart_ja_JP_1.png=4123c1234e85121879226ae325b64513
+nicholschart_ja_JP_1.png=364f970d6bb93b0f839013928c7c006a
 nicholschart_ja_JP_2.png=fa1b4baefb4bc927e61968a3aac80220
-nicholschart_pt_BR_1.png=4123c1234e85121879226ae325b64513
+nicholschart_pt_BR_1.png=364f970d6bb93b0f839013928c7c006a
 nicholschart_pt_BR_2.png=0f40d41b275495a2e839ed7f26bbbf92
-nicholschart_ru_RU_1.png=4123c1234e85121879226ae325b64513
+nicholschart_ru_RU_1.png=364f970d6bb93b0f839013928c7c006a
 nicholschart_ru_RU_2.png=0f40d41b275495a2e839ed7f26bbbf92
 noisegen_1.png=daba32974cb03c6999625f8fc05f83de
 noisegen_2.png=6b6cba150d28f1e01416d17e426e8ad8
diff --git a/scilab/modules/helptools/images/nicholschart_2.png b/scilab/modules/helptools/images/nicholschart_2.png
new file mode 100644 (file)
index 0000000..2cbd640
Binary files /dev/null and b/scilab/modules/helptools/images/nicholschart_2.png differ
index fa3a6bd..228fcbd 100644 (file)
Binary files a/scilab/modules/helptools/images/nicholschart_en_US_1.png and b/scilab/modules/helptools/images/nicholschart_en_US_1.png differ
diff --git a/scilab/modules/helptools/images/nicholschart_en_US_2.png b/scilab/modules/helptools/images/nicholschart_en_US_2.png
deleted file mode 100644 (file)
index 643464c..0000000
Binary files a/scilab/modules/helptools/images/nicholschart_en_US_2.png and /dev/null differ
index 1b39ac3..d9c1a86 100644 (file)
Binary files a/scilab/modules/helptools/images/nicholschart_fr_FR_1.png and b/scilab/modules/helptools/images/nicholschart_fr_FR_1.png differ
diff --git a/scilab/modules/helptools/images/nicholschart_fr_FR_2.png b/scilab/modules/helptools/images/nicholschart_fr_FR_2.png
deleted file mode 100644 (file)
index 643464c..0000000
Binary files a/scilab/modules/helptools/images/nicholschart_fr_FR_2.png and /dev/null differ
index 2d27c7a..48e92d7 100644 (file)
Binary files a/scilab/modules/helptools/images/nicholschart_ja_JP_1.png and b/scilab/modules/helptools/images/nicholschart_ja_JP_1.png differ
diff --git a/scilab/modules/helptools/images/nicholschart_ja_JP_2.png b/scilab/modules/helptools/images/nicholschart_ja_JP_2.png
deleted file mode 100644 (file)
index 6273702..0000000
Binary files a/scilab/modules/helptools/images/nicholschart_ja_JP_2.png and /dev/null differ
index 96ca751..0dfa305 100644 (file)
Binary files a/scilab/modules/helptools/images/nicholschart_pt_BR_1.png and b/scilab/modules/helptools/images/nicholschart_pt_BR_1.png differ
diff --git a/scilab/modules/helptools/images/nicholschart_pt_BR_2.png b/scilab/modules/helptools/images/nicholschart_pt_BR_2.png
deleted file mode 100644 (file)
index 9a10172..0000000
Binary files a/scilab/modules/helptools/images/nicholschart_pt_BR_2.png and /dev/null differ
index 7b6c01c..eee8d94 100644 (file)
Binary files a/scilab/modules/helptools/images/nicholschart_ru_RU_1.png and b/scilab/modules/helptools/images/nicholschart_ru_RU_1.png differ
diff --git a/scilab/modules/helptools/images/nicholschart_ru_RU_2.png b/scilab/modules/helptools/images/nicholschart_ru_RU_2.png
deleted file mode 100644 (file)
index 48282f5..0000000
Binary files a/scilab/modules/helptools/images/nicholschart_ru_RU_2.png and /dev/null differ