bug 7566 fix: The cacsd module graphic functions (bode, black, nyquist,...)
[scilab.git] / scilab / modules / cacsd / macros / gainplot.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2010 - INRIA - Serge Steer
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8
9 function []=gainplot(varargin)
10   rhs=size(varargin)
11   if type(varargin($))==10 then
12     comments=varargin($);
13     rhs=rhs-1;
14   else
15     comments=[];
16   end
17   fname="gainplot";//for error messages
18
19   fmax=[];
20   if or(typeof(varargin(1))==["state-space" "rational"]) then
21     //sys,fmin,fmax [,pas] or sys,frq
22     refdim=1 //for error message
23     if rhs==1 then
24       [frq,repf]=repfreq(varargin(1),1d-3,1d3);
25     elseif rhs==2 then //sys,frq
26       if size(varargin(2),2)<2 then
27         error(msprintf(_("%s: Wrong size for input argument #%d: A row vector with length>%d expected.\n"),..
28                        fname,2,1));
29       end
30       [frq,repf]=repfreq(varargin(1:rhs));
31     elseif or(rhs==(3:4)) then //sys,fmin,fmax [,pas]
32       [frq,repf]=repfreq(varargin(1:rhs));
33     else
34       error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),fname,1,5))
35     end
36     [phi,d]=phasemag(repf);
37   elseif  type(varargin(1))==1 then
38     //frq,db,phi [,comments] or frq, repf [,comments]
39     refdim=2
40     select rhs
41     case 2 then //frq,repf
42       frq=varargin(1);
43       if size(frq,2)<2 then
44         error(msprintf(_("%s: Wrong size for input argument #%d: A row vector with length>%d expected.\n"),..
45                        fname,1,1))
46       end
47       if size(frq,2)<>size(varargin(2),2) then
48         error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),..
49                        fname,1,2))
50       end
51
52       [phi,d]=phasemag(varargin(2))
53     case 3 then  //frq,db,phi
54       [frq,d]=varargin(1:rhs-1)
55       if size(frq,2)<>size(d,2) then
56         error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),..
57                        fname,1,2))
58       end
59     else
60       error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),fname,2,4))
61     end
62   else
63     error(msprintf(_("%s: Wrong type for input argument #%d: Linear dynamical system or row vector of floats expected.\n"),fname,1))
64   end;
65
66   frq=frq';
67   d=d';
68   [n,mn]=size(d);
69   if and(size(comments,"*")<>[0 mn]) then
70     error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same number of elements expected.\n"),...
71                    fname,refdim,rhs+1))
72   end
73
74   //
75   fig=gcf();
76   immediate_drawing=fig.immediate_drawing;
77   fig.immediate_drawing="off";
78
79   axes = gca() ;
80   if size(axes.children,"*")==0 then
81     axes.data_bounds=[min(frq),min(d);max(frq),max(d)]
82     axes.x_label.text=_("Frequency (Hz)")
83     axes.y_label.text=_("Magnitude (dB)")
84
85   else
86     axes.data_bounds=[min([min(frq),min(d)],axes.data_bounds(1,:));
87                       max([max(frq),max(d)],axes.data_bounds(2,:))];
88   end
89   axes.axes_visible="on";
90   axes.log_flags = "lnn" ;
91   axes.grid=color("lightgrey")*ones(1,3);
92
93   if size(d,2)>1&size(frq,2)==1 then
94     xpolys(frq(:,ones(1,mn)),d,1:mn)
95     e=gce();
96   else
97     xpolys(frq,d,1:mn)
98     e=gce();
99   end
100   for i=1:size(e.children,"*")
101     datatipInitStruct(e.children(i),"formatfunction","formatGainplotTip")
102   end
103   if comments<>[] then
104     legend(comments)
105   end
106   fig.immediate_drawing=immediate_drawing;
107 endfunction
108
109 function str=formatGainplotTip(curve,pt,index)
110 //this function is called by the datatips mechanism to format the tip
111 //string for the magnitude bode curves
112   str=msprintf("%.4g"+_("Hz")+"\n%.4g"+_("dB"), pt(1),pt(2))
113 endfunction