bug 6394 fix + datatips custimization + revision of help pages
[scilab.git] / scilab / modules / cacsd / macros / hallchart.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 hallchart(modules,args,colors)
10   defaultmodules=[-20 -10 -6 -4 -2 2 4 6 10 20];//in dB
11   defaultargs=[-90 -60 -45 -30 -15 15 30 45 60 90]; //in degree
12   defaultbounds=[-3.5 -2;3 2];
13   if exists("modules","local")==0 then
14     modules=defaultmodules
15   else
16     if type(modules)|~isreal(modules)<>1 then
17       error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","modules");
18     end
19     modules=matrix(modules,1,-1)
20   end
21   if exists("args","local")==0 then
22     args=defaultargs
23   else
24     if type(args)<>1|~isreal(args) then
25       error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","args");
26     end
27     args=matrix(args,1,-1)
28   end
29
30   if exists("colors","local")==0 then
31     colors=[4 12];
32   else
33     if type(colors)<>1|~isreal(colors) then
34       error(msprintf("%s: Wrong type for imput argument ""%s"": real floating point array expected\n"),"hallchart","colors");
35     end
36     if size(colors,"*")==1 then
37       colors=colors*ones(1,2)
38     end
39   end
40
41   drawlater()
42   ax=gca();
43   nc=size(ax.children,"*")
44   if nc==0 then
45     ax.data_bounds=defaultbounds;
46     ax.axes_visible="on";
47     ax.x_label.text=_("Real axis");
48     ax.y_label.text=_("Imaginary axis");
49     ax.title.text=_("Hall chart")
50     ax.box="on";
51   end
52
53   //iso modules circles. Circles whose center are (-M^2/(M^2-1),0) and
54   //radius M/(M^2-1) with M=|H(jw)| and H=G/(1+G)
55
56   M=exp(log(10)*modules/20)
57   radius=M./(M.*M-ones(M))
58   xc=-M.*radius
59   yc=0
60   radius=abs(radius)
61   //arcs replaced by polylines to be able to use datatips
62   //  xarcs([xc-radius;yc+radius;2*radius;2*radius;0*M;360*64*ones(M)])
63   //  A=gce()
64   //  E=unglue(A);
65   w=linspace(0,2*%pi,200)
66   c=cos(w);s=sin(w)
67   chart_handles=[]
68   for i=1:size(M,"*")
69     xpoly(xc(i)+radius(i)*c,yc+radius(i)*s)
70     ec=gce();
71     ec.foreground=colors(1);
72     ec.line_style=7;
73     ec.clip_state="clipgrf";
74     datatipInitStruct(ec,"formatfunction","formatHallModuleTip","module",modules(i))
75     if 2*int(i/2)==i then
76       xs=xc(i)+radius(i)*cos(%pi/6)
77       ys=yc+radius(i)*sin(%pi/6)
78     else
79       xs=xc(i)+radius(i)*cos(-%pi/6)
80       ys=yc+radius(i)*sin(-%pi/6)
81
82     end
83
84     xstring(xs,ys,string(modules(i))+_("dB"));
85     el=gce();
86
87     el.font_foreground=colors(1);
88     el.clip_state="clipgrf";
89     chart_handles=[glue([el ec]) chart_handles];
90   end
91
92   //iso phase circles. Circles whose center are (-1/2, 1/(2*N)) and
93   //radius sqrt(1+N^2)/(2*N) with N=tan(arg(H(-jw)))
94
95   N=tan(args*%pi/180);
96   radius=sqrt(1+N^2)./(2*N);
97   xc=-1/2;
98   yc=1 ./(2*N);
99
100   //  xarcs([xc-radius;yc+radius;2*radius;2*radius;0*N;360*64*ones(N)])
101   //  E=unglue(gce());
102   for i=1:size(N,"*")
103     xpoly(xc+radius(i)*c,yc(i)+radius(i)*s);ec=gce();
104     ec.foreground=colors(2);
105     ec.line_style=7;
106     ec.clip_state="clipgrf";
107     datatipInitStruct(ec,"formatfunction","formatHallPhaseTip","phase",args(i))
108     xstring(xc,yc(i)+radius(i),msprintf("%g"+_("°"),args(i)));
109     el=gce();
110     el.font_foreground=colors(2);
111     el.clip_state="clipgrf";
112     chart_handles=[glue([el ec]) chart_handles];
113   end
114   chart_handles=glue(chart_handles)
115   //reorder axes children to make chart drawn before the previously
116   // drawn curves if any
117   for k=1:nc
118     swap_handles(ax.children(k),ax.children(k+1))
119   end
120
121   drawnow()
122 endfunction
123 function str=formatHallModuleTip(curve,pt,index)
124 //this function is called by the datatip mechanism to format the tip
125 //string for the Hall charts iso module curves
126   ud=datatipGetStruct(curve);
127   str=msprintf("%.2g"+_("dB"), ud.module);
128 endfunction
129 function str=formatHallPhaseTip(curve,pt,index)
130 //This function is called by the datatip mechanism to format the tip
131 //string for the Hall charts iso phase curves
132   ud=datatipGetStruct(curve);
133   str=msprintf("%.2g"+_("°"), ud.phase);
134 endfunction
135