0732fc990329f1da2abe0fa080816d64366db9c0
[scilab.git] / scilab / modules / gui / macros / getvalue.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2010 - DIGITEO - Allan CORNET
4 // Copyright (C) 2010 - DIGITEO - Clément DAVID <clement.david@scilab.org>
5 // Copyright (C) 2011 - DIGITEO - Bruno JOFRET
6 //
7 // Copyright (C) 2012 - 2016 - Scilab Enterprises
8 //
9 // This file is hereby licensed under the terms of the GNU GPL v2.0,
10 // pursuant to article 5.3.4 of the CeCILL v.2.1.
11 // This file was originally licensed under the terms of the CeCILL v2.1,
12 // and continues to be available under such terms.
13 // For more information, see the COPYING file which you should have received
14 // along with this program.
15
16 function [%ok,%1,%2,%3,%4,%5,...
17     %6,%7,%8,%9,%10,...
18     %11,%12,%13,%14,%15,...
19     %16,%17,%18,%19,%20,...
20     %21,%22,%23,%24,%25,...
21     %26,%27,%28,%29,%30]=getvalue(%desc,%labels,%typ,%ini)
22     //  getvalues - %window dialog for data acquisition
23     //%Synta%
24     //  [%ok,%1,..,%30]=getvalue(desc,labels,typ,ini)
25     //%Parameters
26     //  desc    : column vector of strings, dialog general comment
27     //  labels  : n column vector of strings, labels(i) is the label of
28     //            the ith required value
29     //  typ     : list(typ1,dim1,..,typn,dimn)
30     //            typi : defines the type of the ith required value
31     //                   if may have the following values:
32     //                   'mat'    : stands for matrix of scalars
33     //                   'col'    : stands for column vector of scalars
34     //                   'row'    : stands for row vector of scalars
35     //                   'vec'    : stands for  vector of scalars
36     //                   'intvec' : stands for  vector of integers i.e int(x) == x
37     //                   'str'    : stands for vector of strings
38     //                   'lis'    : stands for list
39     //                   'pol'    : stands for polynomials
40     //                   'r'      : stands for rational
41     //            dimi : defines the size of the ith required value
42     //                   it must be
43     //                    - an integer or a 2-vector of integers (-1 stands for
44     //                      arbitrary dimension)
45     //                    - an evaluatable character string
46     //  ini     : n column vector of strings, ini(i) gives the suggested
47     //            response for the ith required value
48     //  %ok      : boolean ,%t if %ok button pressed, %f if cancel button pressed
49     //  xi      : contains the ith required value if %ok==%t
50     //%Description
51     // getvalues macro encapsulate x_mdialog function with error checking,
52     // evaluation of numerical response, ...
53     //%Remarks
54     // All correct scilab syntax may be used as responses, for matrices
55     // and vectors getvalues automatically adds [ ] around the given response
56     // before numerical evaluation
57     //%Example
58     // labels=['magnitude';'frequency';'phase    '];
59     // [ampl,Freq,ph]=getvalue('define sine signal',labels,..
60     //            list('vec',1,'vec',1,'vec',1),['0.85';'10^2';'%pi/3'])
61     //
62     //%See also
63     // x_mdialog, x_dialog
64
65     //!
66     // 01/09/10 Clément DAVID: update to %30 rhs parameters
67     // 17/01/07 -Alan- This version of getvalue is different of scilab 4.1 :
68     //         - %scicos_context behavior reviewed in accordance to context_evstr macro
69     //         - (u)int(8/16/32) allowed in field of type vec/mat/row/col (F. Nassif's Work)
70     //
71     // 05/02/07 -Alan- : update to %20 rhs parameters
72     //
73     // 12/02/07 -Alan- : fix (variable evaluation of %scicos_context)
74     //
75     // Copyright INRIA
76     [%lhs, %rhs] = argn(0)
77     if %rhs < 3 then
78         error(sprintf(_("%s: Wrong number of input argument(s): %d to %d expected.\n"), "getvalue", 3, 4));
79     end
80
81     %nn=prod(size(%labels))
82     if %lhs<>%nn+2&%lhs<>%nn+1 then error(41),end
83     if size(%typ)<>2*%nn then
84         error("%typ : list(''type'',[sizes],...)")
85     end
86     %1=[];%2=[];%3=[];%4=[];%5=[];
87     %6=[];%7=[];%8=[];%9=[];%10=[];
88     %11=[];%12=[];%13=[];%14=[];%15=[];
89     %16=[];%17=[];%18=[];%19=[];%20=[];
90     %21=[];%22=[];%23=[];%24=[];%25=[];
91     %26=[];%27=[];%28=[];%29=[];%30=[];
92
93     if exists("%scicos_context") then
94         %mm=getfield(1,%scicos_context)
95         for %mi=%mm(3:$)
96             if execstr(%mi+"=%scicos_context(%mi)","errcatch")<>0 then
97                 disp(lasterror())
98                 %ok=%f
99                 return
100             end
101         end
102     end
103
104     if %rhs==3 then  %ini=emptystr(%nn,1),end
105     %ok=%t
106     while %t do
107         %str=x_mdialog(%desc,%labels,%ini)
108         if %str==[] then %ok=%f,%str=[];break,end
109         for %kk=1:%nn
110             %cod=ascii(%str(%kk))
111             %spe=find(%cod==10)
112             if %spe<>[] then
113                 %semi=ascii(";")
114                 %cod(%spe)=%semi*ones(%spe')
115                 %str(%kk)=ascii(%cod)
116             end
117         end
118         %nok=0
119         for %kk=1:%nn
120             select part(%typ(2*%kk-1),1:6)
121             case "mat   "
122                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
123                 if %ierr<>0 then %nok=-%kk;break,end
124                 //29/12/06
125                 //the type of %vv is accepted if it is constant or integer
126                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
127                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
128                 [%mv,%nv]=size(%vv)
129                 %ssz=string(%sz(1))+" x "+string(%sz(2))
130                 if %mv*%nv==0 then
131                     if  %sz(1)>=0&%sz(2)>=0&%sz(1)*%sz(2)<>0 then %nok=%kk,break,end
132                 else
133                     if %sz(1)>=0 then if %mv<>%sz(1) then %nok=%kk,break,end,end
134                     if %sz(2)>=0 then if %nv<>%sz(2) then %nok=%kk,break,end,end
135                 end
136             case "vec   "
137                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch")
138                 if %ierr<>0 then %nok=-%kk;break,end
139                 //17/01/07
140                 //the type of %vv is accepted if it is constant or integer
141                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
142                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
143                 %ssz=string(%sz(1))
144                 %nv=prod(size(%vv))
145                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
146             case "intvec"
147                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch")
148                 if %ierr<>0 then %nok=-%kk;break,end
149                 //17/01/07
150                 //the type of %vv is accepted if it is constant or integer
151                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
152                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
153                 if and(int(%vv) == %vv) == %f then
154                     %nok=-%kk;
155                     break;
156                 end
157                 %ssz=string(%sz(1))
158                 %nv=prod(size(%vv))
159                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
160             case "pol   "
161                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
162                 if %ierr<>0 then %nok=-%kk;break,end
163                 if type(%vv)>2 then %nok=-%kk,break,end
164                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
165                 %ssz=string(%sz(1))
166                 %nv=prod(size(%vv))
167                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
168             case "row   "
169                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
170                 if %ierr<>0 then %nok=-%kk;break,end
171                 //17/01/07
172                 //the type of %vv is accepted if it is constant or integer
173                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
174                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
175                 if %sz(1)<0 then
176                     %ssz="1 x *"
177                 else
178                     %ssz="1 x "+string(%sz(1))
179                 end
180                 [%mv,%nv]=size(%vv)
181                 if %mv<>1 then %nok=%kk,break,end,
182                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
183             case "col   "
184                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
185                 if %ierr<>0 then %nok=-%kk;break,end
186                 //17/01/07
187                 //the type of %vv is accepted if it is constant or integer
188                 if and(type(%vv)<>[1 8]) then %nok=-%kk,break,end
189                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
190                 if %sz(1)<0 then
191                     %ssz="* x 1"
192                 else
193                     %ssz=string(%sz(1))+" x 1"
194                 end
195                 [%mv,%nv]=size(%vv)
196                 if %nv<>1 then %nok=%kk,break,end,
197                 if %sz(1)>=0 then if %mv<>%sz(1) then %nok=%kk,break,end,end
198             case "str   "
199                 %sde=%str(%kk)
200                 %spe=find(ascii(%str(%kk))==10)
201                 %spe($+1)=length(%sde)+1
202                 %vv=[];%kk1=1
203                 for %kkk=1:size(%spe,"*")
204                     %vv(%kkk,1)=part(%sde,%kk1:%spe(%kkk)-1)
205                     %kk1=%spe(%kkk)+1
206                 end
207                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
208                 %ssz=string(%sz(1))
209                 %nv=prod(size(%vv))
210                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
211             case "lis   "
212                 %ierr=execstr("%vv="+%str(%kk),"errcatch");
213                 if %ierr<>0 then %nok=-%kk;break,end
214                 if type(%vv)<>15& type(%vv)<>16 then %nok=-%kk,break,end
215                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
216                 %ssz=string(%sz(1))
217                 %nv=size(%vv)
218                 if %sz(1)>=0 then if %nv<>%sz(1) then %nok=%kk,break,end,end
219             case "r     "
220                 %ierr=execstr("%vv=["+%str(%kk)+"]","errcatch");
221                 if %ierr<>0 then %nok=-%kk;break,end
222                 if type(%vv)<>16 then %nok=-%kk,break,end
223                 if typeof(%vv)<>"rational" then %nok=-%kk,break,end
224                 %sz=%typ(2*%kk);if type(%sz)==10 then %sz=evstr(%sz),end
225                 [%mv,%nv]=size(%vv(2))
226                 %ssz=string(%sz(1))+" x "+string(%sz(2))
227                 if %mv*%nv==0 then
228                     if  %sz(1)>=0&%sz(2)>=0&%sz(1)*%sz(2)<>0 then %nok=%kk,break,end
229                 else
230                     if %sz(1)>=0 then if %mv<>%sz(1) then %nok=%kk,break,end,end
231                     if %sz(2)>=0 then if %nv<>%sz(2) then %nok=%kk,break,end,end
232                 end
233             else
234                 error(msprintf(_("%s: Type %s is not implemented.\n"),"getvalue", %typ(2*%kk-1)))
235             end
236             execstr("%"+string(%kk)+"=%vv")
237         end
238         if %nok>0 then
239             messagebox(msprintf(_("Answer given for %s \n has invalid dimension: \n waiting for dimension %s.\n"), %labels(%nok), %ssz), "modal");
240             %ini=%str
241         elseif %nok<0 then
242             if %ierr==0 then
243                 messagebox(msprintf(_("Answer given for %s \n has incorrect type %s.\n"), %labels(-%nok), %typ(-2*%nok-1)), "modal");
244             else
245                 messagebox(msprintf(_("Answer given for %s \n is incorrect: %s.\n"), %labels(-%nok), lasterror()), "modal");
246             end
247             %ini=%str
248         else
249             break
250         end
251     end
252     if %lhs==%nn+2 then
253         execstr("%"+string(%lhs-1)+"=%str")
254     end
255 endfunction